From 1a29ad0a8dc70fdac52bfdc118ec55d2b0abedb5 Mon Sep 17 00:00:00 2001 From: David Meister Date: Sun, 25 Oct 2026 20:46:08 +0000 Subject: [PATCH 01/15] Implement IRaindexV7: clear4 routes each order's signed context to its own eval Replaces clear3 with clear4, which evaluates alice's order with aliceSignedContext and bob's with bobSignedContext, matching quote2 and takeOrders4. clear3 is removed so callers carrying V6 assumptions revert at the missing selector. All consumers move from IRaindexV6 to IRaindexV7. Co-Authored-By: Claude Opus 5.5 --- .../abis/{IRaindexV6.json => IRaindexV7.json} | 2 +- crates/bindings/abis/RaindexV6.json | 2 +- crates/bindings/src/js_api.rs | 2 +- crates/bindings/src/lib.rs | 4 +- crates/common/src/add_order.rs | 2 +- crates/common/src/deposit.rs | 2 +- .../common/src/local_db/address_collectors.rs | 10 +- crates/common/src/local_db/decode.rs | 6 +- crates/common/src/local_db/fetch.rs | 2 +- crates/common/src/local_db/insert.rs | 4 +- .../src/local_db/pipeline/adapters/apply.rs | 4 +- crates/common/src/local_db/pipeline/engine.rs | 4 +- .../common/src/raindex_client/markets/mod.rs | 2 +- .../common/src/raindex_client/order_quotes.rs | 2 +- crates/common/src/raindex_client/orders.rs | 2 +- .../src/raindex_client/remove_orders.rs | 2 +- .../raindex_client/take_orders/e2e_tests.rs | 2 +- .../src/raindex_client/take_orders/mod.rs | 4 +- .../src/raindex_client/take_orders/result.rs | 4 +- .../src/raindex_client/take_orders/single.rs | 4 +- .../take_orders/single_tests.rs | 2 +- crates/common/src/raindex_client/vaults.rs | 4 +- .../common/src/raindex_client/vaults_list.rs | 2 +- .../raindex_order_builder/order_operations.rs | 2 +- crates/common/src/remove_order.rs | 2 +- crates/common/src/take_orders/candidates.rs | 2 +- crates/common/src/take_orders/config.rs | 2 +- crates/common/src/take_orders/preflight.rs | 14 +- crates/common/src/test_helpers.rs | 4 +- .../common/src/types/orders_list_flattened.rs | 4 +- crates/common/src/withdraw.rs | 2 +- crates/integration_tests/src/lib.rs | 12 +- crates/js_api/src/bindings/mod.rs | 2 +- crates/quote/ARCHITECTURE.md | 4 +- crates/quote/src/cli/input.rs | 4 +- crates/quote/src/cli/mod.rs | 2 +- crates/quote/src/injector.rs | 2 +- crates/quote/src/oracle.rs | 4 +- crates/quote/src/order_quotes.rs | 12 +- crates/quote/src/quote.rs | 4 +- crates/quote/src/quote_debug.rs | 4 +- crates/quote/src/rpc.rs | 6 +- .../subgraph/src/types/order_detail_traits.rs | 4 +- crates/test_fixtures/abis/RaindexV6.json | 4 +- foundry.toml | 2 +- remappings.txt | 2 +- script/build.sh | 2 +- soldeer.lock | 7 +- src/abstract/RaindexV6ArbCommon.sol | 2 +- src/abstract/RaindexV6ArbOrderTaker.sol | 24 +-- src/abstract/RaindexV6ArbTaskGated.sol | 2 +- src/abstract/RaindexV6FlashBorrower.sol | 16 +- src/abstract/RaindexV6FlashLender.sol | 4 +- src/concrete/raindex/RaindexV6.sol | 44 ++-- .../GenericPoolRaindexV6ArbOrderTaker.sol | 10 +- .../GenericPoolRaindexV6FlashBorrower.sol | 10 +- src/generated/candidate/RaindexV6.sol | 8 +- .../RouteProcessorRaindexV6ArbOrderTaker.sol | 10 +- src/lib/LibOrder.sol | 2 +- src/lib/LibRaindex.sol | 2 +- src/lib/LibRaindexArb.sol | 2 +- src/struct/OrderIOCalculationV4.sol | 2 +- subgraph/abis/Raindex.json | 2 +- subgraph/generated/Raindex/Raindex.ts | 88 ++++---- .../RaindexV6ArbOrderTaker.badRaindex.t.sol | 6 +- ...aindexV6ArbOrderTaker.beforeArbOrder.t.sol | 10 +- .../RaindexV6ArbOrderTaker.context.t.sol | 4 +- ...ndexV6ArbOrderTaker.finalizeDecimals.t.sol | 4 +- ...indexV6ArbOrderTaker.finalizeTaskArg.t.sol | 4 +- .../RaindexV6ArbOrderTaker.ierc165.t.sol | 14 +- ...ndexV6ArbOrderTaker.ioIndexSelection.t.sol | 8 +- .../RaindexV6ArbOrderTaker.noOrders.t.sol | 6 +- ...RaindexV6ArbOrderTaker.onTakeOrders2.t.sol | 6 +- ...dexV6ArbOrderTaker.onTakeOrders2Base.t.sol | 2 +- ...xV6ArbOrderTaker.onTakeOrders2Direct.t.sol | 2 +- .../RaindexV6ArbOrderTaker.reentrancy.t.sol | 6 +- ...6ArbTaskGated.checkTaskHashPassMatch.t.sol | 2 +- ...V6ArbTaskGated.checkTaskHashPassZero.t.sol | 2 +- ...6ArbTaskGated.checkTaskHashWrongTask.t.sol | 2 +- .../RaindexV6ArbTaskGated.construct.t.sol | 2 +- ...ndexV6ArbTaskGated.iTaskHashBoundary.t.sol | 2 +- ...indexV6ArbTaskGated.iTaskHashNonzero.t.sol | 2 +- .../RaindexV6ArbTaskGated.iTaskHashZero.t.sol | 2 +- ...dexV6FlashBorrower.badLenderApproval.t.sol | 6 +- ...aindexV6FlashBorrower.beforeArbOrder.t.sol | 10 +- ...ndexV6FlashBorrower.finalizeDecimals.t.sol | 6 +- ...lashBorrower.flashLoanAmountLossless.t.sol | 6 +- ...V6FlashBorrower.flashLoanAmountValue.t.sol | 6 +- ...indexV6FlashBorrower.flashLoanFailed.t.sol | 6 +- ...6FlashBorrower.inputIoIndexSelection.t.sol | 6 +- .../RaindexV6FlashBorrower.ioIsInput.t.sol | 4 +- ...RaindexV6FlashBorrower.mixedDecimals.t.sol | 6 +- .../RaindexV6FlashBorrower.noOrders.t.sol | 6 +- ...ndexV6FlashBorrower.orders0Selection.t.sol | 6 +- ...exV6FlashBorrower.realTokenTransfers.t.sol | 6 +- .../RaindexV6FlashBorrower.reentrancy.t.sol | 8 +- .../RaindexV6FlashLender.griefRecipient.t.sol | 2 +- .../RaindexV6FlashLender.mockSuccess.t.sol | 2 +- .../RaindexV6FlashLender.reentrant.t.sol | 22 +- .../RaindexV6FlashLender.transfers.t.sol | 2 +- ...dexV6ArbOrderTaker.reentrantCallback.t.sol | 2 +- ...ricPoolRaindexV6ArbOrderTaker.sender.t.sol | 2 +- ...FlashBorrower.exchangeTokenSelection.t.sol | 8 +- ...ricPoolRaindexV6FlashBorrower.sender.t.sol | 2 +- ...RaindexV6ArbOrderTaker.lossyRounding.t.sol | 2 +- ...rRaindexV6ArbOrderTaker.noEthForward.t.sol | 2 +- ...xV6ArbOrderTaker.nonStandardDecimals.t.sol | 6 +- ...RaindexV6ArbOrderTaker.onTakeOrders2.t.sol | 6 +- ...xV6ArbOrderTaker.onTakeOrders2Direct.t.sol | 2 +- ...dexV6ArbOrderTaker.onTakeOrders2Fuzz.t.sol | 2 +- ...ocessorRaindexV6ArbOrderTaker.sender.t.sol | 2 +- ...rRaindexV6ArbOrderTaker.tofuDecimals.t.sol | 2 +- .../raindex/RaindexV6.addOrder.entask.t.sol | 2 +- .../raindex/RaindexV6.addOrder.mock.t.sol | 2 +- .../raindex/RaindexV6.addOrder.nonce.t.sol | 2 +- .../raindex/RaindexV6.addOrder.owner.t.sol | 2 +- .../concrete/raindex/RaindexV6.addOrder.t.sol | 2 +- .../RaindexV6.calculateOrderIOHarness.t.sol | 18 +- .../raindex/RaindexV6.clear.badStack.t.sol | 4 +- ...RaindexV6.clear.calculateStateChange.t.sol | 6 +- .../raindex/RaindexV6.clear.context.t.sol | 4 +- .../raindex/RaindexV6.clear.deadOrder.t.sol | 14 +- .../raindex/RaindexV6.clear.freshDriver.t.sol | 42 ++-- .../RaindexV6.clear.handleIO.revert.t.sol | 6 +- .../raindex/RaindexV6.clear.mock.t.sol | 4 +- .../raindex/RaindexV6.clear.sameOwner.t.sol | 4 +- .../raindex/RaindexV6.clear.sameToken.t.sol | 8 +- ...RaindexV6.clear.signedContextRouting.t.sol | 193 ++++++++++++++++++ .../raindex/RaindexV6.clear.zeroAmount.t.sol | 4 +- .../raindex/RaindexV6.deposit.entask.t.sol | 2 +- test/concrete/raindex/RaindexV6.deposit.t.sol | 10 +- .../RaindexV6.depositWithdrawHarness.t.sol | 14 +- .../raindex/RaindexV6.doPost.fresh.t.sol | 2 +- test/concrete/raindex/RaindexV6.entask.t.sol | 2 +- .../raindex/RaindexV6.errorSelector.t.sol | 10 +- .../raindex/RaindexV6.multicall.t.sol | 10 +- .../raindex/RaindexV6.orderMgmt.fresh.t.sol | 2 +- .../raindex/RaindexV6.quote.sameToken.t.sol | 8 +- test/concrete/raindex/RaindexV6.quote.t.sol | 4 +- .../RaindexV6.removeOrder.entask.t.sol | 2 +- .../raindex/RaindexV6.removeOrder.mock.t.sol | 2 +- .../raindex/RaindexV6.removeOrder.owner.t.sol | 2 +- .../RaindexV6.takeOrder.badStack.t.sol | 7 +- ...dexV6.takeOrder.batchEvalConsistency.t.sol | 2 +- ...exV6.takeOrder.batchStateAdversarial.t.sol | 2 +- ...RaindexV6.takeOrder.batchStateBypass.t.sol | 2 +- ...ndexV6.takeOrder.calculationsContext.t.sol | 4 +- .../RaindexV6.takeOrder.exceedsMaxRatio.t.sol | 4 +- .../RaindexV6.takeOrder.freshMutation.t.sol | 18 +- .../RaindexV6.takeOrder.freshVaultZero.t.sol | 6 +- .../RaindexV6.takeOrder.handleIO.revert.t.sol | 2 +- .../RaindexV6.takeOrder.maximumInput.t.sol | 6 +- .../RaindexV6.takeOrder.maximumOutput.t.sol | 6 +- .../RaindexV6.takeOrder.minimumIO.t.sol | 2 +- .../RaindexV6.takeOrder.minimumIOOutput.t.sol | 2 +- .../raindex/RaindexV6.takeOrder.noop.t.sol | 2 +- .../RaindexV6.takeOrder.precision.t.sol | 2 +- .../RaindexV6.takeOrder.sameToken.t.sol | 6 +- .../RaindexV6.takeOrder.takenFlag.t.sol | 8 +- .../RaindexV6.takeOrder.tokenMismatch.t.sol | 2 +- .../RaindexV6.takeOrder.vaultZeroInput.t.sol | 28 +-- .../RaindexV6.takeOrder.zeroAmount.t.sol | 2 +- .../RaindexV6.takeOrder.zeroMaxOOBIndex.t.sol | 6 +- .../RaindexV6.takeOrder.zeroRatio.t.sol | 8 +- .../raindex/RaindexV6.vaultBalance.t.sol | 2 +- .../RaindexV6.vaultBalanceVault0.t.sol | 2 +- .../raindex/RaindexV6.withdraw.entask.t.sol | 2 +- .../concrete/raindex/RaindexV6.withdraw.t.sol | 4 +- test/lib/LibOrder.t.sol | 2 +- test/lib/LibRaindex.doPost.t.sol | 2 +- ...LibRaindexArb.finalizeArbTaskContext.t.sol | 2 +- ...{IRaindexV6Stub.sol => IRaindexV7Stub.sol} | 32 +-- test/util/abstract/MockRaindexBase.sol | 12 +- .../abstract/RaindexV6ExternalMockTest.sol | 12 +- .../abstract/RaindexV6ExternalRealTest.sol | 12 +- test/util/concrete/Alice.sol | 2 +- .../ChildGatedRaindexV6ArbOrderTaker.sol | 2 +- .../ChildGatedRaindexV6FlashBorrower.sol | 2 +- .../concrete/ChildRaindexV6ArbTaskGated.sol | 2 +- .../util/concrete/FlashLendingMockRaindex.sol | 18 +- .../LeftoverFlashLendingMockRaindex.sol | 2 +- .../concrete/LibRaindexArbFinalizeHarness.sol | 2 +- .../util/concrete/LibRaindexDoPostHarness.sol | 2 +- test/util/concrete/MaliciousRaindex.sol | 2 +- .../RaindexV6CalculateOrderIOHarness.sol | 2 +- .../concrete/RaindexV6ClearDriverHarness.sol | 2 +- .../RaindexV6ClearStateChangeHarness.sol | 2 +- .../RealisticFlashLendingMockRaindex.sol | 4 +- .../RealisticOrderTakerMockRaindex.sol | 6 +- .../RecordingFlashLendingMockRaindex.sol | 4 +- test/util/concrete/RecordingOrderTaker.sol | 10 +- test/util/concrete/RecordingTaker.sol | 10 +- test/util/concrete/Reenteroor.sol | 2 +- test/util/concrete/ReentrantExchange.sol | 8 +- test/util/concrete/ReentrantMockRaindex.sol | 6 +- .../IRaindexV6CalculateOrderIOHarness.sol | 4 +- .../IRaindexV6ClearDriverHarness.sol | 4 +- .../IRaindexV6ClearStateChangeHarness.sol | 4 +- .../IRaindexV6VaultBalanceHarness.sol | 4 +- test/util/lib/LibTestAddOrder.sol | 2 +- test/util/lib/LibTestArb.sol | 10 +- test/util/lib/LibTestFlashBorrowerArb.sol | 8 +- test/util/lib/LibTestTakeOrder.sol | 6 +- 203 files changed, 787 insertions(+), 588 deletions(-) rename crates/bindings/abis/{IRaindexV6.json => IRaindexV7.json} (99%) create mode 100644 test/concrete/raindex/RaindexV6.clear.signedContextRouting.t.sol rename test/util/abstract/{IRaindexV6Stub.sol => IRaindexV7Stub.sol} (75%) diff --git a/crates/bindings/abis/IRaindexV6.json b/crates/bindings/abis/IRaindexV7.json similarity index 99% rename from crates/bindings/abis/IRaindexV6.json rename to crates/bindings/abis/IRaindexV7.json index b682da7f35..c46c99838b 100644 --- a/crates/bindings/abis/IRaindexV6.json +++ b/crates/bindings/abis/IRaindexV7.json @@ -145,7 +145,7 @@ }, { "type": "function", - "name": "clear3", + "name": "clear4", "inputs": [ { "name": "alice", diff --git a/crates/bindings/abis/RaindexV6.json b/crates/bindings/abis/RaindexV6.json index 6972bfecb9..0ac5c40e4f 100644 --- a/crates/bindings/abis/RaindexV6.json +++ b/crates/bindings/abis/RaindexV6.json @@ -145,7 +145,7 @@ }, { "type": "function", - "name": "clear3", + "name": "clear4", "inputs": [ { "name": "aliceOrder", diff --git a/crates/bindings/src/js_api.rs b/crates/bindings/src/js_api.rs index e67366230e..9971d06835 100644 --- a/crates/bindings/src/js_api.rs +++ b/crates/bindings/src/js_api.rs @@ -1,4 +1,4 @@ -use crate::IRaindexV6::{ +use crate::IRaindexV7::{ EvaluableV4, OrderV4, QuoteV2, SignedContextV1, TakeOrderConfigV4, TakeOrdersConfigV5, IOV2, }; use wasm_bindgen_utils::{impl_custom_tsify, impl_wasm_traits, prelude::*}; diff --git a/crates/bindings/src/lib.rs b/crates/bindings/src/lib.rs index 40c701f748..4f6bab267e 100644 --- a/crates/bindings/src/lib.rs +++ b/crates/bindings/src/lib.rs @@ -3,7 +3,7 @@ use alloy::sol; sol!( #![sol(all_derives = true, rpc)] #![sol(extra_derives(serde::Serialize, serde::Deserialize))] - IRaindexV6, "./abis/IRaindexV6.json" + IRaindexV7, "./abis/IRaindexV7.json" ); sol!( @@ -57,7 +57,7 @@ pub mod wasm_traits; pub mod topics { use crate::{ IInterpreterStoreV3::Set, - IRaindexV6::{ + IRaindexV7::{ AddOrderV3, AfterClearV2, ClearV3, DepositV2, RemoveOrderV3, TakeOrderV3, WithdrawV2, }, Raindex::MetaV1_2, diff --git a/crates/common/src/add_order.rs b/crates/common/src/add_order.rs index e73069fb79..6fbd390863 100644 --- a/crates/common/src/add_order.rs +++ b/crates/common/src/add_order.rs @@ -31,7 +31,7 @@ use rain_metadata::{ use rain_metadata_bindings::MetaBoard::emitMetaCall; use raindex_app_settings::deployment::DeploymentCfg; use raindex_bindings::provider::{mk_read_provider, ReadProviderError}; -use raindex_bindings::IRaindexV6::{addOrder4Call, EvaluableV4, OrderConfigV4, TaskV2, IOV2}; +use raindex_bindings::IRaindexV7::{addOrder4Call, EvaluableV4, OrderConfigV4, TaskV2, IOV2}; use serde::{Deserialize, Serialize}; use serde_bytes::ByteBuf; use std::collections::HashMap; diff --git a/crates/common/src/deposit.rs b/crates/common/src/deposit.rs index c79a65fefb..f7a92162f8 100644 --- a/crates/common/src/deposit.rs +++ b/crates/common/src/deposit.rs @@ -2,7 +2,7 @@ use crate::allowance::read_allowance; use crate::transaction::{TransactionArgs, TransactionArgsError, WritableTransactionExecuteError}; use alloy::primitives::{Address, B256, U256}; use rain_math_float::{Float, FloatError}; -use raindex_bindings::IRaindexV6::deposit4Call; +use raindex_bindings::IRaindexV7::deposit4Call; #[cfg(not(target_family = "wasm"))] use raindex_bindings::IERC20::approveCall; use serde::{Deserialize, Serialize}; diff --git a/crates/common/src/local_db/address_collectors.rs b/crates/common/src/local_db/address_collectors.rs index a6c42e0504..33763f7608 100644 --- a/crates/common/src/local_db/address_collectors.rs +++ b/crates/common/src/local_db/address_collectors.rs @@ -1,6 +1,6 @@ use super::decode::{DecodedEvent, DecodedEventData}; use alloy::primitives::Address; -use raindex_bindings::IRaindexV6::OrderV4; +use raindex_bindings::IRaindexV7::OrderV4; use std::collections::BTreeSet; pub fn collect_token_addresses( @@ -68,7 +68,7 @@ mod tests { use super::*; use alloy::primitives::{b256, Address, Bytes, FixedBytes, U256}; use raindex_bindings::IInterpreterStoreV3::Set; - use raindex_bindings::IRaindexV6::{ + use raindex_bindings::IRaindexV7::{ AddOrderV3, DepositV2, OrderV4, RemoveOrderV3, SignedContextV1, TakeOrderConfigV4, TakeOrderV3, WithdrawV2, IOV2, }; @@ -90,7 +90,7 @@ mod tests { OrderV4 { owner: Address::from([1u8; 20]), nonce: U256::from(1).into(), - evaluable: raindex_bindings::IRaindexV6::EvaluableV4 { + evaluable: raindex_bindings::IRaindexV7::EvaluableV4 { interpreter: Address::from([2u8; 20]), store: Address::from([3u8; 20]), bytecode: alloy::primitives::Bytes::from(vec![]), @@ -172,11 +172,11 @@ mod tests { vaultId: U256::from(0).into(), }); - let clear = raindex_bindings::IRaindexV6::ClearV3 { + let clear = raindex_bindings::IRaindexV7::ClearV3 { sender: Address::from([0u8; 20]), alice, bob, - clearConfig: raindex_bindings::IRaindexV6::ClearConfigV2 { + clearConfig: raindex_bindings::IRaindexV7::ClearConfigV2 { aliceInputIOIndex: U256::from(0), aliceOutputIOIndex: U256::from(0), bobInputIOIndex: U256::from(0), diff --git a/crates/common/src/local_db/decode.rs b/crates/common/src/local_db/decode.rs index 1661faa23c..a12b1212af 100644 --- a/crates/common/src/local_db/decode.rs +++ b/crates/common/src/local_db/decode.rs @@ -7,7 +7,7 @@ use alloy::{ use core::convert::TryFrom; use raindex_bindings::{ IInterpreterStoreV3::Set, - IRaindexV6::{ + IRaindexV7::{ AddOrderV3, AfterClearV2, ClearV3, DepositV2, RemoveOrderV3, TakeOrderV3, WithdrawV2, }, Raindex::MetaV1_2, @@ -210,11 +210,11 @@ mod test_helpers { use alloy::hex; use alloy::primitives::{address, b256, Address, Bytes, FixedBytes, B256, U256}; use raindex_bindings::{ - IRaindexV6::{ + IRaindexV7::{ AddOrderV3, AfterClearV2, ClearConfigV2, ClearStateChangeV2, ClearV3, DepositV2, RemoveOrderV3, SignedContextV1, TakeOrderConfigV4, TakeOrderV3, WithdrawV2, }, - IRaindexV6::{EvaluableV4, OrderV4, IOV2}, + IRaindexV7::{EvaluableV4, OrderV4, IOV2}, Raindex::MetaV1_2, }; use serde_json::Value; diff --git a/crates/common/src/local_db/fetch.rs b/crates/common/src/local_db/fetch.rs index d4c485e5e2..420757d725 100644 --- a/crates/common/src/local_db/fetch.rs +++ b/crates/common/src/local_db/fetch.rs @@ -443,7 +443,7 @@ mod tests { use alloy::rpc::types::FilterBlockError; use alloy::sol_types::SolEvent; use httpmock::prelude::*; - use raindex_bindings::{IInterpreterStoreV3::Set, IRaindexV6::AddOrderV3}; + use raindex_bindings::{IInterpreterStoreV3::Set, IRaindexV7::AddOrderV3}; use serde_json::json; use std::str::FromStr; use std::sync::atomic::{AtomicUsize, Ordering}; diff --git a/crates/common/src/local_db/insert.rs b/crates/common/src/local_db/insert.rs index b8558342a5..e6556ee19f 100644 --- a/crates/common/src/local_db/insert.rs +++ b/crates/common/src/local_db/insert.rs @@ -9,7 +9,7 @@ use alloy::{ primitives::{keccak256, Address, FixedBytes, B256, U256}, }; use rain_math_float::Float; -use raindex_bindings::IRaindexV6::{ +use raindex_bindings::IRaindexV7::{ AddOrderV3, AfterClearV2, ClearV3, DepositV2, OrderV4, RemoveOrderV3, TakeOrderV3, WithdrawV2, IOV2, }; @@ -776,7 +776,7 @@ mod tests { use alloy::primitives::{b256, Address, Bytes, FixedBytes, B256, U256}; use itertools::Itertools; use raindex_bindings::IInterpreterStoreV3::Set; - use raindex_bindings::IRaindexV6::{ + use raindex_bindings::IRaindexV7::{ ClearConfigV2, ClearStateChangeV2, EvaluableV4, SignedContextV1, TakeOrderConfigV4, }; use std::collections::HashMap; diff --git a/crates/common/src/local_db/pipeline/adapters/apply.rs b/crates/common/src/local_db/pipeline/adapters/apply.rs index 0c8b309c52..53cba253c9 100644 --- a/crates/common/src/local_db/pipeline/adapters/apply.rs +++ b/crates/common/src/local_db/pipeline/adapters/apply.rs @@ -237,7 +237,7 @@ mod tests { fn deposit_event(addr: Address) -> DecodedEventData { use crate::local_db::decode::EventType; - use raindex_bindings::IRaindexV6::DepositV2; + use raindex_bindings::IRaindexV7::DepositV2; DecodedEventData { event_type: EventType::DepositV2, block_number: U256::from(1), @@ -257,7 +257,7 @@ mod tests { fn withdraw_event(addr: Address) -> DecodedEventData { use crate::local_db::decode::EventType; - use raindex_bindings::IRaindexV6::WithdrawV2; + use raindex_bindings::IRaindexV7::WithdrawV2; DecodedEventData { event_type: EventType::WithdrawV2, block_number: U256::from(0x10), diff --git a/crates/common/src/local_db/pipeline/engine.rs b/crates/common/src/local_db/pipeline/engine.rs index d5e7e19191..1f5e0b838f 100644 --- a/crates/common/src/local_db/pipeline/engine.rs +++ b/crates/common/src/local_db/pipeline/engine.rs @@ -421,7 +421,7 @@ mod tests { token: Address, tx: u8, ) -> DecodedEventData { - use raindex_bindings::IRaindexV6::DepositV2; + use raindex_bindings::IRaindexV7::DepositV2; DecodedEventData { event_type: EventType::DepositV2, block_number: U256::from(block), @@ -445,7 +445,7 @@ mod tests { output_token: Address, tx: u8, ) -> DecodedEventData { - use raindex_bindings::IRaindexV6::{AddOrderV3, EvaluableV4, OrderV4, IOV2}; + use raindex_bindings::IRaindexV7::{AddOrderV3, EvaluableV4, OrderV4, IOV2}; DecodedEventData { event_type: EventType::AddOrderV3, block_number: U256::from(block), diff --git a/crates/common/src/raindex_client/markets/mod.rs b/crates/common/src/raindex_client/markets/mod.rs index 059ed1ce89..bc46a610ef 100644 --- a/crates/common/src/raindex_client/markets/mod.rs +++ b/crates/common/src/raindex_client/markets/mod.rs @@ -22,7 +22,7 @@ use raindex_app_settings::token::TokenCfg; #[cfg(not(target_family = "wasm"))] use raindex_bindings::provider::mk_read_provider; #[cfg(not(target_family = "wasm"))] -use raindex_bindings::IRaindexV6::OrderV4; +use raindex_bindings::IRaindexV7::OrderV4; use serde_json::Value; #[cfg(not(target_family = "wasm"))] use std::cmp::Ordering; diff --git a/crates/common/src/raindex_client/order_quotes.rs b/crates/common/src/raindex_client/order_quotes.rs index c7cb3dfe8f..2044051a94 100644 --- a/crates/common/src/raindex_client/order_quotes.rs +++ b/crates/common/src/raindex_client/order_quotes.rs @@ -5,7 +5,7 @@ use crate::raindex_client::vaults::RaindexVault; use crate::utils::timing::Timing; use alloy::primitives::{Address, B256}; use rain_math_float::Float; -use raindex_bindings::IRaindexV6::{OrderV4, SignedContextV1, IOV2}; +use raindex_bindings::IRaindexV7::{OrderV4, SignedContextV1, IOV2}; use raindex_quote::{ get_order_quotes, get_order_quotes_for_pairs, BatchOrderQuotesResponse, NoopInjector, OrderQuoteValue, Pair, SignedContextInjector, diff --git a/crates/common/src/raindex_client/orders.rs b/crates/common/src/raindex_client/orders.rs index cafea77881..7d25f9d659 100644 --- a/crates/common/src/raindex_client/orders.rs +++ b/crates/common/src/raindex_client/orders.rs @@ -753,7 +753,7 @@ impl RaindexOrder { Ok(sg_order) } - /// Generates calldata for `IRaindexV6.takeOrders4` targeting this specific order. + /// Generates calldata for `IRaindexV7.takeOrders4` targeting this specific order. /// /// Unlike `getTakeOrdersCalldata` on `RaindexClient` which discovers orders from the subgraph, /// this method generates calldata for taking this single known order that the user has already diff --git a/crates/common/src/raindex_client/remove_orders.rs b/crates/common/src/raindex_client/remove_orders.rs index be9c3b06b9..0a9dc1b5df 100644 --- a/crates/common/src/raindex_client/remove_orders.rs +++ b/crates/common/src/raindex_client/remove_orders.rs @@ -8,7 +8,7 @@ use crate::retry::{retry_with_constant_interval, RetryError}; use crate::utils::timing::Timing; use alloy::primitives::{hex::decode, Bytes, B256}; use alloy::sol_types::{SolCall, SolValue}; -use raindex_bindings::IRaindexV6::{removeOrder3Call, OrderV4}; +use raindex_bindings::IRaindexV7::{removeOrder3Call, OrderV4}; use raindex_subgraph_client::types::order_detail_traits::OrderDetailError; use tracing::{error, info, info_span}; diff --git a/crates/common/src/raindex_client/take_orders/e2e_tests.rs b/crates/common/src/raindex_client/take_orders/e2e_tests.rs index 650ff5e155..ebc5947ea3 100644 --- a/crates/common/src/raindex_client/take_orders/e2e_tests.rs +++ b/crates/common/src/raindex_client/take_orders/e2e_tests.rs @@ -24,7 +24,7 @@ use alloy::serde::WithOtherFields; use alloy::sol_types::SolCall; use httpmock::MockServer; use rain_math_float::Float; -use raindex_bindings::IRaindexV6::{takeOrders4Call, TakeOrdersConfigV5}; +use raindex_bindings::IRaindexV7::{takeOrders4Call, TakeOrdersConfigV5}; use serde_json::json; use std::ops::{Mul, Sub}; diff --git a/crates/common/src/raindex_client/take_orders/mod.rs b/crates/common/src/raindex_client/take_orders/mod.rs index 49de29ec7d..916bcf159b 100644 --- a/crates/common/src/raindex_client/take_orders/mod.rs +++ b/crates/common/src/raindex_client/take_orders/mod.rs @@ -189,7 +189,7 @@ fn log_selected_legs( #[wasm_export] impl RaindexClient { - /// Generates calldata for `IRaindexV6.takeOrders4` using a mode + price-cap policy. + /// Generates calldata for `IRaindexV7.takeOrders4` using a mode + price-cap policy. /// /// This method includes preflight simulation to validate the transaction will succeed /// and automatically removes failing orders from the config. @@ -608,7 +608,7 @@ mod tests { use crate::test_helpers::candidates::make_candidate; use alloy::primitives::{Address, Bytes, FixedBytes, U256}; use rain_math_float::Float; - use raindex_bindings::IRaindexV6::SignedContextV1; + use raindex_bindings::IRaindexV7::SignedContextV1; fn float(value: &str) -> Float { Float::parse(value.to_string()).unwrap() diff --git a/crates/common/src/raindex_client/take_orders/result.rs b/crates/common/src/raindex_client/take_orders/result.rs index 9ddf4419f3..c1ec8080f2 100644 --- a/crates/common/src/raindex_client/take_orders/result.rs +++ b/crates/common/src/raindex_client/take_orders/result.rs @@ -3,7 +3,7 @@ use crate::take_orders::{build_approval_calldata, BuiltTakeOrdersConfig, ParsedT use alloy::primitives::{Address, Bytes}; use alloy::sol_types::SolCall; use rain_math_float::Float; -use raindex_bindings::IRaindexV6::takeOrders4Call; +use raindex_bindings::IRaindexV7::takeOrders4Call; use serde::{Deserialize, Serialize}; use std::ops::{Div, Mul}; use wasm_bindgen_utils::prelude::*; @@ -426,7 +426,7 @@ mod tests { use crate::take_orders::build_take_orders_config_from_simulation; use crate::test_helpers::candidates::make_candidate; use alloy::primitives::U256; - use raindex_bindings::IRaindexV6::takeOrders4Call; + use raindex_bindings::IRaindexV7::takeOrders4Call; use raindex_bindings::IERC20::approveCall; fn high_price_cap() -> Float { diff --git a/crates/common/src/raindex_client/take_orders/single.rs b/crates/common/src/raindex_client/take_orders/single.rs index faa15b0c11..fbdf708f59 100644 --- a/crates/common/src/raindex_client/take_orders/single.rs +++ b/crates/common/src/raindex_client/take_orders/single.rs @@ -9,7 +9,7 @@ use crate::take_orders::{ use alloy::primitives::Address; use rain_math_float::Float; use raindex_bindings::provider::mk_read_provider; -use raindex_bindings::IRaindexV6::OrderV4; +use raindex_bindings::IRaindexV7::OrderV4; use std::ops::{Div, Mul}; #[cfg(target_family = "wasm")] use std::str::FromStr; @@ -654,7 +654,7 @@ mod tests { use crate::raindex_client::tests::{get_test_yaml, CHAIN_ID_1_RAINDEX_ADDRESS}; use alloy::primitives::{b256, Address, Bytes, FixedBytes, U256}; use httpmock::MockServer; - use raindex_bindings::IRaindexV6::SignedContextV1; + use raindex_bindings::IRaindexV7::SignedContextV1; use raindex_subgraph_client::utils::float::F1; use serde_json::json; use std::str::FromStr; diff --git a/crates/common/src/raindex_client/take_orders/single_tests.rs b/crates/common/src/raindex_client/take_orders/single_tests.rs index 2e8fced82c..35ef2801d6 100644 --- a/crates/common/src/raindex_client/take_orders/single_tests.rs +++ b/crates/common/src/raindex_client/take_orders/single_tests.rs @@ -22,7 +22,7 @@ use alloy::serde::WithOtherFields; use alloy::sol_types::SolCall; use httpmock::MockServer; use rain_math_float::Float; -use raindex_bindings::IRaindexV6::takeOrders4Call; +use raindex_bindings::IRaindexV7::takeOrders4Call; use raindex_quote::Pair; use serde_json::json; use std::ops::{Div, Mul}; diff --git a/crates/common/src/raindex_client/vaults.rs b/crates/common/src/raindex_client/vaults.rs index 8ffe6f9167..1183d1a81f 100644 --- a/crates/common/src/raindex_client/vaults.rs +++ b/crates/common/src/raindex_client/vaults.rs @@ -25,7 +25,7 @@ use alloy::{ }; use async_trait::async_trait; use rain_math_float::Float; -use raindex_bindings::{IRaindexV6::deposit4Call, IERC20::approveCall}; +use raindex_bindings::{IRaindexV7::deposit4Call, IERC20::approveCall}; use raindex_subgraph_client::{ performance::vol::{VaultVolume, VolumeDetails}, types::{ @@ -2647,7 +2647,7 @@ mod tests { use alloy::sol_types::SolCall; use httpmock::MockServer; use raindex_bindings::{ - IRaindexV6::{deposit4Call, withdraw4Call}, + IRaindexV7::{deposit4Call, withdraw4Call}, IERC20::{allowanceCall, approveCall}, }; use raindex_subgraph_client::utils::float::*; diff --git a/crates/common/src/raindex_client/vaults_list.rs b/crates/common/src/raindex_client/vaults_list.rs index e202ecfb2c..923afd1b2e 100644 --- a/crates/common/src/raindex_client/vaults_list.rs +++ b/crates/common/src/raindex_client/vaults_list.rs @@ -268,7 +268,7 @@ mod tests { use crate::raindex_client::{tests::get_test_yaml, RaindexClient}; use alloy::{primitives::U256, sol_types::SolCall}; use httpmock::MockServer; - use raindex_bindings::IRaindexV6::withdraw4Call; + use raindex_bindings::IRaindexV7::withdraw4Call; use serde_json::{json, Value}; fn get_vault1_json() -> Value { diff --git a/crates/common/src/raindex_order_builder/order_operations.rs b/crates/common/src/raindex_order_builder/order_operations.rs index 6d8573dc15..4e9743fbf6 100644 --- a/crates/common/src/raindex_order_builder/order_operations.rs +++ b/crates/common/src/raindex_order_builder/order_operations.rs @@ -17,7 +17,7 @@ use raindex_app_settings::{ order::{OrderIOCfg, VaultType}, raindex::RaindexCfg, }; -use raindex_bindings::{IRaindexV6::deposit4Call, Raindex::multicallCall, IERC20::approveCall}; +use raindex_bindings::{IRaindexV7::deposit4Call, Raindex::multicallCall, IERC20::approveCall}; use std::{collections::HashMap, str::FromStr, sync::Arc}; use url::Url; diff --git a/crates/common/src/remove_order.rs b/crates/common/src/remove_order.rs index fdb678a4d8..3322bd5d24 100644 --- a/crates/common/src/remove_order.rs +++ b/crates/common/src/remove_order.rs @@ -5,7 +5,7 @@ use crate::transaction::TransactionArgsError; use crate::write_tx::{execute_write_tx, WriteTransactionError, WriteTransactionStatus}; use alloy::primitives::hex::FromHexError; use alloy::sol_types::SolCall; -use raindex_bindings::IRaindexV6::removeOrder3Call; +use raindex_bindings::IRaindexV7::removeOrder3Call; use raindex_subgraph_client::types::{common::SgOrder, order_detail_traits::OrderDetailError}; use serde::{Deserialize, Serialize}; use thiserror::Error; diff --git a/crates/common/src/take_orders/candidates.rs b/crates/common/src/take_orders/candidates.rs index 164ab71b7b..159947750d 100644 --- a/crates/common/src/take_orders/candidates.rs +++ b/crates/common/src/take_orders/candidates.rs @@ -7,7 +7,7 @@ use crate::utils::timing::Timing; use alloy::primitives::{keccak256, Address, B256}; use alloy::sol_types::SolValue; use rain_math_float::Float; -use raindex_bindings::IRaindexV6::{OrderV4, SignedContextV1}; +use raindex_bindings::IRaindexV7::{OrderV4, SignedContextV1}; use raindex_quote::SignedContextInjector; #[cfg(target_family = "wasm")] use std::str::FromStr; diff --git a/crates/common/src/take_orders/config.rs b/crates/common/src/take_orders/config.rs index c3667dbe66..be29243104 100644 --- a/crates/common/src/take_orders/config.rs +++ b/crates/common/src/take_orders/config.rs @@ -2,7 +2,7 @@ use super::simulation::SimulationResult; use crate::raindex_client::RaindexError; use alloy::primitives::{Bytes, U256}; use rain_math_float::Float; -use raindex_bindings::IRaindexV6::{TakeOrderConfigV4, TakeOrdersConfigV5}; +use raindex_bindings::IRaindexV7::{TakeOrderConfigV4, TakeOrdersConfigV5}; use serde::{Deserialize, Serialize}; use wasm_bindgen_utils::{impl_wasm_traits, prelude::*}; diff --git a/crates/common/src/take_orders/preflight.rs b/crates/common/src/take_orders/preflight.rs index 7d58b8a642..6986324e08 100644 --- a/crates/common/src/take_orders/preflight.rs +++ b/crates/common/src/take_orders/preflight.rs @@ -6,7 +6,7 @@ use alloy::rpc::types::TransactionRequest; use alloy::serde::WithOtherFields; use alloy::sol_types::SolCall; use raindex_bindings::provider::ReadProvider; -use raindex_bindings::IRaindexV6::{takeOrders4Call, TakeOrdersConfigV5}; +use raindex_bindings::IRaindexV7::{takeOrders4Call, TakeOrdersConfigV5}; use raindex_bindings::IERC20::approveCall; use thiserror::Error; use tracing::{debug, info, warn}; @@ -340,7 +340,7 @@ fn single_order_probe_config(config: &TakeOrdersConfigV5, idx: usize) -> TakeOrd #[cfg(test)] mod tests { use super::*; - use raindex_bindings::IRaindexV6::TakeOrderConfigV4; + use raindex_bindings::IRaindexV7::TakeOrderConfigV4; #[test] fn test_preflight_error_display() { @@ -432,7 +432,7 @@ mod local_evm_tests { use crate::erc20::ERC20; use alloy::primitives::B256; use raindex_bindings::provider::mk_read_provider; - use raindex_bindings::IRaindexV6::TakeOrderConfigV4; + use raindex_bindings::IRaindexV7::TakeOrderConfigV4; use raindex_test_fixtures::LocalEvm; use url::Url; @@ -610,9 +610,9 @@ mod local_evm_tests { let provider = mk_read_provider(&[rpc_url]).unwrap(); let fake_order = TakeOrderConfigV4 { - order: raindex_bindings::IRaindexV6::OrderV4 { + order: raindex_bindings::IRaindexV7::OrderV4 { owner: Address::ZERO, - evaluable: raindex_bindings::IRaindexV6::EvaluableV4 { + evaluable: raindex_bindings::IRaindexV7::EvaluableV4 { interpreter: Address::ZERO, store: Address::ZERO, bytecode: Bytes::new(), @@ -667,9 +667,9 @@ mod local_evm_tests { let provider = mk_read_provider(&[rpc_url]).unwrap(); let fake_order = TakeOrderConfigV4 { - order: raindex_bindings::IRaindexV6::OrderV4 { + order: raindex_bindings::IRaindexV7::OrderV4 { owner: Address::ZERO, - evaluable: raindex_bindings::IRaindexV6::EvaluableV4 { + evaluable: raindex_bindings::IRaindexV7::EvaluableV4 { interpreter: Address::ZERO, store: Address::ZERO, bytecode: Bytes::new(), diff --git a/crates/common/src/test_helpers.rs b/crates/common/src/test_helpers.rs index c04cd10485..5df5903a05 100644 --- a/crates/common/src/test_helpers.rs +++ b/crates/common/src/test_helpers.rs @@ -476,7 +476,7 @@ pub mod local_evm { pub mod orders { use alloy::primitives::{Address, U256}; - use raindex_bindings::IRaindexV6::{EvaluableV4, OrderV4, IOV2}; + use raindex_bindings::IRaindexV7::{EvaluableV4, OrderV4, IOV2}; pub fn make_basic_order(input_token: Address, output_token: Address) -> OrderV4 { OrderV4 { @@ -529,7 +529,7 @@ pub mod orders { } use super::super::local_evm::MultiRaindexTestSetup; - use raindex_bindings::IRaindexV6::OrderV4; + use raindex_bindings::IRaindexV7::OrderV4; pub async fn deploy_order_to_raindex( setup: &MultiRaindexTestSetup, diff --git a/crates/common/src/types/orders_list_flattened.rs b/crates/common/src/types/orders_list_flattened.rs index 4b96749810..e789be8e6c 100644 --- a/crates/common/src/types/orders_list_flattened.rs +++ b/crates/common/src/types/orders_list_flattened.rs @@ -2,7 +2,7 @@ use crate::types::vault::NO_SYMBOL; use crate::{csv::TryIntoCsv, utils::timestamp::format_bigint_timestamp_display}; use alloy::dyn_abi::SolType; use alloy::primitives::hex::{decode, encode}; -use raindex_bindings::IRaindexV6::OrderV4; +use raindex_bindings::IRaindexV7::OrderV4; use raindex_subgraph_client::types::common::*; use serde::{Deserialize, Serialize}; @@ -90,7 +90,7 @@ mod tests { primitives::{Address, Bytes, FixedBytes, B256, U256}, sol_types::SolValue, }; - use raindex_bindings::IRaindexV6::{EvaluableV4, OrderV4, IOV2}; + use raindex_bindings::IRaindexV7::{EvaluableV4, OrderV4, IOV2}; use raindex_subgraph_client::types::common::{ SgAddOrder, SgBigInt, SgBytes, SgErc20, SgOrderStructPartialTrade, SgRaindex, SgTransaction, SgVault, diff --git a/crates/common/src/withdraw.rs b/crates/common/src/withdraw.rs index 822bdb94f1..e882252303 100644 --- a/crates/common/src/withdraw.rs +++ b/crates/common/src/withdraw.rs @@ -8,7 +8,7 @@ use alloy::sol_types::SolCall; use serde::{Deserialize, Serialize}; use rain_math_float::Float; -use raindex_bindings::IRaindexV6::withdraw4Call; +use raindex_bindings::IRaindexV7::withdraw4Call; #[derive(Clone, Deserialize, Serialize, Debug)] pub struct WithdrawArgs { diff --git a/crates/integration_tests/src/lib.rs b/crates/integration_tests/src/lib.rs index 0ea5636fda..1df12631b7 100644 --- a/crates/integration_tests/src/lib.rs +++ b/crates/integration_tests/src/lib.rs @@ -231,7 +231,7 @@ amount price: get("amount") 52; /// (`token2`) at a fixed `outputMax = 2`, `IORatio = 1`. The output vault is /// funded with 10 `dai` so the order is fully takeable when live. The owner /// is `from`, which lets us add a second order from a distinct owner for the - /// `clear3` two-party path. + /// `clear4` two-party path. /// /// Returns the on-chain `OrderV4` and its hash (the `AddOrderV3` event's /// `orderHash`, which is exactly what the contract keys `sOrders` on, hence @@ -621,7 +621,7 @@ amount price: 2 1; ); } - /// `clear3` where one side is a dead order is a best-effort no-op: the + /// `clear4` where one side is a dead order is a best-effort no-op: the /// transaction succeeds, the contract emits `OrderNotFound` for the dead /// side and returns early, so neither `ClearV3` nor `AfterClearV2` is /// emitted. This mirrors the on-chain early-return that makes bulk clearing @@ -648,7 +648,7 @@ amount price: 2 1; // Bob's order is the complementary side: he sells eth (token2) for dai // (token1). Built directly so the input/output token pair is the mirror - // of Alice's, satisfying clear3's TokenMismatch check. + // of Alice's, satisfying clear4's TokenMismatch check. let bob_order = OrderV4 { owner: bob, evaluable: alice_order.evaluable.clone(), @@ -674,7 +674,7 @@ amount price: 2 1; .call() .await .expect("orderExists call should succeed"), - "alice's order must be dead before clear3" + "alice's order must be dead before clear4" ); let clear_config = ClearConfigV2 { @@ -689,12 +689,12 @@ amount price: 2 1; let receipt = local_evm .send_transaction( raindex - .clear3(alice_order, bob_order, clear_config, vec![], vec![]) + .clear4(alice_order, bob_order, clear_config, vec![], vec![]) .from(bob) .into_transaction_request(), ) .await - .expect("clear3 against a dead order must succeed, not revert"); + .expect("clear4 against a dead order must succeed, not revert"); let (order_not_found, _take_order, clear, after_clear) = count_outcome_events(&receipt); assert_eq!(order_not_found, 1, "exactly one OrderNotFound expected"); diff --git a/crates/js_api/src/bindings/mod.rs b/crates/js_api/src/bindings/mod.rs index 4a4f7d0c3b..2ea17b835a 100644 --- a/crates/js_api/src/bindings/mod.rs +++ b/crates/js_api/src/bindings/mod.rs @@ -8,7 +8,7 @@ use alloy::{ }, sol_types::SolCall, }; -use raindex_bindings::IRaindexV6::{takeOrders4Call, OrderV4, TakeOrdersConfigV5}; +use raindex_bindings::IRaindexV7::{takeOrders4Call, OrderV4, TakeOrdersConfigV5}; use serde::{Deserialize, Serialize}; use wasm_bindgen_utils::{impl_wasm_traits, prelude::*}; diff --git a/crates/quote/ARCHITECTURE.md b/crates/quote/ARCHITECTURE.md index e0449ea7b9..bb4426953e 100644 --- a/crates/quote/ARCHITECTURE.md +++ b/crates/quote/ARCHITECTURE.md @@ -4,7 +4,7 @@ This crate provides all functionality to quote Rain Raindex orders from Rust, expose the API to WASM/TypeScript, and ship a small CLI for ad‑hoc quoting and debugging. It stitches together three external systems: -- On‑chain Raindex V6 contracts (`IRaindexV6`) via JSON‑RPC +- On‑chain Raindex contracts (`IRaindexV7`) via JSON‑RPC - The Raindex subgraph for fetching order details by id - Rain error decoding to turn revert data into human readable errors @@ -275,7 +275,7 @@ call, collecting interpreter traces, and decoding any revert reason. - `alloy` primitives and `sol_types`: ABI encode/decode, EVM types, and contract call modeling. -- `raindex_bindings`: contract bindings (`IRaindexV6`, provider helpers like +- `raindex_bindings`: contract bindings (`IRaindexV7`, provider helpers like `mk_read_provider`, which builds an alloy provider with fallback across multiple HTTP RPCs). - `raindex_subgraph_client`: GraphQL client and types; provides `order_detail` diff --git a/crates/quote/src/cli/input.rs b/crates/quote/src/cli/input.rs index e116bc1f22..7102031c71 100644 --- a/crates/quote/src/cli/input.rs +++ b/crates/quote/src/cli/input.rs @@ -5,7 +5,7 @@ use alloy::primitives::{ }; use alloy::sol_types::SolType; use clap::Args; -use raindex_bindings::IRaindexV6::{OrderV4, QuoteV2}; +use raindex_bindings::IRaindexV7::{OrderV4, QuoteV2}; use std::str::FromStr; /// Group of valid input formats @@ -202,7 +202,7 @@ mod tests { use super::*; use alloy::primitives::hex::encode_prefixed; use alloy::sol_types::SolValue; - use raindex_bindings::IRaindexV6::{EvaluableV4, OrderV4}; + use raindex_bindings::IRaindexV7::{EvaluableV4, OrderV4}; #[test] fn test_parse_input() { diff --git a/crates/quote/src/cli/mod.rs b/crates/quote/src/cli/mod.rs index 1cd1d8537b..03f7ba2f52 100644 --- a/crates/quote/src/cli/mod.rs +++ b/crates/quote/src/cli/mod.rs @@ -154,7 +154,7 @@ mod tests { use clap::CommandFactory; use httpmock::{Method::POST, MockServer}; use rain_math_float::Float; - use raindex_bindings::IRaindexV6::{quote2Call, quote2Return, OrderV4, IOV2}; + use raindex_bindings::IRaindexV7::{quote2Call, quote2Return, OrderV4, IOV2}; use serde_json::json; use std::{fs::read_to_string, str::FromStr}; use tempfile::NamedTempFile; diff --git a/crates/quote/src/injector.rs b/crates/quote/src/injector.rs index 904584ebe2..52c2708ea4 100644 --- a/crates/quote/src/injector.rs +++ b/crates/quote/src/injector.rs @@ -1,6 +1,6 @@ use alloy::primitives::Address; use async_trait::async_trait; -use raindex_bindings::IRaindexV6::{OrderV4, SignedContextV1}; +use raindex_bindings::IRaindexV7::{OrderV4, SignedContextV1}; /// Caller-supplied source of additional `SignedContextV1` entries for each /// order candidate. Invoked during candidate building, after any oracle-URL diff --git a/crates/quote/src/oracle.rs b/crates/quote/src/oracle.rs index b295ba9931..932ad72780 100644 --- a/crates/quote/src/oracle.rs +++ b/crates/quote/src/oracle.rs @@ -2,7 +2,7 @@ use alloy::primitives::{Address, Bytes, FixedBytes, U256}; use alloy::sol_types::SolValue; use futures::{stream::FuturesUnordered, StreamExt}; use once_cell::sync::{Lazy, OnceCell}; -use raindex_bindings::IRaindexV6::{OrderV4, SignedContextV1}; +use raindex_bindings::IRaindexV7::{OrderV4, SignedContextV1}; use raindex_subgraph_client::types::common::SgOrder; use reqwest::Client; use serde::de::DeserializeOwned; @@ -483,7 +483,7 @@ mod tests { use alloy::primitives::{address, FixedBytes}; #[cfg(not(target_family = "wasm"))] use httpmock::{Method::POST, MockServer}; - use raindex_bindings::IRaindexV6::{EvaluableV4, OrderV4, IOV2}; + use raindex_bindings::IRaindexV7::{EvaluableV4, OrderV4, IOV2}; #[cfg(not(target_family = "wasm"))] use serde_json::json; use std::sync::{ diff --git a/crates/quote/src/order_quotes.rs b/crates/quote/src/order_quotes.rs index 9ea8f70205..aea2c93d33 100644 --- a/crates/quote/src/order_quotes.rs +++ b/crates/quote/src/order_quotes.rs @@ -12,7 +12,7 @@ use crate::{ use alloy::primitives::{Address, U256}; use alloy::providers::Provider; use raindex_bindings::provider::mk_read_provider; -use raindex_bindings::IRaindexV6::{OrderV4, QuoteV2, SignedContextV1}; +use raindex_bindings::IRaindexV7::{OrderV4, QuoteV2, SignedContextV1}; use raindex_subgraph_client::types::common::SgOrder; use serde::{Deserialize, Serialize}; use std::{collections::HashMap, str::FromStr}; @@ -1243,8 +1243,8 @@ amount price: 2 3; .iter() .map(|(output_max, ratio)| { Bytes::from( - raindex_bindings::IRaindexV6::quote2Call::abi_encode_returns( - &raindex_bindings::IRaindexV6::quote2Return { + raindex_bindings::IRaindexV7::quote2Call::abi_encode_returns( + &raindex_bindings::IRaindexV7::quote2Return { exists: true, outputMax: output_max.get_inner(), ioRatio: ratio.get_inner(), @@ -1254,7 +1254,7 @@ amount price: 2 3; }) .collect::>(); let expected_oracle_quote_call = Bytes::from( - raindex_bindings::IRaindexV6::quote2Call { + raindex_bindings::IRaindexV7::quote2Call { quoteConfig: QuoteV2 { order: order_struct.clone(), inputIOIndex: U256::ZERO, @@ -1265,7 +1265,7 @@ amount price: 2 3; .abi_encode(), ); let expected_plain_quote_call = Bytes::from( - raindex_bindings::IRaindexV6::quote2Call { + raindex_bindings::IRaindexV7::quote2Call { quoteConfig: QuoteV2 { order: order_struct.clone(), inputIOIndex: U256::ZERO, @@ -1276,7 +1276,7 @@ amount price: 2 3; .abi_encode(), ); let expected_second_plain_quote_call = Bytes::from( - raindex_bindings::IRaindexV6::quote2Call { + raindex_bindings::IRaindexV7::quote2Call { quoteConfig: QuoteV2 { order: order_struct, inputIOIndex: U256::from(1), diff --git a/crates/quote/src/quote.rs b/crates/quote/src/quote.rs index 048e4cfa22..257d86b2ac 100644 --- a/crates/quote/src/quote.rs +++ b/crates/quote/src/quote.rs @@ -13,7 +13,7 @@ use url::Url; use wasm_bindgen_utils::{add_ts_content, impl_wasm_traits, prelude::*}; use rain_math_float::Float; -use raindex_bindings::IRaindexV6::{quote2Return, OrderV4, QuoteV2, SignedContextV1}; +use raindex_bindings::IRaindexV7::{quote2Return, OrderV4, QuoteV2, SignedContextV1}; use raindex_subgraph_client::{ types::{common::SgBytes, Id}, utils::make_order_id, @@ -316,7 +316,7 @@ mod tests { use alloy::sol_types::{SolCall, SolValue}; use httpmock::{Method::POST, MockServer}; use rain_error_decoding::AbiDecodedErrorType; - use raindex_bindings::IRaindexV6::{quote2Call, QuoteV2, IOV2}; + use raindex_bindings::IRaindexV7::{quote2Call, QuoteV2, IOV2}; use raindex_subgraph_client::RaindexSubgraphClientError; use serde_json::{json, Value}; diff --git a/crates/quote/src/quote_debug.rs b/crates/quote/src/quote_debug.rs index 619804c414..92d9568862 100644 --- a/crates/quote/src/quote_debug.rs +++ b/crates/quote/src/quote_debug.rs @@ -7,7 +7,7 @@ use rain_interpreter_eval::{ fork::{Forker, NewForkedEvm}, trace::{RainEvalResult, RainEvalResultFromRawCallResultError}, }; -use raindex_bindings::IRaindexV6::quote2Call; +use raindex_bindings::IRaindexV7::quote2Call; use url::Url; pub struct NewQuoteDebugger { @@ -89,7 +89,7 @@ mod tests { use alloy::sol_types::{SolCall, SolValue}; use httpmock::MockServer; use raindex_app_settings::spec_version::SpecVersion; - use raindex_bindings::IRaindexV6::{OrderV4, QuoteV2}; + use raindex_bindings::IRaindexV7::{OrderV4, QuoteV2}; use raindex_common::add_order::AddOrderArgs; use raindex_common::dotrain_order::DotrainOrder; use raindex_test_fixtures::LocalEvm; diff --git a/crates/quote/src/rpc.rs b/crates/quote/src/rpc.rs index bf76f8a4ab..7ec1f7c94e 100644 --- a/crates/quote/src/rpc.rs +++ b/crates/quote/src/rpc.rs @@ -15,7 +15,7 @@ use alloy::{ use futures::future::join_all; use rain_error_decoding::{AbiDecodedErrorType, ErrorRegistry}; use raindex_bindings::provider::{mk_read_provider, ReadProvider}; -use raindex_bindings::IRaindexV6::quote2Call; +use raindex_bindings::IRaindexV7::quote2Call; use raindex_bindings::Raindex::multicallCall; #[cfg(not(target_family = "wasm"))] use std::future::Future; @@ -526,7 +526,7 @@ mod tests { use httpmock::{Method::POST, MockServer}; use rain_error_decoding::ErrorRegistry; use rain_math_float::Float; - use raindex_bindings::IRaindexV6::{quote2Call, quote2Return}; + use raindex_bindings::IRaindexV7::{quote2Call, quote2Return}; use serde_json::json; #[test] @@ -1119,7 +1119,7 @@ mod tests { // --------------------------------------------------------------------- use alloy::primitives::U256; - use raindex_bindings::IRaindexV6::QuoteV2; + use raindex_bindings::IRaindexV7::QuoteV2; // Build a `QuoteTarget` with a specific raindex address and a distinctive // `inputIOIndex`. The index is ABI-encoded into the inner `quote2` calldata, diff --git a/crates/subgraph/src/types/order_detail_traits.rs b/crates/subgraph/src/types/order_detail_traits.rs index 915f4cb192..25d347efe5 100644 --- a/crates/subgraph/src/types/order_detail_traits.rs +++ b/crates/subgraph/src/types/order_detail_traits.rs @@ -5,7 +5,7 @@ use alloy::primitives::{ Address, B256, }; use alloy::sol_types::SolValue; -use raindex_bindings::IRaindexV6::{OrderV4, IOV2}; +use raindex_bindings::IRaindexV7::{OrderV4, IOV2}; use std::{num::TryFromIntError, str::FromStr}; use thiserror::Error; @@ -49,7 +49,7 @@ impl TryFrom for OrderV4 { mod tests { use alloy::hex; use alloy::primitives::{bytes, B256}; - use raindex_bindings::IRaindexV6::EvaluableV4; + use raindex_bindings::IRaindexV7::EvaluableV4; use std::vec; use super::*; diff --git a/crates/test_fixtures/abis/RaindexV6.json b/crates/test_fixtures/abis/RaindexV6.json index 0c624486ec..11d69cb74c 100644 --- a/crates/test_fixtures/abis/RaindexV6.json +++ b/crates/test_fixtures/abis/RaindexV6.json @@ -145,7 +145,7 @@ }, { "type": "function", - "name": "clear3", + "name": "clear4", "inputs": [ { "name": "aliceOrder", @@ -2362,7 +2362,7 @@ } ], "bytecode": { - "object": "0x6080806040523460395760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055615120908161003e8239f35b5f80fdfe6080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a7146117cc575080631f69cb751461156f5780632cb77e9f146115435780632fbc4ba0146113f957806341d1514f146113c25780635cffe9de1461126657806360746119146110e2578063613255ab1461105f57806369c7285614610771578063709fb8a5146104375780639235084d146103e3578063ac9650d814610295578063d7e442ec14610237578063d9d98ce4146101865763fa501182146100c1575f80fd5b34610182576101403660031901126101825767ffffffffffffffff600435818111610182576100f4903690600401611b61565b6024358281116101825761010c903690600401611b61565b60c0366043190112610182576101043583811161018257610131903690600401611d07565b90610124359384116101825761014e61015c943690600401611d07565b926101576126cb565b612211565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b5f80fd5b34610182576040366003190112610182576001600160a01b036101a7611850565b166040516370a0823160e01b8152306004820152602081602481855afa90811561022c575f916101fa575b50156101e25760206040515f8152f35b60249060405190633c5bf76960e21b82526004820152fd5b90506020813d602011610224575b81610215602093836119d0565b810103126101825751826101d2565b3d9150610208565b6040513d5f823e3d90fd5b346101825760203660031901126101825760043567ffffffffffffffff81116101825761028f61026e61015c92369060040161181f565b91906102786126cb565b60405192610285846119b4565b5f84523691611ddb565b90612b63565b34610182576020806003193601126101825760043567ffffffffffffffff8111610182576102c790369060040161181f565b9190604051926102d6846119b4565b5f84528284016102e582611ab4565b946102f360405196876119d0565b8286526102ff83611ab4565b9361031186880195601f1901866121f5565b5f5b84811061037557604080518881528951818a018190525f92600582901b83018101918a918c9085015b8287106103495785850386f35b909192938280610365600193603f198a820301865288516118dc565b960192019601959291909261033c565b806103c4886103be61039160019560059d9c9d1b8701876120f1565b929089846040519586938585013782018381015f81528b519283915e015f838201520380845201826119d0565b30613990565b6103ce828a611fd7565b526103d98189611fd7565b5001969596610313565b3461018257600319602036820112610182576004359067ffffffffffffffff821161018257608090823603011261018257610422606091600401612139565b90604051921515835260208301526040820152f35b34610182576003196040368201126101825760043567ffffffffffffffff8082116101825760c082600401938336030112610182576024359081116101825761048490369060040161181f565b9061048d6126cb565b6104be6104b96104b46104ad6104a38880612124565b60408101906120f1565b36916119f2565b613926565b61397b565b801561075f576001101561074d57602483016104da8186611f44565b90501561073b5760448401946104f08682611f44565b9050156107295761055661051e9661054a61051561050e8580612124565b9585611f44565b99909285611f44565b91909261053b6040519761053189611900565b3389523690611a56565b9a60209b8c8901523691611acc565b60408601523691611acc565b60608301526064850135608083015261056e8261270d565b91825f525f875260405f209586541596876105b2575b888860017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055604051908152f35b6001905560a46001600160a01b03917f87491344dfbcf91f6cbbc610cbbeedc85313d37a02df0c93527f7ea5f8db717f83855116604051908152878c8201526060604082015280610606606082018861203f565b0390a1019161061583856120f1565b9050610679575b5050505061066d929161066561064e61028f933390919060405192600284526020840152604083015260608201604052565b906040519160018352602083015260408201604052565b923691611ddb565b82808080808080610584565b6106866104ad84866120f1565b61068f81614717565b156107025750937fd46c2c56b35c8210e9e712ec3f02242d5fc90187c0ac8ed80cc33626846ec3698961066d9897956106f56106d86106659761064e9761028f9b5116936120f1565b866040519586958652850152606060408501526060840191611d36565b0390a1938395965061061c565b89610725604051928392630c89984b60e31b8452600484015260248301906118dc565b0390fd5b60405163540e5f0b60e01b8152600490fd5b604051636c44ef8f60e01b8152600490fd5b604051633c8270bd60e21b8152600490fd5b604051632cff108b60e21b8152600490fd5b34610182576003196020368201126101825767ffffffffffffffff600435116101825760c09060043536030112610182576107aa6126cb565b5f80806107bf60048035608481019101611e8d565b90501561104d5760246004350135926107d784612772565b1561103b576060806040516107eb81611968565b6107f3611ee2565b81525f60208201525f6040820152015261080b611ee2565b5061086b61086661084561083b61083561082f608460043501600435600401611e8d565b90611f14565b80611f2f565b6040810190611f44565b602061085e61082f608460043501600435600401611e8d565b013591611f7a565b611d22565b936001600160a01b036108ba6108666108a161089761083561082f608460043501600435600401611e8d565b6060810190611f44565b604061085e61082f608460043501600435600401611e8d565b81604051976108c889611930565b16875216602086015260408501526108ea608460043501600435600401611e8d565b9490506001604051950160051b85016040525f905f5b610914608460043501600435600401611e8d565b9050811080611028575b15610e7557610937608460043501600435600401611e8d565b821015610e61578160051b810135607e1982360301811215610182576080818301360312610182576040519161096c83611968565b8181013567ffffffffffffffff81116101825761098e90369084840101611b61565b835280820160208181013590850152604080820135908501526060013567ffffffffffffffff8111610182576109c79236920101611d07565b606082015280516001600160a01b036109e96040830151602085015190611fd7565b5151166001600160a01b0385511614801590610e2d575b610e1b57610a1860208301516040840151908361305c565b610a218161270d565b91825f525f60205260405f2054155f14610a85575051604080513381526001600160a01b039092166020830152810191909152600191907fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f390606090a15b01610900565b9190610ab6602084979597015160408501519060608601519060405192610aab846119b4565b5f8452339186613091565b925f93610ace60608201516044600435013590612795565b15610b3557505051604080513381526001600160a01b03909216602083015281019190915260019291907fe3151dc8cb7a54ffc4baabd28c1f241c94d510b5e5b502491ac3cad6c16316d590606090a15b8115610b2d575b5092610a7f565b905088610b26565b610b426040820151612772565b158015610e08575b15610b9f57505051604080513381526001600160a01b03909216602083015281019190915260019291907f500b713857325f9e6dcb52ae832eca9109d107ed1aae9cb4928b4c1e13f051aa90606090a1610b1f565b9250925050600196959691610bb8606460043501611feb565b15610d755796610c2897610c3860408401516040880151610bd98183613400565b15610d6d5750925b610c32848592610c1b610c1560608a01516001600160e01b03601b918660e01d92828816810b928260e01d9216900b613dd0565b90613f8b565b9d8e9260408d01516134cb565b60408c01526134f5565b996134f5565b98610c43848461351f565b610c4d848261357d565b60405192338452608060208501526060610c73845160808088015261010087019061203f565b93602081015160a0870152604081015160c0870152015192607f198582030160e0860152835180825260208201906020808260051b8501019601925f5b828110610d0f57505050505092806001979695937f194f1feb3b4d7076a2c272e774e792e0c48bb8c7aa1a9a3671c1cd6da9e6b4c193610d0a96604084015260608301520390a180858c5101808d5260051b8c015261368f565b610b1f565b9091929396602080610d60600193601f198782030189528b51906001600160a01b0382511681526040610d4f8584015160608785015260608401906120be565b9201519060408184039101526118dc565b9901950193929101610cb0565b905092610be1565b610c2890610c386060840151610c32610db3610c1560408801516001600160e01b0394601b90868360e01d9316820b91878260e01d9216900b613dd0565b60408a0151610dc28183613400565b15610e005750915b829c8d916060890151908116155f14610df1575060408801515b96879460408d01516134cb565b610dfb9085613427565b610de4565b905091610dca565b50610e1660608201516133dd565b610b4a565b60405163936bb5ad60e01b8152600490fd5b506001600160a01b03610e496060830151604085015190611fd7565b5151166001600160a01b036020860151161415610a00565b634e487b7160e01b5f52603260045260245ffd5b50919390610e87606460043501611feb565b1561102257835b6004356004013590610ea08282613400565b6110045750508490610ec0856001600160a01b0360208701511633612ff3565b505060a46004350190610ed8826004356004016120f1565b905015159081610ffc575b50610f5b575b506001600160a01b03610eff92935116336127bc565b50505b8351811015610f275780610f21610f1b60019387611fd7565b51613868565b01610f02565b5060409160017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005582519182526020820152f35b90506001600160a01b03602084015116610f856001600160a01b03855116926004356004016120f1565b929091333b1561018257610fcd5f93604051958694859463691f9ed760e01b8652600486015260248501528960448501528a606485015260a0608485015260a4840191611d36565b038183335af190811561022c57859115610ee9579050610fed9150611984565b5f836001600160a01b03610ee9565b905088610ee3565b604492506040519163573b6f4160e01b835260048301526024820152fd5b84610e8e565b506110366040830151612772565b61091e565b60405163315f9e2360e21b8152600490fd5b604051639c95219f60e01b8152600490fd5b3461018257602080600319360112610182576024816001600160a01b03611084611850565b16604051928380926370a0823160e01b82523060048301525afa90811561022c575f916110b5575b50604051908152f35b90508181813d83116110db575b6110cc81836119d0565b810103126101825751826110ac565b503d6110c2565b34610182576110f036611890565b92916110fd9491946126cb565b61110883833361273e565b61111181612772565b15611235578160ff91611129856111ec969533612d26565b6111338183613400565b1561122f575080935b61114885828533612f95565b917f8045c25080b0868951141ed0a91720bcad09a8364a2b3109ee1fd49c1f0bc8b860c0611177898833612ff3565b97906001600160a01b0360405192338452169a8b6020840152856040840152886060840152608083015260a0820152a16040519660068852602088015260408701526060860152608085015260a08401521660c082015260e08101604052906040519160018352602083015260408201604052565b90806112185760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b6112279261028f913691611ddb565b80808061015c565b9361113c565b50604051623a3a4d60e21b81523360048201526001600160a01b039190911660248201526044810191909152606490fd5b34610182576080366003190112610182576004356001600160a01b039081811680910361018257611295611866565b6044359167ffffffffffffffff916064358381116101825736602382011215610182578060040135938411610182573660248583010111610182576113229560209216936112e4868587612eb6565b60405196879283926323e30c8b60e01b84523360048501528760248501528860448501525f606485015260a06084850152602460a485019201611d36565b03815f855af193841561022c575f9461138e575b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd984036113755761136a93503091612f2f565b602060405160018152f35b604051630b6c58a960e31b815260048101859052602490fd5b9093506020813d6020116113ba575b816113aa602093836119d0565b8101031261018257519284611336565b3d915061139d565b346101825760603660031901126101825760206113f16113e0611850565b6113e8611866565b60443591612d26565b604051908152f35b346101825761140736611890565b928094926114136126cb565b61141e82853361273e565b61142781612772565b15611513578061143b61148a9286336127bc565b9790957f7f9dfa19cf1cc2f806f2f860fbc9c056b601fb1afc0e9b843dfe5c63616268e660806040513381526001600160a01b038416998a60208301528560408301526060820152a133612862565b939091856114b85760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b6115079661028f956106659460ff93604051956005875260208701526040860152606085015260808401521660a082015260c08101604052906040519160018352602083015260408201604052565b8080808080808061015c565b506040516306dde9c360e41b81523360048201526001600160a01b03841660248201526044810191909152606490fd5b34610182576020366003190112610182576004355f525f6020526020600160405f205414604051908152f35b34610182576003196040368201126101825767ffffffffffffffff9060043582811161018257806004019160a08236039182011261018257602435848111610182576115bf90369060040161181f565b90936115c96126cb565b5f946001600160a01b0394856115de84611d22565b1633036117aa576115f76115f23685611b61565b61270d565b805f525f60205260405f2096600188541461163e575b60208960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556040519015158152f35b9091929394959697505f6001985560405196338852826020890152606060408901528161166a8761187c565b166060890152602484013590606219018112156101825783019060a06080890152806116986004840161187c565b166101008901526116ab6024830161187c565b16610120880152604481013560221982360301811215610182570190602460048301359201988211610182578136038913610182577f09d18501db0080ca2d6cd7c17fa7255daff4b2d503ea93b76ff68b6752ea8e63878061066595608461177361028f9a60209f6117329061179d9f9a606061014061064e9d0152610160880191611d36565b6117646117596117456044880185611d56565b605f198a8603810160a08c01529491611d8b565b926064870190611d56565b918784030160c0880152611d8b565b91013560e08301520390a13390919060405192600284526020840152604083015260608201604052565b828080808080808061160d565b6024866117b685611d22565b6040516335252be360e01b815291166004820152fd5b34610182576020366003190112610182576004359063ffffffff60e01b82168092036101825760209163e414309160e01b811490811561180e575b5015158152f35b6301ffc9a760e01b14905083611807565b9181601f840112156101825782359167ffffffffffffffff8311610182576020808501948460051b01011161018257565b600435906001600160a01b038216820361018257565b602435906001600160a01b038216820361018257565b35906001600160a01b038216820361018257565b906080600319830112610182576004356001600160a01b0381168103610182579160243591604435916064359067ffffffffffffffff8211610182576118d89160040161181f565b9091565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b60a0810190811067ffffffffffffffff82111761191c57604052565b634e487b7160e01b5f52604160045260245ffd5b6060810190811067ffffffffffffffff82111761191c57604052565b6040810190811067ffffffffffffffff82111761191c57604052565b6080810190811067ffffffffffffffff82111761191c57604052565b67ffffffffffffffff811161191c57604052565b60e0810190811067ffffffffffffffff82111761191c57604052565b6020810190811067ffffffffffffffff82111761191c57604052565b90601f8019910116810190811067ffffffffffffffff82111761191c57604052565b92919267ffffffffffffffff821161191c5760405191611a1c601f8201601f1916602001846119d0565b829481845281830111610182578281602093845f960137010152565b9080601f8301121561018257816020611a53933591016119f2565b90565b91906060838203126101825760405190611a6f82611930565b8193611a7a8161187c565b8352611a886020820161187c565b602084015260408101359167ffffffffffffffff831161018257604092611aaf9201611a38565b910152565b67ffffffffffffffff811161191c5760051b60200190565b929192611ad882611ab4565b604092611ae860405192836119d0565b819581835260208093019160061b84019381851161018257915b848310611b1157505050505050565b8583830312610182578386918251611b288161194c565b611b318661187c565b81528286013583820152815201920191611b02565b9080601f8301121561018257816020611a5393359101611acc565b91909160a0818403126101825760405190611b7b82611900565b8193611b868261187c565b835267ffffffffffffffff9160208101358381116101825782611baa918301611a56565b602085015260408101358381116101825782611bc7918301611b46565b6040850152606081013592831161018257611be86080939284938301611b46565b60608501520135910152565b909291611c0084611ab4565b916040611c1060405194856119d0565b839580855260208095019160059160051b8401948086116101825784935b868510611c3f575050505050505050565b67ffffffffffffffff90853582811161018257870190606082850312610182578451611c6a81611930565b611c738361187c565b81528a83013584811161018257830185601f8201121561018257803590611c9982611ab4565b91611ca6895193846119d0565b8083528d808401918b1b83010191888311610182578e809101915b838310611cf757509150508201528583013593841161018257611ce8858c95869501611a38565b86820152815201940193611c2e565b82358152918101918f9101611cc1565b9080601f8301121561018257816020611a5393359101611bf4565b356001600160a01b03811681036101825790565b908060209392818452848401375f828201840152601f01601f1916010190565b9035601e198236030181121561018257016020813591019167ffffffffffffffff8211610182578160061b3603831361018257565b9190808252602080920192915f905b828210611da8575050505090565b909192936001906001600160a01b03611dc08761187c565b16815285830135838201526040908101950193920190611d9a565b90929192611de881611ab4565b91604091611df960405194856119d0565b839581855260208095019160051b8301938185116101825783925b858410611e245750505050505050565b67ffffffffffffffff908435828111610182578601908382860312610182578351611e4e8161194c565b82358481116101825786611e63918501611a56565b81528983013593841161018257611e7e868b95869501611d07565b83820152815201930192611e14565b903590601e1981360301821215610182570180359067ffffffffffffffff821161018257602001918160051b3603831361018257565b60405190611ed082611930565b60606040835f81525f60208201520152565b60405190611eef82611900565b5f608083828152611efe611ec3565b6020820152606060408201526060808201520152565b9015610e6157803590607e1981360301821215610182570190565b903590609e1981360301821215610182570190565b903590601e1981360301821215610182570180359067ffffffffffffffff821161018257602001918160061b3603831361018257565b9190811015610e615760061b0190565b805115610e615760200190565b805160011015610e615760400190565b805160021015610e615760600190565b805160031015610e615760800190565b805160041015610e615760a00190565b8051821015610e615760209160051b010190565b3580151581036101825790565b9081518082526020808093019301915f5b828110612017575050505090565b835180516001600160a01b031686528201518583015260409094019392810192600101612009565b906080806120b56120a361209160406001600160a01b0380895116885260208901519060a060208a01528082511660a08a015260208201511660c08901520151606060e08801526101008701906118dc565b60408701518682036040880152611ff8565b60608601518582036060870152611ff8565b93015191015290565b9081518082526020808093019301915f5b8281106120dd575050505090565b8351855293810193928101926001016120cf565b903590601e1981360301821215610182570180359067ffffffffffffffff82116101825760200191813603831361018257565b903590605e1981360301821215610182570190565b6121506115f26121498380611f2f565b3690611b61565b5f525f602052600160405f2054036121ec5780612170816121dc93611f2f565b6121d461218f6121946020850135938460408701359384923690611b61565b61305c565b6121ac6121a18580611f2f565b946060810190611e8d565b92906121cc604051966121be886119b4565b5f88525f3681373690611b61565b933691611bf4565b923392613091565b6040810151606090910151600192565b505f905f905f90565b5f5b82811061220357505050565b6060828201526020016121f7565b926001600160a01b038451166001600160a01b03835116146126b9576001600160a01b03612246606086015160643590611fd7565b515116906040830151916001600160a01b036122656084358095611fd7565b51511614801590612679575b610e1b576040850151906001600160a01b036122906044358094611fd7565b5151166001600160a01b036122ab60643560608a0151611fd7565b51511614612667576122bc8661270d565b805f525f60205260405f20541561261457506122d78461270d565b805f525f60205260405f2054156125c057506123ba9291612394917f6fa7f4c28634b0a9d6831401c45ae468195fb63aed07308935c35374ff5d9e396040518061233f61233161012033845280602085015283018d61203f565b82810360408401528a61203f565b85606083015260643560808301528760a083015260a43560c083015260c43560e083015260e4356101008301520390a16001600160a01b0386511660405192612387846119b4565b5f8452606435908a613091565b936001600160a01b03865116604051926123ad846119b4565b5f845260a4359086613091565b916123c86040820151612772565b1580156125ac575b8015612599575b8015612586575b61257457604051916123ef83611968565b5f83525f60208401525f60408401525f606084015261240e848361473b565b84526040840152612434612422838661473b565b602086015280606086015284516134cb565b9461244860208501516040860151906134cb565b93612452876133dd565b8015612565575b6125535761251a61254c957fd9fa84dd790c969daa5c33d8050dc06b4a9b59d5b42e2be5f5e8ae20447f618d946124fc6125519a60a09661249b8a885161351f565b6124a98c602089015161351f565b6124b78a604089015161357d565b6124c58c606089015161357d565b6124ce8a613868565b6124d78c613868565b6001600160a01b036124f360c435926060606435910151611fd7565b51511633612862565b50506001600160a01b036124f360e43592606060a435910151611fd7565b5050606060405191338352805160208401526020810151604084015260408101518284015201516080820152a161368f565b61368f565b565b604051630d86822160e01b8152600490fd5b5061256f856133dd565b612459565b6040516321badf1f60e01b8152600490fd5b5061259460608401516133dd565b6123de565b506125a760608201516133dd565b6123d7565b506125ba6040840151612772565b156123d0565b9351604080513381526001600160a01b039092166020830152810194909452507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f3945091925082915050606081015b0390a1565b9551604080513381526001600160a01b039092166020830152810196909652507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f39493508392505060608201905061260f565b604051631cd2f1c760e21b8152600490fd5b506001600160a01b03612693606085015160a43590611fd7565b5151166001600160a01b036126af604088015160443590611fd7565b5151161415612271565b604051630a98f1f360e21b8152600490fd5b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0060028154146126fb5760029055565b604051633ee5aeb560e01b8152600490fd5b6040516127388161272a602082019460208652604083019061203f565b03601f1981018352826119d0565b51902090565b909115612749575050565b6040516305dbdfd960e41b81526001600160a01b03918216600482015291166024820152604490fd5b612791905f60e01d906001600160e01b038160e01d9116601b0b61479e565b1290565b90612791916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b61481f565b9291926127c882613a63565b936127d2816133dd565b6128505784816001600160e01b036127f19360e01d9116601b0b61489e565b9290809315612827575b5082908161280b575b5050509190565b61281f926001600160a01b03309216612f2f565b5f8181612804565b9092505f19811461283c57600101915f6127fb565b634e487b7160e01b5f52601160045260245ffd5b604051632eaefac360e21b8152600490fd5b9392919361286f836133dd565b61290d578461288b57612883939450612ff3565b50505f905f90565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f5281526128c8835f205494856134f5565b956128d2876133dd565b6128f5575f97885260018252838820908852815282872091875252909320829055565b835163c5e12af560e01b815260048101889052602490fd5b60405163793a8f5560e01b815260048101849052602490fd5b919060408382031261018257825167ffffffffffffffff908181116101825784019082601f8301121561018257815160209261296182611ab4565b9161296f60405193846119d0565b808352848084019160051b830101918683116101825785809101915b8383106129fe5750505050948281015191821161018257019180601f840112156101825782516129ba81611ab4565b936129c860405195866119d0565b818552838086019260051b820101928311610182578301905b8282106129ef575050505090565b815181529083019083016129e1565b825181529181019186910161298b565b90808251908181526020809101926020808460051b8301019501935f915b848310612a3c5750505050505090565b9091929394958480612a5a600193601f198682030187528a516120be565b9801930193019194939290612a2c565b91906020928381526001600160a01b0382511684820152838201516040820152612aa4604083015160e060608401526101008301906118dc565b9060608301516080820152612acb608084015192601f1993848483030160a0850152612a0e565b9260a081015193838382030160c08401528680865192838152019501905f5b818110612b0e57505050611a5394955060c060e091015192828503019101526120be565b825187529588019591880191600101612aea565b90604082019082526020606081936040838201528551809452019301915f5b828110612b4f575050505090565b835185529381019392810192600101612b41565b919091335f526020308152604091825f2091835195612b818761194c565b612b89611ec3565b875260608281980152845190612b9e826119b4565b5f8252855190612bad826119b4565b5f82525f3681375f5b8151811015612d1a57898688612bcc8486611fd7565b51888151948d80870151908151612bee575b5050505050505050600101612bb6565b905f92916001600160a01b0396612c138887818d51169c015116998789015190613b42565b95825199612c208b611998565b8a5289015287015285015260808401528760a08401528660c08401525f8c51809563d04dfe2360e01b82528180612c5b600498898301612a6a565b03915afa938415612d10579089915f95612cea575b508451612c86575b50899250808e8c938e612bde565b5101511691823b1561018257612cb4925f92838d5180968195829463012c676d60e21b845233908401612b22565b03925af18015612ce0579060019291612cd1575b81928782612c78565b612cda90611984565b5f612cc8565b89513d5f823e3d90fd5b612d079195503d805f833e612cff81836119d0565b810190612926565b9050935f612c70565b8c513d5f823e3d90fd5b50505050505050509050565b8215612d5b576001600160a01b038091165f52600160205260405f2091165f5260205260405f20905f5260205260405f205490565b909150612d6782613d74565b6001600160a01b03809316906040918251946370a0823160e01b86528416938460048701526020928387602481865afa968715612e7d575f97612e87575b5083612dbe612db783612dee9a614a53565b50906141de565b508651636eb1769f60e11b81526001600160a01b0390941660048501523060248501529297889081906044820190565b0381865afa968715612e7d575f97612e4c575b50612db7612e1291611a5398614a53565b50612e1d8183613400565b15612e445750935b5f5260018252825f20905f528152815f20905f8052525f2054906134f5565b905093612e25565b96508387813d8311612e76575b612e6381836119d0565b8101031261018257955195612db7612e01565b503d612e59565b85513d5f823e3d90fd5b96508387813d8311612eaf575b612e9e81836119d0565b810103126101825795519583612da5565b503d612e94565b6040519263a9059cbb60e01b5f526001600160a01b0380931660045260245260205f60448180855af160015f5114811615612f10575b8360405215612efa57505050565b635274afe760e01b835216600482015260249150fd5b6001811516612f2657813b15153d151616612eec565b833d5f823e3d90fd5b9092604051936323b872dd60e01b5f526001600160a01b0393848092166004521660245260445260205f60648180855af160015f5114811615612f7f575b836040525f60605215612efa57505050565b6001811516612f2657813b15153d151616612f6d565b93929193612fa2836133dd565b61290d5784612fb6576128839394506127bc565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f5281526128c8835f205494856134cb565b9092919261300081613a63565b9361300a816133dd565b61304a5784816001600160e01b036130299360e01d9116601b0b61489e565b50809281613038575050509190565b6001600160a01b0361281f9316612eb6565b604051632d1671a360e11b8152600490fd5b9161308790606061307c936001600160a01b039485916040880151611fd7565b515116940151611fd7565b5151161461266757565b94919392909260408051916130a583611998565b6130ad611ee2565b83526020925f848201525f838201526060945f868301528560c06080938260808201525f60a082015201528351916130e483611900565b600483525f5b8181106133ce5750506132d7959493925f9261320e61325e938d61310d8161270d565b9c896001600160a01b039e8f94859182865116908d5194600386528501528c840152168c820152608081018a5261314386611f8a565b5261314d85611f8a565b50885161315981611930565b6002815289368c83013761316c86611f97565b5261317685611f97565b5060ff8a6131d98b8501936131c38761319c81613194858a51611fd7565b515116613d74565b975116886131ab848951611fd7565b515116856131ba858a51611fd7565b51015191612d26565b966131cf828751611fd7565b5151169451611fd7565b51015192169093929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b61321782611fa7565b5261322181611fa7565b506132458a8d8d60ff8a6131d98d8501936131c38761319c81613194858a51611fd7565b61324e82611fb7565b5261325881611fb7565b50613b42565b95878a511697848b0191825191868184511693015116928a8552308752858086209151015186519161328f836119b4565b86835287519561329e87611998565b86528886015286850152848885015289608085015260a084015260c08301528351808098819463d04dfe2360e01b835260048301612a6a565b03915afa9687156133c4575f945f986133a2575b5084516002811061338b5750818386015195015161331161330b88611fc7565b51611fb7565b5161331c8183613400565b156133835750925b6133468685919060405192600284526020840152604083015260608201604052565b61334f88611fa7565b5261335987611fa7565b508251996133668b611998565b8a52890152870152850152608084015260a083015260c082015290565b905092613324565b602490835190630fbb8e5560e21b82526004820152fd5b9097506133ba9194503d805f833e612cff81836119d0565b939093965f6132eb565b50513d5f823e3d90fd5b808888809387010152016130ea565b6133fc905f60e01d906001600160e01b038160e01d9116601b0b61479e565b1390565b906133fc916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b61481f565b61344e6001600160e01b0392838316601b0b9260e01d938160e01d9116601b0b8484613f95565b90637ffffff5821361349e575b90613465916141de565b9290921580613496575b61347857505090565b6044925060405191638eba4d0760e01b835260048301526024820152fd5b50821561346f565b6134a88282614e7e565b1561345b57604483856040519163d556b11160e01b835260048301526024820152fd5b611a5391610c15916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6143e4565b611a5391610c15916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6145a8565b61357991608081018261353b6135358351611fc7565b51611fc7565b5261357261356c6001600160a01b0380945151169361356361355d8551611fc7565b51611f8a565b51169251611fc7565b51611fa7565b5191612f95565b5050565b906080810191806135916135358551611fb7565b526001600160a01b038092515116916135ad61355d8551611fb7565b51166135bc61356c8551611fb7565b519081613657576135cc836133dd565b61290d579183917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a959361260f955f5260209060018252613622604094855f20835f528452855f20855f528452855f20546134f5565b945f5260018252835f20905f528152825f20915f52525f20555b51604051918291338352604060208401526040830190612a0e565b91613688917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a959361260f95612862565b505061363c565b60c0810151908151915f92613803575b506137446020918281510151926001600160a01b039081818187511696015116928660a082019485518252308452604097888320898686510151015160808601518b51916136ec836119b4565b8683528c51936136fb856119b4565b8785528d519661370a88611998565b8752898701528c86015260016060860152608085015260a084015260c08301528851808099819463d04dfe2360e01b835260048301612a6a565b03915afa9485156137f95787956137db575b508451613767575b50505050505050565b81905101510151169051813b156137d75791849184938361379c965180978195829463012c676d60e21b845260048401612b22565b03925af19081156137ce57506137b7575b808080808061375e565b6137c18291611984565b6137cb57806137ad565b80fd5b513d84823e3d90fd5b8480fd5b6137f09195503d8089833e612cff81836119d0565b9050935f613756565b86513d89823e3d90fd5b6001600160a01b03602080845101510151169060a083015190823b1561018257613846925f928360405180968195829463012c676d60e21b845260048401612b22565b03925af1801561022c571561369f57613860919250611984565b5f905f61369f565b6080810161387961356c8251611fb7565b5191821561388657505050565b6138a061355d6001600160a01b0380935151169351611fb7565b5116815f5260209160018352604092835f20835f528152835f20855f528152835f2054936001600160e01b0385166138db575b505050505050565b6138ff955f9284845260018152828420868552815282842091845252812055612ff3565b5f8080806138d3565b8115613912570490565b634e487b7160e01b5f52601260045260245ffd5b604081511061396e576020810151908051603f19810190811161283c5760051c821161395a5760016020920160051b010190565b5050604051613968816119b4565b5f815290565b50604051613968816119b4565b80511561398b57602001515f1a90565b505f90565b905f8091602081519101845af48080613a0e575b156139c45750506040513d81523d5f602083013e60203d82010160405290565b156139eb57604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b3d156139fc576040513d5f823e3d90fd5b60405163d6bda27560e01b8152600490fd5b503d1515806139a45750813b15156139a4565b60041115613a2b57565b634e487b7160e01b5f52602160045260245ffd5b602090939291936001600160a01b036040820195168152613a5f83613a21565b0152565b613a6b614f6c565b6040805163b7bad1b160e01b81526001600160a01b0383166004820152909182826024815f73200e12d10bb0c5e4a17e7018f0f1161919bb93895af1928315613b39575f925f94613b04575b50613ac183613a21565b600183141580613af2575b613ad65750505090565b5163ee07877f60e01b8152918291610725919060048401613a3f565b50613afc83613a21565b821515613acc565b90809450613b289293503d8511613b32575b613b2081836119d0565b810190614874565b919091925f613ab7565b503d613b16565b513d5f823e3d90fd5b90805191613b4f83611ab4565b91613b6a604094613b62865195866119d0565b808552611ab4565b601f199460209186013686840137835183519095908015613d69576001613bc09101965b6001978891010197613bb7613ba28a611ab4565b99613baf86519b8c6119d0565b808b52611ab4565b018489016121f5565b85805f9684516002815233878201523086820152606081018652613be38b611f8a565b52613bed8a611f8a565b505f925b613d25575b5050508351613c09575b50505050505090565b85809598979692980181613c1d8289611fd7565b52613c288188611fd7565b505f925b613c3b575b5085969750613c00565b8451831015613d20576001600160a01b03613cb281613c5a8689611fd7565b51511686613c68878a611fd7565b51015187815160051b9101207f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f52601c52603c5f208c613ca9888b611fd7565b510151916149ca565b15613d0857868098999a928192613cc9878a611fd7565b515116613cd68787611fd7565b52019385613ce48289611fd7565b510151613cf1868c611fd7565b52613cfc858b611fd7565b50019290989796613c2c565b8951630a57f30960e31b815260048101859052602490fd5b613c31565b9091968151881015613d60578280910197613d408184611fd7565b51613d4b8a8d611fd7565b52613d56898c611fd7565b5001919081613bf1565b96829150613bf6565b50613bc05f96613b8e565b613d7c614f6c565b60408051630782d7e160e01b81526001600160a01b03831660048201529091828260248173200e12d10bb0c5e4a17e7018f0f1161919bb93895afa928315613b39575f925f94613b045750613ac183613a21565b9091939284158215175f14613dea5750505090505f905f90565b82810192600160fd1b8082019083011760fe1c613f21575b5050613e0d81614b43565b93613e1781614b43565b94613e228682614b63565b90918215613f12575f9083986f0785ee10d5da46d900f436a000000000808611613f04575b50670de0b6b3a7640000808b11613ef5575b50633b9aca00808b11613ee6575b50612710808b11613ed8575b5098805b613ec7575081906118d8989982600a0a9109960195817fcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccd0a93838211900382610100031b9203901c170291614b76565b60019290920191600a900480613e77565b60049a04998a930192613e73565b600991939a049901915f613e67565b601291939a049901915f613e59565b85049950602592505f613e47565b509290506118d8949550614b76565b5f821215613f7557808413613f67575b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb2841315613e02579092506118d8939491614a81565b9092506118d8939491614ae8565b80841215613f31579092506118d8939491614a81565b61346582826141de565b92909180613fbb576044848460405191637a97930f60e01b835260048301526024820152fd5b90919280155f14613fd057505050505f905f90565b613fe993613fdd91614c30565b92919490938492614c30565b9093919284613ff788614b43565b9161400186614b43565b947f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000094604c918688106141a8575b030191600160ff1b98838a018112155f14614175575050035b5f955f82128061416c575b61414e575b5f81128061413c575b61411e5786820103966001600160ff1b0388149081614114575b508061410b575b80614102575b6140e45750906140989291614ddc565b915f81136140ab575b506118d893614b76565b9091604c82136140d9576140c291600a0a90613908565b9081156140cf575f6140a1565b505050505f905f90565b50505050505f905f90565b876044916040519163d556b11160e01b835260048301526024820152fd5b505f8512614088565b50828414614082565b905088145f61407b565b604489836040519163d556b11160e01b835260048301526024820152fd5b50806001600160ff1b03018213614061565b95508087018613156141665786818703015b95614058565b5f614160565b505f8113614053565b89985090920390506001600160ff1b03819003870182136141995701860194614048565b5050505050505050505f905f90565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009650604b925061402f565b8115613912570590565b8082601b82810b83146143d3577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e1000000000000000000840561437f575b8380820b0361436e57507b199999999999999999999999999999999999999999999999999999987b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc8401111561431f575b838060030b036142a3575b8084136142875750506001600160e01b036001925b60e01b91161791565b8303600a0a8015613912576001600160e01b039107159261427e565b92915f8413156142f35750906142b98383614e7e565b6142d557637ffffffe1901600a0a810290637fffffff92614269565b506044916040519163d556b11160e01b835260048301526024820152fd5b637fffffff1992830390604382136140d95761431291600a0a906141d4565b9182156140cf5792614269565b5f198401808060030b14614333575061425e565b90506001600160e01b039293507b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff915060e01b9260ff1d181617905f90565b600190940193600a90930592614211565b937f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000008405156143c0576305f5e100600894058094819201955b915050614211565b620186a0600594058094819201956143b8565b508261425e57505050505f90600190565b919291600160ff1b84016143fc576118d89350614e97565b906118d8935f03916145a8565b919291600160ff1b919080158061459657509061442591614c30565b9490929091905f86858585828213801561458d575b614570575b505050508682841860ff1c94860391039081604c0381116145555701600a0a80820591908461453b575b505081019182821860ff1c111561453357826001600160ff1b031461451557905f600192135f146144e657600a9004915b01925b811581176144aa57509190565b806144c3575b5080156144bb579190565b505f91508190565b91926144d99203600160ff1b01600a0a906141d4565b600160ff1b91905f6144b0565b600a60037fe666666666666666666666666666666666666666666666666666666666666667920104019161449a565b604490836040519163d556b11160e01b835260048301526024820152fd5b50909261449d565b8107614548575b80614469565b60ff1d600117015f614542565b505050919350614563579190565b60018160ff1d1790039190565b5f9a50909750909550600160ff1b9450925090508680808061443f565b50835f1261443a565b156145a15750509190565b9350919050565b93929193841581158181176146f9575050906145c391614c30565b91949082956145d482958294614c30565b80969294919693878684821380156146f0575b6146d7575b5050505050508682841860ff1c94860391039081604c0381116145555701600a0a8082059190846146bd575b505081019182821860ff1c11156146b557826001600160ff1b031461451557905f600192135f1461468657600a9004915b01925b8115811761465957509190565b80614669575080156144bb579190565b600160ff1b936146809291038401600a0a906141d4565b5f6144b0565b600a60037fe6666666666666666666666666666666666666666666666666666666666666679201040191614649565b50909261464c565b81076146ca575b80614618565b60ff1d600117015f6146c4565b929b5098509196509450925090505f80808080806145ec565b508584126145e7565b939593909291901561470f5750506144bb579190565b945092915050565b600881511061398b576008015167ffffffffffffffff1667ff0a89c674ee78741490565b9160408301926040614775610c15606087519401938451906001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b613dd0565b94519301614784815186612795565b61478c575050565b909350611a5391925051925183613427565b92915f9060018184145f87128715171717614818575f9280821361480a575b03604c81135f8212176147fe57600a0a90846147dc83820293846141d4565b146147f1575050156147ed575f9190565b5f90565b9093509015611a53579190565b5050156147ed575f9190565b5f95600194509250906147bd565b5050505f90565b93929190918083145f83125f8712188315871517171761486e575f928082136148615703604c81135f8212176147fe57600a0a90846147dc83820293846141d4565b91946001935091906147bd565b50919050565b919082604091031261018257815160048110156101825760209092015160ff811681036101825790565b91925f8312156148c6576044838360405191634a7d166b60e01b835260048301526024820152fd5b9192836148d857505090505f90600190565b60ff81168201918083126149a0575f831215614910575050604c1981126144bb575f03600a0a916149098382613908565b9283021490565b909293915f81135f1461499657604d811361496b57600a0a92831561391257835f190483116149425750500290600190565b60405163c849483b60e01b815260048101849052602481019290925260ff166044820152606490fd5b5060405163c849483b60e01b81526004810192909252602482015260ff919091166044820152606490fd5b5050905090600190565b60405163c849483b60e01b815260048101869052602481019190915260ff82166044820152606490fd5b9091813b614a05576149dc9192614fd5565b506149e681613a21565b1591826149f257505090565b6001600160a01b03918216911614919050565b6020918160645f935160405192630b135d3f60e11b9788855260048501526040602485015286820190604485015e8281018201859052601f01601f191601915afa905f5114601f3d11161690565b9060ff165f03916001600160ff1b0382115f14614a7957600a6001818404940192061590565b909190600190565b909392915f614a91918184613dd0565b9490945f8483019182019412159081614ade575b8115614ad4575b50614ab657505090565b604492506040519163d556b11160e01b835260048301526024820152fd5b905083125f614aac565b8281129150614aa5565b614afd93600160fe1b90810193920190613dd0565b9081815f821215614b34575050604b19821261288357614b22915f03600a0a906141d4565b9081614b2c575f90565b600160ff1b90565b93600160ff1b90910192509050565b5f811215611a5357600160ff1b90808203614b5c575090565b90505f0390565b905f198183099102908180821091030391565b92939291905f8184181215614c0b576001600160ff1b039283831115614bf557600160ff1b93838503614bab57505050509190565b90919293508514614bc5575050600a600191045f03920190565b604051630ed8062160e21b8152600481019190915260248101919091526044810182905260648101849052608490fd5b5090915050600160ff1b811461283c575f039190565b90916001600160ff1b0380841115612804578514614bc5575050600a60019104920190565b9190918015614dd257827f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000080830515614ce0575b507f19999999999999999999999999999999999999999999999999999999999999997f0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc830110614cd1575b8313614cbb5791905f90565b919060018060ff1b926001600160ff1b03030190565b9290600a02905f190192614caf565b6f4b3b4ca85a86c47a098a22400000000080840515614dc0575b507728c87cb5c89a2571ebfdcb54864ada834a00000000000000830515614da9575b7b097edd871cfda3a5697758bf0e3cbb5ac5741c640000000000000000830515614d95575b7e3899162693736ac531a5a58f1fbb4b746504382ca7e4000000000000000000830515614d8557820515614d76575b5f614c64565b9290600a02905f190192614d70565b9391606402916001190193614d41565b93916402540be40002916009190193614d41565b9391678ac7230489e8000002916012190193614d1c565b6025198301955092909202915f614cfa565b505f915081908190565b90915f198383099280830292838086109503948086039584871015614e5a5714614e52579082910960018219018216809204600280826003021880830282030280830282030280830282030280830282030280830282030280920290030293600183805f03040190848311900302920304170290565b505091500490565b60648386866040519263362ced0960e11b8452600484015260248301526044820152fd5b611a5391905f811215614e92575f0361500f565b61500f565b909291600160ff1b91828101614f295750808414614f1f57808413918215614f17578185035b604c811115614f065750505f915b15614ef757507f8000000000000000000000000000000000000000000000000000000000000001019190565b92506001600160ff1b03039190565b600a0a908115613912570491614ecb565b848203614ebd565b505090505f905f90565b93614f3692945f03614409565b80939180928114614f4a575b50505f039190565b915092506001600160ff1b03831461451557600a600191059201915f80614f42565b73200e12d10bb0c5e4a17e7018f0f1161919bb9389803b158015614faa575b614f925750565b602490604051906373e6d7b360e01b82526004820152fd5b507f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d41813f1415614f8b565b815191906041830361500557614ffe9250602082015190606060408401519301515f1a9061509e565b9192909190565b50505f9160029190565b90637ffffff581131561509857637ffffffe1981019060438213615091575f82121561506557637fffffff91505f0301600a0a7b8000000000000000000000000000000000000000000000000000000202111590565b50600a0a8015613912577b80000000000000000000000000000000000000000000000000000001041090565b5050151590565b50505f90565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411615115579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa1561022c575f516001600160a01b0381161561510b57905f905f90565b505f906001905f90565b5050505f916003919056", + "object": "0x6080806040523460395760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055615121908161003e8239f35b5f80fdfe6080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a7146117cc575080631f69cb751461156f5780632cb77e9f146115435780632fbc4ba0146113f957806341d1514f146113c25780635cffe9de1461126657806360746119146110e2578063613255ab1461105f57806369c7285614610771578063709fb8a5146104375780639235084d146103e3578063ac9650d814610295578063d5708b46146101fa578063d7e442ec146101765763d9d98ce4146100c1575f80fd5b3461015f57604036600319011261015f576001600160a01b036100e2611850565b166040516370a0823160e01b8152306004820152602081602481855afa90811561016b575f91610135575b501561011d5760206040515f8152f35b60249060405190633c5bf76960e21b82526004820152fd5b90506020813d602011610163575b81610150602093836119d0565b8101031261015f57515f61010d565b5f80fd5b3d9150610143565b6040513d5f823e3d90fd5b3461015f57602036600319011261015f5760043567ffffffffffffffff811161015f576101ce6101ad6101d492369060040161181f565b91906101b76126cc565b604051926101c4846119b4565b5f84523691611ddb565b90612b64565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b3461015f5761014036600319011261015f5767ffffffffffffffff60043581811161015f5761022d903690600401611b61565b60243582811161015f57610245903690600401611b61565b60c036604319011261015f576101043583811161015f5761026a903690600401611d07565b906101243593841161015f576102876101d4943690600401611d07565b926102906126cc565b612211565b3461015f5760208060031936011261015f5760043567ffffffffffffffff811161015f576102c790369060040161181f565b9190604051926102d6846119b4565b5f84528284016102e582611ab4565b946102f360405196876119d0565b8286526102ff83611ab4565b9361031186880195601f1901866121f5565b5f5b84811061037557604080518881528951818a018190525f92600582901b83018101918a918c9085015b8287106103495785850386f35b909192938280610365600193603f198a820301865288516118dc565b960192019601959291909261033c565b806103c4886103be61039160019560059d9c9d1b8701876120f1565b929089846040519586938585013782018381015f81528b519283915e015f838201520380845201826119d0565b30613991565b6103ce828a611fd7565b526103d98189611fd7565b5001969596610313565b3461015f5760031960203682011261015f576004359067ffffffffffffffff821161015f57608090823603011261015f57610422606091600401612139565b90604051921515835260208301526040820152f35b3461015f5760031960403682011261015f5760043567ffffffffffffffff80821161015f5760c08260040193833603011261015f5760243590811161015f5761048490369060040161181f565b9061048d6126cc565b6104be6104b96104b46104ad6104a38880612124565b60408101906120f1565b36916119f2565b613927565b61397c565b801561075f576001101561074d57602483016104da8186611f44565b90501561073b5760448401946104f08682611f44565b9050156107295761055661051e9661054a61051561050e8580612124565b9585611f44565b99909285611f44565b91909261053b6040519761053189611900565b3389523690611a56565b9a60209b8c8901523691611acc565b60408601523691611acc565b60608301526064850135608083015261056e8261270e565b91825f525f875260405f209586541596876105b2575b888860017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055604051908152f35b6001905560a46001600160a01b03917f87491344dfbcf91f6cbbc610cbbeedc85313d37a02df0c93527f7ea5f8db717f83855116604051908152878c8201526060604082015280610606606082018861203f565b0390a1019161061583856120f1565b9050610679575b5050505061066d929161066561064e6101ce933390919060405192600284526020840152604083015260608201604052565b906040519160018352602083015260408201604052565b923691611ddb565b82808080808080610584565b6106866104ad84866120f1565b61068f81614718565b156107025750937fd46c2c56b35c8210e9e712ec3f02242d5fc90187c0ac8ed80cc33626846ec3698961066d9897956106f56106d86106659761064e976101ce9b5116936120f1565b866040519586958652850152606060408501526060840191611d36565b0390a1938395965061061c565b89610725604051928392630c89984b60e31b8452600484015260248301906118dc565b0390fd5b60405163540e5f0b60e01b8152600490fd5b604051636c44ef8f60e01b8152600490fd5b604051633c8270bd60e21b8152600490fd5b604051632cff108b60e21b8152600490fd5b3461015f5760031960203682011261015f5767ffffffffffffffff6004351161015f5760c0906004353603011261015f576107aa6126cc565b5f80806107bf60048035608481019101611e8d565b90501561104d5760246004350135926107d784612773565b1561103b576060806040516107eb81611968565b6107f3611ee2565b81525f60208201525f6040820152015261080b611ee2565b5061086b61086661084561083b61083561082f608460043501600435600401611e8d565b90611f14565b80611f2f565b6040810190611f44565b602061085e61082f608460043501600435600401611e8d565b013591611f7a565b611d22565b936001600160a01b036108ba6108666108a161089761083561082f608460043501600435600401611e8d565b6060810190611f44565b604061085e61082f608460043501600435600401611e8d565b81604051976108c889611930565b16875216602086015260408501526108ea608460043501600435600401611e8d565b9490506001604051950160051b85016040525f905f5b610914608460043501600435600401611e8d565b9050811080611028575b15610e7557610937608460043501600435600401611e8d565b821015610e61578160051b810135607e198236030181121561015f57608081830136031261015f576040519161096c83611968565b8181013567ffffffffffffffff811161015f5761098e90369084840101611b61565b835280820160208181013590850152604080820135908501526060013567ffffffffffffffff811161015f576109c79236920101611d07565b606082015280516001600160a01b036109e96040830151602085015190611fd7565b5151166001600160a01b0385511614801590610e2d575b610e1b57610a1860208301516040840151908361305d565b610a218161270e565b91825f525f60205260405f2054155f14610a85575051604080513381526001600160a01b039092166020830152810191909152600191907fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f390606090a15b01610900565b9190610ab6602084979597015160408501519060608601519060405192610aab846119b4565b5f8452339186613092565b925f93610ace60608201516044600435013590612796565b15610b3557505051604080513381526001600160a01b03909216602083015281019190915260019291907fe3151dc8cb7a54ffc4baabd28c1f241c94d510b5e5b502491ac3cad6c16316d590606090a15b8115610b2d575b5092610a7f565b905088610b26565b610b426040820151612773565b158015610e08575b15610b9f57505051604080513381526001600160a01b03909216602083015281019190915260019291907f500b713857325f9e6dcb52ae832eca9109d107ed1aae9cb4928b4c1e13f051aa90606090a1610b1f565b9250925050600196959691610bb8606460043501611feb565b15610d755796610c2897610c3860408401516040880151610bd98183613401565b15610d6d5750925b610c32848592610c1b610c1560608a01516001600160e01b03601b918660e01d92828816810b928260e01d9216900b613dd1565b90613f8c565b9d8e9260408d01516134cc565b60408c01526134f6565b996134f6565b98610c438484613520565b610c4d848261357e565b60405192338452608060208501526060610c73845160808088015261010087019061203f565b93602081015160a0870152604081015160c0870152015192607f198582030160e0860152835180825260208201906020808260051b8501019601925f5b828110610d0f57505050505092806001979695937f194f1feb3b4d7076a2c272e774e792e0c48bb8c7aa1a9a3671c1cd6da9e6b4c193610d0a96604084015260608301520390a180858c5101808d5260051b8c0152613690565b610b1f565b9091929396602080610d60600193601f198782030189528b51906001600160a01b0382511681526040610d4f8584015160608785015260608401906120be565b9201519060408184039101526118dc565b9901950193929101610cb0565b905092610be1565b610c2890610c386060840151610c32610db3610c1560408801516001600160e01b0394601b90868360e01d9316820b91878260e01d9216900b613dd1565b60408a0151610dc28183613401565b15610e005750915b829c8d916060890151908116155f14610df1575060408801515b96879460408d01516134cc565b610dfb9085613428565b610de4565b905091610dca565b50610e1660608201516133de565b610b4a565b60405163936bb5ad60e01b8152600490fd5b506001600160a01b03610e496060830151604085015190611fd7565b5151166001600160a01b036020860151161415610a00565b634e487b7160e01b5f52603260045260245ffd5b50919390610e87606460043501611feb565b1561102257835b6004356004013590610ea08282613401565b6110045750508490610ec0856001600160a01b0360208701511633612ff4565b505060a46004350190610ed8826004356004016120f1565b905015159081610ffc575b50610f5b575b506001600160a01b03610eff92935116336127bd565b50505b8351811015610f275780610f21610f1b60019387611fd7565b51613869565b01610f02565b5060409160017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005582519182526020820152f35b90506001600160a01b03602084015116610f856001600160a01b03855116926004356004016120f1565b929091333b1561015f57610fcd5f93604051958694859463691f9ed760e01b8652600486015260248501528960448501528a606485015260a0608485015260a4840191611d36565b038183335af190811561016b57859115610ee9579050610fed9150611984565b5f836001600160a01b03610ee9565b905088610ee3565b604492506040519163573b6f4160e01b835260048301526024820152fd5b84610e8e565b506110366040830151612773565b61091e565b60405163315f9e2360e21b8152600490fd5b604051639c95219f60e01b8152600490fd5b3461015f5760208060031936011261015f576024816001600160a01b03611084611850565b16604051928380926370a0823160e01b82523060048301525afa90811561016b575f916110b5575b50604051908152f35b90508181813d83116110db575b6110cc81836119d0565b8101031261015f5751826110ac565b503d6110c2565b3461015f576110f036611890565b92916110fd9491946126cc565b61110883833361273f565b61111181612773565b15611235578160ff91611129856111ec969533612d27565b6111338183613401565b1561122f575080935b61114885828533612f96565b917f8045c25080b0868951141ed0a91720bcad09a8364a2b3109ee1fd49c1f0bc8b860c0611177898833612ff4565b97906001600160a01b0360405192338452169a8b6020840152856040840152886060840152608083015260a0820152a16040519660068852602088015260408701526060860152608085015260a08401521660c082015260e08101604052906040519160018352602083015260408201604052565b90806112185760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b611227926101ce913691611ddb565b8080806101d4565b9361113c565b50604051623a3a4d60e21b81523360048201526001600160a01b039190911660248201526044810191909152606490fd5b3461015f57608036600319011261015f576004356001600160a01b039081811680910361015f57611295611866565b6044359167ffffffffffffffff9160643583811161015f573660238201121561015f57806004013593841161015f57366024858301011161015f576113229560209216936112e4868587612eb7565b60405196879283926323e30c8b60e01b84523360048501528760248501528860448501525f606485015260a06084850152602460a485019201611d36565b03815f855af193841561016b575f9461138e575b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd984036113755761136a93503091612f30565b602060405160018152f35b604051630b6c58a960e31b815260048101859052602490fd5b9093506020813d6020116113ba575b816113aa602093836119d0565b8101031261015f57519284611336565b3d915061139d565b3461015f57606036600319011261015f5760206113f16113e0611850565b6113e8611866565b60443591612d27565b604051908152f35b3461015f5761140736611890565b928094926114136126cc565b61141e82853361273f565b61142781612773565b15611513578061143b61148a9286336127bd565b9790957f7f9dfa19cf1cc2f806f2f860fbc9c056b601fb1afc0e9b843dfe5c63616268e660806040513381526001600160a01b038416998a60208301528560408301526060820152a133612863565b939091856114b85760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b611507966101ce956106659460ff93604051956005875260208701526040860152606085015260808401521660a082015260c08101604052906040519160018352602083015260408201604052565b808080808080806101d4565b506040516306dde9c360e41b81523360048201526001600160a01b03841660248201526044810191909152606490fd5b3461015f57602036600319011261015f576004355f525f6020526020600160405f205414604051908152f35b3461015f5760031960403682011261015f5767ffffffffffffffff9060043582811161015f57806004019160a08236039182011261015f5760243584811161015f576115bf90369060040161181f565b90936115c96126cc565b5f946001600160a01b0394856115de84611d22565b1633036117aa576115f76115f23685611b61565b61270e565b805f525f60205260405f2096600188541461163e575b60208960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556040519015158152f35b9091929394959697505f6001985560405196338852826020890152606060408901528161166a8761187c565b1660608901526024840135906062190181121561015f5783019060a06080890152806116986004840161187c565b166101008901526116ab6024830161187c565b1661012088015260448101356022198236030181121561015f57019060246004830135920198821161015f57813603891361015f577f09d18501db0080ca2d6cd7c17fa7255daff4b2d503ea93b76ff68b6752ea8e6387806106659560846117736101ce9a60209f6117329061179d9f9a606061014061064e9d0152610160880191611d36565b6117646117596117456044880185611d56565b605f198a8603810160a08c01529491611d8b565b926064870190611d56565b918784030160c0880152611d8b565b91013560e08301520390a13390919060405192600284526020840152604083015260608201604052565b828080808080808061160d565b6024866117b685611d22565b6040516335252be360e01b815291166004820152fd5b3461015f57602036600319011261015f576004359063ffffffff60e01b821680920361015f5760209163e414309160e01b811490811561180e575b5015158152f35b6301ffc9a760e01b14905083611807565b9181601f8401121561015f5782359167ffffffffffffffff831161015f576020808501948460051b01011161015f57565b600435906001600160a01b038216820361015f57565b602435906001600160a01b038216820361015f57565b35906001600160a01b038216820361015f57565b90608060031983011261015f576004356001600160a01b038116810361015f579160243591604435916064359067ffffffffffffffff821161015f576118d89160040161181f565b9091565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b60a0810190811067ffffffffffffffff82111761191c57604052565b634e487b7160e01b5f52604160045260245ffd5b6060810190811067ffffffffffffffff82111761191c57604052565b6040810190811067ffffffffffffffff82111761191c57604052565b6080810190811067ffffffffffffffff82111761191c57604052565b67ffffffffffffffff811161191c57604052565b60e0810190811067ffffffffffffffff82111761191c57604052565b6020810190811067ffffffffffffffff82111761191c57604052565b90601f8019910116810190811067ffffffffffffffff82111761191c57604052565b92919267ffffffffffffffff821161191c5760405191611a1c601f8201601f1916602001846119d0565b82948184528183011161015f578281602093845f960137010152565b9080601f8301121561015f57816020611a53933591016119f2565b90565b919060608382031261015f5760405190611a6f82611930565b8193611a7a8161187c565b8352611a886020820161187c565b602084015260408101359167ffffffffffffffff831161015f57604092611aaf9201611a38565b910152565b67ffffffffffffffff811161191c5760051b60200190565b929192611ad882611ab4565b604092611ae860405192836119d0565b819581835260208093019160061b84019381851161015f57915b848310611b1157505050505050565b858383031261015f578386918251611b288161194c565b611b318661187c565b81528286013583820152815201920191611b02565b9080601f8301121561015f57816020611a5393359101611acc565b91909160a08184031261015f5760405190611b7b82611900565b8193611b868261187c565b835267ffffffffffffffff91602081013583811161015f5782611baa918301611a56565b6020850152604081013583811161015f5782611bc7918301611b46565b6040850152606081013592831161015f57611be86080939284938301611b46565b60608501520135910152565b909291611c0084611ab4565b916040611c1060405194856119d0565b839580855260208095019160059160051b84019480861161015f5784935b868510611c3f575050505050505050565b67ffffffffffffffff90853582811161015f5787019060608285031261015f578451611c6a81611930565b611c738361187c565b81528a83013584811161015f57830185601f8201121561015f57803590611c9982611ab4565b91611ca6895193846119d0565b8083528d808401918b1b8301019188831161015f578e809101915b838310611cf757509150508201528583013593841161015f57611ce8858c95869501611a38565b86820152815201940193611c2e565b82358152918101918f9101611cc1565b9080601f8301121561015f57816020611a5393359101611bf4565b356001600160a01b038116810361015f5790565b908060209392818452848401375f828201840152601f01601f1916010190565b9035601e198236030181121561015f57016020813591019167ffffffffffffffff821161015f578160061b3603831361015f57565b9190808252602080920192915f905b828210611da8575050505090565b909192936001906001600160a01b03611dc08761187c565b16815285830135838201526040908101950193920190611d9a565b90929192611de881611ab4565b91604091611df960405194856119d0565b839581855260208095019160051b83019381851161015f5783925b858410611e245750505050505050565b67ffffffffffffffff90843582811161015f57860190838286031261015f578351611e4e8161194c565b823584811161015f5786611e63918501611a56565b81528983013593841161015f57611e7e868b95869501611d07565b83820152815201930192611e14565b903590601e198136030182121561015f570180359067ffffffffffffffff821161015f57602001918160051b3603831361015f57565b60405190611ed082611930565b60606040835f81525f60208201520152565b60405190611eef82611900565b5f608083828152611efe611ec3565b6020820152606060408201526060808201520152565b9015610e6157803590607e198136030182121561015f570190565b903590609e198136030182121561015f570190565b903590601e198136030182121561015f570180359067ffffffffffffffff821161015f57602001918160061b3603831361015f57565b9190811015610e615760061b0190565b805115610e615760200190565b805160011015610e615760400190565b805160021015610e615760600190565b805160031015610e615760800190565b805160041015610e615760a00190565b8051821015610e615760209160051b010190565b35801515810361015f5790565b9081518082526020808093019301915f5b828110612017575050505090565b835180516001600160a01b031686528201518583015260409094019392810192600101612009565b906080806120b56120a361209160406001600160a01b0380895116885260208901519060a060208a01528082511660a08a015260208201511660c08901520151606060e08801526101008701906118dc565b60408701518682036040880152611ff8565b60608601518582036060870152611ff8565b93015191015290565b9081518082526020808093019301915f5b8281106120dd575050505090565b8351855293810193928101926001016120cf565b903590601e198136030182121561015f570180359067ffffffffffffffff821161015f5760200191813603831361015f57565b903590605e198136030182121561015f570190565b6121506115f26121498380611f2f565b3690611b61565b5f525f602052600160405f2054036121ec5780612170816121dc93611f2f565b6121d461218f6121946020850135938460408701359384923690611b61565b61305d565b6121ac6121a18580611f2f565b946060810190611e8d565b92906121cc604051966121be886119b4565b5f88525f3681373690611b61565b933691611bf4565b923392613092565b6040810151606090910151600192565b505f905f905f90565b5f5b82811061220357505050565b6060828201526020016121f7565b92916001600160a01b038451166001600160a01b03835116146126ba576001600160a01b03612247606086015160643590611fd7565b515116906040830151916001600160a01b036122666084358095611fd7565b5151161480159061267a575b610e1b576040850151906001600160a01b036122916044358094611fd7565b5151166001600160a01b036122ac60643560608a0151611fd7565b51511614612668576122bd8661270e565b805f525f60205260405f20541561261557506122d88461270e565b805f525f60205260405f2054156125c157506123bb9291612395917f6fa7f4c28634b0a9d6831401c45ae468195fb63aed07308935c35374ff5d9e396040518061234061233261012033845280602085015283018d61203f565b82810360408401528a61203f565b85606083015260643560808301528760a083015260a43560c083015260c43560e083015260e4356101008301520390a16001600160a01b0386511660405192612388846119b4565b5f8452606435908a613092565b936001600160a01b03865116604051926123ae846119b4565b5f845260a4359086613092565b916123c96040820151612773565b1580156125ad575b801561259a575b8015612587575b61257557604051916123f083611968565b5f83525f60208401525f60408401525f606084015261240f848361473c565b84526040840152612435612423838661473c565b602086015280606086015284516134cc565b9461244960208501516040860151906134cc565b93612453876133de565b8015612566575b6125545761251b61254d957fd9fa84dd790c969daa5c33d8050dc06b4a9b59d5b42e2be5f5e8ae20447f618d946124fd6125529a60a09661249c8a8851613520565b6124aa8c6020890151613520565b6124b88a604089015161357e565b6124c68c606089015161357e565b6124cf8a613869565b6124d88c613869565b6001600160a01b036124f460c435926060606435910151611fd7565b51511633612863565b50506001600160a01b036124f460e43592606060a435910151611fd7565b5050606060405191338352805160208401526020810151604084015260408101518284015201516080820152a1613690565b613690565b565b604051630d86822160e01b8152600490fd5b50612570856133de565b61245a565b6040516321badf1f60e01b8152600490fd5b5061259560608401516133de565b6123df565b506125a860608201516133de565b6123d8565b506125bb6040840151612773565b156123d1565b9351604080513381526001600160a01b039092166020830152810194909452507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f3945091925082915050606081015b0390a1565b9551604080513381526001600160a01b039092166020830152810196909652507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f394935083925050606082019050612610565b604051631cd2f1c760e21b8152600490fd5b506001600160a01b03612694606085015160a43590611fd7565b5151166001600160a01b036126b0604088015160443590611fd7565b5151161415612272565b604051630a98f1f360e21b8152600490fd5b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0060028154146126fc5760029055565b604051633ee5aeb560e01b8152600490fd5b6040516127398161272b602082019460208652604083019061203f565b03601f1981018352826119d0565b51902090565b90911561274a575050565b6040516305dbdfd960e41b81526001600160a01b03918216600482015291166024820152604490fd5b612792905f60e01d906001600160e01b038160e01d9116601b0b61479f565b1290565b90612792916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614820565b9291926127c982613a64565b936127d3816133de565b6128515784816001600160e01b036127f29360e01d9116601b0b61489f565b9290809315612828575b5082908161280c575b5050509190565b612820926001600160a01b03309216612f30565b5f8181612805565b9092505f19811461283d57600101915f6127fc565b634e487b7160e01b5f52601160045260245ffd5b604051632eaefac360e21b8152600490fd5b93929193612870836133de565b61290e578461288c57612884939450612ff4565b50505f905f90565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f5281526128c9835f205494856134f6565b956128d3876133de565b6128f6575f97885260018252838820908852815282872091875252909320829055565b835163c5e12af560e01b815260048101889052602490fd5b60405163793a8f5560e01b815260048101849052602490fd5b919060408382031261015f57825167ffffffffffffffff9081811161015f5784019082601f8301121561015f57815160209261296282611ab4565b9161297060405193846119d0565b808352848084019160051b8301019186831161015f5785809101915b8383106129ff5750505050948281015191821161015f57019180601f8401121561015f5782516129bb81611ab4565b936129c960405195866119d0565b818552838086019260051b82010192831161015f578301905b8282106129f0575050505090565b815181529083019083016129e2565b825181529181019186910161298c565b90808251908181526020809101926020808460051b8301019501935f915b848310612a3d5750505050505090565b9091929394958480612a5b600193601f198682030187528a516120be565b9801930193019194939290612a2d565b91906020928381526001600160a01b0382511684820152838201516040820152612aa5604083015160e060608401526101008301906118dc565b9060608301516080820152612acc608084015192601f1993848483030160a0850152612a0f565b9260a081015193838382030160c08401528680865192838152019501905f5b818110612b0f57505050611a5394955060c060e091015192828503019101526120be565b825187529588019591880191600101612aeb565b90604082019082526020606081936040838201528551809452019301915f5b828110612b50575050505090565b835185529381019392810192600101612b42565b919091335f526020308152604091825f2091835195612b828761194c565b612b8a611ec3565b875260608281980152845190612b9f826119b4565b5f8252855190612bae826119b4565b5f82525f3681375f5b8151811015612d1b57898688612bcd8486611fd7565b51888151948d80870151908151612bef575b5050505050505050600101612bb7565b905f92916001600160a01b0396612c148887818d51169c015116998789015190613b43565b95825199612c218b611998565b8a5289015287015285015260808401528760a08401528660c08401525f8c51809563d04dfe2360e01b82528180612c5c600498898301612a6b565b03915afa938415612d11579089915f95612ceb575b508451612c87575b50899250808e8c938e612bdf565b5101511691823b1561015f57612cb5925f92838d5180968195829463012c676d60e21b845233908401612b23565b03925af18015612ce1579060019291612cd2575b81928782612c79565b612cdb90611984565b5f612cc9565b89513d5f823e3d90fd5b612d089195503d805f833e612d0081836119d0565b810190612927565b9050935f612c71565b8c513d5f823e3d90fd5b50505050505050509050565b8215612d5c576001600160a01b038091165f52600160205260405f2091165f5260205260405f20905f5260205260405f205490565b909150612d6882613d75565b6001600160a01b03809316906040918251946370a0823160e01b86528416938460048701526020928387602481865afa968715612e7e575f97612e88575b5083612dbf612db883612def9a614a54565b50906141df565b508651636eb1769f60e11b81526001600160a01b0390941660048501523060248501529297889081906044820190565b0381865afa968715612e7e575f97612e4d575b50612db8612e1391611a5398614a54565b50612e1e8183613401565b15612e455750935b5f5260018252825f20905f528152815f20905f8052525f2054906134f6565b905093612e26565b96508387813d8311612e77575b612e6481836119d0565b8101031261015f57955195612db8612e02565b503d612e5a565b85513d5f823e3d90fd5b96508387813d8311612eb0575b612e9f81836119d0565b8101031261015f5795519583612da6565b503d612e95565b6040519263a9059cbb60e01b5f526001600160a01b0380931660045260245260205f60448180855af160015f5114811615612f11575b8360405215612efb57505050565b635274afe760e01b835216600482015260249150fd5b6001811516612f2757813b15153d151616612eed565b833d5f823e3d90fd5b9092604051936323b872dd60e01b5f526001600160a01b0393848092166004521660245260445260205f60648180855af160015f5114811615612f80575b836040525f60605215612efb57505050565b6001811516612f2757813b15153d151616612f6e565b93929193612fa3836133de565b61290e5784612fb7576128849394506127bd565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f5281526128c9835f205494856134cc565b9092919261300181613a64565b9361300b816133de565b61304b5784816001600160e01b0361302a9360e01d9116601b0b61489f565b50809281613039575050509190565b6001600160a01b036128209316612eb7565b604051632d1671a360e11b8152600490fd5b9161308890606061307d936001600160a01b039485916040880151611fd7565b515116940151611fd7565b5151161461266857565b94919392909260408051916130a683611998565b6130ae611ee2565b83526020925f848201525f838201526060945f868301528560c06080938260808201525f60a082015201528351916130e583611900565b600483525f5b8181106133cf5750506132d8959493925f9261320f61325f938d61310e8161270e565b9c896001600160a01b039e8f94859182865116908d5194600386528501528c840152168c820152608081018a5261314486611f8a565b5261314e85611f8a565b50885161315a81611930565b6002815289368c83013761316d86611f97565b5261317785611f97565b5060ff8a6131da8b8501936131c48761319d81613195858a51611fd7565b515116613d75565b975116886131ac848951611fd7565b515116856131bb858a51611fd7565b51015191612d27565b966131d0828751611fd7565b5151169451611fd7565b51015192169093929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b61321882611fa7565b5261322281611fa7565b506132468a8d8d60ff8a6131da8d8501936131c48761319d81613195858a51611fd7565b61324f82611fb7565b5261325981611fb7565b50613b43565b95878a511697848b0191825191868184511693015116928a85523087528580862091510151865191613290836119b4565b86835287519561329f87611998565b86528886015286850152848885015289608085015260a084015260c08301528351808098819463d04dfe2360e01b835260048301612a6b565b03915afa9687156133c5575f945f986133a3575b5084516002811061338c5750818386015195015161331261330c88611fc7565b51611fb7565b5161331d8183613401565b156133845750925b6133478685919060405192600284526020840152604083015260608201604052565b61335088611fa7565b5261335a87611fa7565b508251996133678b611998565b8a52890152870152850152608084015260a083015260c082015290565b905092613325565b602490835190630fbb8e5560e21b82526004820152fd5b9097506133bb9194503d805f833e612d0081836119d0565b939093965f6132ec565b50513d5f823e3d90fd5b808888809387010152016130eb565b6133fd905f60e01d906001600160e01b038160e01d9116601b0b61479f565b1390565b906133fd916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614820565b61344f6001600160e01b0392838316601b0b9260e01d938160e01d9116601b0b8484613f96565b90637ffffff5821361349f575b90613466916141df565b9290921580613497575b61347957505090565b6044925060405191638eba4d0760e01b835260048301526024820152fd5b508215613470565b6134a98282614e7f565b1561345c57604483856040519163d556b11160e01b835260048301526024820152fd5b611a5391610c15916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6143e5565b611a5391610c15916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6145a9565b61357a91608081018261353c6135368351611fc7565b51611fc7565b5261357361356d6001600160a01b0380945151169361356461355e8551611fc7565b51611f8a565b51169251611fc7565b51611fa7565b5191612f96565b5050565b906080810191806135926135368551611fb7565b526001600160a01b038092515116916135ae61355e8551611fb7565b51166135bd61356d8551611fb7565b519081613658576135cd836133de565b61290e579183917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a9593612610955f5260209060018252613623604094855f20835f528452855f20855f528452855f20546134f6565b945f5260018252835f20905f528152825f20915f52525f20555b51604051918291338352604060208401526040830190612a0f565b91613689917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a959361261095612863565b505061363d565b60c0810151908151915f92613804575b506137456020918281510151926001600160a01b039081818187511696015116928660a082019485518252308452604097888320898686510151015160808601518b51916136ed836119b4565b8683528c51936136fc856119b4565b8785528d519661370b88611998565b8752898701528c86015260016060860152608085015260a084015260c08301528851808099819463d04dfe2360e01b835260048301612a6b565b03915afa9485156137fa5787956137dc575b508451613768575b50505050505050565b81905101510151169051813b156137d85791849184938361379d965180978195829463012c676d60e21b845260048401612b23565b03925af19081156137cf57506137b8575b808080808061375f565b6137c28291611984565b6137cc57806137ae565b80fd5b513d84823e3d90fd5b8480fd5b6137f19195503d8089833e612d0081836119d0565b9050935f613757565b86513d89823e3d90fd5b6001600160a01b03602080845101510151169060a083015190823b1561015f57613847925f928360405180968195829463012c676d60e21b845260048401612b23565b03925af1801561016b57156136a057613861919250611984565b5f905f6136a0565b6080810161387a61356d8251611fb7565b5191821561388757505050565b6138a161355e6001600160a01b0380935151169351611fb7565b5116815f5260209160018352604092835f20835f528152835f20855f528152835f2054936001600160e01b0385166138dc575b505050505050565b613900955f9284845260018152828420868552815282842091845252812055612ff4565b5f8080806138d4565b8115613913570490565b634e487b7160e01b5f52601260045260245ffd5b604081511061396f576020810151908051603f19810190811161283d5760051c821161395b5760016020920160051b010190565b5050604051613969816119b4565b5f815290565b50604051613969816119b4565b80511561398c57602001515f1a90565b505f90565b905f8091602081519101845af48080613a0f575b156139c55750506040513d81523d5f602083013e60203d82010160405290565b156139ec57604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b3d156139fd576040513d5f823e3d90fd5b60405163d6bda27560e01b8152600490fd5b503d1515806139a55750813b15156139a5565b60041115613a2c57565b634e487b7160e01b5f52602160045260245ffd5b602090939291936001600160a01b036040820195168152613a6083613a22565b0152565b613a6c614f6d565b6040805163b7bad1b160e01b81526001600160a01b0383166004820152909182826024815f73200e12d10bb0c5e4a17e7018f0f1161919bb93895af1928315613b3a575f925f94613b05575b50613ac283613a22565b600183141580613af3575b613ad75750505090565b5163ee07877f60e01b8152918291610725919060048401613a40565b50613afd83613a22565b821515613acd565b90809450613b299293503d8511613b33575b613b2181836119d0565b810190614875565b919091925f613ab8565b503d613b17565b513d5f823e3d90fd5b90805191613b5083611ab4565b91613b6b604094613b63865195866119d0565b808552611ab4565b601f199460209186013686840137835183519095908015613d6a576001613bc19101965b6001978891010197613bb8613ba38a611ab4565b99613bb086519b8c6119d0565b808b52611ab4565b018489016121f5565b85805f9684516002815233878201523086820152606081018652613be48b611f8a565b52613bee8a611f8a565b505f925b613d26575b5050508351613c0a575b50505050505090565b85809598979692980181613c1e8289611fd7565b52613c298188611fd7565b505f925b613c3c575b5085969750613c01565b8451831015613d21576001600160a01b03613cb381613c5b8689611fd7565b51511686613c69878a611fd7565b51015187815160051b9101207f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f52601c52603c5f208c613caa888b611fd7565b510151916149cb565b15613d0957868098999a928192613cca878a611fd7565b515116613cd78787611fd7565b52019385613ce58289611fd7565b510151613cf2868c611fd7565b52613cfd858b611fd7565b50019290989796613c2d565b8951630a57f30960e31b815260048101859052602490fd5b613c32565b9091968151881015613d61578280910197613d418184611fd7565b51613d4c8a8d611fd7565b52613d57898c611fd7565b5001919081613bf2565b96829150613bf7565b50613bc15f96613b8f565b613d7d614f6d565b60408051630782d7e160e01b81526001600160a01b03831660048201529091828260248173200e12d10bb0c5e4a17e7018f0f1161919bb93895afa928315613b3a575f925f94613b055750613ac283613a22565b9091939284158215175f14613deb5750505090505f905f90565b82810192600160fd1b8082019083011760fe1c613f22575b5050613e0e81614b44565b93613e1881614b44565b94613e238682614b64565b90918215613f13575f9083986f0785ee10d5da46d900f436a000000000808611613f05575b50670de0b6b3a7640000808b11613ef6575b50633b9aca00808b11613ee7575b50612710808b11613ed9575b5098805b613ec8575081906118d8989982600a0a9109960195817fcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccd0a93838211900382610100031b9203901c170291614b77565b60019290920191600a900480613e78565b60049a04998a930192613e74565b600991939a049901915f613e68565b601291939a049901915f613e5a565b85049950602592505f613e48565b509290506118d8949550614b77565b5f821215613f7657808413613f68575b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb2841315613e03579092506118d8939491614a82565b9092506118d8939491614ae9565b80841215613f32579092506118d8939491614a82565b61346682826141df565b92909180613fbc576044848460405191637a97930f60e01b835260048301526024820152fd5b90919280155f14613fd157505050505f905f90565b613fea93613fde91614c31565b92919490938492614c31565b9093919284613ff888614b44565b9161400286614b44565b947f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000094604c918688106141a9575b030191600160ff1b98838a018112155f14614176575050035b5f955f82128061416d575b61414f575b5f81128061413d575b61411f5786820103966001600160ff1b0388149081614115575b508061410c575b80614103575b6140e55750906140999291614ddd565b915f81136140ac575b506118d893614b77565b9091604c82136140da576140c391600a0a90613909565b9081156140d0575f6140a2565b505050505f905f90565b50505050505f905f90565b876044916040519163d556b11160e01b835260048301526024820152fd5b505f8512614089565b50828414614083565b905088145f61407c565b604489836040519163d556b11160e01b835260048301526024820152fd5b50806001600160ff1b03018213614062565b95508087018613156141675786818703015b95614059565b5f614161565b505f8113614054565b89985090920390506001600160ff1b038190038701821361419a5701860194614049565b5050505050505050505f905f90565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009650604b9250614030565b8115613913570590565b8082601b82810b83146143d4577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000008405614380575b8380820b0361436f57507b199999999999999999999999999999999999999999999999999999987b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc84011115614320575b838060030b036142a4575b8084136142885750506001600160e01b036001925b60e01b91161791565b8303600a0a8015613913576001600160e01b039107159261427f565b92915f8413156142f45750906142ba8383614e7f565b6142d657637ffffffe1901600a0a810290637fffffff9261426a565b506044916040519163d556b11160e01b835260048301526024820152fd5b637fffffff1992830390604382136140da5761431391600a0a906141d5565b9182156140d0579261426a565b5f198401808060030b14614334575061425f565b90506001600160e01b039293507b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff915060e01b9260ff1d181617905f90565b600190940193600a90930592614212565b937f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000008405156143c1576305f5e100600894058094819201955b915050614212565b620186a0600594058094819201956143b9565b508261425f57505050505f90600190565b919291600160ff1b84016143fd576118d89350614e98565b906118d8935f03916145a9565b919291600160ff1b919080158061459757509061442691614c31565b9490929091905f86858585828213801561458e575b614571575b505050508682841860ff1c94860391039081604c0381116145565701600a0a80820591908461453c575b505081019182821860ff1c111561453457826001600160ff1b031461451657905f600192135f146144e757600a9004915b01925b811581176144ab57509190565b806144c4575b5080156144bc579190565b505f91508190565b91926144da9203600160ff1b01600a0a906141d5565b600160ff1b91905f6144b1565b600a60037fe666666666666666666666666666666666666666666666666666666666666667920104019161449b565b604490836040519163d556b11160e01b835260048301526024820152fd5b50909261449e565b8107614549575b8061446a565b60ff1d600117015f614543565b505050919350614564579190565b60018160ff1d1790039190565b5f9a50909750909550600160ff1b94509250905086808080614440565b50835f1261443b565b156145a25750509190565b9350919050565b93929193841581158181176146fa575050906145c491614c31565b91949082956145d582958294614c31565b80969294919693878684821380156146f1575b6146d8575b5050505050508682841860ff1c94860391039081604c0381116145565701600a0a8082059190846146be575b505081019182821860ff1c11156146b657826001600160ff1b031461451657905f600192135f1461468757600a9004915b01925b8115811761465a57509190565b8061466a575080156144bc579190565b600160ff1b936146819291038401600a0a906141d5565b5f6144b1565b600a60037fe666666666666666666666666666666666666666666666666666666666666667920104019161464a565b50909261464d565b81076146cb575b80614619565b60ff1d600117015f6146c5565b929b5098509196509450925090505f80808080806145ed565b508584126145e8565b93959390929190156147105750506144bc579190565b945092915050565b600881511061398c576008015167ffffffffffffffff1667ff0a89c674ee78741490565b9160408301926040614776610c15606087519401938451906001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b613dd1565b94519301614785815186612796565b61478d575050565b909350611a5391925051925183613428565b92915f9060018184145f87128715171717614819575f9280821361480b575b03604c81135f8212176147ff57600a0a90846147dd83820293846141d5565b146147f2575050156147ee575f9190565b5f90565b9093509015611a53579190565b5050156147ee575f9190565b5f95600194509250906147be565b5050505f90565b93929190918083145f83125f8712188315871517171761486f575f928082136148625703604c81135f8212176147ff57600a0a90846147dd83820293846141d5565b91946001935091906147be565b50919050565b919082604091031261015f578151600481101561015f5760209092015160ff8116810361015f5790565b91925f8312156148c7576044838360405191634a7d166b60e01b835260048301526024820152fd5b9192836148d957505090505f90600190565b60ff81168201918083126149a1575f831215614911575050604c1981126144bc575f03600a0a9161490a8382613909565b9283021490565b909293915f81135f1461499757604d811361496c57600a0a92831561391357835f190483116149435750500290600190565b60405163c849483b60e01b815260048101849052602481019290925260ff166044820152606490fd5b5060405163c849483b60e01b81526004810192909252602482015260ff919091166044820152606490fd5b5050905090600190565b60405163c849483b60e01b815260048101869052602481019190915260ff82166044820152606490fd5b9091813b614a06576149dd9192614fd6565b506149e781613a22565b1591826149f357505090565b6001600160a01b03918216911614919050565b6020918160645f935160405192630b135d3f60e11b9788855260048501526040602485015286820190604485015e8281018201859052601f01601f191601915afa905f5114601f3d11161690565b9060ff165f03916001600160ff1b0382115f14614a7a57600a6001818404940192061590565b909190600190565b909392915f614a92918184613dd1565b9490945f8483019182019412159081614adf575b8115614ad5575b50614ab757505090565b604492506040519163d556b11160e01b835260048301526024820152fd5b905083125f614aad565b8281129150614aa6565b614afe93600160fe1b90810193920190613dd1565b9081815f821215614b35575050604b19821261288457614b23915f03600a0a906141d5565b9081614b2d575f90565b600160ff1b90565b93600160ff1b90910192509050565b5f811215611a5357600160ff1b90808203614b5d575090565b90505f0390565b905f198183099102908180821091030391565b92939291905f8184181215614c0c576001600160ff1b039283831115614bf657600160ff1b93838503614bac57505050509190565b90919293508514614bc6575050600a600191045f03920190565b604051630ed8062160e21b8152600481019190915260248101919091526044810182905260648101849052608490fd5b5090915050600160ff1b811461283d575f039190565b90916001600160ff1b0380841115612805578514614bc6575050600a60019104920190565b9190918015614dd357827f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000080830515614ce1575b507f19999999999999999999999999999999999999999999999999999999999999997f0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc830110614cd2575b8313614cbc5791905f90565b919060018060ff1b926001600160ff1b03030190565b9290600a02905f190192614cb0565b6f4b3b4ca85a86c47a098a22400000000080840515614dc1575b507728c87cb5c89a2571ebfdcb54864ada834a00000000000000830515614daa575b7b097edd871cfda3a5697758bf0e3cbb5ac5741c640000000000000000830515614d96575b7e3899162693736ac531a5a58f1fbb4b746504382ca7e4000000000000000000830515614d8657820515614d77575b5f614c65565b9290600a02905f190192614d71565b9391606402916001190193614d42565b93916402540be40002916009190193614d42565b9391678ac7230489e8000002916012190193614d1d565b6025198301955092909202915f614cfb565b505f915081908190565b90915f198383099280830292838086109503948086039584871015614e5b5714614e53579082910960018219018216809204600280826003021880830282030280830282030280830282030280830282030280830282030280920290030293600183805f03040190848311900302920304170290565b505091500490565b60648386866040519263362ced0960e11b8452600484015260248301526044820152fd5b611a5391905f811215614e93575f03615010565b615010565b909291600160ff1b91828101614f2a5750808414614f2057808413918215614f18578185035b604c811115614f075750505f915b15614ef857507f8000000000000000000000000000000000000000000000000000000000000001019190565b92506001600160ff1b03039190565b600a0a908115613913570491614ecc565b848203614ebe565b505090505f905f90565b93614f3792945f0361440a565b80939180928114614f4b575b50505f039190565b915092506001600160ff1b03831461451657600a600191059201915f80614f43565b73200e12d10bb0c5e4a17e7018f0f1161919bb9389803b158015614fab575b614f935750565b602490604051906373e6d7b360e01b82526004820152fd5b507f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d41813f1415614f8c565b815191906041830361500657614fff9250602082015190606060408401519301515f1a9061509f565b9192909190565b50505f9160029190565b90637ffffff581131561509957637ffffffe1981019060438213615092575f82121561506657637fffffff91505f0301600a0a7b8000000000000000000000000000000000000000000000000000000202111590565b50600a0a8015613913577b80000000000000000000000000000000000000000000000000000001041090565b5050151590565b50505f90565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411615116579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa1561016b575f516001600160a01b0381161561510c57905f905f90565b505f906001905f90565b5050505f916003919056", "linkReferences": {} } } diff --git a/foundry.toml b/foundry.toml index 64bdab412d..9b2b779b88 100644 --- a/foundry.toml +++ b/foundry.toml @@ -81,7 +81,7 @@ rainlang = "0.2.19" rainlang-interface = "0.2.13" # rainlanguage/rain.raindex.interface was renamed to # rainlanguage/raindex.interface; Soldeer registry name follows. -raindex-interface = "0.1.8" +raindex-interface = { version = "0.1.10", git = "https://github.com/rainlanguage/raindex.interface.git", rev = "b8b58723c50ab950e18d9126fb608d6f20924602" } rain-metadata = "0.1.43" # The MetaBoard split out of `rain.metadata` into its own deploy repo. The # deploy pin lives there now; `rain-metadata` keeps the interfaces and libs. diff --git a/remappings.txt b/remappings.txt index cbfd8c86ca..5801e4f202 100644 --- a/remappings.txt +++ b/remappings.txt @@ -17,6 +17,6 @@ rain-solmem-0.1.28/=dependencies/rain-solmem-0.1.28/ rain-string-0.3.9/=dependencies/rain-string-0.3.9/ rain-tofu-erc20-decimals-0.1.4/=dependencies/rain-tofu-erc20-decimals-0.1.4/ rain-tofu-erc20-decimals-deploy-0.1.3/=dependencies/rain-tofu-erc20-decimals-deploy-0.1.3/ -raindex-interface-0.1.8/=dependencies/raindex-interface-0.1.8/ +raindex-interface-0.1.10/=dependencies/raindex-interface-0.1.10/ rainlang-0.2.19/=dependencies/rainlang-0.2.19/ rainlang-interface-0.2.13/=dependencies/rainlang-interface-0.2.13/ diff --git a/script/build.sh b/script/build.sh index 28b32fa363..35c9e4fcaa 100755 --- a/script/build.sh +++ b/script/build.sh @@ -39,7 +39,7 @@ jq "{abi}" out/DecimalFloat.sol/DecimalFloat.json > subgraph/abis/DecimalFloat.j mkdir -p crates/bindings/abis # Sources the raindex compiler profile also compiles get per-profile artifacts. -jq "{abi}" out/IRaindexV6.sol/IRaindexV6.default.json > crates/bindings/abis/IRaindexV6.json +jq "{abi}" out/IRaindexV7.sol/IRaindexV7.default.json > crates/bindings/abis/IRaindexV7.json jq "{abi}" out/RaindexV6.sol/RaindexV6.json > crates/bindings/abis/RaindexV6.json jq "{abi}" out/ERC20.sol/ERC20.json > crates/bindings/abis/ERC20.json jq "{abi}" out/IERC20Metadata.sol/IERC20Metadata.default.json > crates/bindings/abis/IERC20Metadata.json diff --git a/soldeer.lock b/soldeer.lock index df051c5afb..f81d8f2261 100644 --- a/soldeer.lock +++ b/soldeer.lock @@ -133,10 +133,9 @@ integrity = "a2832c32c4a13a592c4c66072be5dca8b956e535467d8ce3cb6c51e9b4d5fc89" [[dependencies]] name = "raindex-interface" -version = "0.1.8" -url = "https://soldeer-revisions.s3.amazonaws.com/raindex-interface/0_1_8_20-10-2026_19:54:20_raindex.zip" -checksum = "2511bbf1d709ff96d203f6c55e0b1aec09ef8f5a46cff6dab03ecbb3848473d5" -integrity = "7c26914cf291270095904b8e963748c932d8b2599446e1de98e91a8b3f871e2c" +version = "0.1.10" +git = "https://github.com/rainlanguage/raindex.interface.git" +rev = "b8b58723c50ab950e18d9126fb608d6f20924602" [[dependencies]] name = "rainlang" diff --git a/src/abstract/RaindexV6ArbCommon.sol b/src/abstract/RaindexV6ArbCommon.sol index 7a7e82db48..6ec159835d 100644 --- a/src/abstract/RaindexV6ArbCommon.sol +++ b/src/abstract/RaindexV6ArbCommon.sol @@ -2,7 +2,7 @@ // SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd pragma solidity ^0.8.19; -import {TaskV2} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +import {TaskV2} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; /// @param task The task to run as post for each arb. struct RaindexV6ArbConfig { diff --git a/src/abstract/RaindexV6ArbOrderTaker.sol b/src/abstract/RaindexV6ArbOrderTaker.sol index 78a4ed18d1..d14de7a782 100644 --- a/src/abstract/RaindexV6ArbOrderTaker.sol +++ b/src/abstract/RaindexV6ArbOrderTaker.sol @@ -5,13 +5,13 @@ pragma solidity ^0.8.19; import {ERC165, IERC165} from "@openzeppelin-contracts-5.7.0/utils/introspection/ERC165.sol"; import {ReentrancyGuard} from "@openzeppelin-contracts-5.7.0/utils/ReentrancyGuard.sol"; import {IERC20, SafeERC20} from "@openzeppelin-contracts-5.7.0/token/ERC20/utils/SafeERC20.sol"; -import {IRaindexV6} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; -import {IRaindexV6ArbOrderTaker, TaskV2} from "raindex-interface-0.1.8/src/interface/IRaindexV6ArbOrderTaker.sol"; -import {TakeOrdersConfigV5, Float} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +import {IRaindexV7} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; +import {IRaindexV7ArbOrderTaker, TaskV2} from "raindex-interface-0.1.10/src/interface/IRaindexV7ArbOrderTaker.sol"; +import {TakeOrdersConfigV5, Float} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {RaindexV6ArbCommon} from "./RaindexV6ArbCommon.sol"; import {LibRaindexArb} from "../lib/LibRaindexArb.sol"; import {LibRaindexDeploy} from "../lib/deploy/LibRaindexDeploy.sol"; -import {IRaindexV6OrderTaker} from "raindex-interface-0.1.8/src/interface/IRaindexV6OrderTaker.sol"; +import {IRaindexV7OrderTaker} from "raindex-interface-0.1.10/src/interface/IRaindexV7OrderTaker.sol"; import {LibTOFUTokenDecimals} from "rain-tofu-erc20-decimals-0.1.4/src/lib/LibTOFUTokenDecimals.sol"; /// Thrown when `arb5` is called with a `raindex` that is not the trusted @@ -28,8 +28,8 @@ error UnexpectedOnTakeOrdersCaller(address caller); /// flash loans. Inheritors implement the strategy for sourcing the input token /// (e.g. routing through a DEX). abstract contract RaindexV6ArbOrderTaker is - IRaindexV6OrderTaker, - IRaindexV6ArbOrderTaker, + IRaindexV7OrderTaker, + IRaindexV7ArbOrderTaker, ReentrancyGuard, ERC165, RaindexV6ArbCommon @@ -40,12 +40,12 @@ abstract contract RaindexV6ArbOrderTaker is /// @inheritdoc IERC165 function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { - return (interfaceId == type(IRaindexV6OrderTaker).interfaceId) - || (interfaceId == type(IRaindexV6ArbOrderTaker).interfaceId) || super.supportsInterface(interfaceId); + return (interfaceId == type(IRaindexV7OrderTaker).interfaceId) + || (interfaceId == type(IRaindexV7ArbOrderTaker).interfaceId) || super.supportsInterface(interfaceId); } - /// @inheritdoc IRaindexV6ArbOrderTaker - function arb5(IRaindexV6 raindex, TakeOrdersConfigV5 calldata takeOrders, TaskV2 calldata task) + /// @inheritdoc IRaindexV7ArbOrderTaker + function arb5(IRaindexV7 raindex, TakeOrdersConfigV5 calldata takeOrders, TaskV2 calldata task) external payable nonReentrant @@ -53,7 +53,7 @@ abstract contract RaindexV6ArbOrderTaker is _beforeArb(task); // Mimic what Raindex would do anyway if called with zero orders. if (takeOrders.orders.length == 0) { - revert IRaindexV6.NoOrders(); + revert IRaindexV7.NoOrders(); } // The arb grants `raindex` an unlimited token approval and calls it, so // it MUST be the trusted deployment rather than a caller-supplied address. @@ -78,7 +78,7 @@ abstract contract RaindexV6ArbOrderTaker is ); } - /// @inheritdoc IRaindexV6OrderTaker + /// @inheritdoc IRaindexV7OrderTaker /// @dev While `arb5` is in flight only the trusted raindex may call this; /// any other caller reverts with `UnexpectedOnTakeOrdersCaller`. During an /// arb the contract holds the caller's `msg.value` and tokens, and diff --git a/src/abstract/RaindexV6ArbTaskGated.sol b/src/abstract/RaindexV6ArbTaskGated.sol index d1855f90d3..aca4709b47 100644 --- a/src/abstract/RaindexV6ArbTaskGated.sol +++ b/src/abstract/RaindexV6ArbTaskGated.sol @@ -3,7 +3,7 @@ pragma solidity ^0.8.19; import {RaindexV6ArbCommon, RaindexV6ArbConfig, WrongTask} from "./RaindexV6ArbCommon.sol"; -import {TaskV2} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +import {TaskV2} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; /// @title RaindexV6ArbTaskGated /// @notice Mixin that adds task-hash gating to arb contracts. Stores a task diff --git a/src/abstract/RaindexV6FlashBorrower.sol b/src/abstract/RaindexV6FlashBorrower.sol index b3b269c8c8..60de2901ef 100644 --- a/src/abstract/RaindexV6FlashBorrower.sol +++ b/src/abstract/RaindexV6FlashBorrower.sol @@ -6,9 +6,11 @@ import {ERC165, IERC165} from "@openzeppelin-contracts-5.7.0/utils/introspection import {SafeERC20} from "@openzeppelin-contracts-5.7.0/token/ERC20/utils/SafeERC20.sol"; import {IERC20} from "@openzeppelin-contracts-5.7.0/token/ERC20/IERC20.sol"; import {ReentrancyGuard} from "@openzeppelin-contracts-5.7.0/utils/ReentrancyGuard.sol"; -import {ON_FLASH_LOAN_CALLBACK_SUCCESS} from "raindex-interface-0.1.8/src/interface/ierc3156/IERC3156FlashBorrower.sol"; -import {IRaindexV6, TakeOrdersConfigV5, TaskV2} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; -import {IERC3156FlashBorrower} from "raindex-interface-0.1.8/src/interface/ierc3156/IERC3156FlashBorrower.sol"; +import { + ON_FLASH_LOAN_CALLBACK_SUCCESS +} from "raindex-interface-0.1.10/src/interface/ierc3156/IERC3156FlashBorrower.sol"; +import {IRaindexV7, TakeOrdersConfigV5, TaskV2} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; +import {IERC3156FlashBorrower} from "raindex-interface-0.1.10/src/interface/ierc3156/IERC3156FlashBorrower.sol"; import {RaindexV6ArbCommon} from "./RaindexV6ArbCommon.sol"; import {LibRaindexArb} from "../lib/LibRaindexArb.sol"; import {LibRaindexDeploy} from "../lib/deploy/LibRaindexDeploy.sol"; @@ -107,7 +109,7 @@ abstract contract RaindexV6FlashBorrower is IERC3156FlashBorrower, ReentrancyGua // the flash loan itself will take back what it needs, and we simply // keep anything left over according to active balances. //slither-disable-next-line unused-return - IRaindexV6(msg.sender).takeOrders4(takeOrders); + IRaindexV7(msg.sender).takeOrders4(takeOrders); return ON_FLASH_LOAN_CALLBACK_SUCCESS; } @@ -124,7 +126,7 @@ abstract contract RaindexV6FlashBorrower is IERC3156FlashBorrower, ReentrancyGua /// /// @param raindex The `Raindex` contract to take orders from and flash /// loan against. - /// @param takeOrders As per `IRaindexV6.takeOrders4`. + /// @param takeOrders As per `IRaindexV7.takeOrders4`. /// @param exchangeData Arbitrary bytes that will be passed to `_exchange` /// after the flash loan is taken. The inheriting contract is responsible /// for decoding this data and defining how it controls interactions with @@ -132,7 +134,7 @@ abstract contract RaindexV6FlashBorrower is IERC3156FlashBorrower, ReentrancyGua /// uses this data as a literal encoded external call. /// @param task The task to evaluate after the arb completes. function arb4( - IRaindexV6 raindex, + IRaindexV7 raindex, TakeOrdersConfigV5 calldata takeOrders, bytes calldata exchangeData, TaskV2 calldata task @@ -140,7 +142,7 @@ abstract contract RaindexV6FlashBorrower is IERC3156FlashBorrower, ReentrancyGua _beforeArb(task); // Mimic what Raindex would do anyway if called with zero orders. if (takeOrders.orders.length == 0) { - revert IRaindexV6.NoOrders(); + revert IRaindexV7.NoOrders(); } // The flash-loan amount below reads `minimumIO` as the order output the // taker receives, which only matches when `minimumIO` is the taker diff --git a/src/abstract/RaindexV6FlashLender.sol b/src/abstract/RaindexV6FlashLender.sol index 5520598adb..095bf6ec4e 100644 --- a/src/abstract/RaindexV6FlashLender.sol +++ b/src/abstract/RaindexV6FlashLender.sol @@ -9,8 +9,8 @@ import {SafeERC20} from "@openzeppelin-contracts-5.7.0/token/ERC20/utils/SafeERC import { IERC3156FlashBorrower, ON_FLASH_LOAN_CALLBACK_SUCCESS -} from "raindex-interface-0.1.8/src/interface/ierc3156/IERC3156FlashBorrower.sol"; -import {IERC3156FlashLender} from "raindex-interface-0.1.8/src/interface/ierc3156/IERC3156FlashLender.sol"; +} from "raindex-interface-0.1.10/src/interface/ierc3156/IERC3156FlashBorrower.sol"; +import {IERC3156FlashLender} from "raindex-interface-0.1.10/src/interface/ierc3156/IERC3156FlashLender.sol"; /// Thrown when the `onFlashLoan` callback returns anything other than /// ON_FLASH_LOAN_CALLBACK_SUCCESS. diff --git a/src/concrete/raindex/RaindexV6.sol b/src/concrete/raindex/RaindexV6.sol index 24e2425a1b..e7bb65927b 100644 --- a/src/concrete/raindex/RaindexV6.sol +++ b/src/concrete/raindex/RaindexV6.sol @@ -31,7 +31,7 @@ import {LibTOFUTokenDecimals, TOFUOutcome} from "rain-tofu-erc20-decimals-0.1.4/ import {ITOFUTokenDecimals} from "rain-tofu-erc20-decimals-0.1.4/src/interface/ITOFUTokenDecimals.sol"; import { - IRaindexV6, + IRaindexV7, OrderV4, OrderConfigV4, TakeOrderConfigV4, @@ -46,8 +46,8 @@ import { QuoteV2, Float, IOV2 -} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; -import {IRaindexV6OrderTaker} from "raindex-interface-0.1.8/src/interface/IRaindexV6OrderTaker.sol"; +} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; +import {IRaindexV7OrderTaker} from "raindex-interface-0.1.10/src/interface/IRaindexV7OrderTaker.sol"; import {LibOrder} from "../../lib/LibOrder.sol"; import { CALLING_CONTEXT_COLUMNS, @@ -88,8 +88,8 @@ import {OrderIOCalculationV4} from "../../struct/OrderIOCalculationV4.sol"; import {TakeOrdersIO} from "../../struct/TakeOrdersIO.sol"; /// @title RaindexV6 -/// See `IRaindexV6` for more documentation. -contract RaindexV6 is IRaindexV6, IMetaV1_2, ReentrancyGuard, Multicall, RaindexV6FlashLender { +/// See `IRaindexV7` for more documentation. +contract RaindexV6 is IRaindexV7, IMetaV1_2, ReentrancyGuard, Multicall, RaindexV6FlashLender { using LibUint256Array for uint256[]; using SafeERC20 for IERC20; using LibOrder for OrderV4; @@ -109,14 +109,14 @@ contract RaindexV6 is IRaindexV6, IMetaV1_2, ReentrancyGuard, Multicall, Raindex mapping(bytes32 orderHash => uint256 liveness) internal sOrders; /// @dev Vault balances are stored in a mapping of owner => token => vault ID - /// This gives 1:1 parity with the `IRaindexV6` interface but keeping the + /// This gives 1:1 parity with the `IRaindexV7` interface but keeping the /// `sFoo` naming convention for storage variables. // Solhint and slither disagree on this. Slither wins. //solhint-disable-next-line private-vars-leading-underscore mapping(address owner => mapping(address token => mapping(bytes32 vaultId => Float balance))) internal sVaultBalances; - /// @inheritdoc IRaindexV6 + /// @inheritdoc IRaindexV7 function vaultBalance2(address owner, address token, bytes32 vaultId) external view override returns (Float) { return _vaultBalance(owner, token, vaultId); } @@ -144,17 +144,17 @@ contract RaindexV6 is IRaindexV6, IMetaV1_2, ReentrancyGuard, Multicall, Raindex } } - /// @inheritdoc IRaindexV6 + /// @inheritdoc IRaindexV7 function orderExists(bytes32 orderHash) external view override returns (bool) { return sOrders[orderHash] == ORDER_LIVE; } - /// @inheritdoc IRaindexV6 + /// @inheritdoc IRaindexV7 function entask2(TaskV2[] calldata post) external nonReentrant { LibRaindex.doPost(new bytes32[][](0), post); } - /// @inheritdoc IRaindexV6 + /// @inheritdoc IRaindexV7 function deposit4(address token, bytes32 vaultId, Float depositAmount, TaskV2[] calldata post) external nonReentrant @@ -189,7 +189,7 @@ contract RaindexV6 is IRaindexV6, IMetaV1_2, ReentrancyGuard, Multicall, Raindex } } - /// @inheritdoc IRaindexV6 + /// @inheritdoc IRaindexV7 function withdraw4(address token, bytes32 vaultId, Float targetAmount, TaskV2[] calldata post) external nonReentrant @@ -228,7 +228,7 @@ contract RaindexV6 is IRaindexV6, IMetaV1_2, ReentrancyGuard, Multicall, Raindex } } - /// @inheritdoc IRaindexV6 + /// @inheritdoc IRaindexV7 function addOrder4(OrderConfigV4 calldata orderConfig, TaskV2[] calldata post) external nonReentrant @@ -284,7 +284,7 @@ contract RaindexV6 is IRaindexV6, IMetaV1_2, ReentrancyGuard, Multicall, Raindex return stateChange; } - /// @inheritdoc IRaindexV6 + /// @inheritdoc IRaindexV7 function removeOrder3(OrderV4 calldata order, TaskV2[] calldata post) external nonReentrant @@ -320,7 +320,7 @@ contract RaindexV6 is IRaindexV6, IMetaV1_2, ReentrancyGuard, Multicall, Raindex } } - /// @inheritdoc IRaindexV6 + /// @inheritdoc IRaindexV7 function quote2(QuoteV2 calldata quoteConfig) external view returns (bool, Float, Float) { bytes32 orderHash = quoteConfig.order.hash(); @@ -340,12 +340,12 @@ contract RaindexV6 is IRaindexV6, IMetaV1_2, ReentrancyGuard, Multicall, Raindex quoteConfig.signedContext, new bytes32[](0) ); - // true is quote2's "order is live" result required by IRaindexV6. + // true is quote2's "order is live" result required by IRaindexV7. // forge-lint: disable-next-line(boolean-cst) return (true, orderIOCalculation.outputMax, orderIOCalculation.IORatio); } - /// @inheritdoc IRaindexV6 + /// @inheritdoc IRaindexV7 // Most of the cyclomatic complexity here is due to the error handling within // the loop. The actual logic is fairly linear. //slither-disable-next-line cyclomatic-complexity @@ -548,7 +548,7 @@ contract RaindexV6 is IRaindexV6, IMetaV1_2, ReentrancyGuard, Multicall, Raindex // reduced amount until settlement completes. Re-entering raindex from the // callback is blocked by `nonReentrant`. if (config.data.length > 0 && ordersTaken) { - IRaindexV6OrderTaker(msg.sender) + IRaindexV7OrderTaker(msg.sender) .onTakeOrders2(io.outputToken, io.inputToken, totalTakerInput, totalTakerOutput, config.data); } @@ -566,8 +566,8 @@ contract RaindexV6 is IRaindexV6, IMetaV1_2, ReentrancyGuard, Multicall, Raindex } } - /// @inheritdoc IRaindexV6 - function clear3( + /// @inheritdoc IRaindexV7 + function clear4( OrderV4 memory aliceOrder, OrderV4 memory bobOrder, ClearConfigV2 calldata clearConfig, @@ -616,7 +616,7 @@ contract RaindexV6 is IRaindexV6, IMetaV1_2, ReentrancyGuard, Multicall, Raindex clearConfig.aliceInputIOIndex, clearConfig.aliceOutputIOIndex, bobOrder.owner, - bobSignedContext, + aliceSignedContext, new bytes32[](0) ); OrderIOCalculationV4 memory bobOrderIOCalculation = calculateOrderIO( @@ -624,7 +624,7 @@ contract RaindexV6 is IRaindexV6, IMetaV1_2, ReentrancyGuard, Multicall, Raindex clearConfig.bobInputIOIndex, clearConfig.bobOutputIOIndex, aliceOrder.owner, - aliceSignedContext, + bobSignedContext, new bytes32[](0) ); @@ -698,7 +698,7 @@ contract RaindexV6 is IRaindexV6, IMetaV1_2, ReentrancyGuard, Multicall, Raindex /// @param stateOverlay Key/value pairs seeded into the interpreter's /// in-memory store before the calculate eval, making earlier same-owner, /// same-batch calculate writes visible to this evaluation. Empty for - /// single-order callers (`quote`, `clear3`). + /// single-order callers (`quote`, `clear4`). function calculateOrderIO( OrderV4 memory order, uint256 inputIOIndex, diff --git a/src/generated/candidate/GenericPoolRaindexV6ArbOrderTaker.sol b/src/generated/candidate/GenericPoolRaindexV6ArbOrderTaker.sol index 9107129b10..61a3939b6c 100644 --- a/src/generated/candidate/GenericPoolRaindexV6ArbOrderTaker.sol +++ b/src/generated/candidate/GenericPoolRaindexV6ArbOrderTaker.sol @@ -5,23 +5,23 @@ pragma solidity ^0.8.25; // THIS FILE IS AUTOGENERATED BY THE BUILD SCRIPT. DO NOT EDIT BY HAND. /// @dev Hash of the known bytecode. -bytes32 constant BYTECODE_HASH = bytes32(0xea2ee7e4040817c33b24e5036306a6a7f9866a8468d9cb8d4013248beab196e2); +bytes32 constant BYTECODE_HASH = bytes32(0x5b347b2f35bba73f9acae3ea36836e2a5891d63b65415ece68c80128b7b2cf4f); /// @dev The deterministic deploy address of the contract when deployed via /// the Zoltu factory. -address constant DEPLOYED_ADDRESS = address(0x54B665CBC09bdA1048119105b86132Cd6b1d335B); +address constant DEPLOYED_ADDRESS = address(0xb1eD4171E14abDcC2872DA35915810680fAbE97A); /// @dev The creation bytecode of the contract. bytes constant CREATION_CODE = - hex"6080604052348015600e575f80fd5b5060017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005561238f806100405f395ff3fe608060405260043610610034575f3560e01c806301ffc9a71461003d578063691f9ed714610070578063b17c83c11461008f57005b3661003b57005b005b348015610048575f80fd5b5061005c610057366004611629565b6100a2565b604051901515815260200160405180910390f35b34801561007b575f80fd5b5061003b61008a366004611664565b6100f3565b61003b61009d366004611706565b610148565b5f6001600160e01b0319821663691f9ed760e01b14806100d257506001600160e01b0319821663b17c83c160e01b145b806100ed57506301ffc9a760e01b6001600160e01b03198316145b92915050565b61010186868686868661040a565b6101408683838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061046f92505050565b505050505050565b610150610520565b61015f61015c826119f5565b50565b61016c6080830183611ab1565b90505f0361018d57604051639c95219f60e01b815260040160405180910390fd5b6001600160a01b038316732f04ff4cf5a3a19c619fe2c892bdbd72a76bf132146101da5760405163516e822d60e01b81526001600160a01b03841660048201526024015b60405180910390fd5b5f6101e86080840184611ab1565b5f8181106101f8576101f8611af7565b905060200281019061020a9190611b0b565b6102149080611b29565b610222906040810190611b3d565b61022f6080860186611ab1565b5f81811061023f5761023f611af7565b90506020028101906102519190611b0b565b6020013581811061026457610264611af7565b61027a9260206040909202019081019150611b83565b90505f61028a6080850185611ab1565b5f81811061029a5761029a611af7565b90506020028101906102ac9190611b0b565b6102b69080611b29565b6102c4906060810190611b3d565b6102d16080870187611ab1565b5f8181106102e1576102e1611af7565b90506020028101906102f39190611b0b565b6040013581811061030657610306611af7565b61031c9260206040909202019081019150611b83565b90506103336001600160a01b038316865f1961054e565b6040516334e3942b60e11b81526001600160a01b038616906369c728569061035f908790600401611de7565b60408051808303815f875af115801561037a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061039e9190611fe7565b506103b590506001600160a01b038316865f61054e565b6103da6103c1846119f5565b836103cb856105c8565b846103d5866105c8565b61064c565b505061040560017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054600214801561044f575033732f04ff4cf5a3a19c619fe2c892bdbd72a76bf13214155b156101405760405163f6688adf60e01b81523360048201526024016101d1565b5f805f838060200190518101906104869190612009565b919450925090506001600160a01b0383166104b4576040516398521dc560e01b815260040160405180910390fd5b6001600160a01b0382166104db5760405163456ac4c360e11b815260040160405180910390fd5b6104f06001600160a01b038616845f1961054e565b6105046001600160a01b03831682476108eb565b506105196001600160a01b038616845f61054e565b5050505050565b6105286109b8565b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b61055a8383835f6109fc565b6104055761056b83835f60016109fc565b61059357604051635274afe760e01b81526001600160a01b03841660048201526024016101d1565b6105a083838360016109fc565b61040557604051635274afe760e01b81526001600160a01b03841660048201526024016101d1565b5f6105d1610a5e565b6040516354636d2b60e01b81526001600160a01b038316600482015273200e12d10bb0c5e4a17e7018f0f1161919bb9389906354636d2b906024016020604051808303815f875af1158015610628573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100ed91906120a4565b6040805160018082528183019092525f91816020015b6060815260200190600190039081610662575050604080516003808252608082019092529192505f919060208201606080368337019050506040516370a0823160e01b81523060048201529091505f906001600160a01b038816906370a0823190602401602060405180830381865afa1580156106e1573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061070591906120c4565b90508015610721576107216001600160a01b0388163383610ae9565b5f61072c8288610af6565b50905080835f8151811061074257610742611af7565b602090810291909101015250506040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015610793573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107b791906120c4565b905080156107d3576107d36001600160a01b0386163383610ae9565b5f6107de8286610af6565b50905080836001815181106107f5576107f5611af7565b6020908102919091010152504790508015610814576108143382610b37565b5f610820826012610af6565b509050808360028151811061083757610837611af7565b602002602001018181525050505080825f8151811061085857610858611af7565b60209081029190910101526040805160018082528183019092525f91816020015b6040805160a0810182525f918101828152606080830193909352608082018390528152602081019190915281526020019060019003908161087957905050905087815f815181106108cc576108cc611af7565b60200260200101819052506108e18382610b95565b5050505050505050565b6060814710156109175760405163cf47918160e01b8152476004820152602481018390526044016101d1565b5f610923858486610d59565b905080801561094457505f3d118061094457505f856001600160a01b03163b115b1561095957610951610d6e565b9150506109b1565b801561098357604051639996b31560e01b81526001600160a01b03861660048201526024016101d1565b3d1561099657610991610d87565b6109af565b60405163d6bda27560e01b815260040160405180910390fd5b505b9392505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00546002036109fa57604051633ee5aeb560e01b815260040160405180910390fd5b565b60405163095ea7b360e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610a52578383151615610a46573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b73200e12d10bb0c5e4a17e7018f0f1161919bb93893b1580610ab5575073200e12d10bb0c5e4a17e7018f0f1161919bb93893f7f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d4114155b156109fa576040516373e6d7b360e01b815273200e12d10bb0c5e4a17e7018f0f1161919bb938960048201526024016101d1565b6105a08383836001610d92565b5f805f805f610b058787610ddc565b9250925092505f80610b178585610e38565b9150915081838015610b265750815b9650965050505050505b9250929050565b80471015610b615760405163cf47918160e01b8152476004820152602481018290526044016101d1565b610b7a828260405180602001604052805f815250610d59565b15610b83575050565b3d1561099657610b91610d87565b5050565b335f8181523060209081526040808320815160a0810183528083018581526060808301879052608083018190529082528185015282518581529384018581528484019093529093909291905b86518110156108e157868181518110610bfc57610bfc611af7565b602002602001015193505f845f015160400151511115610d51575f845f01515f01516001600160a01b031663d04dfe236040518060e00160405280885f0151602001516001600160a01b03168152602001898152602001885f01516040015181526020015f8152602001610c748d8a602001516110ab565b8152602001878152602001868152506040518263ffffffff1660e01b8152600401610c9f9190612190565b5f60405180830381865afa158015610cb9573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610ce09190810190612291565b9150505f81511115610d4f5784516020015160405163012c676d60e21b81526001600160a01b03909116906304b19db490610d21908a908590600401612347565b5f604051808303815f87803b158015610d38575f80fd5b505af1158015610d4a573d5f803e3d5ffd5b505050505b505b600101610be1565b5f805f83516020850186885af1949350505050565b6040513d81523d5f602083013e3d602001810160405290565b6040513d5f823e3d81fd5b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610a52578383151615610a46573d5f823e3d81fd5b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff861115610e2757600a860460018201600a88065f1493509350935050610e31565b8593509150600190505b9250925092565b5f808383601b82900b821480610f83577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e1000000000000000000870515610eb9577f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000870515610eaa576305f5e10087059650600886019550610eb9565b620186a0870596506005860195505b8687601b0b14610ed457600a87059650856001019550610eb9565b7b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc7b1999999999999999999999999999999999999999999999999999999888820111610f7d575f600188039050808160030b03610f7b5760e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff7b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff60ff8b901d18161795505f9450610b309350505050565b505b50610f9a565b865f03610f9a57505f935060019250610b30915050565b858660030b14611051575f821315610ff957610fb6838361138d565b15610fde5760405163d556b11160e01b815260048101849052602481018390526044016101d1565b637ffffffe19909501600a0a82029550637fffffff94611051565b637fffffff19869003604381131561101b57505f9450849350610b3092505050565b80600a0a888161102d5761102d612367565b059750875f0361104757505f9450849350610b3092505050565b50637fffffff1995505b818613611061576001935061107a565b818603600a0a838161107557611075612367565b071593505b5050507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff841660e084901b1791509250929050565b60605f825167ffffffffffffffff8111156110c8576110c8611784565b6040519080825280602002602001820160405280156110f1578160200160208202803683370190505b5090505f80845111611103575f611109565b83516001015b85516001010190505f8167ffffffffffffffff81111561112b5761112b611784565b60405190808252806020026020018201604052801561115e57816020015b60608152602001906001900390816111495790505b5090505f611182604080516002815233602082015230818301526060810190915290565b82828151811061119457611194611af7565b60200260200101819052505f5b87518110156111f15781806001019250508781815181106111c4576111c4611af7565b60200260200101518383815181106111de576111de611af7565b60209081029190910101526001016111a1565b508551156113835780806001019150508382828151811061121457611214611af7565b60200260200101819052505f5b8651811015611381576112d087828151811061123f5761123f611af7565b60200260200101515f01516112ad61127b8a858151811061126257611262611af7565b6020026020010151602001518051602090810291012090565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f908152601c91909152603c902090565b8984815181106112bf576112bf611af7565b6020026020010151604001516113a8565b6112f057604051630a57f30960e31b8152600481018290526024016101d1565b86818151811061130257611302611af7565b60200260200101515f01516001600160a01b03165f1b85828151811061132a5761132a611af7565b602002602001018181525050818060010192505086818151811061135057611350611af7565b60200260200101516020015183838151811061136e5761136e611af7565b6020908102919091010152600101611221565b505b5095945050505050565b5f6109b15f841261139e57836113a2565b835f035b83611418565b5f836001600160a01b03163b5f03611406575f806113c685856114b6565b5090925090505f8160038111156113df576113df61237b565b1480156113fd5750856001600160a01b0316826001600160a01b0316145b925050506109b1565b6114118484846114fc565b90506109b1565b5f637ffffff5821361142b57505f6100ed565b637ffffffe19820160438113156114465750508115156100ed565b5f81126114865780600a0a7b800000000000000000000000000000000000000000000000000000018161147b5761147b612367565b0484119150506100ed565b805f03600a0a7b800000000000000000000000000000000000000000000000000000020284101591505092915050565b5f805f83516041036114ed576020840151604085015160608601515f1a6114df88828585611561565b955095509550505050610e31565b505081515f9150600290610e31565b805160408051630b135d3f60e11b8082526004820186905260248201929092525f92906020820185604483015e5f82606483010152601f820160051c60051b915060205f60648401838a5afa9050825f5114601f3d1116811693505050509392505050565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084111561159a57505f9150600390508261161f565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa1580156115eb573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b03811661161657505f92506001915082905061161f565b92505f91508190505b9450945094915050565b5f60208284031215611639575f80fd5b81356001600160e01b0319811681146109b1575f80fd5b6001600160a01b038116811461015c575f80fd5b5f805f805f8060a08789031215611679575f80fd5b863561168481611650565b9550602087013561169481611650565b94506040870135935060608701359250608087013567ffffffffffffffff808211156116be575f80fd5b818901915089601f8301126116d1575f80fd5b8135818111156116df575f80fd5b8a60208285010111156116f0575f80fd5b6020830194508093505050509295509295509295565b5f805f60608486031215611718575f80fd5b833561172381611650565b9250602084013567ffffffffffffffff8082111561173f575f80fd5b9085019060c08288031215611752575f80fd5b90925060408501359080821115611767575f80fd5b50840160408187031215611779575f80fd5b809150509250925092565b634e487b7160e01b5f52604160045260245ffd5b6040516060810167ffffffffffffffff811182821017156117bb576117bb611784565b60405290565b6040805190810167ffffffffffffffff811182821017156117bb576117bb611784565b604051601f8201601f1916810167ffffffffffffffff8111828210171561180d5761180d611784565b604052919050565b5f67ffffffffffffffff82111561182e5761182e611784565b50601f01601f191660200190565b5f82601f83011261184b575f80fd5b813561185e61185982611815565b6117e4565b818152846020838601011115611872575f80fd5b816020850160208301375f918101602001919091529392505050565b5f67ffffffffffffffff8211156118a7576118a7611784565b5060051b60200190565b5f82601f8301126118c0575f80fd5b813560206118d06118598361188e565b82815260059290921b840181019181810190868411156118ee575f80fd5b8286015b848110156119ea57803567ffffffffffffffff80821115611911575f80fd5b908801906060828b03601f19011215611928575f80fd5b611930611798565b8683013561193d81611650565b815260408381013583811115611951575f80fd5b8401603f81018d13611961575f80fd5b888101356119716118598261188e565b81815260059190911b82018301908a8101908f83111561198f575f80fd5b928401925b828410156119ad5783358252928b0192908b0190611994565b858c01525050506060840135838111156119c5575f80fd5b6119d38d8a8388010161183c565b9183019190915250855250509183019183016118f2565b509695505050505050565b5f60408236031215611a05575f80fd5b611a0d6117c1565b823567ffffffffffffffff80821115611a24575f80fd5b818501915060608236031215611a38575f80fd5b611a40611798565b8235611a4b81611650565b81526020830135611a5b81611650565b6020820152604083013582811115611a71575f80fd5b611a7d3682860161183c565b60408301525083526020850135915080821115611a98575f80fd5b50611aa5368286016118b1565b60208301525092915050565b5f808335601e19843603018112611ac6575f80fd5b83018035915067ffffffffffffffff821115611ae0575f80fd5b6020019150600581901b3603821315610b30575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235607e19833603018112611b1f575f80fd5b9190910192915050565b5f8235609e19833603018112611b1f575f80fd5b5f808335601e19843603018112611b52575f80fd5b83018035915067ffffffffffffffff821115611b6c575f80fd5b6020019150600681901b3603821315610b30575f80fd5b5f60208284031215611b93575f80fd5b81356109b181611650565b5f808335601e19843603018112611bb3575f80fd5b830160208101925035905067ffffffffffffffff811115611bd2575f80fd5b8060051b3603821315610b30575f80fd5b5f8235605e19833603018112611bf7575f80fd5b90910192915050565b5f808335601e19843603018112611c15575f80fd5b830160208101925035905067ffffffffffffffff811115611c34575f80fd5b803603821315610b30575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f808335601e19843603018112611c7f575f80fd5b830160208101925035905067ffffffffffffffff811115611c9e575f80fd5b8060061b3603821315610b30575f80fd5b8183525f60208085019450825f5b85811015611cf5578135611cd081611650565b6001600160a01b03168752818301358388015260409687019690910190600101611cbd565b509495945050505050565b8183526020808401935f91600585811b8301820185855b88811015611dd957858303601f19018a52611d328289611be3565b60608135611d3f81611650565b6001600160a01b03168552611d5682880183611b9e565b82898801528083880152608092507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811115611d90575f80fd5b871b808288850137860190506040611daa84820185611c00565b9450838884030182890152611dc28484018683611c42565b9e8a019e9750505093870193505050600101611d17565b509098975050505050505050565b5f602080835260e08301843582850152604082860135818601526060818701358187015280870135801515808214611e1d575f80fd5b8060808901525050611e326080880188611b9e565b60c060a08901529384905261010093848801600582901b89018601835f5b84811015611fae578b830360ff19018452813536879003607e19018112611e75575f80fd5b8601803536829003609e19018112611e8b575f80fd5b6080855281018035611e9c81611650565b6001600160a01b038082166080880152611eb88e840184611be3565b915060a0808801528135611ecb81611650565b8116610120880152818e0135611ee081611650565b16610140870152611ef3818c0182611c00565b91508a610160880152611f0b61018088018383611c42565b915050611f1a8b830183611c6a565b607f19808985030160c08a0152611f32848385611caf565b9350611f408d860186611c6a565b93509150808985030160e08a015250611f5a838383611caf565b9250505060808201358c8701528c8301358d8701528a8301358b870152611f838a840184611b9e565b935091508581038a870152611f99818484611d00565b968d019695505050918a019150600101611e50565b5050611fbd60a08c018c611c00565b8b8303601f190160c08d015298509650611fd8818989611c42565b9b9a5050505050505050505050565b5f8060408385031215611ff8575f80fd5b505080516020909101519092909150565b5f805f6060848603121561201b575f80fd5b835161202681611650565b602085015190935061203781611650565b604085015190925067ffffffffffffffff811115612053575f80fd5b8401601f81018613612063575f80fd5b805161207161185982611815565b818152876020838501011115612085575f80fd5b8160208401602083015e5f602083830101528093505050509250925092565b5f602082840312156120b4575f80fd5b815160ff811681146109b1575f80fd5b5f602082840312156120d4575f80fd5b5051919050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f815180845260208085019450602084015f5b83811015611cf55781518752958201959082019060010161211c565b5f8282518085526020808601955060208260051b840101602086015f5b8481101561218357601f19868403018952612171838351612109565b98840198925090830190600101612155565b5090979650505050505050565b602081526001600160a01b038251166020820152602082015160408201525f604083015160e060608401526121c96101008401826120db565b9050606084015160808401526080840151601f19808584030160a08601526121f18383612138565b925060a08601519150808584030160c086015261220e8383612109565b925060c08601519150808584030160e08601525061222c8282612109565b95945050505050565b5f82601f830112612244575f80fd5b815160206122546118598361188e565b8083825260208201915060208460051b870101935086841115612275575f80fd5b602086015b848110156119ea578051835291830191830161227a565b5f80604083850312156122a2575f80fd5b825167ffffffffffffffff808211156122b9575f80fd5b818501915085601f8301126122cc575f80fd5b815160206122dc6118598361188e565b82815260059290921b840181019181810190898411156122fa575f80fd5b948201945b83861015612318578551825294820194908201906122ff565b91880151919650909350505080821115612330575f80fd5b5061233d85828601612235565b9150509250929050565b828152604060208201525f61235f6040830184612109565b949350505050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52602160045260245ffd"; + hex"6080604052348015600e575f80fd5b5060017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005561238f806100405f395ff3fe608060405260043610610034575f3560e01c806301ffc9a71461003d578063691f9ed714610070578063b17c83c11461008f57005b3661003b57005b005b348015610048575f80fd5b5061005c610057366004611629565b6100a2565b604051901515815260200160405180910390f35b34801561007b575f80fd5b5061003b61008a366004611664565b6100f3565b61003b61009d366004611706565b610148565b5f6001600160e01b0319821663691f9ed760e01b14806100d257506001600160e01b0319821663b17c83c160e01b145b806100ed57506301ffc9a760e01b6001600160e01b03198316145b92915050565b61010186868686868661040a565b6101408683838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061046f92505050565b505050505050565b610150610520565b61015f61015c826119f5565b50565b61016c6080830183611ab1565b90505f0361018d57604051639c95219f60e01b815260040160405180910390fd5b6001600160a01b038316737900fd69e0785195f6e4622e3138146c4cc4abd2146101da5760405163516e822d60e01b81526001600160a01b03841660048201526024015b60405180910390fd5b5f6101e86080840184611ab1565b5f8181106101f8576101f8611af7565b905060200281019061020a9190611b0b565b6102149080611b29565b610222906040810190611b3d565b61022f6080860186611ab1565b5f81811061023f5761023f611af7565b90506020028101906102519190611b0b565b6020013581811061026457610264611af7565b61027a9260206040909202019081019150611b83565b90505f61028a6080850185611ab1565b5f81811061029a5761029a611af7565b90506020028101906102ac9190611b0b565b6102b69080611b29565b6102c4906060810190611b3d565b6102d16080870187611ab1565b5f8181106102e1576102e1611af7565b90506020028101906102f39190611b0b565b6040013581811061030657610306611af7565b61031c9260206040909202019081019150611b83565b90506103336001600160a01b038316865f1961054e565b6040516334e3942b60e11b81526001600160a01b038616906369c728569061035f908790600401611de7565b60408051808303815f875af115801561037a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061039e9190611fe7565b506103b590506001600160a01b038316865f61054e565b6103da6103c1846119f5565b836103cb856105c8565b846103d5866105c8565b61064c565b505061040560017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054600214801561044f575033737900fd69e0785195f6e4622e3138146c4cc4abd214155b156101405760405163f6688adf60e01b81523360048201526024016101d1565b5f805f838060200190518101906104869190612009565b919450925090506001600160a01b0383166104b4576040516398521dc560e01b815260040160405180910390fd5b6001600160a01b0382166104db5760405163456ac4c360e11b815260040160405180910390fd5b6104f06001600160a01b038616845f1961054e565b6105046001600160a01b03831682476108eb565b506105196001600160a01b038616845f61054e565b5050505050565b6105286109b8565b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b61055a8383835f6109fc565b6104055761056b83835f60016109fc565b61059357604051635274afe760e01b81526001600160a01b03841660048201526024016101d1565b6105a083838360016109fc565b61040557604051635274afe760e01b81526001600160a01b03841660048201526024016101d1565b5f6105d1610a5e565b6040516354636d2b60e01b81526001600160a01b038316600482015273200e12d10bb0c5e4a17e7018f0f1161919bb9389906354636d2b906024016020604051808303815f875af1158015610628573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100ed91906120a4565b6040805160018082528183019092525f91816020015b6060815260200190600190039081610662575050604080516003808252608082019092529192505f919060208201606080368337019050506040516370a0823160e01b81523060048201529091505f906001600160a01b038816906370a0823190602401602060405180830381865afa1580156106e1573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061070591906120c4565b90508015610721576107216001600160a01b0388163383610ae9565b5f61072c8288610af6565b50905080835f8151811061074257610742611af7565b602090810291909101015250506040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015610793573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107b791906120c4565b905080156107d3576107d36001600160a01b0386163383610ae9565b5f6107de8286610af6565b50905080836001815181106107f5576107f5611af7565b6020908102919091010152504790508015610814576108143382610b37565b5f610820826012610af6565b509050808360028151811061083757610837611af7565b602002602001018181525050505080825f8151811061085857610858611af7565b60209081029190910101526040805160018082528183019092525f91816020015b6040805160a0810182525f918101828152606080830193909352608082018390528152602081019190915281526020019060019003908161087957905050905087815f815181106108cc576108cc611af7565b60200260200101819052506108e18382610b95565b5050505050505050565b6060814710156109175760405163cf47918160e01b8152476004820152602481018390526044016101d1565b5f610923858486610d59565b905080801561094457505f3d118061094457505f856001600160a01b03163b115b1561095957610951610d6e565b9150506109b1565b801561098357604051639996b31560e01b81526001600160a01b03861660048201526024016101d1565b3d1561099657610991610d87565b6109af565b60405163d6bda27560e01b815260040160405180910390fd5b505b9392505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00546002036109fa57604051633ee5aeb560e01b815260040160405180910390fd5b565b60405163095ea7b360e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610a52578383151615610a46573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b73200e12d10bb0c5e4a17e7018f0f1161919bb93893b1580610ab5575073200e12d10bb0c5e4a17e7018f0f1161919bb93893f7f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d4114155b156109fa576040516373e6d7b360e01b815273200e12d10bb0c5e4a17e7018f0f1161919bb938960048201526024016101d1565b6105a08383836001610d92565b5f805f805f610b058787610ddc565b9250925092505f80610b178585610e38565b9150915081838015610b265750815b9650965050505050505b9250929050565b80471015610b615760405163cf47918160e01b8152476004820152602481018290526044016101d1565b610b7a828260405180602001604052805f815250610d59565b15610b83575050565b3d1561099657610b91610d87565b5050565b335f8181523060209081526040808320815160a0810183528083018581526060808301879052608083018190529082528185015282518581529384018581528484019093529093909291905b86518110156108e157868181518110610bfc57610bfc611af7565b602002602001015193505f845f015160400151511115610d51575f845f01515f01516001600160a01b031663d04dfe236040518060e00160405280885f0151602001516001600160a01b03168152602001898152602001885f01516040015181526020015f8152602001610c748d8a602001516110ab565b8152602001878152602001868152506040518263ffffffff1660e01b8152600401610c9f9190612190565b5f60405180830381865afa158015610cb9573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610ce09190810190612291565b9150505f81511115610d4f5784516020015160405163012c676d60e21b81526001600160a01b03909116906304b19db490610d21908a908590600401612347565b5f604051808303815f87803b158015610d38575f80fd5b505af1158015610d4a573d5f803e3d5ffd5b505050505b505b600101610be1565b5f805f83516020850186885af1949350505050565b6040513d81523d5f602083013e3d602001810160405290565b6040513d5f823e3d81fd5b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610a52578383151615610a46573d5f823e3d81fd5b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff861115610e2757600a860460018201600a88065f1493509350935050610e31565b8593509150600190505b9250925092565b5f808383601b82900b821480610f83577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e1000000000000000000870515610eb9577f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000870515610eaa576305f5e10087059650600886019550610eb9565b620186a0870596506005860195505b8687601b0b14610ed457600a87059650856001019550610eb9565b7b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc7b1999999999999999999999999999999999999999999999999999999888820111610f7d575f600188039050808160030b03610f7b5760e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff7b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff60ff8b901d18161795505f9450610b309350505050565b505b50610f9a565b865f03610f9a57505f935060019250610b30915050565b858660030b14611051575f821315610ff957610fb6838361138d565b15610fde5760405163d556b11160e01b815260048101849052602481018390526044016101d1565b637ffffffe19909501600a0a82029550637fffffff94611051565b637fffffff19869003604381131561101b57505f9450849350610b3092505050565b80600a0a888161102d5761102d612367565b059750875f0361104757505f9450849350610b3092505050565b50637fffffff1995505b818613611061576001935061107a565b818603600a0a838161107557611075612367565b071593505b5050507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff841660e084901b1791509250929050565b60605f825167ffffffffffffffff8111156110c8576110c8611784565b6040519080825280602002602001820160405280156110f1578160200160208202803683370190505b5090505f80845111611103575f611109565b83516001015b85516001010190505f8167ffffffffffffffff81111561112b5761112b611784565b60405190808252806020026020018201604052801561115e57816020015b60608152602001906001900390816111495790505b5090505f611182604080516002815233602082015230818301526060810190915290565b82828151811061119457611194611af7565b60200260200101819052505f5b87518110156111f15781806001019250508781815181106111c4576111c4611af7565b60200260200101518383815181106111de576111de611af7565b60209081029190910101526001016111a1565b508551156113835780806001019150508382828151811061121457611214611af7565b60200260200101819052505f5b8651811015611381576112d087828151811061123f5761123f611af7565b60200260200101515f01516112ad61127b8a858151811061126257611262611af7565b6020026020010151602001518051602090810291012090565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f908152601c91909152603c902090565b8984815181106112bf576112bf611af7565b6020026020010151604001516113a8565b6112f057604051630a57f30960e31b8152600481018290526024016101d1565b86818151811061130257611302611af7565b60200260200101515f01516001600160a01b03165f1b85828151811061132a5761132a611af7565b602002602001018181525050818060010192505086818151811061135057611350611af7565b60200260200101516020015183838151811061136e5761136e611af7565b6020908102919091010152600101611221565b505b5095945050505050565b5f6109b15f841261139e57836113a2565b835f035b83611418565b5f836001600160a01b03163b5f03611406575f806113c685856114b6565b5090925090505f8160038111156113df576113df61237b565b1480156113fd5750856001600160a01b0316826001600160a01b0316145b925050506109b1565b6114118484846114fc565b90506109b1565b5f637ffffff5821361142b57505f6100ed565b637ffffffe19820160438113156114465750508115156100ed565b5f81126114865780600a0a7b800000000000000000000000000000000000000000000000000000018161147b5761147b612367565b0484119150506100ed565b805f03600a0a7b800000000000000000000000000000000000000000000000000000020284101591505092915050565b5f805f83516041036114ed576020840151604085015160608601515f1a6114df88828585611561565b955095509550505050610e31565b505081515f9150600290610e31565b805160408051630b135d3f60e11b8082526004820186905260248201929092525f92906020820185604483015e5f82606483010152601f820160051c60051b915060205f60648401838a5afa9050825f5114601f3d1116811693505050509392505050565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084111561159a57505f9150600390508261161f565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa1580156115eb573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b03811661161657505f92506001915082905061161f565b92505f91508190505b9450945094915050565b5f60208284031215611639575f80fd5b81356001600160e01b0319811681146109b1575f80fd5b6001600160a01b038116811461015c575f80fd5b5f805f805f8060a08789031215611679575f80fd5b863561168481611650565b9550602087013561169481611650565b94506040870135935060608701359250608087013567ffffffffffffffff808211156116be575f80fd5b818901915089601f8301126116d1575f80fd5b8135818111156116df575f80fd5b8a60208285010111156116f0575f80fd5b6020830194508093505050509295509295509295565b5f805f60608486031215611718575f80fd5b833561172381611650565b9250602084013567ffffffffffffffff8082111561173f575f80fd5b9085019060c08288031215611752575f80fd5b90925060408501359080821115611767575f80fd5b50840160408187031215611779575f80fd5b809150509250925092565b634e487b7160e01b5f52604160045260245ffd5b6040516060810167ffffffffffffffff811182821017156117bb576117bb611784565b60405290565b6040805190810167ffffffffffffffff811182821017156117bb576117bb611784565b604051601f8201601f1916810167ffffffffffffffff8111828210171561180d5761180d611784565b604052919050565b5f67ffffffffffffffff82111561182e5761182e611784565b50601f01601f191660200190565b5f82601f83011261184b575f80fd5b813561185e61185982611815565b6117e4565b818152846020838601011115611872575f80fd5b816020850160208301375f918101602001919091529392505050565b5f67ffffffffffffffff8211156118a7576118a7611784565b5060051b60200190565b5f82601f8301126118c0575f80fd5b813560206118d06118598361188e565b82815260059290921b840181019181810190868411156118ee575f80fd5b8286015b848110156119ea57803567ffffffffffffffff80821115611911575f80fd5b908801906060828b03601f19011215611928575f80fd5b611930611798565b8683013561193d81611650565b815260408381013583811115611951575f80fd5b8401603f81018d13611961575f80fd5b888101356119716118598261188e565b81815260059190911b82018301908a8101908f83111561198f575f80fd5b928401925b828410156119ad5783358252928b0192908b0190611994565b858c01525050506060840135838111156119c5575f80fd5b6119d38d8a8388010161183c565b9183019190915250855250509183019183016118f2565b509695505050505050565b5f60408236031215611a05575f80fd5b611a0d6117c1565b823567ffffffffffffffff80821115611a24575f80fd5b818501915060608236031215611a38575f80fd5b611a40611798565b8235611a4b81611650565b81526020830135611a5b81611650565b6020820152604083013582811115611a71575f80fd5b611a7d3682860161183c565b60408301525083526020850135915080821115611a98575f80fd5b50611aa5368286016118b1565b60208301525092915050565b5f808335601e19843603018112611ac6575f80fd5b83018035915067ffffffffffffffff821115611ae0575f80fd5b6020019150600581901b3603821315610b30575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235607e19833603018112611b1f575f80fd5b9190910192915050565b5f8235609e19833603018112611b1f575f80fd5b5f808335601e19843603018112611b52575f80fd5b83018035915067ffffffffffffffff821115611b6c575f80fd5b6020019150600681901b3603821315610b30575f80fd5b5f60208284031215611b93575f80fd5b81356109b181611650565b5f808335601e19843603018112611bb3575f80fd5b830160208101925035905067ffffffffffffffff811115611bd2575f80fd5b8060051b3603821315610b30575f80fd5b5f8235605e19833603018112611bf7575f80fd5b90910192915050565b5f808335601e19843603018112611c15575f80fd5b830160208101925035905067ffffffffffffffff811115611c34575f80fd5b803603821315610b30575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f808335601e19843603018112611c7f575f80fd5b830160208101925035905067ffffffffffffffff811115611c9e575f80fd5b8060061b3603821315610b30575f80fd5b8183525f60208085019450825f5b85811015611cf5578135611cd081611650565b6001600160a01b03168752818301358388015260409687019690910190600101611cbd565b509495945050505050565b8183526020808401935f91600585811b8301820185855b88811015611dd957858303601f19018a52611d328289611be3565b60608135611d3f81611650565b6001600160a01b03168552611d5682880183611b9e565b82898801528083880152608092507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811115611d90575f80fd5b871b808288850137860190506040611daa84820185611c00565b9450838884030182890152611dc28484018683611c42565b9e8a019e9750505093870193505050600101611d17565b509098975050505050505050565b5f602080835260e08301843582850152604082860135818601526060818701358187015280870135801515808214611e1d575f80fd5b8060808901525050611e326080880188611b9e565b60c060a08901529384905261010093848801600582901b89018601835f5b84811015611fae578b830360ff19018452813536879003607e19018112611e75575f80fd5b8601803536829003609e19018112611e8b575f80fd5b6080855281018035611e9c81611650565b6001600160a01b038082166080880152611eb88e840184611be3565b915060a0808801528135611ecb81611650565b8116610120880152818e0135611ee081611650565b16610140870152611ef3818c0182611c00565b91508a610160880152611f0b61018088018383611c42565b915050611f1a8b830183611c6a565b607f19808985030160c08a0152611f32848385611caf565b9350611f408d860186611c6a565b93509150808985030160e08a015250611f5a838383611caf565b9250505060808201358c8701528c8301358d8701528a8301358b870152611f838a840184611b9e565b935091508581038a870152611f99818484611d00565b968d019695505050918a019150600101611e50565b5050611fbd60a08c018c611c00565b8b8303601f190160c08d015298509650611fd8818989611c42565b9b9a5050505050505050505050565b5f8060408385031215611ff8575f80fd5b505080516020909101519092909150565b5f805f6060848603121561201b575f80fd5b835161202681611650565b602085015190935061203781611650565b604085015190925067ffffffffffffffff811115612053575f80fd5b8401601f81018613612063575f80fd5b805161207161185982611815565b818152876020838501011115612085575f80fd5b8160208401602083015e5f602083830101528093505050509250925092565b5f602082840312156120b4575f80fd5b815160ff811681146109b1575f80fd5b5f602082840312156120d4575f80fd5b5051919050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f815180845260208085019450602084015f5b83811015611cf55781518752958201959082019060010161211c565b5f8282518085526020808601955060208260051b840101602086015f5b8481101561218357601f19868403018952612171838351612109565b98840198925090830190600101612155565b5090979650505050505050565b602081526001600160a01b038251166020820152602082015160408201525f604083015160e060608401526121c96101008401826120db565b9050606084015160808401526080840151601f19808584030160a08601526121f18383612138565b925060a08601519150808584030160c086015261220e8383612109565b925060c08601519150808584030160e08601525061222c8282612109565b95945050505050565b5f82601f830112612244575f80fd5b815160206122546118598361188e565b8083825260208201915060208460051b870101935086841115612275575f80fd5b602086015b848110156119ea578051835291830191830161227a565b5f80604083850312156122a2575f80fd5b825167ffffffffffffffff808211156122b9575f80fd5b818501915085601f8301126122cc575f80fd5b815160206122dc6118598361188e565b82815260059290921b840181019181810190898411156122fa575f80fd5b948201945b83861015612318578551825294820194908201906122ff565b91880151919650909350505080821115612330575f80fd5b5061233d85828601612235565b9150509250929050565b828152604060208201525f61235f6040830184612109565b949350505050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52602160045260245ffd"; /// @dev The runtime bytecode of the contract. bytes constant RUNTIME_CODE = - hex"608060405260043610610034575f3560e01c806301ffc9a71461003d578063691f9ed714610070578063b17c83c11461008f57005b3661003b57005b005b348015610048575f80fd5b5061005c610057366004611629565b6100a2565b604051901515815260200160405180910390f35b34801561007b575f80fd5b5061003b61008a366004611664565b6100f3565b61003b61009d366004611706565b610148565b5f6001600160e01b0319821663691f9ed760e01b14806100d257506001600160e01b0319821663b17c83c160e01b145b806100ed57506301ffc9a760e01b6001600160e01b03198316145b92915050565b61010186868686868661040a565b6101408683838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061046f92505050565b505050505050565b610150610520565b61015f61015c826119f5565b50565b61016c6080830183611ab1565b90505f0361018d57604051639c95219f60e01b815260040160405180910390fd5b6001600160a01b038316732f04ff4cf5a3a19c619fe2c892bdbd72a76bf132146101da5760405163516e822d60e01b81526001600160a01b03841660048201526024015b60405180910390fd5b5f6101e86080840184611ab1565b5f8181106101f8576101f8611af7565b905060200281019061020a9190611b0b565b6102149080611b29565b610222906040810190611b3d565b61022f6080860186611ab1565b5f81811061023f5761023f611af7565b90506020028101906102519190611b0b565b6020013581811061026457610264611af7565b61027a9260206040909202019081019150611b83565b90505f61028a6080850185611ab1565b5f81811061029a5761029a611af7565b90506020028101906102ac9190611b0b565b6102b69080611b29565b6102c4906060810190611b3d565b6102d16080870187611ab1565b5f8181106102e1576102e1611af7565b90506020028101906102f39190611b0b565b6040013581811061030657610306611af7565b61031c9260206040909202019081019150611b83565b90506103336001600160a01b038316865f1961054e565b6040516334e3942b60e11b81526001600160a01b038616906369c728569061035f908790600401611de7565b60408051808303815f875af115801561037a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061039e9190611fe7565b506103b590506001600160a01b038316865f61054e565b6103da6103c1846119f5565b836103cb856105c8565b846103d5866105c8565b61064c565b505061040560017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054600214801561044f575033732f04ff4cf5a3a19c619fe2c892bdbd72a76bf13214155b156101405760405163f6688adf60e01b81523360048201526024016101d1565b5f805f838060200190518101906104869190612009565b919450925090506001600160a01b0383166104b4576040516398521dc560e01b815260040160405180910390fd5b6001600160a01b0382166104db5760405163456ac4c360e11b815260040160405180910390fd5b6104f06001600160a01b038616845f1961054e565b6105046001600160a01b03831682476108eb565b506105196001600160a01b038616845f61054e565b5050505050565b6105286109b8565b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b61055a8383835f6109fc565b6104055761056b83835f60016109fc565b61059357604051635274afe760e01b81526001600160a01b03841660048201526024016101d1565b6105a083838360016109fc565b61040557604051635274afe760e01b81526001600160a01b03841660048201526024016101d1565b5f6105d1610a5e565b6040516354636d2b60e01b81526001600160a01b038316600482015273200e12d10bb0c5e4a17e7018f0f1161919bb9389906354636d2b906024016020604051808303815f875af1158015610628573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100ed91906120a4565b6040805160018082528183019092525f91816020015b6060815260200190600190039081610662575050604080516003808252608082019092529192505f919060208201606080368337019050506040516370a0823160e01b81523060048201529091505f906001600160a01b038816906370a0823190602401602060405180830381865afa1580156106e1573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061070591906120c4565b90508015610721576107216001600160a01b0388163383610ae9565b5f61072c8288610af6565b50905080835f8151811061074257610742611af7565b602090810291909101015250506040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015610793573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107b791906120c4565b905080156107d3576107d36001600160a01b0386163383610ae9565b5f6107de8286610af6565b50905080836001815181106107f5576107f5611af7565b6020908102919091010152504790508015610814576108143382610b37565b5f610820826012610af6565b509050808360028151811061083757610837611af7565b602002602001018181525050505080825f8151811061085857610858611af7565b60209081029190910101526040805160018082528183019092525f91816020015b6040805160a0810182525f918101828152606080830193909352608082018390528152602081019190915281526020019060019003908161087957905050905087815f815181106108cc576108cc611af7565b60200260200101819052506108e18382610b95565b5050505050505050565b6060814710156109175760405163cf47918160e01b8152476004820152602481018390526044016101d1565b5f610923858486610d59565b905080801561094457505f3d118061094457505f856001600160a01b03163b115b1561095957610951610d6e565b9150506109b1565b801561098357604051639996b31560e01b81526001600160a01b03861660048201526024016101d1565b3d1561099657610991610d87565b6109af565b60405163d6bda27560e01b815260040160405180910390fd5b505b9392505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00546002036109fa57604051633ee5aeb560e01b815260040160405180910390fd5b565b60405163095ea7b360e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610a52578383151615610a46573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b73200e12d10bb0c5e4a17e7018f0f1161919bb93893b1580610ab5575073200e12d10bb0c5e4a17e7018f0f1161919bb93893f7f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d4114155b156109fa576040516373e6d7b360e01b815273200e12d10bb0c5e4a17e7018f0f1161919bb938960048201526024016101d1565b6105a08383836001610d92565b5f805f805f610b058787610ddc565b9250925092505f80610b178585610e38565b9150915081838015610b265750815b9650965050505050505b9250929050565b80471015610b615760405163cf47918160e01b8152476004820152602481018290526044016101d1565b610b7a828260405180602001604052805f815250610d59565b15610b83575050565b3d1561099657610b91610d87565b5050565b335f8181523060209081526040808320815160a0810183528083018581526060808301879052608083018190529082528185015282518581529384018581528484019093529093909291905b86518110156108e157868181518110610bfc57610bfc611af7565b602002602001015193505f845f015160400151511115610d51575f845f01515f01516001600160a01b031663d04dfe236040518060e00160405280885f0151602001516001600160a01b03168152602001898152602001885f01516040015181526020015f8152602001610c748d8a602001516110ab565b8152602001878152602001868152506040518263ffffffff1660e01b8152600401610c9f9190612190565b5f60405180830381865afa158015610cb9573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610ce09190810190612291565b9150505f81511115610d4f5784516020015160405163012c676d60e21b81526001600160a01b03909116906304b19db490610d21908a908590600401612347565b5f604051808303815f87803b158015610d38575f80fd5b505af1158015610d4a573d5f803e3d5ffd5b505050505b505b600101610be1565b5f805f83516020850186885af1949350505050565b6040513d81523d5f602083013e3d602001810160405290565b6040513d5f823e3d81fd5b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610a52578383151615610a46573d5f823e3d81fd5b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff861115610e2757600a860460018201600a88065f1493509350935050610e31565b8593509150600190505b9250925092565b5f808383601b82900b821480610f83577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e1000000000000000000870515610eb9577f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000870515610eaa576305f5e10087059650600886019550610eb9565b620186a0870596506005860195505b8687601b0b14610ed457600a87059650856001019550610eb9565b7b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc7b1999999999999999999999999999999999999999999999999999999888820111610f7d575f600188039050808160030b03610f7b5760e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff7b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff60ff8b901d18161795505f9450610b309350505050565b505b50610f9a565b865f03610f9a57505f935060019250610b30915050565b858660030b14611051575f821315610ff957610fb6838361138d565b15610fde5760405163d556b11160e01b815260048101849052602481018390526044016101d1565b637ffffffe19909501600a0a82029550637fffffff94611051565b637fffffff19869003604381131561101b57505f9450849350610b3092505050565b80600a0a888161102d5761102d612367565b059750875f0361104757505f9450849350610b3092505050565b50637fffffff1995505b818613611061576001935061107a565b818603600a0a838161107557611075612367565b071593505b5050507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff841660e084901b1791509250929050565b60605f825167ffffffffffffffff8111156110c8576110c8611784565b6040519080825280602002602001820160405280156110f1578160200160208202803683370190505b5090505f80845111611103575f611109565b83516001015b85516001010190505f8167ffffffffffffffff81111561112b5761112b611784565b60405190808252806020026020018201604052801561115e57816020015b60608152602001906001900390816111495790505b5090505f611182604080516002815233602082015230818301526060810190915290565b82828151811061119457611194611af7565b60200260200101819052505f5b87518110156111f15781806001019250508781815181106111c4576111c4611af7565b60200260200101518383815181106111de576111de611af7565b60209081029190910101526001016111a1565b508551156113835780806001019150508382828151811061121457611214611af7565b60200260200101819052505f5b8651811015611381576112d087828151811061123f5761123f611af7565b60200260200101515f01516112ad61127b8a858151811061126257611262611af7565b6020026020010151602001518051602090810291012090565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f908152601c91909152603c902090565b8984815181106112bf576112bf611af7565b6020026020010151604001516113a8565b6112f057604051630a57f30960e31b8152600481018290526024016101d1565b86818151811061130257611302611af7565b60200260200101515f01516001600160a01b03165f1b85828151811061132a5761132a611af7565b602002602001018181525050818060010192505086818151811061135057611350611af7565b60200260200101516020015183838151811061136e5761136e611af7565b6020908102919091010152600101611221565b505b5095945050505050565b5f6109b15f841261139e57836113a2565b835f035b83611418565b5f836001600160a01b03163b5f03611406575f806113c685856114b6565b5090925090505f8160038111156113df576113df61237b565b1480156113fd5750856001600160a01b0316826001600160a01b0316145b925050506109b1565b6114118484846114fc565b90506109b1565b5f637ffffff5821361142b57505f6100ed565b637ffffffe19820160438113156114465750508115156100ed565b5f81126114865780600a0a7b800000000000000000000000000000000000000000000000000000018161147b5761147b612367565b0484119150506100ed565b805f03600a0a7b800000000000000000000000000000000000000000000000000000020284101591505092915050565b5f805f83516041036114ed576020840151604085015160608601515f1a6114df88828585611561565b955095509550505050610e31565b505081515f9150600290610e31565b805160408051630b135d3f60e11b8082526004820186905260248201929092525f92906020820185604483015e5f82606483010152601f820160051c60051b915060205f60648401838a5afa9050825f5114601f3d1116811693505050509392505050565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084111561159a57505f9150600390508261161f565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa1580156115eb573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b03811661161657505f92506001915082905061161f565b92505f91508190505b9450945094915050565b5f60208284031215611639575f80fd5b81356001600160e01b0319811681146109b1575f80fd5b6001600160a01b038116811461015c575f80fd5b5f805f805f8060a08789031215611679575f80fd5b863561168481611650565b9550602087013561169481611650565b94506040870135935060608701359250608087013567ffffffffffffffff808211156116be575f80fd5b818901915089601f8301126116d1575f80fd5b8135818111156116df575f80fd5b8a60208285010111156116f0575f80fd5b6020830194508093505050509295509295509295565b5f805f60608486031215611718575f80fd5b833561172381611650565b9250602084013567ffffffffffffffff8082111561173f575f80fd5b9085019060c08288031215611752575f80fd5b90925060408501359080821115611767575f80fd5b50840160408187031215611779575f80fd5b809150509250925092565b634e487b7160e01b5f52604160045260245ffd5b6040516060810167ffffffffffffffff811182821017156117bb576117bb611784565b60405290565b6040805190810167ffffffffffffffff811182821017156117bb576117bb611784565b604051601f8201601f1916810167ffffffffffffffff8111828210171561180d5761180d611784565b604052919050565b5f67ffffffffffffffff82111561182e5761182e611784565b50601f01601f191660200190565b5f82601f83011261184b575f80fd5b813561185e61185982611815565b6117e4565b818152846020838601011115611872575f80fd5b816020850160208301375f918101602001919091529392505050565b5f67ffffffffffffffff8211156118a7576118a7611784565b5060051b60200190565b5f82601f8301126118c0575f80fd5b813560206118d06118598361188e565b82815260059290921b840181019181810190868411156118ee575f80fd5b8286015b848110156119ea57803567ffffffffffffffff80821115611911575f80fd5b908801906060828b03601f19011215611928575f80fd5b611930611798565b8683013561193d81611650565b815260408381013583811115611951575f80fd5b8401603f81018d13611961575f80fd5b888101356119716118598261188e565b81815260059190911b82018301908a8101908f83111561198f575f80fd5b928401925b828410156119ad5783358252928b0192908b0190611994565b858c01525050506060840135838111156119c5575f80fd5b6119d38d8a8388010161183c565b9183019190915250855250509183019183016118f2565b509695505050505050565b5f60408236031215611a05575f80fd5b611a0d6117c1565b823567ffffffffffffffff80821115611a24575f80fd5b818501915060608236031215611a38575f80fd5b611a40611798565b8235611a4b81611650565b81526020830135611a5b81611650565b6020820152604083013582811115611a71575f80fd5b611a7d3682860161183c565b60408301525083526020850135915080821115611a98575f80fd5b50611aa5368286016118b1565b60208301525092915050565b5f808335601e19843603018112611ac6575f80fd5b83018035915067ffffffffffffffff821115611ae0575f80fd5b6020019150600581901b3603821315610b30575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235607e19833603018112611b1f575f80fd5b9190910192915050565b5f8235609e19833603018112611b1f575f80fd5b5f808335601e19843603018112611b52575f80fd5b83018035915067ffffffffffffffff821115611b6c575f80fd5b6020019150600681901b3603821315610b30575f80fd5b5f60208284031215611b93575f80fd5b81356109b181611650565b5f808335601e19843603018112611bb3575f80fd5b830160208101925035905067ffffffffffffffff811115611bd2575f80fd5b8060051b3603821315610b30575f80fd5b5f8235605e19833603018112611bf7575f80fd5b90910192915050565b5f808335601e19843603018112611c15575f80fd5b830160208101925035905067ffffffffffffffff811115611c34575f80fd5b803603821315610b30575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f808335601e19843603018112611c7f575f80fd5b830160208101925035905067ffffffffffffffff811115611c9e575f80fd5b8060061b3603821315610b30575f80fd5b8183525f60208085019450825f5b85811015611cf5578135611cd081611650565b6001600160a01b03168752818301358388015260409687019690910190600101611cbd565b509495945050505050565b8183526020808401935f91600585811b8301820185855b88811015611dd957858303601f19018a52611d328289611be3565b60608135611d3f81611650565b6001600160a01b03168552611d5682880183611b9e565b82898801528083880152608092507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811115611d90575f80fd5b871b808288850137860190506040611daa84820185611c00565b9450838884030182890152611dc28484018683611c42565b9e8a019e9750505093870193505050600101611d17565b509098975050505050505050565b5f602080835260e08301843582850152604082860135818601526060818701358187015280870135801515808214611e1d575f80fd5b8060808901525050611e326080880188611b9e565b60c060a08901529384905261010093848801600582901b89018601835f5b84811015611fae578b830360ff19018452813536879003607e19018112611e75575f80fd5b8601803536829003609e19018112611e8b575f80fd5b6080855281018035611e9c81611650565b6001600160a01b038082166080880152611eb88e840184611be3565b915060a0808801528135611ecb81611650565b8116610120880152818e0135611ee081611650565b16610140870152611ef3818c0182611c00565b91508a610160880152611f0b61018088018383611c42565b915050611f1a8b830183611c6a565b607f19808985030160c08a0152611f32848385611caf565b9350611f408d860186611c6a565b93509150808985030160e08a015250611f5a838383611caf565b9250505060808201358c8701528c8301358d8701528a8301358b870152611f838a840184611b9e565b935091508581038a870152611f99818484611d00565b968d019695505050918a019150600101611e50565b5050611fbd60a08c018c611c00565b8b8303601f190160c08d015298509650611fd8818989611c42565b9b9a5050505050505050505050565b5f8060408385031215611ff8575f80fd5b505080516020909101519092909150565b5f805f6060848603121561201b575f80fd5b835161202681611650565b602085015190935061203781611650565b604085015190925067ffffffffffffffff811115612053575f80fd5b8401601f81018613612063575f80fd5b805161207161185982611815565b818152876020838501011115612085575f80fd5b8160208401602083015e5f602083830101528093505050509250925092565b5f602082840312156120b4575f80fd5b815160ff811681146109b1575f80fd5b5f602082840312156120d4575f80fd5b5051919050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f815180845260208085019450602084015f5b83811015611cf55781518752958201959082019060010161211c565b5f8282518085526020808601955060208260051b840101602086015f5b8481101561218357601f19868403018952612171838351612109565b98840198925090830190600101612155565b5090979650505050505050565b602081526001600160a01b038251166020820152602082015160408201525f604083015160e060608401526121c96101008401826120db565b9050606084015160808401526080840151601f19808584030160a08601526121f18383612138565b925060a08601519150808584030160c086015261220e8383612109565b925060c08601519150808584030160e08601525061222c8282612109565b95945050505050565b5f82601f830112612244575f80fd5b815160206122546118598361188e565b8083825260208201915060208460051b870101935086841115612275575f80fd5b602086015b848110156119ea578051835291830191830161227a565b5f80604083850312156122a2575f80fd5b825167ffffffffffffffff808211156122b9575f80fd5b818501915085601f8301126122cc575f80fd5b815160206122dc6118598361188e565b82815260059290921b840181019181810190898411156122fa575f80fd5b948201945b83861015612318578551825294820194908201906122ff565b91880151919650909350505080821115612330575f80fd5b5061233d85828601612235565b9150509250929050565b828152604060208201525f61235f6040830184612109565b949350505050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52602160045260245ffd"; + hex"608060405260043610610034575f3560e01c806301ffc9a71461003d578063691f9ed714610070578063b17c83c11461008f57005b3661003b57005b005b348015610048575f80fd5b5061005c610057366004611629565b6100a2565b604051901515815260200160405180910390f35b34801561007b575f80fd5b5061003b61008a366004611664565b6100f3565b61003b61009d366004611706565b610148565b5f6001600160e01b0319821663691f9ed760e01b14806100d257506001600160e01b0319821663b17c83c160e01b145b806100ed57506301ffc9a760e01b6001600160e01b03198316145b92915050565b61010186868686868661040a565b6101408683838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061046f92505050565b505050505050565b610150610520565b61015f61015c826119f5565b50565b61016c6080830183611ab1565b90505f0361018d57604051639c95219f60e01b815260040160405180910390fd5b6001600160a01b038316737900fd69e0785195f6e4622e3138146c4cc4abd2146101da5760405163516e822d60e01b81526001600160a01b03841660048201526024015b60405180910390fd5b5f6101e86080840184611ab1565b5f8181106101f8576101f8611af7565b905060200281019061020a9190611b0b565b6102149080611b29565b610222906040810190611b3d565b61022f6080860186611ab1565b5f81811061023f5761023f611af7565b90506020028101906102519190611b0b565b6020013581811061026457610264611af7565b61027a9260206040909202019081019150611b83565b90505f61028a6080850185611ab1565b5f81811061029a5761029a611af7565b90506020028101906102ac9190611b0b565b6102b69080611b29565b6102c4906060810190611b3d565b6102d16080870187611ab1565b5f8181106102e1576102e1611af7565b90506020028101906102f39190611b0b565b6040013581811061030657610306611af7565b61031c9260206040909202019081019150611b83565b90506103336001600160a01b038316865f1961054e565b6040516334e3942b60e11b81526001600160a01b038616906369c728569061035f908790600401611de7565b60408051808303815f875af115801561037a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061039e9190611fe7565b506103b590506001600160a01b038316865f61054e565b6103da6103c1846119f5565b836103cb856105c8565b846103d5866105c8565b61064c565b505061040560017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054600214801561044f575033737900fd69e0785195f6e4622e3138146c4cc4abd214155b156101405760405163f6688adf60e01b81523360048201526024016101d1565b5f805f838060200190518101906104869190612009565b919450925090506001600160a01b0383166104b4576040516398521dc560e01b815260040160405180910390fd5b6001600160a01b0382166104db5760405163456ac4c360e11b815260040160405180910390fd5b6104f06001600160a01b038616845f1961054e565b6105046001600160a01b03831682476108eb565b506105196001600160a01b038616845f61054e565b5050505050565b6105286109b8565b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b61055a8383835f6109fc565b6104055761056b83835f60016109fc565b61059357604051635274afe760e01b81526001600160a01b03841660048201526024016101d1565b6105a083838360016109fc565b61040557604051635274afe760e01b81526001600160a01b03841660048201526024016101d1565b5f6105d1610a5e565b6040516354636d2b60e01b81526001600160a01b038316600482015273200e12d10bb0c5e4a17e7018f0f1161919bb9389906354636d2b906024016020604051808303815f875af1158015610628573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100ed91906120a4565b6040805160018082528183019092525f91816020015b6060815260200190600190039081610662575050604080516003808252608082019092529192505f919060208201606080368337019050506040516370a0823160e01b81523060048201529091505f906001600160a01b038816906370a0823190602401602060405180830381865afa1580156106e1573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061070591906120c4565b90508015610721576107216001600160a01b0388163383610ae9565b5f61072c8288610af6565b50905080835f8151811061074257610742611af7565b602090810291909101015250506040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015610793573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107b791906120c4565b905080156107d3576107d36001600160a01b0386163383610ae9565b5f6107de8286610af6565b50905080836001815181106107f5576107f5611af7565b6020908102919091010152504790508015610814576108143382610b37565b5f610820826012610af6565b509050808360028151811061083757610837611af7565b602002602001018181525050505080825f8151811061085857610858611af7565b60209081029190910101526040805160018082528183019092525f91816020015b6040805160a0810182525f918101828152606080830193909352608082018390528152602081019190915281526020019060019003908161087957905050905087815f815181106108cc576108cc611af7565b60200260200101819052506108e18382610b95565b5050505050505050565b6060814710156109175760405163cf47918160e01b8152476004820152602481018390526044016101d1565b5f610923858486610d59565b905080801561094457505f3d118061094457505f856001600160a01b03163b115b1561095957610951610d6e565b9150506109b1565b801561098357604051639996b31560e01b81526001600160a01b03861660048201526024016101d1565b3d1561099657610991610d87565b6109af565b60405163d6bda27560e01b815260040160405180910390fd5b505b9392505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00546002036109fa57604051633ee5aeb560e01b815260040160405180910390fd5b565b60405163095ea7b360e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610a52578383151615610a46573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b73200e12d10bb0c5e4a17e7018f0f1161919bb93893b1580610ab5575073200e12d10bb0c5e4a17e7018f0f1161919bb93893f7f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d4114155b156109fa576040516373e6d7b360e01b815273200e12d10bb0c5e4a17e7018f0f1161919bb938960048201526024016101d1565b6105a08383836001610d92565b5f805f805f610b058787610ddc565b9250925092505f80610b178585610e38565b9150915081838015610b265750815b9650965050505050505b9250929050565b80471015610b615760405163cf47918160e01b8152476004820152602481018290526044016101d1565b610b7a828260405180602001604052805f815250610d59565b15610b83575050565b3d1561099657610b91610d87565b5050565b335f8181523060209081526040808320815160a0810183528083018581526060808301879052608083018190529082528185015282518581529384018581528484019093529093909291905b86518110156108e157868181518110610bfc57610bfc611af7565b602002602001015193505f845f015160400151511115610d51575f845f01515f01516001600160a01b031663d04dfe236040518060e00160405280885f0151602001516001600160a01b03168152602001898152602001885f01516040015181526020015f8152602001610c748d8a602001516110ab565b8152602001878152602001868152506040518263ffffffff1660e01b8152600401610c9f9190612190565b5f60405180830381865afa158015610cb9573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610ce09190810190612291565b9150505f81511115610d4f5784516020015160405163012c676d60e21b81526001600160a01b03909116906304b19db490610d21908a908590600401612347565b5f604051808303815f87803b158015610d38575f80fd5b505af1158015610d4a573d5f803e3d5ffd5b505050505b505b600101610be1565b5f805f83516020850186885af1949350505050565b6040513d81523d5f602083013e3d602001810160405290565b6040513d5f823e3d81fd5b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610a52578383151615610a46573d5f823e3d81fd5b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff861115610e2757600a860460018201600a88065f1493509350935050610e31565b8593509150600190505b9250925092565b5f808383601b82900b821480610f83577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e1000000000000000000870515610eb9577f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000870515610eaa576305f5e10087059650600886019550610eb9565b620186a0870596506005860195505b8687601b0b14610ed457600a87059650856001019550610eb9565b7b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc7b1999999999999999999999999999999999999999999999999999999888820111610f7d575f600188039050808160030b03610f7b5760e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff7b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff60ff8b901d18161795505f9450610b309350505050565b505b50610f9a565b865f03610f9a57505f935060019250610b30915050565b858660030b14611051575f821315610ff957610fb6838361138d565b15610fde5760405163d556b11160e01b815260048101849052602481018390526044016101d1565b637ffffffe19909501600a0a82029550637fffffff94611051565b637fffffff19869003604381131561101b57505f9450849350610b3092505050565b80600a0a888161102d5761102d612367565b059750875f0361104757505f9450849350610b3092505050565b50637fffffff1995505b818613611061576001935061107a565b818603600a0a838161107557611075612367565b071593505b5050507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff841660e084901b1791509250929050565b60605f825167ffffffffffffffff8111156110c8576110c8611784565b6040519080825280602002602001820160405280156110f1578160200160208202803683370190505b5090505f80845111611103575f611109565b83516001015b85516001010190505f8167ffffffffffffffff81111561112b5761112b611784565b60405190808252806020026020018201604052801561115e57816020015b60608152602001906001900390816111495790505b5090505f611182604080516002815233602082015230818301526060810190915290565b82828151811061119457611194611af7565b60200260200101819052505f5b87518110156111f15781806001019250508781815181106111c4576111c4611af7565b60200260200101518383815181106111de576111de611af7565b60209081029190910101526001016111a1565b508551156113835780806001019150508382828151811061121457611214611af7565b60200260200101819052505f5b8651811015611381576112d087828151811061123f5761123f611af7565b60200260200101515f01516112ad61127b8a858151811061126257611262611af7565b6020026020010151602001518051602090810291012090565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f908152601c91909152603c902090565b8984815181106112bf576112bf611af7565b6020026020010151604001516113a8565b6112f057604051630a57f30960e31b8152600481018290526024016101d1565b86818151811061130257611302611af7565b60200260200101515f01516001600160a01b03165f1b85828151811061132a5761132a611af7565b602002602001018181525050818060010192505086818151811061135057611350611af7565b60200260200101516020015183838151811061136e5761136e611af7565b6020908102919091010152600101611221565b505b5095945050505050565b5f6109b15f841261139e57836113a2565b835f035b83611418565b5f836001600160a01b03163b5f03611406575f806113c685856114b6565b5090925090505f8160038111156113df576113df61237b565b1480156113fd5750856001600160a01b0316826001600160a01b0316145b925050506109b1565b6114118484846114fc565b90506109b1565b5f637ffffff5821361142b57505f6100ed565b637ffffffe19820160438113156114465750508115156100ed565b5f81126114865780600a0a7b800000000000000000000000000000000000000000000000000000018161147b5761147b612367565b0484119150506100ed565b805f03600a0a7b800000000000000000000000000000000000000000000000000000020284101591505092915050565b5f805f83516041036114ed576020840151604085015160608601515f1a6114df88828585611561565b955095509550505050610e31565b505081515f9150600290610e31565b805160408051630b135d3f60e11b8082526004820186905260248201929092525f92906020820185604483015e5f82606483010152601f820160051c60051b915060205f60648401838a5afa9050825f5114601f3d1116811693505050509392505050565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084111561159a57505f9150600390508261161f565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa1580156115eb573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b03811661161657505f92506001915082905061161f565b92505f91508190505b9450945094915050565b5f60208284031215611639575f80fd5b81356001600160e01b0319811681146109b1575f80fd5b6001600160a01b038116811461015c575f80fd5b5f805f805f8060a08789031215611679575f80fd5b863561168481611650565b9550602087013561169481611650565b94506040870135935060608701359250608087013567ffffffffffffffff808211156116be575f80fd5b818901915089601f8301126116d1575f80fd5b8135818111156116df575f80fd5b8a60208285010111156116f0575f80fd5b6020830194508093505050509295509295509295565b5f805f60608486031215611718575f80fd5b833561172381611650565b9250602084013567ffffffffffffffff8082111561173f575f80fd5b9085019060c08288031215611752575f80fd5b90925060408501359080821115611767575f80fd5b50840160408187031215611779575f80fd5b809150509250925092565b634e487b7160e01b5f52604160045260245ffd5b6040516060810167ffffffffffffffff811182821017156117bb576117bb611784565b60405290565b6040805190810167ffffffffffffffff811182821017156117bb576117bb611784565b604051601f8201601f1916810167ffffffffffffffff8111828210171561180d5761180d611784565b604052919050565b5f67ffffffffffffffff82111561182e5761182e611784565b50601f01601f191660200190565b5f82601f83011261184b575f80fd5b813561185e61185982611815565b6117e4565b818152846020838601011115611872575f80fd5b816020850160208301375f918101602001919091529392505050565b5f67ffffffffffffffff8211156118a7576118a7611784565b5060051b60200190565b5f82601f8301126118c0575f80fd5b813560206118d06118598361188e565b82815260059290921b840181019181810190868411156118ee575f80fd5b8286015b848110156119ea57803567ffffffffffffffff80821115611911575f80fd5b908801906060828b03601f19011215611928575f80fd5b611930611798565b8683013561193d81611650565b815260408381013583811115611951575f80fd5b8401603f81018d13611961575f80fd5b888101356119716118598261188e565b81815260059190911b82018301908a8101908f83111561198f575f80fd5b928401925b828410156119ad5783358252928b0192908b0190611994565b858c01525050506060840135838111156119c5575f80fd5b6119d38d8a8388010161183c565b9183019190915250855250509183019183016118f2565b509695505050505050565b5f60408236031215611a05575f80fd5b611a0d6117c1565b823567ffffffffffffffff80821115611a24575f80fd5b818501915060608236031215611a38575f80fd5b611a40611798565b8235611a4b81611650565b81526020830135611a5b81611650565b6020820152604083013582811115611a71575f80fd5b611a7d3682860161183c565b60408301525083526020850135915080821115611a98575f80fd5b50611aa5368286016118b1565b60208301525092915050565b5f808335601e19843603018112611ac6575f80fd5b83018035915067ffffffffffffffff821115611ae0575f80fd5b6020019150600581901b3603821315610b30575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235607e19833603018112611b1f575f80fd5b9190910192915050565b5f8235609e19833603018112611b1f575f80fd5b5f808335601e19843603018112611b52575f80fd5b83018035915067ffffffffffffffff821115611b6c575f80fd5b6020019150600681901b3603821315610b30575f80fd5b5f60208284031215611b93575f80fd5b81356109b181611650565b5f808335601e19843603018112611bb3575f80fd5b830160208101925035905067ffffffffffffffff811115611bd2575f80fd5b8060051b3603821315610b30575f80fd5b5f8235605e19833603018112611bf7575f80fd5b90910192915050565b5f808335601e19843603018112611c15575f80fd5b830160208101925035905067ffffffffffffffff811115611c34575f80fd5b803603821315610b30575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f808335601e19843603018112611c7f575f80fd5b830160208101925035905067ffffffffffffffff811115611c9e575f80fd5b8060061b3603821315610b30575f80fd5b8183525f60208085019450825f5b85811015611cf5578135611cd081611650565b6001600160a01b03168752818301358388015260409687019690910190600101611cbd565b509495945050505050565b8183526020808401935f91600585811b8301820185855b88811015611dd957858303601f19018a52611d328289611be3565b60608135611d3f81611650565b6001600160a01b03168552611d5682880183611b9e565b82898801528083880152608092507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811115611d90575f80fd5b871b808288850137860190506040611daa84820185611c00565b9450838884030182890152611dc28484018683611c42565b9e8a019e9750505093870193505050600101611d17565b509098975050505050505050565b5f602080835260e08301843582850152604082860135818601526060818701358187015280870135801515808214611e1d575f80fd5b8060808901525050611e326080880188611b9e565b60c060a08901529384905261010093848801600582901b89018601835f5b84811015611fae578b830360ff19018452813536879003607e19018112611e75575f80fd5b8601803536829003609e19018112611e8b575f80fd5b6080855281018035611e9c81611650565b6001600160a01b038082166080880152611eb88e840184611be3565b915060a0808801528135611ecb81611650565b8116610120880152818e0135611ee081611650565b16610140870152611ef3818c0182611c00565b91508a610160880152611f0b61018088018383611c42565b915050611f1a8b830183611c6a565b607f19808985030160c08a0152611f32848385611caf565b9350611f408d860186611c6a565b93509150808985030160e08a015250611f5a838383611caf565b9250505060808201358c8701528c8301358d8701528a8301358b870152611f838a840184611b9e565b935091508581038a870152611f99818484611d00565b968d019695505050918a019150600101611e50565b5050611fbd60a08c018c611c00565b8b8303601f190160c08d015298509650611fd8818989611c42565b9b9a5050505050505050505050565b5f8060408385031215611ff8575f80fd5b505080516020909101519092909150565b5f805f6060848603121561201b575f80fd5b835161202681611650565b602085015190935061203781611650565b604085015190925067ffffffffffffffff811115612053575f80fd5b8401601f81018613612063575f80fd5b805161207161185982611815565b818152876020838501011115612085575f80fd5b8160208401602083015e5f602083830101528093505050509250925092565b5f602082840312156120b4575f80fd5b815160ff811681146109b1575f80fd5b5f602082840312156120d4575f80fd5b5051919050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f815180845260208085019450602084015f5b83811015611cf55781518752958201959082019060010161211c565b5f8282518085526020808601955060208260051b840101602086015f5b8481101561218357601f19868403018952612171838351612109565b98840198925090830190600101612155565b5090979650505050505050565b602081526001600160a01b038251166020820152602082015160408201525f604083015160e060608401526121c96101008401826120db565b9050606084015160808401526080840151601f19808584030160a08601526121f18383612138565b925060a08601519150808584030160c086015261220e8383612109565b925060c08601519150808584030160e08601525061222c8282612109565b95945050505050565b5f82601f830112612244575f80fd5b815160206122546118598361188e565b8083825260208201915060208460051b870101935086841115612275575f80fd5b602086015b848110156119ea578051835291830191830161227a565b5f80604083850312156122a2575f80fd5b825167ffffffffffffffff808211156122b9575f80fd5b818501915085601f8301126122cc575f80fd5b815160206122dc6118598361188e565b82815260059290921b840181019181810190898411156122fa575f80fd5b948201945b83861015612318578551825294820194908201906122ff565b91880151919650909350505080821115612330575f80fd5b5061233d85828601612235565b9150509250929050565b828152604060208201525f61235f6040830184612109565b949350505050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52602160045260245ffd"; /// @dev What MUST already be on a network before this release can be /// broadcast there: an address, and the runtime code that belongs at it. /// `abi.encode`d as a `DeployDependency[]` because Solidity has no /// file-scope constant of dynamic array type. bytes constant DEPENDENCIES = - hex"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000051c00000000000000000000000002f04ff4cf5a3a19c619fe2c892bdbd72a76bf132000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000051206080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a7146117cc575080631f69cb751461156f5780632cb77e9f146115435780632fbc4ba0146113f957806341d1514f146113c25780635cffe9de1461126657806360746119146110e2578063613255ab1461105f57806369c7285614610771578063709fb8a5146104375780639235084d146103e3578063ac9650d814610295578063d7e442ec14610237578063d9d98ce4146101865763fa501182146100c1575f80fd5b34610182576101403660031901126101825767ffffffffffffffff600435818111610182576100f4903690600401611b61565b6024358281116101825761010c903690600401611b61565b60c0366043190112610182576101043583811161018257610131903690600401611d07565b90610124359384116101825761014e61015c943690600401611d07565b926101576126cb565b612211565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b5f80fd5b34610182576040366003190112610182576001600160a01b036101a7611850565b166040516370a0823160e01b8152306004820152602081602481855afa90811561022c575f916101fa575b50156101e25760206040515f8152f35b60249060405190633c5bf76960e21b82526004820152fd5b90506020813d602011610224575b81610215602093836119d0565b810103126101825751826101d2565b3d9150610208565b6040513d5f823e3d90fd5b346101825760203660031901126101825760043567ffffffffffffffff81116101825761028f61026e61015c92369060040161181f565b91906102786126cb565b60405192610285846119b4565b5f84523691611ddb565b90612b63565b34610182576020806003193601126101825760043567ffffffffffffffff8111610182576102c790369060040161181f565b9190604051926102d6846119b4565b5f84528284016102e582611ab4565b946102f360405196876119d0565b8286526102ff83611ab4565b9361031186880195601f1901866121f5565b5f5b84811061037557604080518881528951818a018190525f92600582901b83018101918a918c9085015b8287106103495785850386f35b909192938280610365600193603f198a820301865288516118dc565b960192019601959291909261033c565b806103c4886103be61039160019560059d9c9d1b8701876120f1565b929089846040519586938585013782018381015f81528b519283915e015f838201520380845201826119d0565b30613990565b6103ce828a611fd7565b526103d98189611fd7565b5001969596610313565b3461018257600319602036820112610182576004359067ffffffffffffffff821161018257608090823603011261018257610422606091600401612139565b90604051921515835260208301526040820152f35b34610182576003196040368201126101825760043567ffffffffffffffff8082116101825760c082600401938336030112610182576024359081116101825761048490369060040161181f565b9061048d6126cb565b6104be6104b96104b46104ad6104a38880612124565b60408101906120f1565b36916119f2565b613926565b61397b565b801561075f576001101561074d57602483016104da8186611f44565b90501561073b5760448401946104f08682611f44565b9050156107295761055661051e9661054a61051561050e8580612124565b9585611f44565b99909285611f44565b91909261053b6040519761053189611900565b3389523690611a56565b9a60209b8c8901523691611acc565b60408601523691611acc565b60608301526064850135608083015261056e8261270d565b91825f525f875260405f209586541596876105b2575b888860017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055604051908152f35b6001905560a46001600160a01b03917f87491344dfbcf91f6cbbc610cbbeedc85313d37a02df0c93527f7ea5f8db717f83855116604051908152878c8201526060604082015280610606606082018861203f565b0390a1019161061583856120f1565b9050610679575b5050505061066d929161066561064e61028f933390919060405192600284526020840152604083015260608201604052565b906040519160018352602083015260408201604052565b923691611ddb565b82808080808080610584565b6106866104ad84866120f1565b61068f81614717565b156107025750937fd46c2c56b35c8210e9e712ec3f02242d5fc90187c0ac8ed80cc33626846ec3698961066d9897956106f56106d86106659761064e9761028f9b5116936120f1565b866040519586958652850152606060408501526060840191611d36565b0390a1938395965061061c565b89610725604051928392630c89984b60e31b8452600484015260248301906118dc565b0390fd5b60405163540e5f0b60e01b8152600490fd5b604051636c44ef8f60e01b8152600490fd5b604051633c8270bd60e21b8152600490fd5b604051632cff108b60e21b8152600490fd5b34610182576003196020368201126101825767ffffffffffffffff600435116101825760c09060043536030112610182576107aa6126cb565b5f80806107bf60048035608481019101611e8d565b90501561104d5760246004350135926107d784612772565b1561103b576060806040516107eb81611968565b6107f3611ee2565b81525f60208201525f6040820152015261080b611ee2565b5061086b61086661084561083b61083561082f608460043501600435600401611e8d565b90611f14565b80611f2f565b6040810190611f44565b602061085e61082f608460043501600435600401611e8d565b013591611f7a565b611d22565b936001600160a01b036108ba6108666108a161089761083561082f608460043501600435600401611e8d565b6060810190611f44565b604061085e61082f608460043501600435600401611e8d565b81604051976108c889611930565b16875216602086015260408501526108ea608460043501600435600401611e8d565b9490506001604051950160051b85016040525f905f5b610914608460043501600435600401611e8d565b9050811080611028575b15610e7557610937608460043501600435600401611e8d565b821015610e61578160051b810135607e1982360301811215610182576080818301360312610182576040519161096c83611968565b8181013567ffffffffffffffff81116101825761098e90369084840101611b61565b835280820160208181013590850152604080820135908501526060013567ffffffffffffffff8111610182576109c79236920101611d07565b606082015280516001600160a01b036109e96040830151602085015190611fd7565b5151166001600160a01b0385511614801590610e2d575b610e1b57610a1860208301516040840151908361305c565b610a218161270d565b91825f525f60205260405f2054155f14610a85575051604080513381526001600160a01b039092166020830152810191909152600191907fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f390606090a15b01610900565b9190610ab6602084979597015160408501519060608601519060405192610aab846119b4565b5f8452339186613091565b925f93610ace60608201516044600435013590612795565b15610b3557505051604080513381526001600160a01b03909216602083015281019190915260019291907fe3151dc8cb7a54ffc4baabd28c1f241c94d510b5e5b502491ac3cad6c16316d590606090a15b8115610b2d575b5092610a7f565b905088610b26565b610b426040820151612772565b158015610e08575b15610b9f57505051604080513381526001600160a01b03909216602083015281019190915260019291907f500b713857325f9e6dcb52ae832eca9109d107ed1aae9cb4928b4c1e13f051aa90606090a1610b1f565b9250925050600196959691610bb8606460043501611feb565b15610d755796610c2897610c3860408401516040880151610bd98183613400565b15610d6d5750925b610c32848592610c1b610c1560608a01516001600160e01b03601b918660e01d92828816810b928260e01d9216900b613dd0565b90613f8b565b9d8e9260408d01516134cb565b60408c01526134f5565b996134f5565b98610c43848461351f565b610c4d848261357d565b60405192338452608060208501526060610c73845160808088015261010087019061203f565b93602081015160a0870152604081015160c0870152015192607f198582030160e0860152835180825260208201906020808260051b8501019601925f5b828110610d0f57505050505092806001979695937f194f1feb3b4d7076a2c272e774e792e0c48bb8c7aa1a9a3671c1cd6da9e6b4c193610d0a96604084015260608301520390a180858c5101808d5260051b8c015261368f565b610b1f565b9091929396602080610d60600193601f198782030189528b51906001600160a01b0382511681526040610d4f8584015160608785015260608401906120be565b9201519060408184039101526118dc565b9901950193929101610cb0565b905092610be1565b610c2890610c386060840151610c32610db3610c1560408801516001600160e01b0394601b90868360e01d9316820b91878260e01d9216900b613dd0565b60408a0151610dc28183613400565b15610e005750915b829c8d916060890151908116155f14610df1575060408801515b96879460408d01516134cb565b610dfb9085613427565b610de4565b905091610dca565b50610e1660608201516133dd565b610b4a565b60405163936bb5ad60e01b8152600490fd5b506001600160a01b03610e496060830151604085015190611fd7565b5151166001600160a01b036020860151161415610a00565b634e487b7160e01b5f52603260045260245ffd5b50919390610e87606460043501611feb565b1561102257835b6004356004013590610ea08282613400565b6110045750508490610ec0856001600160a01b0360208701511633612ff3565b505060a46004350190610ed8826004356004016120f1565b905015159081610ffc575b50610f5b575b506001600160a01b03610eff92935116336127bc565b50505b8351811015610f275780610f21610f1b60019387611fd7565b51613868565b01610f02565b5060409160017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005582519182526020820152f35b90506001600160a01b03602084015116610f856001600160a01b03855116926004356004016120f1565b929091333b1561018257610fcd5f93604051958694859463691f9ed760e01b8652600486015260248501528960448501528a606485015260a0608485015260a4840191611d36565b038183335af190811561022c57859115610ee9579050610fed9150611984565b5f836001600160a01b03610ee9565b905088610ee3565b604492506040519163573b6f4160e01b835260048301526024820152fd5b84610e8e565b506110366040830151612772565b61091e565b60405163315f9e2360e21b8152600490fd5b604051639c95219f60e01b8152600490fd5b3461018257602080600319360112610182576024816001600160a01b03611084611850565b16604051928380926370a0823160e01b82523060048301525afa90811561022c575f916110b5575b50604051908152f35b90508181813d83116110db575b6110cc81836119d0565b810103126101825751826110ac565b503d6110c2565b34610182576110f036611890565b92916110fd9491946126cb565b61110883833361273e565b61111181612772565b15611235578160ff91611129856111ec969533612d26565b6111338183613400565b1561122f575080935b61114885828533612f95565b917f8045c25080b0868951141ed0a91720bcad09a8364a2b3109ee1fd49c1f0bc8b860c0611177898833612ff3565b97906001600160a01b0360405192338452169a8b6020840152856040840152886060840152608083015260a0820152a16040519660068852602088015260408701526060860152608085015260a08401521660c082015260e08101604052906040519160018352602083015260408201604052565b90806112185760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b6112279261028f913691611ddb565b80808061015c565b9361113c565b50604051623a3a4d60e21b81523360048201526001600160a01b039190911660248201526044810191909152606490fd5b34610182576080366003190112610182576004356001600160a01b039081811680910361018257611295611866565b6044359167ffffffffffffffff916064358381116101825736602382011215610182578060040135938411610182573660248583010111610182576113229560209216936112e4868587612eb6565b60405196879283926323e30c8b60e01b84523360048501528760248501528860448501525f606485015260a06084850152602460a485019201611d36565b03815f855af193841561022c575f9461138e575b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd984036113755761136a93503091612f2f565b602060405160018152f35b604051630b6c58a960e31b815260048101859052602490fd5b9093506020813d6020116113ba575b816113aa602093836119d0565b8101031261018257519284611336565b3d915061139d565b346101825760603660031901126101825760206113f16113e0611850565b6113e8611866565b60443591612d26565b604051908152f35b346101825761140736611890565b928094926114136126cb565b61141e82853361273e565b61142781612772565b15611513578061143b61148a9286336127bc565b9790957f7f9dfa19cf1cc2f806f2f860fbc9c056b601fb1afc0e9b843dfe5c63616268e660806040513381526001600160a01b038416998a60208301528560408301526060820152a133612862565b939091856114b85760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b6115079661028f956106659460ff93604051956005875260208701526040860152606085015260808401521660a082015260c08101604052906040519160018352602083015260408201604052565b8080808080808061015c565b506040516306dde9c360e41b81523360048201526001600160a01b03841660248201526044810191909152606490fd5b34610182576020366003190112610182576004355f525f6020526020600160405f205414604051908152f35b34610182576003196040368201126101825767ffffffffffffffff9060043582811161018257806004019160a08236039182011261018257602435848111610182576115bf90369060040161181f565b90936115c96126cb565b5f946001600160a01b0394856115de84611d22565b1633036117aa576115f76115f23685611b61565b61270d565b805f525f60205260405f2096600188541461163e575b60208960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556040519015158152f35b9091929394959697505f6001985560405196338852826020890152606060408901528161166a8761187c565b166060890152602484013590606219018112156101825783019060a06080890152806116986004840161187c565b166101008901526116ab6024830161187c565b16610120880152604481013560221982360301811215610182570190602460048301359201988211610182578136038913610182577f09d18501db0080ca2d6cd7c17fa7255daff4b2d503ea93b76ff68b6752ea8e63878061066595608461177361028f9a60209f6117329061179d9f9a606061014061064e9d0152610160880191611d36565b6117646117596117456044880185611d56565b605f198a8603810160a08c01529491611d8b565b926064870190611d56565b918784030160c0880152611d8b565b91013560e08301520390a13390919060405192600284526020840152604083015260608201604052565b828080808080808061160d565b6024866117b685611d22565b6040516335252be360e01b815291166004820152fd5b34610182576020366003190112610182576004359063ffffffff60e01b82168092036101825760209163e414309160e01b811490811561180e575b5015158152f35b6301ffc9a760e01b14905083611807565b9181601f840112156101825782359167ffffffffffffffff8311610182576020808501948460051b01011161018257565b600435906001600160a01b038216820361018257565b602435906001600160a01b038216820361018257565b35906001600160a01b038216820361018257565b906080600319830112610182576004356001600160a01b0381168103610182579160243591604435916064359067ffffffffffffffff8211610182576118d89160040161181f565b9091565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b60a0810190811067ffffffffffffffff82111761191c57604052565b634e487b7160e01b5f52604160045260245ffd5b6060810190811067ffffffffffffffff82111761191c57604052565b6040810190811067ffffffffffffffff82111761191c57604052565b6080810190811067ffffffffffffffff82111761191c57604052565b67ffffffffffffffff811161191c57604052565b60e0810190811067ffffffffffffffff82111761191c57604052565b6020810190811067ffffffffffffffff82111761191c57604052565b90601f8019910116810190811067ffffffffffffffff82111761191c57604052565b92919267ffffffffffffffff821161191c5760405191611a1c601f8201601f1916602001846119d0565b829481845281830111610182578281602093845f960137010152565b9080601f8301121561018257816020611a53933591016119f2565b90565b91906060838203126101825760405190611a6f82611930565b8193611a7a8161187c565b8352611a886020820161187c565b602084015260408101359167ffffffffffffffff831161018257604092611aaf9201611a38565b910152565b67ffffffffffffffff811161191c5760051b60200190565b929192611ad882611ab4565b604092611ae860405192836119d0565b819581835260208093019160061b84019381851161018257915b848310611b1157505050505050565b8583830312610182578386918251611b288161194c565b611b318661187c565b81528286013583820152815201920191611b02565b9080601f8301121561018257816020611a5393359101611acc565b91909160a0818403126101825760405190611b7b82611900565b8193611b868261187c565b835267ffffffffffffffff9160208101358381116101825782611baa918301611a56565b602085015260408101358381116101825782611bc7918301611b46565b6040850152606081013592831161018257611be86080939284938301611b46565b60608501520135910152565b909291611c0084611ab4565b916040611c1060405194856119d0565b839580855260208095019160059160051b8401948086116101825784935b868510611c3f575050505050505050565b67ffffffffffffffff90853582811161018257870190606082850312610182578451611c6a81611930565b611c738361187c565b81528a83013584811161018257830185601f8201121561018257803590611c9982611ab4565b91611ca6895193846119d0565b8083528d808401918b1b83010191888311610182578e809101915b838310611cf757509150508201528583013593841161018257611ce8858c95869501611a38565b86820152815201940193611c2e565b82358152918101918f9101611cc1565b9080601f8301121561018257816020611a5393359101611bf4565b356001600160a01b03811681036101825790565b908060209392818452848401375f828201840152601f01601f1916010190565b9035601e198236030181121561018257016020813591019167ffffffffffffffff8211610182578160061b3603831361018257565b9190808252602080920192915f905b828210611da8575050505090565b909192936001906001600160a01b03611dc08761187c565b16815285830135838201526040908101950193920190611d9a565b90929192611de881611ab4565b91604091611df960405194856119d0565b839581855260208095019160051b8301938185116101825783925b858410611e245750505050505050565b67ffffffffffffffff908435828111610182578601908382860312610182578351611e4e8161194c565b82358481116101825786611e63918501611a56565b81528983013593841161018257611e7e868b95869501611d07565b83820152815201930192611e14565b903590601e1981360301821215610182570180359067ffffffffffffffff821161018257602001918160051b3603831361018257565b60405190611ed082611930565b60606040835f81525f60208201520152565b60405190611eef82611900565b5f608083828152611efe611ec3565b6020820152606060408201526060808201520152565b9015610e6157803590607e1981360301821215610182570190565b903590609e1981360301821215610182570190565b903590601e1981360301821215610182570180359067ffffffffffffffff821161018257602001918160061b3603831361018257565b9190811015610e615760061b0190565b805115610e615760200190565b805160011015610e615760400190565b805160021015610e615760600190565b805160031015610e615760800190565b805160041015610e615760a00190565b8051821015610e615760209160051b010190565b3580151581036101825790565b9081518082526020808093019301915f5b828110612017575050505090565b835180516001600160a01b031686528201518583015260409094019392810192600101612009565b906080806120b56120a361209160406001600160a01b0380895116885260208901519060a060208a01528082511660a08a015260208201511660c08901520151606060e08801526101008701906118dc565b60408701518682036040880152611ff8565b60608601518582036060870152611ff8565b93015191015290565b9081518082526020808093019301915f5b8281106120dd575050505090565b8351855293810193928101926001016120cf565b903590601e1981360301821215610182570180359067ffffffffffffffff82116101825760200191813603831361018257565b903590605e1981360301821215610182570190565b6121506115f26121498380611f2f565b3690611b61565b5f525f602052600160405f2054036121ec5780612170816121dc93611f2f565b6121d461218f6121946020850135938460408701359384923690611b61565b61305c565b6121ac6121a18580611f2f565b946060810190611e8d565b92906121cc604051966121be886119b4565b5f88525f3681373690611b61565b933691611bf4565b923392613091565b6040810151606090910151600192565b505f905f905f90565b5f5b82811061220357505050565b6060828201526020016121f7565b926001600160a01b038451166001600160a01b03835116146126b9576001600160a01b03612246606086015160643590611fd7565b515116906040830151916001600160a01b036122656084358095611fd7565b51511614801590612679575b610e1b576040850151906001600160a01b036122906044358094611fd7565b5151166001600160a01b036122ab60643560608a0151611fd7565b51511614612667576122bc8661270d565b805f525f60205260405f20541561261457506122d78461270d565b805f525f60205260405f2054156125c057506123ba9291612394917f6fa7f4c28634b0a9d6831401c45ae468195fb63aed07308935c35374ff5d9e396040518061233f61233161012033845280602085015283018d61203f565b82810360408401528a61203f565b85606083015260643560808301528760a083015260a43560c083015260c43560e083015260e4356101008301520390a16001600160a01b0386511660405192612387846119b4565b5f8452606435908a613091565b936001600160a01b03865116604051926123ad846119b4565b5f845260a4359086613091565b916123c86040820151612772565b1580156125ac575b8015612599575b8015612586575b61257457604051916123ef83611968565b5f83525f60208401525f60408401525f606084015261240e848361473b565b84526040840152612434612422838661473b565b602086015280606086015284516134cb565b9461244860208501516040860151906134cb565b93612452876133dd565b8015612565575b6125535761251a61254c957fd9fa84dd790c969daa5c33d8050dc06b4a9b59d5b42e2be5f5e8ae20447f618d946124fc6125519a60a09661249b8a885161351f565b6124a98c602089015161351f565b6124b78a604089015161357d565b6124c58c606089015161357d565b6124ce8a613868565b6124d78c613868565b6001600160a01b036124f360c435926060606435910151611fd7565b51511633612862565b50506001600160a01b036124f360e43592606060a435910151611fd7565b5050606060405191338352805160208401526020810151604084015260408101518284015201516080820152a161368f565b61368f565b565b604051630d86822160e01b8152600490fd5b5061256f856133dd565b612459565b6040516321badf1f60e01b8152600490fd5b5061259460608401516133dd565b6123de565b506125a760608201516133dd565b6123d7565b506125ba6040840151612772565b156123d0565b9351604080513381526001600160a01b039092166020830152810194909452507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f3945091925082915050606081015b0390a1565b9551604080513381526001600160a01b039092166020830152810196909652507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f39493508392505060608201905061260f565b604051631cd2f1c760e21b8152600490fd5b506001600160a01b03612693606085015160a43590611fd7565b5151166001600160a01b036126af604088015160443590611fd7565b5151161415612271565b604051630a98f1f360e21b8152600490fd5b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0060028154146126fb5760029055565b604051633ee5aeb560e01b8152600490fd5b6040516127388161272a602082019460208652604083019061203f565b03601f1981018352826119d0565b51902090565b909115612749575050565b6040516305dbdfd960e41b81526001600160a01b03918216600482015291166024820152604490fd5b612791905f60e01d906001600160e01b038160e01d9116601b0b61479e565b1290565b90612791916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b61481f565b9291926127c882613a63565b936127d2816133dd565b6128505784816001600160e01b036127f19360e01d9116601b0b61489e565b9290809315612827575b5082908161280b575b5050509190565b61281f926001600160a01b03309216612f2f565b5f8181612804565b9092505f19811461283c57600101915f6127fb565b634e487b7160e01b5f52601160045260245ffd5b604051632eaefac360e21b8152600490fd5b9392919361286f836133dd565b61290d578461288b57612883939450612ff3565b50505f905f90565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f5281526128c8835f205494856134f5565b956128d2876133dd565b6128f5575f97885260018252838820908852815282872091875252909320829055565b835163c5e12af560e01b815260048101889052602490fd5b60405163793a8f5560e01b815260048101849052602490fd5b919060408382031261018257825167ffffffffffffffff908181116101825784019082601f8301121561018257815160209261296182611ab4565b9161296f60405193846119d0565b808352848084019160051b830101918683116101825785809101915b8383106129fe5750505050948281015191821161018257019180601f840112156101825782516129ba81611ab4565b936129c860405195866119d0565b818552838086019260051b820101928311610182578301905b8282106129ef575050505090565b815181529083019083016129e1565b825181529181019186910161298b565b90808251908181526020809101926020808460051b8301019501935f915b848310612a3c5750505050505090565b9091929394958480612a5a600193601f198682030187528a516120be565b9801930193019194939290612a2c565b91906020928381526001600160a01b0382511684820152838201516040820152612aa4604083015160e060608401526101008301906118dc565b9060608301516080820152612acb608084015192601f1993848483030160a0850152612a0e565b9260a081015193838382030160c08401528680865192838152019501905f5b818110612b0e57505050611a5394955060c060e091015192828503019101526120be565b825187529588019591880191600101612aea565b90604082019082526020606081936040838201528551809452019301915f5b828110612b4f575050505090565b835185529381019392810192600101612b41565b919091335f526020308152604091825f2091835195612b818761194c565b612b89611ec3565b875260608281980152845190612b9e826119b4565b5f8252855190612bad826119b4565b5f82525f3681375f5b8151811015612d1a57898688612bcc8486611fd7565b51888151948d80870151908151612bee575b5050505050505050600101612bb6565b905f92916001600160a01b0396612c138887818d51169c015116998789015190613b42565b95825199612c208b611998565b8a5289015287015285015260808401528760a08401528660c08401525f8c51809563d04dfe2360e01b82528180612c5b600498898301612a6a565b03915afa938415612d10579089915f95612cea575b508451612c86575b50899250808e8c938e612bde565b5101511691823b1561018257612cb4925f92838d5180968195829463012c676d60e21b845233908401612b22565b03925af18015612ce0579060019291612cd1575b81928782612c78565b612cda90611984565b5f612cc8565b89513d5f823e3d90fd5b612d079195503d805f833e612cff81836119d0565b810190612926565b9050935f612c70565b8c513d5f823e3d90fd5b50505050505050509050565b8215612d5b576001600160a01b038091165f52600160205260405f2091165f5260205260405f20905f5260205260405f205490565b909150612d6782613d74565b6001600160a01b03809316906040918251946370a0823160e01b86528416938460048701526020928387602481865afa968715612e7d575f97612e87575b5083612dbe612db783612dee9a614a53565b50906141de565b508651636eb1769f60e11b81526001600160a01b0390941660048501523060248501529297889081906044820190565b0381865afa968715612e7d575f97612e4c575b50612db7612e1291611a5398614a53565b50612e1d8183613400565b15612e445750935b5f5260018252825f20905f528152815f20905f8052525f2054906134f5565b905093612e25565b96508387813d8311612e76575b612e6381836119d0565b8101031261018257955195612db7612e01565b503d612e59565b85513d5f823e3d90fd5b96508387813d8311612eaf575b612e9e81836119d0565b810103126101825795519583612da5565b503d612e94565b6040519263a9059cbb60e01b5f526001600160a01b0380931660045260245260205f60448180855af160015f5114811615612f10575b8360405215612efa57505050565b635274afe760e01b835216600482015260249150fd5b6001811516612f2657813b15153d151616612eec565b833d5f823e3d90fd5b9092604051936323b872dd60e01b5f526001600160a01b0393848092166004521660245260445260205f60648180855af160015f5114811615612f7f575b836040525f60605215612efa57505050565b6001811516612f2657813b15153d151616612f6d565b93929193612fa2836133dd565b61290d5784612fb6576128839394506127bc565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f5281526128c8835f205494856134cb565b9092919261300081613a63565b9361300a816133dd565b61304a5784816001600160e01b036130299360e01d9116601b0b61489e565b50809281613038575050509190565b6001600160a01b0361281f9316612eb6565b604051632d1671a360e11b8152600490fd5b9161308790606061307c936001600160a01b039485916040880151611fd7565b515116940151611fd7565b5151161461266757565b94919392909260408051916130a583611998565b6130ad611ee2565b83526020925f848201525f838201526060945f868301528560c06080938260808201525f60a082015201528351916130e483611900565b600483525f5b8181106133ce5750506132d7959493925f9261320e61325e938d61310d8161270d565b9c896001600160a01b039e8f94859182865116908d5194600386528501528c840152168c820152608081018a5261314386611f8a565b5261314d85611f8a565b50885161315981611930565b6002815289368c83013761316c86611f97565b5261317685611f97565b5060ff8a6131d98b8501936131c38761319c81613194858a51611fd7565b515116613d74565b975116886131ab848951611fd7565b515116856131ba858a51611fd7565b51015191612d26565b966131cf828751611fd7565b5151169451611fd7565b51015192169093929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b61321782611fa7565b5261322181611fa7565b506132458a8d8d60ff8a6131d98d8501936131c38761319c81613194858a51611fd7565b61324e82611fb7565b5261325881611fb7565b50613b42565b95878a511697848b0191825191868184511693015116928a8552308752858086209151015186519161328f836119b4565b86835287519561329e87611998565b86528886015286850152848885015289608085015260a084015260c08301528351808098819463d04dfe2360e01b835260048301612a6a565b03915afa9687156133c4575f945f986133a2575b5084516002811061338b5750818386015195015161331161330b88611fc7565b51611fb7565b5161331c8183613400565b156133835750925b6133468685919060405192600284526020840152604083015260608201604052565b61334f88611fa7565b5261335987611fa7565b508251996133668b611998565b8a52890152870152850152608084015260a083015260c082015290565b905092613324565b602490835190630fbb8e5560e21b82526004820152fd5b9097506133ba9194503d805f833e612cff81836119d0565b939093965f6132eb565b50513d5f823e3d90fd5b808888809387010152016130ea565b6133fc905f60e01d906001600160e01b038160e01d9116601b0b61479e565b1390565b906133fc916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b61481f565b61344e6001600160e01b0392838316601b0b9260e01d938160e01d9116601b0b8484613f95565b90637ffffff5821361349e575b90613465916141de565b9290921580613496575b61347857505090565b6044925060405191638eba4d0760e01b835260048301526024820152fd5b50821561346f565b6134a88282614e7e565b1561345b57604483856040519163d556b11160e01b835260048301526024820152fd5b611a5391610c15916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6143e4565b611a5391610c15916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6145a8565b61357991608081018261353b6135358351611fc7565b51611fc7565b5261357261356c6001600160a01b0380945151169361356361355d8551611fc7565b51611f8a565b51169251611fc7565b51611fa7565b5191612f95565b5050565b906080810191806135916135358551611fb7565b526001600160a01b038092515116916135ad61355d8551611fb7565b51166135bc61356c8551611fb7565b519081613657576135cc836133dd565b61290d579183917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a959361260f955f5260209060018252613622604094855f20835f528452855f20855f528452855f20546134f5565b945f5260018252835f20905f528152825f20915f52525f20555b51604051918291338352604060208401526040830190612a0e565b91613688917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a959361260f95612862565b505061363c565b60c0810151908151915f92613803575b506137446020918281510151926001600160a01b039081818187511696015116928660a082019485518252308452604097888320898686510151015160808601518b51916136ec836119b4565b8683528c51936136fb856119b4565b8785528d519661370a88611998565b8752898701528c86015260016060860152608085015260a084015260c08301528851808099819463d04dfe2360e01b835260048301612a6a565b03915afa9485156137f95787956137db575b508451613767575b50505050505050565b81905101510151169051813b156137d75791849184938361379c965180978195829463012c676d60e21b845260048401612b22565b03925af19081156137ce57506137b7575b808080808061375e565b6137c18291611984565b6137cb57806137ad565b80fd5b513d84823e3d90fd5b8480fd5b6137f09195503d8089833e612cff81836119d0565b9050935f613756565b86513d89823e3d90fd5b6001600160a01b03602080845101510151169060a083015190823b1561018257613846925f928360405180968195829463012c676d60e21b845260048401612b22565b03925af1801561022c571561369f57613860919250611984565b5f905f61369f565b6080810161387961356c8251611fb7565b5191821561388657505050565b6138a061355d6001600160a01b0380935151169351611fb7565b5116815f5260209160018352604092835f20835f528152835f20855f528152835f2054936001600160e01b0385166138db575b505050505050565b6138ff955f9284845260018152828420868552815282842091845252812055612ff3565b5f8080806138d3565b8115613912570490565b634e487b7160e01b5f52601260045260245ffd5b604081511061396e576020810151908051603f19810190811161283c5760051c821161395a5760016020920160051b010190565b5050604051613968816119b4565b5f815290565b50604051613968816119b4565b80511561398b57602001515f1a90565b505f90565b905f8091602081519101845af48080613a0e575b156139c45750506040513d81523d5f602083013e60203d82010160405290565b156139eb57604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b3d156139fc576040513d5f823e3d90fd5b60405163d6bda27560e01b8152600490fd5b503d1515806139a45750813b15156139a4565b60041115613a2b57565b634e487b7160e01b5f52602160045260245ffd5b602090939291936001600160a01b036040820195168152613a5f83613a21565b0152565b613a6b614f6c565b6040805163b7bad1b160e01b81526001600160a01b0383166004820152909182826024815f73200e12d10bb0c5e4a17e7018f0f1161919bb93895af1928315613b39575f925f94613b04575b50613ac183613a21565b600183141580613af2575b613ad65750505090565b5163ee07877f60e01b8152918291610725919060048401613a3f565b50613afc83613a21565b821515613acc565b90809450613b289293503d8511613b32575b613b2081836119d0565b810190614874565b919091925f613ab7565b503d613b16565b513d5f823e3d90fd5b90805191613b4f83611ab4565b91613b6a604094613b62865195866119d0565b808552611ab4565b601f199460209186013686840137835183519095908015613d69576001613bc09101965b6001978891010197613bb7613ba28a611ab4565b99613baf86519b8c6119d0565b808b52611ab4565b018489016121f5565b85805f9684516002815233878201523086820152606081018652613be38b611f8a565b52613bed8a611f8a565b505f925b613d25575b5050508351613c09575b50505050505090565b85809598979692980181613c1d8289611fd7565b52613c288188611fd7565b505f925b613c3b575b5085969750613c00565b8451831015613d20576001600160a01b03613cb281613c5a8689611fd7565b51511686613c68878a611fd7565b51015187815160051b9101207f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f52601c52603c5f208c613ca9888b611fd7565b510151916149ca565b15613d0857868098999a928192613cc9878a611fd7565b515116613cd68787611fd7565b52019385613ce48289611fd7565b510151613cf1868c611fd7565b52613cfc858b611fd7565b50019290989796613c2c565b8951630a57f30960e31b815260048101859052602490fd5b613c31565b9091968151881015613d60578280910197613d408184611fd7565b51613d4b8a8d611fd7565b52613d56898c611fd7565b5001919081613bf1565b96829150613bf6565b50613bc05f96613b8e565b613d7c614f6c565b60408051630782d7e160e01b81526001600160a01b03831660048201529091828260248173200e12d10bb0c5e4a17e7018f0f1161919bb93895afa928315613b39575f925f94613b045750613ac183613a21565b9091939284158215175f14613dea5750505090505f905f90565b82810192600160fd1b8082019083011760fe1c613f21575b5050613e0d81614b43565b93613e1781614b43565b94613e228682614b63565b90918215613f12575f9083986f0785ee10d5da46d900f436a000000000808611613f04575b50670de0b6b3a7640000808b11613ef5575b50633b9aca00808b11613ee6575b50612710808b11613ed8575b5098805b613ec7575081906118d8989982600a0a9109960195817fcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccd0a93838211900382610100031b9203901c170291614b76565b60019290920191600a900480613e77565b60049a04998a930192613e73565b600991939a049901915f613e67565b601291939a049901915f613e59565b85049950602592505f613e47565b509290506118d8949550614b76565b5f821215613f7557808413613f67575b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb2841315613e02579092506118d8939491614a81565b9092506118d8939491614ae8565b80841215613f31579092506118d8939491614a81565b61346582826141de565b92909180613fbb576044848460405191637a97930f60e01b835260048301526024820152fd5b90919280155f14613fd057505050505f905f90565b613fe993613fdd91614c30565b92919490938492614c30565b9093919284613ff788614b43565b9161400186614b43565b947f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000094604c918688106141a8575b030191600160ff1b98838a018112155f14614175575050035b5f955f82128061416c575b61414e575b5f81128061413c575b61411e5786820103966001600160ff1b0388149081614114575b508061410b575b80614102575b6140e45750906140989291614ddc565b915f81136140ab575b506118d893614b76565b9091604c82136140d9576140c291600a0a90613908565b9081156140cf575f6140a1565b505050505f905f90565b50505050505f905f90565b876044916040519163d556b11160e01b835260048301526024820152fd5b505f8512614088565b50828414614082565b905088145f61407b565b604489836040519163d556b11160e01b835260048301526024820152fd5b50806001600160ff1b03018213614061565b95508087018613156141665786818703015b95614058565b5f614160565b505f8113614053565b89985090920390506001600160ff1b03819003870182136141995701860194614048565b5050505050505050505f905f90565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009650604b925061402f565b8115613912570590565b8082601b82810b83146143d3577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e1000000000000000000840561437f575b8380820b0361436e57507b199999999999999999999999999999999999999999999999999999987b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc8401111561431f575b838060030b036142a3575b8084136142875750506001600160e01b036001925b60e01b91161791565b8303600a0a8015613912576001600160e01b039107159261427e565b92915f8413156142f35750906142b98383614e7e565b6142d557637ffffffe1901600a0a810290637fffffff92614269565b506044916040519163d556b11160e01b835260048301526024820152fd5b637fffffff1992830390604382136140d95761431291600a0a906141d4565b9182156140cf5792614269565b5f198401808060030b14614333575061425e565b90506001600160e01b039293507b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff915060e01b9260ff1d181617905f90565b600190940193600a90930592614211565b937f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000008405156143c0576305f5e100600894058094819201955b915050614211565b620186a0600594058094819201956143b8565b508261425e57505050505f90600190565b919291600160ff1b84016143fc576118d89350614e97565b906118d8935f03916145a8565b919291600160ff1b919080158061459657509061442591614c30565b9490929091905f86858585828213801561458d575b614570575b505050508682841860ff1c94860391039081604c0381116145555701600a0a80820591908461453b575b505081019182821860ff1c111561453357826001600160ff1b031461451557905f600192135f146144e657600a9004915b01925b811581176144aa57509190565b806144c3575b5080156144bb579190565b505f91508190565b91926144d99203600160ff1b01600a0a906141d4565b600160ff1b91905f6144b0565b600a60037fe666666666666666666666666666666666666666666666666666666666666667920104019161449a565b604490836040519163d556b11160e01b835260048301526024820152fd5b50909261449d565b8107614548575b80614469565b60ff1d600117015f614542565b505050919350614563579190565b60018160ff1d1790039190565b5f9a50909750909550600160ff1b9450925090508680808061443f565b50835f1261443a565b156145a15750509190565b9350919050565b93929193841581158181176146f9575050906145c391614c30565b91949082956145d482958294614c30565b80969294919693878684821380156146f0575b6146d7575b5050505050508682841860ff1c94860391039081604c0381116145555701600a0a8082059190846146bd575b505081019182821860ff1c11156146b557826001600160ff1b031461451557905f600192135f1461468657600a9004915b01925b8115811761465957509190565b80614669575080156144bb579190565b600160ff1b936146809291038401600a0a906141d4565b5f6144b0565b600a60037fe6666666666666666666666666666666666666666666666666666666666666679201040191614649565b50909261464c565b81076146ca575b80614618565b60ff1d600117015f6146c4565b929b5098509196509450925090505f80808080806145ec565b508584126145e7565b939593909291901561470f5750506144bb579190565b945092915050565b600881511061398b576008015167ffffffffffffffff1667ff0a89c674ee78741490565b9160408301926040614775610c15606087519401938451906001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b613dd0565b94519301614784815186612795565b61478c575050565b909350611a5391925051925183613427565b92915f9060018184145f87128715171717614818575f9280821361480a575b03604c81135f8212176147fe57600a0a90846147dc83820293846141d4565b146147f1575050156147ed575f9190565b5f90565b9093509015611a53579190565b5050156147ed575f9190565b5f95600194509250906147bd565b5050505f90565b93929190918083145f83125f8712188315871517171761486e575f928082136148615703604c81135f8212176147fe57600a0a90846147dc83820293846141d4565b91946001935091906147bd565b50919050565b919082604091031261018257815160048110156101825760209092015160ff811681036101825790565b91925f8312156148c6576044838360405191634a7d166b60e01b835260048301526024820152fd5b9192836148d857505090505f90600190565b60ff81168201918083126149a0575f831215614910575050604c1981126144bb575f03600a0a916149098382613908565b9283021490565b909293915f81135f1461499657604d811361496b57600a0a92831561391257835f190483116149425750500290600190565b60405163c849483b60e01b815260048101849052602481019290925260ff166044820152606490fd5b5060405163c849483b60e01b81526004810192909252602482015260ff919091166044820152606490fd5b5050905090600190565b60405163c849483b60e01b815260048101869052602481019190915260ff82166044820152606490fd5b9091813b614a05576149dc9192614fd5565b506149e681613a21565b1591826149f257505090565b6001600160a01b03918216911614919050565b6020918160645f935160405192630b135d3f60e11b9788855260048501526040602485015286820190604485015e8281018201859052601f01601f191601915afa905f5114601f3d11161690565b9060ff165f03916001600160ff1b0382115f14614a7957600a6001818404940192061590565b909190600190565b909392915f614a91918184613dd0565b9490945f8483019182019412159081614ade575b8115614ad4575b50614ab657505090565b604492506040519163d556b11160e01b835260048301526024820152fd5b905083125f614aac565b8281129150614aa5565b614afd93600160fe1b90810193920190613dd0565b9081815f821215614b34575050604b19821261288357614b22915f03600a0a906141d4565b9081614b2c575f90565b600160ff1b90565b93600160ff1b90910192509050565b5f811215611a5357600160ff1b90808203614b5c575090565b90505f0390565b905f198183099102908180821091030391565b92939291905f8184181215614c0b576001600160ff1b039283831115614bf557600160ff1b93838503614bab57505050509190565b90919293508514614bc5575050600a600191045f03920190565b604051630ed8062160e21b8152600481019190915260248101919091526044810182905260648101849052608490fd5b5090915050600160ff1b811461283c575f039190565b90916001600160ff1b0380841115612804578514614bc5575050600a60019104920190565b9190918015614dd257827f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000080830515614ce0575b507f19999999999999999999999999999999999999999999999999999999999999997f0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc830110614cd1575b8313614cbb5791905f90565b919060018060ff1b926001600160ff1b03030190565b9290600a02905f190192614caf565b6f4b3b4ca85a86c47a098a22400000000080840515614dc0575b507728c87cb5c89a2571ebfdcb54864ada834a00000000000000830515614da9575b7b097edd871cfda3a5697758bf0e3cbb5ac5741c640000000000000000830515614d95575b7e3899162693736ac531a5a58f1fbb4b746504382ca7e4000000000000000000830515614d8557820515614d76575b5f614c64565b9290600a02905f190192614d70565b9391606402916001190193614d41565b93916402540be40002916009190193614d41565b9391678ac7230489e8000002916012190193614d1c565b6025198301955092909202915f614cfa565b505f915081908190565b90915f198383099280830292838086109503948086039584871015614e5a5714614e52579082910960018219018216809204600280826003021880830282030280830282030280830282030280830282030280830282030280920290030293600183805f03040190848311900302920304170290565b505091500490565b60648386866040519263362ced0960e11b8452600484015260248301526044820152fd5b611a5391905f811215614e92575f0361500f565b61500f565b909291600160ff1b91828101614f295750808414614f1f57808413918215614f17578185035b604c811115614f065750505f915b15614ef757507f8000000000000000000000000000000000000000000000000000000000000001019190565b92506001600160ff1b03039190565b600a0a908115613912570491614ecb565b848203614ebd565b505090505f905f90565b93614f3692945f03614409565b80939180928114614f4a575b50505f039190565b915092506001600160ff1b03831461451557600a600191059201915f80614f42565b73200e12d10bb0c5e4a17e7018f0f1161919bb9389803b158015614faa575b614f925750565b602490604051906373e6d7b360e01b82526004820152fd5b507f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d41813f1415614f8b565b815191906041830361500557614ffe9250602082015190606060408401519301515f1a9061509e565b9192909190565b50505f9160029190565b90637ffffff581131561509857637ffffffe1981019060438213615091575f82121561506557637fffffff91505f0301600a0a7b8000000000000000000000000000000000000000000000000000000202111590565b50600a0a8015613912577b80000000000000000000000000000000000000000000000000000001041090565b5050151590565b50505f90565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411615115579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa1561022c575f516001600160a01b0381161561510b57905f905f90565b505f906001905f90565b5050505f916003919056000000000000000000000000200e12d10bb0c5e4a17e7018f0f1161919bb93890000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000044b608060405234801561000f575f80fd5b506004361061004a575f3560e01c80630782d7e11461004e57806354636d2b14610078578063b7bad1b11461009d578063f5c36eaf146100b0575b5f80fd5b61006161005c366004610363565b6100c3565b60405161006f929190610403565b60405180910390f35b61008b610086366004610363565b6100d8565b60405160ff909116815260200161006f565b6100616100ab366004610363565b6100e9565b61008b6100be366004610363565b6100f5565b5f806100cf5f84610100565b91509150915091565b5f6100e35f836101f0565b92915050565b5f806100cf5f84610281565b5f6100e35f83610356565b73ffffffffffffffffffffffffffffffffffffffff81165f9081526020838152604080832081518083019092525460ff8082161515835261010090910416818301527f313ce56700000000000000000000000000000000000000000000000000000000808452839283908190816004818a5afa915060203d1015610182575f91505b811561019857505f5160ff811115610198575f91505b816101af57505050602001516003925090506101e9565b83516101c3575f955093506101e992505050565b836020015160ff1681146101d85760026101db565b60015b846020015195509550505050505b9250929050565b5f805f6101fd8585610281565b909250905060018260038111156102165761021661039d565b1415801561023557505f8260038111156102325761023261039d565b14155b156102795783826040517fee07877f000000000000000000000000000000000000000000000000000000008152600401610270929190610421565b60405180910390fd5b949350505050565b5f805f8061028f8686610100565b90925090505f8260038111156102a7576102a761039d565b0361034b576040805180820182526001815260ff838116602080840191825273ffffffffffffffffffffffffffffffffffffffff8a165f908152908b9052939093209151825493517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009094169015157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff161761010093909116929092029190911790555b909590945092505050565b5f805f6101fd8585610100565b5f60208284031215610373575f80fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114610396575f80fd5b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b600481106103ff577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b9052565b6040810161041182856103ca565b60ff831660208301529392505050565b73ffffffffffffffffffffffffffffffffffffffff831681526040810161039660208301846103ca56000000000000000000000000000000000000000000"; + hex"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000051e00000000000000000000000007900fd69e0785195f6e4622e3138146c4cc4abd2000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000051216080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a7146117cc575080631f69cb751461156f5780632cb77e9f146115435780632fbc4ba0146113f957806341d1514f146113c25780635cffe9de1461126657806360746119146110e2578063613255ab1461105f57806369c7285614610771578063709fb8a5146104375780639235084d146103e3578063ac9650d814610295578063d5708b46146101fa578063d7e442ec146101765763d9d98ce4146100c1575f80fd5b3461015f57604036600319011261015f576001600160a01b036100e2611850565b166040516370a0823160e01b8152306004820152602081602481855afa90811561016b575f91610135575b501561011d5760206040515f8152f35b60249060405190633c5bf76960e21b82526004820152fd5b90506020813d602011610163575b81610150602093836119d0565b8101031261015f57515f61010d565b5f80fd5b3d9150610143565b6040513d5f823e3d90fd5b3461015f57602036600319011261015f5760043567ffffffffffffffff811161015f576101ce6101ad6101d492369060040161181f565b91906101b76126cc565b604051926101c4846119b4565b5f84523691611ddb565b90612b64565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b3461015f5761014036600319011261015f5767ffffffffffffffff60043581811161015f5761022d903690600401611b61565b60243582811161015f57610245903690600401611b61565b60c036604319011261015f576101043583811161015f5761026a903690600401611d07565b906101243593841161015f576102876101d4943690600401611d07565b926102906126cc565b612211565b3461015f5760208060031936011261015f5760043567ffffffffffffffff811161015f576102c790369060040161181f565b9190604051926102d6846119b4565b5f84528284016102e582611ab4565b946102f360405196876119d0565b8286526102ff83611ab4565b9361031186880195601f1901866121f5565b5f5b84811061037557604080518881528951818a018190525f92600582901b83018101918a918c9085015b8287106103495785850386f35b909192938280610365600193603f198a820301865288516118dc565b960192019601959291909261033c565b806103c4886103be61039160019560059d9c9d1b8701876120f1565b929089846040519586938585013782018381015f81528b519283915e015f838201520380845201826119d0565b30613991565b6103ce828a611fd7565b526103d98189611fd7565b5001969596610313565b3461015f5760031960203682011261015f576004359067ffffffffffffffff821161015f57608090823603011261015f57610422606091600401612139565b90604051921515835260208301526040820152f35b3461015f5760031960403682011261015f5760043567ffffffffffffffff80821161015f5760c08260040193833603011261015f5760243590811161015f5761048490369060040161181f565b9061048d6126cc565b6104be6104b96104b46104ad6104a38880612124565b60408101906120f1565b36916119f2565b613927565b61397c565b801561075f576001101561074d57602483016104da8186611f44565b90501561073b5760448401946104f08682611f44565b9050156107295761055661051e9661054a61051561050e8580612124565b9585611f44565b99909285611f44565b91909261053b6040519761053189611900565b3389523690611a56565b9a60209b8c8901523691611acc565b60408601523691611acc565b60608301526064850135608083015261056e8261270e565b91825f525f875260405f209586541596876105b2575b888860017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055604051908152f35b6001905560a46001600160a01b03917f87491344dfbcf91f6cbbc610cbbeedc85313d37a02df0c93527f7ea5f8db717f83855116604051908152878c8201526060604082015280610606606082018861203f565b0390a1019161061583856120f1565b9050610679575b5050505061066d929161066561064e6101ce933390919060405192600284526020840152604083015260608201604052565b906040519160018352602083015260408201604052565b923691611ddb565b82808080808080610584565b6106866104ad84866120f1565b61068f81614718565b156107025750937fd46c2c56b35c8210e9e712ec3f02242d5fc90187c0ac8ed80cc33626846ec3698961066d9897956106f56106d86106659761064e976101ce9b5116936120f1565b866040519586958652850152606060408501526060840191611d36565b0390a1938395965061061c565b89610725604051928392630c89984b60e31b8452600484015260248301906118dc565b0390fd5b60405163540e5f0b60e01b8152600490fd5b604051636c44ef8f60e01b8152600490fd5b604051633c8270bd60e21b8152600490fd5b604051632cff108b60e21b8152600490fd5b3461015f5760031960203682011261015f5767ffffffffffffffff6004351161015f5760c0906004353603011261015f576107aa6126cc565b5f80806107bf60048035608481019101611e8d565b90501561104d5760246004350135926107d784612773565b1561103b576060806040516107eb81611968565b6107f3611ee2565b81525f60208201525f6040820152015261080b611ee2565b5061086b61086661084561083b61083561082f608460043501600435600401611e8d565b90611f14565b80611f2f565b6040810190611f44565b602061085e61082f608460043501600435600401611e8d565b013591611f7a565b611d22565b936001600160a01b036108ba6108666108a161089761083561082f608460043501600435600401611e8d565b6060810190611f44565b604061085e61082f608460043501600435600401611e8d565b81604051976108c889611930565b16875216602086015260408501526108ea608460043501600435600401611e8d565b9490506001604051950160051b85016040525f905f5b610914608460043501600435600401611e8d565b9050811080611028575b15610e7557610937608460043501600435600401611e8d565b821015610e61578160051b810135607e198236030181121561015f57608081830136031261015f576040519161096c83611968565b8181013567ffffffffffffffff811161015f5761098e90369084840101611b61565b835280820160208181013590850152604080820135908501526060013567ffffffffffffffff811161015f576109c79236920101611d07565b606082015280516001600160a01b036109e96040830151602085015190611fd7565b5151166001600160a01b0385511614801590610e2d575b610e1b57610a1860208301516040840151908361305d565b610a218161270e565b91825f525f60205260405f2054155f14610a85575051604080513381526001600160a01b039092166020830152810191909152600191907fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f390606090a15b01610900565b9190610ab6602084979597015160408501519060608601519060405192610aab846119b4565b5f8452339186613092565b925f93610ace60608201516044600435013590612796565b15610b3557505051604080513381526001600160a01b03909216602083015281019190915260019291907fe3151dc8cb7a54ffc4baabd28c1f241c94d510b5e5b502491ac3cad6c16316d590606090a15b8115610b2d575b5092610a7f565b905088610b26565b610b426040820151612773565b158015610e08575b15610b9f57505051604080513381526001600160a01b03909216602083015281019190915260019291907f500b713857325f9e6dcb52ae832eca9109d107ed1aae9cb4928b4c1e13f051aa90606090a1610b1f565b9250925050600196959691610bb8606460043501611feb565b15610d755796610c2897610c3860408401516040880151610bd98183613401565b15610d6d5750925b610c32848592610c1b610c1560608a01516001600160e01b03601b918660e01d92828816810b928260e01d9216900b613dd1565b90613f8c565b9d8e9260408d01516134cc565b60408c01526134f6565b996134f6565b98610c438484613520565b610c4d848261357e565b60405192338452608060208501526060610c73845160808088015261010087019061203f565b93602081015160a0870152604081015160c0870152015192607f198582030160e0860152835180825260208201906020808260051b8501019601925f5b828110610d0f57505050505092806001979695937f194f1feb3b4d7076a2c272e774e792e0c48bb8c7aa1a9a3671c1cd6da9e6b4c193610d0a96604084015260608301520390a180858c5101808d5260051b8c0152613690565b610b1f565b9091929396602080610d60600193601f198782030189528b51906001600160a01b0382511681526040610d4f8584015160608785015260608401906120be565b9201519060408184039101526118dc565b9901950193929101610cb0565b905092610be1565b610c2890610c386060840151610c32610db3610c1560408801516001600160e01b0394601b90868360e01d9316820b91878260e01d9216900b613dd1565b60408a0151610dc28183613401565b15610e005750915b829c8d916060890151908116155f14610df1575060408801515b96879460408d01516134cc565b610dfb9085613428565b610de4565b905091610dca565b50610e1660608201516133de565b610b4a565b60405163936bb5ad60e01b8152600490fd5b506001600160a01b03610e496060830151604085015190611fd7565b5151166001600160a01b036020860151161415610a00565b634e487b7160e01b5f52603260045260245ffd5b50919390610e87606460043501611feb565b1561102257835b6004356004013590610ea08282613401565b6110045750508490610ec0856001600160a01b0360208701511633612ff4565b505060a46004350190610ed8826004356004016120f1565b905015159081610ffc575b50610f5b575b506001600160a01b03610eff92935116336127bd565b50505b8351811015610f275780610f21610f1b60019387611fd7565b51613869565b01610f02565b5060409160017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005582519182526020820152f35b90506001600160a01b03602084015116610f856001600160a01b03855116926004356004016120f1565b929091333b1561015f57610fcd5f93604051958694859463691f9ed760e01b8652600486015260248501528960448501528a606485015260a0608485015260a4840191611d36565b038183335af190811561016b57859115610ee9579050610fed9150611984565b5f836001600160a01b03610ee9565b905088610ee3565b604492506040519163573b6f4160e01b835260048301526024820152fd5b84610e8e565b506110366040830151612773565b61091e565b60405163315f9e2360e21b8152600490fd5b604051639c95219f60e01b8152600490fd5b3461015f5760208060031936011261015f576024816001600160a01b03611084611850565b16604051928380926370a0823160e01b82523060048301525afa90811561016b575f916110b5575b50604051908152f35b90508181813d83116110db575b6110cc81836119d0565b8101031261015f5751826110ac565b503d6110c2565b3461015f576110f036611890565b92916110fd9491946126cc565b61110883833361273f565b61111181612773565b15611235578160ff91611129856111ec969533612d27565b6111338183613401565b1561122f575080935b61114885828533612f96565b917f8045c25080b0868951141ed0a91720bcad09a8364a2b3109ee1fd49c1f0bc8b860c0611177898833612ff4565b97906001600160a01b0360405192338452169a8b6020840152856040840152886060840152608083015260a0820152a16040519660068852602088015260408701526060860152608085015260a08401521660c082015260e08101604052906040519160018352602083015260408201604052565b90806112185760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b611227926101ce913691611ddb565b8080806101d4565b9361113c565b50604051623a3a4d60e21b81523360048201526001600160a01b039190911660248201526044810191909152606490fd5b3461015f57608036600319011261015f576004356001600160a01b039081811680910361015f57611295611866565b6044359167ffffffffffffffff9160643583811161015f573660238201121561015f57806004013593841161015f57366024858301011161015f576113229560209216936112e4868587612eb7565b60405196879283926323e30c8b60e01b84523360048501528760248501528860448501525f606485015260a06084850152602460a485019201611d36565b03815f855af193841561016b575f9461138e575b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd984036113755761136a93503091612f30565b602060405160018152f35b604051630b6c58a960e31b815260048101859052602490fd5b9093506020813d6020116113ba575b816113aa602093836119d0565b8101031261015f57519284611336565b3d915061139d565b3461015f57606036600319011261015f5760206113f16113e0611850565b6113e8611866565b60443591612d27565b604051908152f35b3461015f5761140736611890565b928094926114136126cc565b61141e82853361273f565b61142781612773565b15611513578061143b61148a9286336127bd565b9790957f7f9dfa19cf1cc2f806f2f860fbc9c056b601fb1afc0e9b843dfe5c63616268e660806040513381526001600160a01b038416998a60208301528560408301526060820152a133612863565b939091856114b85760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b611507966101ce956106659460ff93604051956005875260208701526040860152606085015260808401521660a082015260c08101604052906040519160018352602083015260408201604052565b808080808080806101d4565b506040516306dde9c360e41b81523360048201526001600160a01b03841660248201526044810191909152606490fd5b3461015f57602036600319011261015f576004355f525f6020526020600160405f205414604051908152f35b3461015f5760031960403682011261015f5767ffffffffffffffff9060043582811161015f57806004019160a08236039182011261015f5760243584811161015f576115bf90369060040161181f565b90936115c96126cc565b5f946001600160a01b0394856115de84611d22565b1633036117aa576115f76115f23685611b61565b61270e565b805f525f60205260405f2096600188541461163e575b60208960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556040519015158152f35b9091929394959697505f6001985560405196338852826020890152606060408901528161166a8761187c565b1660608901526024840135906062190181121561015f5783019060a06080890152806116986004840161187c565b166101008901526116ab6024830161187c565b1661012088015260448101356022198236030181121561015f57019060246004830135920198821161015f57813603891361015f577f09d18501db0080ca2d6cd7c17fa7255daff4b2d503ea93b76ff68b6752ea8e6387806106659560846117736101ce9a60209f6117329061179d9f9a606061014061064e9d0152610160880191611d36565b6117646117596117456044880185611d56565b605f198a8603810160a08c01529491611d8b565b926064870190611d56565b918784030160c0880152611d8b565b91013560e08301520390a13390919060405192600284526020840152604083015260608201604052565b828080808080808061160d565b6024866117b685611d22565b6040516335252be360e01b815291166004820152fd5b3461015f57602036600319011261015f576004359063ffffffff60e01b821680920361015f5760209163e414309160e01b811490811561180e575b5015158152f35b6301ffc9a760e01b14905083611807565b9181601f8401121561015f5782359167ffffffffffffffff831161015f576020808501948460051b01011161015f57565b600435906001600160a01b038216820361015f57565b602435906001600160a01b038216820361015f57565b35906001600160a01b038216820361015f57565b90608060031983011261015f576004356001600160a01b038116810361015f579160243591604435916064359067ffffffffffffffff821161015f576118d89160040161181f565b9091565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b60a0810190811067ffffffffffffffff82111761191c57604052565b634e487b7160e01b5f52604160045260245ffd5b6060810190811067ffffffffffffffff82111761191c57604052565b6040810190811067ffffffffffffffff82111761191c57604052565b6080810190811067ffffffffffffffff82111761191c57604052565b67ffffffffffffffff811161191c57604052565b60e0810190811067ffffffffffffffff82111761191c57604052565b6020810190811067ffffffffffffffff82111761191c57604052565b90601f8019910116810190811067ffffffffffffffff82111761191c57604052565b92919267ffffffffffffffff821161191c5760405191611a1c601f8201601f1916602001846119d0565b82948184528183011161015f578281602093845f960137010152565b9080601f8301121561015f57816020611a53933591016119f2565b90565b919060608382031261015f5760405190611a6f82611930565b8193611a7a8161187c565b8352611a886020820161187c565b602084015260408101359167ffffffffffffffff831161015f57604092611aaf9201611a38565b910152565b67ffffffffffffffff811161191c5760051b60200190565b929192611ad882611ab4565b604092611ae860405192836119d0565b819581835260208093019160061b84019381851161015f57915b848310611b1157505050505050565b858383031261015f578386918251611b288161194c565b611b318661187c565b81528286013583820152815201920191611b02565b9080601f8301121561015f57816020611a5393359101611acc565b91909160a08184031261015f5760405190611b7b82611900565b8193611b868261187c565b835267ffffffffffffffff91602081013583811161015f5782611baa918301611a56565b6020850152604081013583811161015f5782611bc7918301611b46565b6040850152606081013592831161015f57611be86080939284938301611b46565b60608501520135910152565b909291611c0084611ab4565b916040611c1060405194856119d0565b839580855260208095019160059160051b84019480861161015f5784935b868510611c3f575050505050505050565b67ffffffffffffffff90853582811161015f5787019060608285031261015f578451611c6a81611930565b611c738361187c565b81528a83013584811161015f57830185601f8201121561015f57803590611c9982611ab4565b91611ca6895193846119d0565b8083528d808401918b1b8301019188831161015f578e809101915b838310611cf757509150508201528583013593841161015f57611ce8858c95869501611a38565b86820152815201940193611c2e565b82358152918101918f9101611cc1565b9080601f8301121561015f57816020611a5393359101611bf4565b356001600160a01b038116810361015f5790565b908060209392818452848401375f828201840152601f01601f1916010190565b9035601e198236030181121561015f57016020813591019167ffffffffffffffff821161015f578160061b3603831361015f57565b9190808252602080920192915f905b828210611da8575050505090565b909192936001906001600160a01b03611dc08761187c565b16815285830135838201526040908101950193920190611d9a565b90929192611de881611ab4565b91604091611df960405194856119d0565b839581855260208095019160051b83019381851161015f5783925b858410611e245750505050505050565b67ffffffffffffffff90843582811161015f57860190838286031261015f578351611e4e8161194c565b823584811161015f5786611e63918501611a56565b81528983013593841161015f57611e7e868b95869501611d07565b83820152815201930192611e14565b903590601e198136030182121561015f570180359067ffffffffffffffff821161015f57602001918160051b3603831361015f57565b60405190611ed082611930565b60606040835f81525f60208201520152565b60405190611eef82611900565b5f608083828152611efe611ec3565b6020820152606060408201526060808201520152565b9015610e6157803590607e198136030182121561015f570190565b903590609e198136030182121561015f570190565b903590601e198136030182121561015f570180359067ffffffffffffffff821161015f57602001918160061b3603831361015f57565b9190811015610e615760061b0190565b805115610e615760200190565b805160011015610e615760400190565b805160021015610e615760600190565b805160031015610e615760800190565b805160041015610e615760a00190565b8051821015610e615760209160051b010190565b35801515810361015f5790565b9081518082526020808093019301915f5b828110612017575050505090565b835180516001600160a01b031686528201518583015260409094019392810192600101612009565b906080806120b56120a361209160406001600160a01b0380895116885260208901519060a060208a01528082511660a08a015260208201511660c08901520151606060e08801526101008701906118dc565b60408701518682036040880152611ff8565b60608601518582036060870152611ff8565b93015191015290565b9081518082526020808093019301915f5b8281106120dd575050505090565b8351855293810193928101926001016120cf565b903590601e198136030182121561015f570180359067ffffffffffffffff821161015f5760200191813603831361015f57565b903590605e198136030182121561015f570190565b6121506115f26121498380611f2f565b3690611b61565b5f525f602052600160405f2054036121ec5780612170816121dc93611f2f565b6121d461218f6121946020850135938460408701359384923690611b61565b61305d565b6121ac6121a18580611f2f565b946060810190611e8d565b92906121cc604051966121be886119b4565b5f88525f3681373690611b61565b933691611bf4565b923392613092565b6040810151606090910151600192565b505f905f905f90565b5f5b82811061220357505050565b6060828201526020016121f7565b92916001600160a01b038451166001600160a01b03835116146126ba576001600160a01b03612247606086015160643590611fd7565b515116906040830151916001600160a01b036122666084358095611fd7565b5151161480159061267a575b610e1b576040850151906001600160a01b036122916044358094611fd7565b5151166001600160a01b036122ac60643560608a0151611fd7565b51511614612668576122bd8661270e565b805f525f60205260405f20541561261557506122d88461270e565b805f525f60205260405f2054156125c157506123bb9291612395917f6fa7f4c28634b0a9d6831401c45ae468195fb63aed07308935c35374ff5d9e396040518061234061233261012033845280602085015283018d61203f565b82810360408401528a61203f565b85606083015260643560808301528760a083015260a43560c083015260c43560e083015260e4356101008301520390a16001600160a01b0386511660405192612388846119b4565b5f8452606435908a613092565b936001600160a01b03865116604051926123ae846119b4565b5f845260a4359086613092565b916123c96040820151612773565b1580156125ad575b801561259a575b8015612587575b61257557604051916123f083611968565b5f83525f60208401525f60408401525f606084015261240f848361473c565b84526040840152612435612423838661473c565b602086015280606086015284516134cc565b9461244960208501516040860151906134cc565b93612453876133de565b8015612566575b6125545761251b61254d957fd9fa84dd790c969daa5c33d8050dc06b4a9b59d5b42e2be5f5e8ae20447f618d946124fd6125529a60a09661249c8a8851613520565b6124aa8c6020890151613520565b6124b88a604089015161357e565b6124c68c606089015161357e565b6124cf8a613869565b6124d88c613869565b6001600160a01b036124f460c435926060606435910151611fd7565b51511633612863565b50506001600160a01b036124f460e43592606060a435910151611fd7565b5050606060405191338352805160208401526020810151604084015260408101518284015201516080820152a1613690565b613690565b565b604051630d86822160e01b8152600490fd5b50612570856133de565b61245a565b6040516321badf1f60e01b8152600490fd5b5061259560608401516133de565b6123df565b506125a860608201516133de565b6123d8565b506125bb6040840151612773565b156123d1565b9351604080513381526001600160a01b039092166020830152810194909452507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f3945091925082915050606081015b0390a1565b9551604080513381526001600160a01b039092166020830152810196909652507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f394935083925050606082019050612610565b604051631cd2f1c760e21b8152600490fd5b506001600160a01b03612694606085015160a43590611fd7565b5151166001600160a01b036126b0604088015160443590611fd7565b5151161415612272565b604051630a98f1f360e21b8152600490fd5b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0060028154146126fc5760029055565b604051633ee5aeb560e01b8152600490fd5b6040516127398161272b602082019460208652604083019061203f565b03601f1981018352826119d0565b51902090565b90911561274a575050565b6040516305dbdfd960e41b81526001600160a01b03918216600482015291166024820152604490fd5b612792905f60e01d906001600160e01b038160e01d9116601b0b61479f565b1290565b90612792916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614820565b9291926127c982613a64565b936127d3816133de565b6128515784816001600160e01b036127f29360e01d9116601b0b61489f565b9290809315612828575b5082908161280c575b5050509190565b612820926001600160a01b03309216612f30565b5f8181612805565b9092505f19811461283d57600101915f6127fc565b634e487b7160e01b5f52601160045260245ffd5b604051632eaefac360e21b8152600490fd5b93929193612870836133de565b61290e578461288c57612884939450612ff4565b50505f905f90565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f5281526128c9835f205494856134f6565b956128d3876133de565b6128f6575f97885260018252838820908852815282872091875252909320829055565b835163c5e12af560e01b815260048101889052602490fd5b60405163793a8f5560e01b815260048101849052602490fd5b919060408382031261015f57825167ffffffffffffffff9081811161015f5784019082601f8301121561015f57815160209261296282611ab4565b9161297060405193846119d0565b808352848084019160051b8301019186831161015f5785809101915b8383106129ff5750505050948281015191821161015f57019180601f8401121561015f5782516129bb81611ab4565b936129c960405195866119d0565b818552838086019260051b82010192831161015f578301905b8282106129f0575050505090565b815181529083019083016129e2565b825181529181019186910161298c565b90808251908181526020809101926020808460051b8301019501935f915b848310612a3d5750505050505090565b9091929394958480612a5b600193601f198682030187528a516120be565b9801930193019194939290612a2d565b91906020928381526001600160a01b0382511684820152838201516040820152612aa5604083015160e060608401526101008301906118dc565b9060608301516080820152612acc608084015192601f1993848483030160a0850152612a0f565b9260a081015193838382030160c08401528680865192838152019501905f5b818110612b0f57505050611a5394955060c060e091015192828503019101526120be565b825187529588019591880191600101612aeb565b90604082019082526020606081936040838201528551809452019301915f5b828110612b50575050505090565b835185529381019392810192600101612b42565b919091335f526020308152604091825f2091835195612b828761194c565b612b8a611ec3565b875260608281980152845190612b9f826119b4565b5f8252855190612bae826119b4565b5f82525f3681375f5b8151811015612d1b57898688612bcd8486611fd7565b51888151948d80870151908151612bef575b5050505050505050600101612bb7565b905f92916001600160a01b0396612c148887818d51169c015116998789015190613b43565b95825199612c218b611998565b8a5289015287015285015260808401528760a08401528660c08401525f8c51809563d04dfe2360e01b82528180612c5c600498898301612a6b565b03915afa938415612d11579089915f95612ceb575b508451612c87575b50899250808e8c938e612bdf565b5101511691823b1561015f57612cb5925f92838d5180968195829463012c676d60e21b845233908401612b23565b03925af18015612ce1579060019291612cd2575b81928782612c79565b612cdb90611984565b5f612cc9565b89513d5f823e3d90fd5b612d089195503d805f833e612d0081836119d0565b810190612927565b9050935f612c71565b8c513d5f823e3d90fd5b50505050505050509050565b8215612d5c576001600160a01b038091165f52600160205260405f2091165f5260205260405f20905f5260205260405f205490565b909150612d6882613d75565b6001600160a01b03809316906040918251946370a0823160e01b86528416938460048701526020928387602481865afa968715612e7e575f97612e88575b5083612dbf612db883612def9a614a54565b50906141df565b508651636eb1769f60e11b81526001600160a01b0390941660048501523060248501529297889081906044820190565b0381865afa968715612e7e575f97612e4d575b50612db8612e1391611a5398614a54565b50612e1e8183613401565b15612e455750935b5f5260018252825f20905f528152815f20905f8052525f2054906134f6565b905093612e26565b96508387813d8311612e77575b612e6481836119d0565b8101031261015f57955195612db8612e02565b503d612e5a565b85513d5f823e3d90fd5b96508387813d8311612eb0575b612e9f81836119d0565b8101031261015f5795519583612da6565b503d612e95565b6040519263a9059cbb60e01b5f526001600160a01b0380931660045260245260205f60448180855af160015f5114811615612f11575b8360405215612efb57505050565b635274afe760e01b835216600482015260249150fd5b6001811516612f2757813b15153d151616612eed565b833d5f823e3d90fd5b9092604051936323b872dd60e01b5f526001600160a01b0393848092166004521660245260445260205f60648180855af160015f5114811615612f80575b836040525f60605215612efb57505050565b6001811516612f2757813b15153d151616612f6e565b93929193612fa3836133de565b61290e5784612fb7576128849394506127bd565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f5281526128c9835f205494856134cc565b9092919261300181613a64565b9361300b816133de565b61304b5784816001600160e01b0361302a9360e01d9116601b0b61489f565b50809281613039575050509190565b6001600160a01b036128209316612eb7565b604051632d1671a360e11b8152600490fd5b9161308890606061307d936001600160a01b039485916040880151611fd7565b515116940151611fd7565b5151161461266857565b94919392909260408051916130a683611998565b6130ae611ee2565b83526020925f848201525f838201526060945f868301528560c06080938260808201525f60a082015201528351916130e583611900565b600483525f5b8181106133cf5750506132d8959493925f9261320f61325f938d61310e8161270e565b9c896001600160a01b039e8f94859182865116908d5194600386528501528c840152168c820152608081018a5261314486611f8a565b5261314e85611f8a565b50885161315a81611930565b6002815289368c83013761316d86611f97565b5261317785611f97565b5060ff8a6131da8b8501936131c48761319d81613195858a51611fd7565b515116613d75565b975116886131ac848951611fd7565b515116856131bb858a51611fd7565b51015191612d27565b966131d0828751611fd7565b5151169451611fd7565b51015192169093929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b61321882611fa7565b5261322281611fa7565b506132468a8d8d60ff8a6131da8d8501936131c48761319d81613195858a51611fd7565b61324f82611fb7565b5261325981611fb7565b50613b43565b95878a511697848b0191825191868184511693015116928a85523087528580862091510151865191613290836119b4565b86835287519561329f87611998565b86528886015286850152848885015289608085015260a084015260c08301528351808098819463d04dfe2360e01b835260048301612a6b565b03915afa9687156133c5575f945f986133a3575b5084516002811061338c5750818386015195015161331261330c88611fc7565b51611fb7565b5161331d8183613401565b156133845750925b6133478685919060405192600284526020840152604083015260608201604052565b61335088611fa7565b5261335a87611fa7565b508251996133678b611998565b8a52890152870152850152608084015260a083015260c082015290565b905092613325565b602490835190630fbb8e5560e21b82526004820152fd5b9097506133bb9194503d805f833e612d0081836119d0565b939093965f6132ec565b50513d5f823e3d90fd5b808888809387010152016130eb565b6133fd905f60e01d906001600160e01b038160e01d9116601b0b61479f565b1390565b906133fd916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614820565b61344f6001600160e01b0392838316601b0b9260e01d938160e01d9116601b0b8484613f96565b90637ffffff5821361349f575b90613466916141df565b9290921580613497575b61347957505090565b6044925060405191638eba4d0760e01b835260048301526024820152fd5b508215613470565b6134a98282614e7f565b1561345c57604483856040519163d556b11160e01b835260048301526024820152fd5b611a5391610c15916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6143e5565b611a5391610c15916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6145a9565b61357a91608081018261353c6135368351611fc7565b51611fc7565b5261357361356d6001600160a01b0380945151169361356461355e8551611fc7565b51611f8a565b51169251611fc7565b51611fa7565b5191612f96565b5050565b906080810191806135926135368551611fb7565b526001600160a01b038092515116916135ae61355e8551611fb7565b51166135bd61356d8551611fb7565b519081613658576135cd836133de565b61290e579183917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a9593612610955f5260209060018252613623604094855f20835f528452855f20855f528452855f20546134f6565b945f5260018252835f20905f528152825f20915f52525f20555b51604051918291338352604060208401526040830190612a0f565b91613689917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a959361261095612863565b505061363d565b60c0810151908151915f92613804575b506137456020918281510151926001600160a01b039081818187511696015116928660a082019485518252308452604097888320898686510151015160808601518b51916136ed836119b4565b8683528c51936136fc856119b4565b8785528d519661370b88611998565b8752898701528c86015260016060860152608085015260a084015260c08301528851808099819463d04dfe2360e01b835260048301612a6b565b03915afa9485156137fa5787956137dc575b508451613768575b50505050505050565b81905101510151169051813b156137d85791849184938361379d965180978195829463012c676d60e21b845260048401612b23565b03925af19081156137cf57506137b8575b808080808061375f565b6137c28291611984565b6137cc57806137ae565b80fd5b513d84823e3d90fd5b8480fd5b6137f19195503d8089833e612d0081836119d0565b9050935f613757565b86513d89823e3d90fd5b6001600160a01b03602080845101510151169060a083015190823b1561015f57613847925f928360405180968195829463012c676d60e21b845260048401612b23565b03925af1801561016b57156136a057613861919250611984565b5f905f6136a0565b6080810161387a61356d8251611fb7565b5191821561388757505050565b6138a161355e6001600160a01b0380935151169351611fb7565b5116815f5260209160018352604092835f20835f528152835f20855f528152835f2054936001600160e01b0385166138dc575b505050505050565b613900955f9284845260018152828420868552815282842091845252812055612ff4565b5f8080806138d4565b8115613913570490565b634e487b7160e01b5f52601260045260245ffd5b604081511061396f576020810151908051603f19810190811161283d5760051c821161395b5760016020920160051b010190565b5050604051613969816119b4565b5f815290565b50604051613969816119b4565b80511561398c57602001515f1a90565b505f90565b905f8091602081519101845af48080613a0f575b156139c55750506040513d81523d5f602083013e60203d82010160405290565b156139ec57604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b3d156139fd576040513d5f823e3d90fd5b60405163d6bda27560e01b8152600490fd5b503d1515806139a55750813b15156139a5565b60041115613a2c57565b634e487b7160e01b5f52602160045260245ffd5b602090939291936001600160a01b036040820195168152613a6083613a22565b0152565b613a6c614f6d565b6040805163b7bad1b160e01b81526001600160a01b0383166004820152909182826024815f73200e12d10bb0c5e4a17e7018f0f1161919bb93895af1928315613b3a575f925f94613b05575b50613ac283613a22565b600183141580613af3575b613ad75750505090565b5163ee07877f60e01b8152918291610725919060048401613a40565b50613afd83613a22565b821515613acd565b90809450613b299293503d8511613b33575b613b2181836119d0565b810190614875565b919091925f613ab8565b503d613b17565b513d5f823e3d90fd5b90805191613b5083611ab4565b91613b6b604094613b63865195866119d0565b808552611ab4565b601f199460209186013686840137835183519095908015613d6a576001613bc19101965b6001978891010197613bb8613ba38a611ab4565b99613bb086519b8c6119d0565b808b52611ab4565b018489016121f5565b85805f9684516002815233878201523086820152606081018652613be48b611f8a565b52613bee8a611f8a565b505f925b613d26575b5050508351613c0a575b50505050505090565b85809598979692980181613c1e8289611fd7565b52613c298188611fd7565b505f925b613c3c575b5085969750613c01565b8451831015613d21576001600160a01b03613cb381613c5b8689611fd7565b51511686613c69878a611fd7565b51015187815160051b9101207f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f52601c52603c5f208c613caa888b611fd7565b510151916149cb565b15613d0957868098999a928192613cca878a611fd7565b515116613cd78787611fd7565b52019385613ce58289611fd7565b510151613cf2868c611fd7565b52613cfd858b611fd7565b50019290989796613c2d565b8951630a57f30960e31b815260048101859052602490fd5b613c32565b9091968151881015613d61578280910197613d418184611fd7565b51613d4c8a8d611fd7565b52613d57898c611fd7565b5001919081613bf2565b96829150613bf7565b50613bc15f96613b8f565b613d7d614f6d565b60408051630782d7e160e01b81526001600160a01b03831660048201529091828260248173200e12d10bb0c5e4a17e7018f0f1161919bb93895afa928315613b3a575f925f94613b055750613ac283613a22565b9091939284158215175f14613deb5750505090505f905f90565b82810192600160fd1b8082019083011760fe1c613f22575b5050613e0e81614b44565b93613e1881614b44565b94613e238682614b64565b90918215613f13575f9083986f0785ee10d5da46d900f436a000000000808611613f05575b50670de0b6b3a7640000808b11613ef6575b50633b9aca00808b11613ee7575b50612710808b11613ed9575b5098805b613ec8575081906118d8989982600a0a9109960195817fcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccd0a93838211900382610100031b9203901c170291614b77565b60019290920191600a900480613e78565b60049a04998a930192613e74565b600991939a049901915f613e68565b601291939a049901915f613e5a565b85049950602592505f613e48565b509290506118d8949550614b77565b5f821215613f7657808413613f68575b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb2841315613e03579092506118d8939491614a82565b9092506118d8939491614ae9565b80841215613f32579092506118d8939491614a82565b61346682826141df565b92909180613fbc576044848460405191637a97930f60e01b835260048301526024820152fd5b90919280155f14613fd157505050505f905f90565b613fea93613fde91614c31565b92919490938492614c31565b9093919284613ff888614b44565b9161400286614b44565b947f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000094604c918688106141a9575b030191600160ff1b98838a018112155f14614176575050035b5f955f82128061416d575b61414f575b5f81128061413d575b61411f5786820103966001600160ff1b0388149081614115575b508061410c575b80614103575b6140e55750906140999291614ddd565b915f81136140ac575b506118d893614b77565b9091604c82136140da576140c391600a0a90613909565b9081156140d0575f6140a2565b505050505f905f90565b50505050505f905f90565b876044916040519163d556b11160e01b835260048301526024820152fd5b505f8512614089565b50828414614083565b905088145f61407c565b604489836040519163d556b11160e01b835260048301526024820152fd5b50806001600160ff1b03018213614062565b95508087018613156141675786818703015b95614059565b5f614161565b505f8113614054565b89985090920390506001600160ff1b038190038701821361419a5701860194614049565b5050505050505050505f905f90565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009650604b9250614030565b8115613913570590565b8082601b82810b83146143d4577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000008405614380575b8380820b0361436f57507b199999999999999999999999999999999999999999999999999999987b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc84011115614320575b838060030b036142a4575b8084136142885750506001600160e01b036001925b60e01b91161791565b8303600a0a8015613913576001600160e01b039107159261427f565b92915f8413156142f45750906142ba8383614e7f565b6142d657637ffffffe1901600a0a810290637fffffff9261426a565b506044916040519163d556b11160e01b835260048301526024820152fd5b637fffffff1992830390604382136140da5761431391600a0a906141d5565b9182156140d0579261426a565b5f198401808060030b14614334575061425f565b90506001600160e01b039293507b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff915060e01b9260ff1d181617905f90565b600190940193600a90930592614212565b937f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000008405156143c1576305f5e100600894058094819201955b915050614212565b620186a0600594058094819201956143b9565b508261425f57505050505f90600190565b919291600160ff1b84016143fd576118d89350614e98565b906118d8935f03916145a9565b919291600160ff1b919080158061459757509061442691614c31565b9490929091905f86858585828213801561458e575b614571575b505050508682841860ff1c94860391039081604c0381116145565701600a0a80820591908461453c575b505081019182821860ff1c111561453457826001600160ff1b031461451657905f600192135f146144e757600a9004915b01925b811581176144ab57509190565b806144c4575b5080156144bc579190565b505f91508190565b91926144da9203600160ff1b01600a0a906141d5565b600160ff1b91905f6144b1565b600a60037fe666666666666666666666666666666666666666666666666666666666666667920104019161449b565b604490836040519163d556b11160e01b835260048301526024820152fd5b50909261449e565b8107614549575b8061446a565b60ff1d600117015f614543565b505050919350614564579190565b60018160ff1d1790039190565b5f9a50909750909550600160ff1b94509250905086808080614440565b50835f1261443b565b156145a25750509190565b9350919050565b93929193841581158181176146fa575050906145c491614c31565b91949082956145d582958294614c31565b80969294919693878684821380156146f1575b6146d8575b5050505050508682841860ff1c94860391039081604c0381116145565701600a0a8082059190846146be575b505081019182821860ff1c11156146b657826001600160ff1b031461451657905f600192135f1461468757600a9004915b01925b8115811761465a57509190565b8061466a575080156144bc579190565b600160ff1b936146819291038401600a0a906141d5565b5f6144b1565b600a60037fe666666666666666666666666666666666666666666666666666666666666667920104019161464a565b50909261464d565b81076146cb575b80614619565b60ff1d600117015f6146c5565b929b5098509196509450925090505f80808080806145ed565b508584126145e8565b93959390929190156147105750506144bc579190565b945092915050565b600881511061398c576008015167ffffffffffffffff1667ff0a89c674ee78741490565b9160408301926040614776610c15606087519401938451906001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b613dd1565b94519301614785815186612796565b61478d575050565b909350611a5391925051925183613428565b92915f9060018184145f87128715171717614819575f9280821361480b575b03604c81135f8212176147ff57600a0a90846147dd83820293846141d5565b146147f2575050156147ee575f9190565b5f90565b9093509015611a53579190565b5050156147ee575f9190565b5f95600194509250906147be565b5050505f90565b93929190918083145f83125f8712188315871517171761486f575f928082136148625703604c81135f8212176147ff57600a0a90846147dd83820293846141d5565b91946001935091906147be565b50919050565b919082604091031261015f578151600481101561015f5760209092015160ff8116810361015f5790565b91925f8312156148c7576044838360405191634a7d166b60e01b835260048301526024820152fd5b9192836148d957505090505f90600190565b60ff81168201918083126149a1575f831215614911575050604c1981126144bc575f03600a0a9161490a8382613909565b9283021490565b909293915f81135f1461499757604d811361496c57600a0a92831561391357835f190483116149435750500290600190565b60405163c849483b60e01b815260048101849052602481019290925260ff166044820152606490fd5b5060405163c849483b60e01b81526004810192909252602482015260ff919091166044820152606490fd5b5050905090600190565b60405163c849483b60e01b815260048101869052602481019190915260ff82166044820152606490fd5b9091813b614a06576149dd9192614fd6565b506149e781613a22565b1591826149f357505090565b6001600160a01b03918216911614919050565b6020918160645f935160405192630b135d3f60e11b9788855260048501526040602485015286820190604485015e8281018201859052601f01601f191601915afa905f5114601f3d11161690565b9060ff165f03916001600160ff1b0382115f14614a7a57600a6001818404940192061590565b909190600190565b909392915f614a92918184613dd1565b9490945f8483019182019412159081614adf575b8115614ad5575b50614ab757505090565b604492506040519163d556b11160e01b835260048301526024820152fd5b905083125f614aad565b8281129150614aa6565b614afe93600160fe1b90810193920190613dd1565b9081815f821215614b35575050604b19821261288457614b23915f03600a0a906141d5565b9081614b2d575f90565b600160ff1b90565b93600160ff1b90910192509050565b5f811215611a5357600160ff1b90808203614b5d575090565b90505f0390565b905f198183099102908180821091030391565b92939291905f8184181215614c0c576001600160ff1b039283831115614bf657600160ff1b93838503614bac57505050509190565b90919293508514614bc6575050600a600191045f03920190565b604051630ed8062160e21b8152600481019190915260248101919091526044810182905260648101849052608490fd5b5090915050600160ff1b811461283d575f039190565b90916001600160ff1b0380841115612805578514614bc6575050600a60019104920190565b9190918015614dd357827f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000080830515614ce1575b507f19999999999999999999999999999999999999999999999999999999999999997f0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc830110614cd2575b8313614cbc5791905f90565b919060018060ff1b926001600160ff1b03030190565b9290600a02905f190192614cb0565b6f4b3b4ca85a86c47a098a22400000000080840515614dc1575b507728c87cb5c89a2571ebfdcb54864ada834a00000000000000830515614daa575b7b097edd871cfda3a5697758bf0e3cbb5ac5741c640000000000000000830515614d96575b7e3899162693736ac531a5a58f1fbb4b746504382ca7e4000000000000000000830515614d8657820515614d77575b5f614c65565b9290600a02905f190192614d71565b9391606402916001190193614d42565b93916402540be40002916009190193614d42565b9391678ac7230489e8000002916012190193614d1d565b6025198301955092909202915f614cfb565b505f915081908190565b90915f198383099280830292838086109503948086039584871015614e5b5714614e53579082910960018219018216809204600280826003021880830282030280830282030280830282030280830282030280830282030280920290030293600183805f03040190848311900302920304170290565b505091500490565b60648386866040519263362ced0960e11b8452600484015260248301526044820152fd5b611a5391905f811215614e93575f03615010565b615010565b909291600160ff1b91828101614f2a5750808414614f2057808413918215614f18578185035b604c811115614f075750505f915b15614ef857507f8000000000000000000000000000000000000000000000000000000000000001019190565b92506001600160ff1b03039190565b600a0a908115613913570491614ecc565b848203614ebe565b505090505f905f90565b93614f3792945f0361440a565b80939180928114614f4b575b50505f039190565b915092506001600160ff1b03831461451657600a600191059201915f80614f43565b73200e12d10bb0c5e4a17e7018f0f1161919bb9389803b158015614fab575b614f935750565b602490604051906373e6d7b360e01b82526004820152fd5b507f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d41813f1415614f8c565b815191906041830361500657614fff9250602082015190606060408401519301515f1a9061509f565b9192909190565b50505f9160029190565b90637ffffff581131561509957637ffffffe1981019060438213615092575f82121561506657637fffffff91505f0301600a0a7b8000000000000000000000000000000000000000000000000000000202111590565b50600a0a8015613913577b80000000000000000000000000000000000000000000000000000001041090565b5050151590565b50505f90565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411615116579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa1561016b575f516001600160a01b0381161561510c57905f905f90565b505f906001905f90565b5050505f91600391905600000000000000000000000000000000000000000000000000000000000000000000000000000000000000200e12d10bb0c5e4a17e7018f0f1161919bb93890000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000044b608060405234801561000f575f80fd5b506004361061004a575f3560e01c80630782d7e11461004e57806354636d2b14610078578063b7bad1b11461009d578063f5c36eaf146100b0575b5f80fd5b61006161005c366004610363565b6100c3565b60405161006f929190610403565b60405180910390f35b61008b610086366004610363565b6100d8565b60405160ff909116815260200161006f565b6100616100ab366004610363565b6100e9565b61008b6100be366004610363565b6100f5565b5f806100cf5f84610100565b91509150915091565b5f6100e35f836101f0565b92915050565b5f806100cf5f84610281565b5f6100e35f83610356565b73ffffffffffffffffffffffffffffffffffffffff81165f9081526020838152604080832081518083019092525460ff8082161515835261010090910416818301527f313ce56700000000000000000000000000000000000000000000000000000000808452839283908190816004818a5afa915060203d1015610182575f91505b811561019857505f5160ff811115610198575f91505b816101af57505050602001516003925090506101e9565b83516101c3575f955093506101e992505050565b836020015160ff1681146101d85760026101db565b60015b846020015195509550505050505b9250929050565b5f805f6101fd8585610281565b909250905060018260038111156102165761021661039d565b1415801561023557505f8260038111156102325761023261039d565b14155b156102795783826040517fee07877f000000000000000000000000000000000000000000000000000000008152600401610270929190610421565b60405180910390fd5b949350505050565b5f805f8061028f8686610100565b90925090505f8260038111156102a7576102a761039d565b0361034b576040805180820182526001815260ff838116602080840191825273ffffffffffffffffffffffffffffffffffffffff8a165f908152908b9052939093209151825493517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009094169015157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff161761010093909116929092029190911790555b909590945092505050565b5f805f6101fd8585610100565b5f60208284031215610373575f80fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114610396575f80fd5b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b600481106103ff577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b9052565b6040810161041182856103ca565b60ff831660208301529392505050565b73ffffffffffffffffffffffffffffffffffffffff831681526040810161039660208301846103ca56000000000000000000000000000000000000000000"; diff --git a/src/generated/candidate/GenericPoolRaindexV6FlashBorrower.sol b/src/generated/candidate/GenericPoolRaindexV6FlashBorrower.sol index f04bc0b718..07aed185db 100644 --- a/src/generated/candidate/GenericPoolRaindexV6FlashBorrower.sol +++ b/src/generated/candidate/GenericPoolRaindexV6FlashBorrower.sol @@ -5,23 +5,23 @@ pragma solidity ^0.8.25; // THIS FILE IS AUTOGENERATED BY THE BUILD SCRIPT. DO NOT EDIT BY HAND. /// @dev Hash of the known bytecode. -bytes32 constant BYTECODE_HASH = bytes32(0xe534396413dc76a97b4c4604685a4a9261c3c821366f4a65918db330087af462); +bytes32 constant BYTECODE_HASH = bytes32(0xdae411801ed7fcc79a01d91033d08a34e9e831e384b828a4d395fa93f9f20df4); /// @dev The deterministic deploy address of the contract when deployed via /// the Zoltu factory. -address constant DEPLOYED_ADDRESS = address(0x7E14964fbaABBc2a5324a6B966BE55d31f9b9CC0); +address constant DEPLOYED_ADDRESS = address(0xD9A05552B9caD4Ac7018Bc602423719A784ddF73); /// @dev The creation bytecode of the contract. bytes constant CREATION_CODE = - hex"6080604052348015600e575f80fd5b5060017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055612cdb806100405f395ff3fe608060405260043610610034575f3560e01c806301ffc9a71461003d57806323e30c8b146100715780638c18e4ba1461009e57005b3661003b57005b005b348015610048575f80fd5b5061005c610057366004611908565b6100b1565b60405190151581526020015b60405180910390f35b34801561007c575f80fd5b5061009061008b366004611991565b6100e7565b604051908152602001610068565b61003b6100ac366004611a08565b610204565b5f6001600160e01b031982166323e30c8b60e01b14806100e157506301ffc9a760e01b6001600160e01b03198316145b92915050565b5f33732f04ff4cf5a3a19c619fe2c892bdbd72a76bf1321461012257604051625e1e6f60e51b81523360048201526024015b60405180910390fd5b6001600160a01b0387163014610156576040516322c7df1960e21b81526001600160a01b0388166004820152602401610119565b5f806101648486018661200c565b915091506101728282610534565b6040516334e3942b60e11b815233906369c7285690610195908590600401612225565b60408051808303815f875af11580156101b0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101d491906123a3565b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd99a9950505050505050505050565b61020c6105a8565b61021b610218826123c5565b50565b610228608085018561242e565b90505f0361024957604051639c95219f60e01b815260040160405180910390fd5b6102596080850160608601612474565b61027657604051636d3a9fe560e01b815260040160405180910390fd5b5f84848460405160200161028c939291906126cd565b60408051601f1981840301815291905290505f6102ac608087018761242e565b5f8181106102bc576102bc6128df565b90506020028101906102ce91906128f3565b6102d89080612911565b6102e6906060810190612925565b6102f3608089018961242e565b5f818110610303576103036128df565b905060200281019061031591906128f3565b60400135818110610328576103286128df565b61033e926020604090920201908101915061296b565b90505f61034e608088018861242e565b5f81811061035e5761035e6128df565b905060200281019061037091906128f3565b61037a9080612911565b610388906040810190612925565b61039560808a018a61242e565b5f8181106103a5576103a56128df565b90506020028101906103b791906128f3565b602001358181106103ca576103ca6128df565b6103e0926020604090920201908101915061296b565b90505f6103ec826105d6565b90505f6103f8846105d6565b90505f6104068a358361065a565b905061041d6001600160a01b0385168c5f19610681565b6104326001600160a01b0386168c5f19610681565b604051632e7ff4ef60e11b81526001600160a01b038c1690635cffe9de90610464903090899086908c90600401612986565b6020604051808303815f875af1158015610480573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104a491906129b7565b6104c1576040516349088f5960e11b815260040160405180910390fd5b6104d56001600160a01b0386168c5f610681565b6104e96001600160a01b0385168c5f610681565b6104fe6104f5886123c5565b858588866106fb565b50505050505061052d60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5050505050565b5f82608001515f8151811061054b5761054b6128df565b60200260200101515f01516060015183608001515f81518110610570576105706128df565b6020026020010151604001518151811061058c5761058c6128df565b60200260200101515f015190506105a3818361099a565b505050565b6105b0610a44565b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f6105df610a88565b6040516354636d2b60e01b81526001600160a01b038316600482015273200e12d10bb0c5e4a17e7018f0f1161919bb9389906354636d2b906024016020604051808303815f875af1158015610636573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100e191906129d2565b5f6001600160e01b038316601b0b60e084901d610678828286610b13565b95945050505050565b61068d8383835f610b57565b6105a35761069e83835f6001610b57565b6106c657604051635274afe760e01b81526001600160a01b0384166004820152602401610119565b6106d38383836001610b57565b6105a357604051635274afe760e01b81526001600160a01b0384166004820152602401610119565b6040805160018082528183019092525f91816020015b6060815260200190600190039081610711575050604080516003808252608082019092529192505f919060208201606080368337019050506040516370a0823160e01b81523060048201529091505f906001600160a01b038816906370a0823190602401602060405180830381865afa158015610790573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107b491906129f2565b905080156107d0576107d06001600160a01b0388163383610bb9565b5f6107db8288610bc6565b50905080835f815181106107f1576107f16128df565b602090810291909101015250506040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015610842573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061086691906129f2565b90508015610882576108826001600160a01b0386163383610bb9565b5f61088d8286610bc6565b50905080836001815181106108a4576108a46128df565b60209081029190910101525047905080156108c3576108c33382610c07565b5f6108cf826012610bc6565b50905080836002815181106108e6576108e66128df565b602002602001018181525050505080825f81518110610907576109076128df565b60209081029190910101526040805160018082528183019092525f91816020015b6040805160a0810182525f918101828152606080830193909352608082018390528152602081019190915281526020019060019003908161092857905050905087815f8151811061097b5761097b6128df565b60200260200101819052506109908382610c7e565b5050505050505050565b5f805f838060200190518101906109b19190612a09565b919450925090506001600160a01b0383166109df576040516398521dc560e01b815260040160405180910390fd5b6001600160a01b038216610a065760405163456ac4c360e11b815260040160405180910390fd5b610a1b6001600160a01b038616845f19610681565b610a2f6001600160a01b0383168247610e42565b5061052d6001600160a01b038616845f610681565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054600203610a8657604051633ee5aeb560e01b815260040160405180910390fd5b565b73200e12d10bb0c5e4a17e7018f0f1161919bb93893b1580610adf575073200e12d10bb0c5e4a17e7018f0f1161919bb93893f7f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d4114155b15610a86576040516373e6d7b360e01b815273200e12d10bb0c5e4a17e7018f0f1161919bb93896004820152602401610119565b5f805f610b21868686610ef0565b9150915080610b4c5760405162bc8ecf60e31b81526004810187905260248101869052604401610119565b5090505b9392505050565b60405163095ea7b360e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610bad578383151615610ba1573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b6106d38383836001611062565b5f805f805f610bd587876110ac565b9250925092505f80610be78585611108565b9150915081838015610bf65750815b9650965050505050505b9250929050565b80471015610c315760405163cf47918160e01b815247600482015260248101829052604401610119565b610c4a828260405180602001604052805f815250611351565b15610c53575050565b3d15610c6557610c61611366565b5050565b60405163d6bda27560e01b815260040160405180910390fd5b335f8181523060209081526040808320815160a0810183528083018581526060808301879052608083018190529082528185015282518581529384018581528484019093529093909291905b865181101561099057868181518110610ce557610ce56128df565b602002602001015193505f845f015160400151511115610e3a575f845f01515f01516001600160a01b031663d04dfe236040518060e00160405280885f0151602001516001600160a01b03168152602001898152602001885f01516040015181526020015f8152602001610d5d8d8a60200151611371565b8152602001878152602001868152506040518263ffffffff1660e01b8152600401610d889190612aef565b5f60405180830381865afa158015610da2573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610dc99190810190612be7565b9150505f81511115610e385784516020015160405163012c676d60e21b81526001600160a01b03909116906304b19db490610e0a908a908590600401612c93565b5f604051808303815f87803b158015610e21575f80fd5b505af1158015610e33573d5f803e3d5ffd5b505050505b505b600101610cca565b606081471015610e6e5760405163cf47918160e01b815247600482015260248101839052604401610119565b5f610e7a858486611351565b9050808015610e9b57505f3d1180610e9b57505f856001600160a01b03163b115b15610eb057610ea8611653565b915050610b50565b8015610eda57604051639996b31560e01b81526001600160a01b0386166004820152602401610119565b3d15610c6557610ee8611366565b509392505050565b5f805f851215610f1d57604051634a7d166b60e01b81526004810186905260248101859052604401610119565b845f03610f2f57505f9050600161105a565b8460ff8416850185811215610f6a5760405163c849483b60e01b8152600481018890526024810187905260ff86166044820152606401610119565b5f805f831215610fb657604c19831215610f8d575f80955095505050505061105a565b825f03600a0a9150818481610fa457610fa4612cb3565b049550508402909114915061105a9050565b5f83131561104f57604d831315610ff35760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610119565b82600a0a9150815f198161100957611009612cb3565b0484111561103d5760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610119565b509190910292506001915061105a9050565b509193506001925050505b935093915050565b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610bad578383151615610ba1573d5f823e3d81fd5b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8611156110f757600a860460018201600a88065f1493509350935050611101565b8593509150600190505b9250925092565b5f808383601b82900b82148061123e577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e1000000000000000000870515611189577f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000087051561117a576305f5e10087059650600886019550611189565b620186a0870596506005860195505b8687601b0b146111a457600a87059650856001019550611189565b7b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc7b1999999999999999999999999999999999999999999999999999999888820111611238575f600188039050808160030b036112365760e01b6001600160e01b037b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff60ff8b901d18161795505f9450610c009350505050565b505b50611255565b865f0361125557505f935060019250610c00915050565b858660030b1461130c575f8213156112b457611271838361166c565b156112995760405163d556b11160e01b81526004810184905260248101839052604401610119565b637ffffffe19909501600a0a82029550637fffffff9461130c565b637fffffff1986900360438113156112d657505f9450849350610c0092505050565b80600a0a88816112e8576112e8612cb3565b059750875f0361130257505f9450849350610c0092505050565b50637fffffff1995505b81861361131c5760019350611335565b818603600a0a838161133057611330612cb3565b071593505b5050506001600160e01b03841660e084901b1791509250929050565b5f805f83516020850186885af1949350505050565b6040513d5f823e3d81fd5b60605f825167ffffffffffffffff81111561138e5761138e611aaf565b6040519080825280602002602001820160405280156113b7578160200160208202803683370190505b5090505f808451116113c9575f6113cf565b83516001015b85516001010190505f8167ffffffffffffffff8111156113f1576113f1611aaf565b60405190808252806020026020018201604052801561142457816020015b606081526020019060019003908161140f5790505b5090505f611448604080516002815233602082015230818301526060810190915290565b82828151811061145a5761145a6128df565b60200260200101819052505f5b87518110156114b757818060010192505087818151811061148a5761148a6128df565b60200260200101518383815181106114a4576114a46128df565b6020908102919091010152600101611467565b50855115611649578080600101915050838282815181106114da576114da6128df565b60200260200101819052505f5b865181101561164757611596878281518110611505576115056128df565b60200260200101515f01516115736115418a8581518110611528576115286128df565b6020026020010151602001518051602090810291012090565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f908152601c91909152603c902090565b898481518110611585576115856128df565b602002602001015160400151611687565b6115b657604051630a57f30960e31b815260048101829052602401610119565b8681815181106115c8576115c86128df565b60200260200101515f01516001600160a01b03165f1b8582815181106115f0576115f06128df565b6020026020010181815250508180600101925050868181518110611616576116166128df565b602002602001015160200151838381518110611634576116346128df565b60209081029190910101526001016114e7565b505b5095945050505050565b6040513d81523d5f602083013e3d602001810160405290565b5f610b505f841261167d5783611681565b835f035b836116f7565b5f836001600160a01b03163b5f036116e5575f806116a58585611795565b5090925090505f8160038111156116be576116be612cc7565b1480156116dc5750856001600160a01b0316826001600160a01b0316145b92505050610b50565b6116f08484846117db565b9050610b50565b5f637ffffff5821361170a57505f6100e1565b637ffffffe19820160438113156117255750508115156100e1565b5f81126117655780600a0a7b800000000000000000000000000000000000000000000000000000018161175a5761175a612cb3565b0484119150506100e1565b805f03600a0a7b800000000000000000000000000000000000000000000000000000020284101591505092915050565b5f805f83516041036117cc576020840151604085015160608601515f1a6117be88828585611840565b955095509550505050611101565b505081515f9150600290611101565b805160408051630b135d3f60e11b8082526004820186905260248201929092525f92906020820185604483015e5f82606483010152601f820160051c60051b915060205f60648401838a5afa9050825f5114601f3d1116811693505050509392505050565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084111561187957505f915060039050826118fe565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa1580156118ca573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b0381166118f557505f9250600191508290506118fe565b92505f91508190505b9450945094915050565b5f60208284031215611918575f80fd5b81356001600160e01b031981168114610b50575f80fd5b6001600160a01b0381168114610218575f80fd5b803561194e8161192f565b919050565b5f8083601f840112611963575f80fd5b50813567ffffffffffffffff81111561197a575f80fd5b602083019150836020828501011115610c00575f80fd5b5f805f805f8060a087890312156119a6575f80fd5b86356119b18161192f565b955060208701356119c18161192f565b94506040870135935060608701359250608087013567ffffffffffffffff8111156119ea575f80fd5b6119f689828a01611953565b979a9699509497509295939492505050565b5f805f805f60808688031215611a1c575f80fd5b8535611a278161192f565b9450602086013567ffffffffffffffff80821115611a43575f80fd5b9087019060c0828a031215611a56575f80fd5b90945060408701359080821115611a6b575f80fd5b611a7789838a01611953565b90955093506060880135915080821115611a8f575f80fd5b50860160408189031215611aa1575f80fd5b809150509295509295909350565b634e487b7160e01b5f52604160045260245ffd5b6040516060810167ffffffffffffffff81118282101715611ae657611ae6611aaf565b60405290565b6040805190810167ffffffffffffffff81118282101715611ae657611ae6611aaf565b6040516080810167ffffffffffffffff81118282101715611ae657611ae6611aaf565b60405160a0810167ffffffffffffffff81118282101715611ae657611ae6611aaf565b60405160c0810167ffffffffffffffff81118282101715611ae657611ae6611aaf565b604051601f8201601f1916810167ffffffffffffffff81118282101715611ba157611ba1611aaf565b604052919050565b8015158114610218575f80fd5b803561194e81611ba9565b5f67ffffffffffffffff821115611bda57611bda611aaf565b5060051b60200190565b5f67ffffffffffffffff821115611bfd57611bfd611aaf565b50601f01601f191660200190565b5f82601f830112611c1a575f80fd5b8135611c2d611c2882611be4565b611b78565b818152846020838601011115611c41575f80fd5b816020850160208301375f918101602001919091529392505050565b5f60608284031215611c6d575f80fd5b611c75611ac3565b90508135611c828161192f565b81526020820135611c928161192f565b6020820152604082013567ffffffffffffffff811115611cb0575f80fd5b611cbc84828501611c0b565b60408301525092915050565b5f82601f830112611cd7575f80fd5b81356020611ce7611c2883611bc1565b82815260069290921b84018101918181019086841115611d05575f80fd5b8286015b84811015611d4b5760408189031215611d20575f80fd5b611d28611aec565b8135611d338161192f565b81528185013585820152835291830191604001611d09565b509695505050505050565b5f82601f830112611d65575f80fd5b81356020611d75611c2883611bc1565b82815260059290921b84018101918181019086841115611d93575f80fd5b8286015b84811015611d4b57803567ffffffffffffffff80821115611db6575f80fd5b908801906060828b03601f19011215611dcd575f80fd5b611dd5611ac3565b86830135611de28161192f565b815260408381013583811115611df6575f80fd5b8401603f81018d13611e06575f80fd5b88810135611e16611c2882611bc1565b81815260059190911b82018301908a8101908f831115611e34575f80fd5b928401925b82841015611e525783358252928b0192908b0190611e39565b858c0152505050606084013583811115611e6a575f80fd5b611e788d8a83880101611c0b565b918301919091525085525050918301918301611d97565b5f82601f830112611e9e575f80fd5b81356020611eae611c2883611bc1565b82815260059290921b84018101918181019086841115611ecc575f80fd5b8286015b84811015611d4b57803567ffffffffffffffff80821115611eef575f80fd5b90880190601f196080838c0382011215611f07575f80fd5b611f0f611b0f565b8784013583811115611f1f575f80fd5b840160a0818e0384011215611f32575f80fd5b611f3a611b32565b9250611f47898201611943565b8352604081013584811115611f5a575f80fd5b611f688e8b83850101611c5d565b8a8501525060608082013585811115611f7f575f80fd5b611f8d8f8c83860101611cc8565b604086015250608082013585811115611fa4575f80fd5b611fb28f8c83860101611cc8565b828601525060a0820135608085015283835260408601358a8401528086013560408401526080860135935084841115611fe9575f80fd5b611ff78e8b86890101611d56565b90830152508652505050918301918301611ed0565b5f806040838503121561201d575f80fd5b823567ffffffffffffffff80821115612034575f80fd5b9084019060c08287031215612047575f80fd5b61204f611b55565b82358152602083013560208201526040830135604082015261207360608401611bb6565b6060820152608083013582811115612089575f80fd5b61209588828601611e8f565b60808301525060a0830135828111156120ac575f80fd5b6120b888828601611c0b565b60a083015250935060208501359150808211156120d3575f80fd5b506120e085828601611c0b565b9150509250929050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f815180845260208085019450602084015f5b8381101561215b57815180516001600160a01b03168852830151838801526040909601959082019060010161212b565b509495945050505050565b5f815180845260208085019450602084015f5b8381101561215b57815187529582019590820190600101612179565b5f82825180855260208086019550808260051b8401018186015f5b8481101561221857601f19868403018952815160606001600160a01b0382511685528582015181878701526121e782870182612166565b9150506040808301519250858203818701525061220481836120ea565b9a86019a94505050908301906001016121b0565b5090979650505050505050565b5f602080835260e08301845182850152818501516040818187015280870151915060608281880152808801519250608083151560808901526080890151935060a060c060a08a01528585518088526101009750878b019150878160051b8c010189880197505f5b82811015612374578c820360ff190184528851805187845280516001600160a01b03908116898601528d82015188860189905280518216610120870152808f01519091166101408601528a015161016085018a90526122ef6101808601826120ea565b90508a820151607f19808784030160c088015261230c8383612118565b92508b8401519150808784030160e0880152506123298282612118565b915050888201518d8601528d8301518e8601528a8301518b8601528983015192508481038a86015261235b8184612195565b9b8e019b968e019694505050600191909101905061228c565b5060a08d01518c8203601f190160c08e01529950612392818b6120ea565b9d9c50505050505050505050505050565b5f80604083850312156123b4575f80fd5b505080516020909101519092909150565b5f604082360312156123d5575f80fd5b6123dd611aec565b823567ffffffffffffffff808211156123f4575f80fd5b61240036838701611c5d565b83526020850135915080821115612415575f80fd5b5061242236828601611d56565b60208301525092915050565b5f808335601e19843603018112612443575f80fd5b83018035915067ffffffffffffffff82111561245d575f80fd5b6020019150600581901b3603821315610c00575f80fd5b5f60208284031215612484575f80fd5b8135610b5081611ba9565b5f808335601e198436030181126124a4575f80fd5b830160208101925035905067ffffffffffffffff8111156124c3575f80fd5b8060051b3603821315610c00575f80fd5b5f8235605e198336030181126124e8575f80fd5b90910192915050565b5f808335601e19843603018112612506575f80fd5b830160208101925035905067ffffffffffffffff811115612525575f80fd5b803603821315610c00575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f808335601e19843603018112612570575f80fd5b830160208101925035905067ffffffffffffffff81111561258f575f80fd5b8060061b3603821315610c00575f80fd5b8183525f60208085019450825f5b8581101561215b5781356125c18161192f565b6001600160a01b031687528183013583880152604096870196909101906001016125ae565b8183526020808401935f91600585811b8301820185855b888110156126bf57858303601f19018a5261261882896124d4565b606081356126258161192f565b6001600160a01b0316855261263c8288018361248f565b82898801528083880152608092507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811115612676575f80fd5b871b808288850137860190506040612690848201856124f1565b94508388840301828901526126a88484018683612533565b9e8a019e97505050938701935050506001016125fd565b509098975050505050505050565b5f604080835261010080840187358386015260206060818a013581880152848a01356080880152808a013561270181611ba9565b151560a088015261271560808b018b61248f565b60c0898101529384905261012093848901600582901b8a018601835f5b8481101561288f578c830361011f19018452813536879003607e19018112612758575f80fd5b8601803536829003609e1901811261276e575f80fd5b608085528101803561277f8161192f565b6001600160a01b03808216608088015261279b8c8401846124d4565b915060a08088015281356127ae8161192f565b8116878e0152818c01356127c18161192f565b166101408701526127d4818f01826124f1565b91508a6101608801526127ec61018088018383612533565b9150506127fb8e83018361255b565b607f19808985030160c08a01526128138483856125a0565b93506128218d86018661255b565b93509150808985030160e08a01525061283b8383836125a0565b9250505060808201358d8701528a8301358b8701528d8301358e8701526128648a84018461248f565b935091508581038a87015261287a8184846125e6565b968b0196955050509188019150600101612732565b505061289e60a08f018f6124f1565b8c8303603f190160e08e0152995097506128b9818a8a612533565b98505050505050858403818701525050506128d5818587612533565b9695505050505050565b634e487b7160e01b5f52603260045260245ffd5b5f8235607e19833603018112612907575f80fd5b9190910192915050565b5f8235609e19833603018112612907575f80fd5b5f808335601e1984360301811261293a575f80fd5b83018035915067ffffffffffffffff821115612954575f80fd5b6020019150600681901b3603821315610c00575f80fd5b5f6020828403121561297b575f80fd5b8135610b508161192f565b5f6001600160a01b038087168352808616602084015250836040830152608060608301526128d560808301846120ea565b5f602082840312156129c7575f80fd5b8151610b5081611ba9565b5f602082840312156129e2575f80fd5b815160ff81168114610b50575f80fd5b5f60208284031215612a02575f80fd5b5051919050565b5f805f60608486031215612a1b575f80fd5b8351612a268161192f565b6020850151909350612a378161192f565b604085015190925067ffffffffffffffff811115612a53575f80fd5b8401601f81018613612a63575f80fd5b8051612a71611c2882611be4565b818152876020838501011115612a85575f80fd5b8160208401602083015e5f602083830101528093505050509250925092565b5f8282518085526020808601955060208260051b840101602086015f5b8481101561221857601f19868403018952612add838351612166565b98840198925090830190600101612ac1565b602081526001600160a01b038251166020820152602082015160408201525f604083015160e06060840152612b286101008401826120ea565b9050606084015160808401526080840151601f19808584030160a0860152612b508383612aa4565b925060a08601519150808584030160c0860152612b6d8383612166565b925060c08601519150808584030160e0860152506106788282612166565b5f82601f830112612b9a575f80fd5b81516020612baa611c2883611bc1565b8083825260208201915060208460051b870101935086841115612bcb575f80fd5b602086015b84811015611d4b5780518352918301918301612bd0565b5f8060408385031215612bf8575f80fd5b825167ffffffffffffffff80821115612c0f575f80fd5b818501915085601f830112612c22575f80fd5b81516020612c32611c2883611bc1565b82815260059290921b84018101918181019089841115612c50575f80fd5b948201945b83861015612c6e57855182529482019490820190612c55565b91880151919650909350505080821115612c86575f80fd5b506120e085828601612b8b565b828152604060208201525f612cab6040830184612166565b949350505050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52602160045260245ffd"; + hex"6080604052348015600e575f80fd5b5060017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055612cdb806100405f395ff3fe608060405260043610610034575f3560e01c806301ffc9a71461003d57806323e30c8b146100715780638c18e4ba1461009e57005b3661003b57005b005b348015610048575f80fd5b5061005c610057366004611908565b6100b1565b60405190151581526020015b60405180910390f35b34801561007c575f80fd5b5061009061008b366004611991565b6100e7565b604051908152602001610068565b61003b6100ac366004611a08565b610204565b5f6001600160e01b031982166323e30c8b60e01b14806100e157506301ffc9a760e01b6001600160e01b03198316145b92915050565b5f33737900fd69e0785195f6e4622e3138146c4cc4abd21461012257604051625e1e6f60e51b81523360048201526024015b60405180910390fd5b6001600160a01b0387163014610156576040516322c7df1960e21b81526001600160a01b0388166004820152602401610119565b5f806101648486018661200c565b915091506101728282610534565b6040516334e3942b60e11b815233906369c7285690610195908590600401612225565b60408051808303815f875af11580156101b0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101d491906123a3565b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd99a9950505050505050505050565b61020c6105a8565b61021b610218826123c5565b50565b610228608085018561242e565b90505f0361024957604051639c95219f60e01b815260040160405180910390fd5b6102596080850160608601612474565b61027657604051636d3a9fe560e01b815260040160405180910390fd5b5f84848460405160200161028c939291906126cd565b60408051601f1981840301815291905290505f6102ac608087018761242e565b5f8181106102bc576102bc6128df565b90506020028101906102ce91906128f3565b6102d89080612911565b6102e6906060810190612925565b6102f3608089018961242e565b5f818110610303576103036128df565b905060200281019061031591906128f3565b60400135818110610328576103286128df565b61033e926020604090920201908101915061296b565b90505f61034e608088018861242e565b5f81811061035e5761035e6128df565b905060200281019061037091906128f3565b61037a9080612911565b610388906040810190612925565b61039560808a018a61242e565b5f8181106103a5576103a56128df565b90506020028101906103b791906128f3565b602001358181106103ca576103ca6128df565b6103e0926020604090920201908101915061296b565b90505f6103ec826105d6565b90505f6103f8846105d6565b90505f6104068a358361065a565b905061041d6001600160a01b0385168c5f19610681565b6104326001600160a01b0386168c5f19610681565b604051632e7ff4ef60e11b81526001600160a01b038c1690635cffe9de90610464903090899086908c90600401612986565b6020604051808303815f875af1158015610480573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104a491906129b7565b6104c1576040516349088f5960e11b815260040160405180910390fd5b6104d56001600160a01b0386168c5f610681565b6104e96001600160a01b0385168c5f610681565b6104fe6104f5886123c5565b858588866106fb565b50505050505061052d60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5050505050565b5f82608001515f8151811061054b5761054b6128df565b60200260200101515f01516060015183608001515f81518110610570576105706128df565b6020026020010151604001518151811061058c5761058c6128df565b60200260200101515f015190506105a3818361099a565b505050565b6105b0610a44565b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f6105df610a88565b6040516354636d2b60e01b81526001600160a01b038316600482015273200e12d10bb0c5e4a17e7018f0f1161919bb9389906354636d2b906024016020604051808303815f875af1158015610636573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100e191906129d2565b5f6001600160e01b038316601b0b60e084901d610678828286610b13565b95945050505050565b61068d8383835f610b57565b6105a35761069e83835f6001610b57565b6106c657604051635274afe760e01b81526001600160a01b0384166004820152602401610119565b6106d38383836001610b57565b6105a357604051635274afe760e01b81526001600160a01b0384166004820152602401610119565b6040805160018082528183019092525f91816020015b6060815260200190600190039081610711575050604080516003808252608082019092529192505f919060208201606080368337019050506040516370a0823160e01b81523060048201529091505f906001600160a01b038816906370a0823190602401602060405180830381865afa158015610790573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107b491906129f2565b905080156107d0576107d06001600160a01b0388163383610bb9565b5f6107db8288610bc6565b50905080835f815181106107f1576107f16128df565b602090810291909101015250506040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015610842573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061086691906129f2565b90508015610882576108826001600160a01b0386163383610bb9565b5f61088d8286610bc6565b50905080836001815181106108a4576108a46128df565b60209081029190910101525047905080156108c3576108c33382610c07565b5f6108cf826012610bc6565b50905080836002815181106108e6576108e66128df565b602002602001018181525050505080825f81518110610907576109076128df565b60209081029190910101526040805160018082528183019092525f91816020015b6040805160a0810182525f918101828152606080830193909352608082018390528152602081019190915281526020019060019003908161092857905050905087815f8151811061097b5761097b6128df565b60200260200101819052506109908382610c7e565b5050505050505050565b5f805f838060200190518101906109b19190612a09565b919450925090506001600160a01b0383166109df576040516398521dc560e01b815260040160405180910390fd5b6001600160a01b038216610a065760405163456ac4c360e11b815260040160405180910390fd5b610a1b6001600160a01b038616845f19610681565b610a2f6001600160a01b0383168247610e42565b5061052d6001600160a01b038616845f610681565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054600203610a8657604051633ee5aeb560e01b815260040160405180910390fd5b565b73200e12d10bb0c5e4a17e7018f0f1161919bb93893b1580610adf575073200e12d10bb0c5e4a17e7018f0f1161919bb93893f7f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d4114155b15610a86576040516373e6d7b360e01b815273200e12d10bb0c5e4a17e7018f0f1161919bb93896004820152602401610119565b5f805f610b21868686610ef0565b9150915080610b4c5760405162bc8ecf60e31b81526004810187905260248101869052604401610119565b5090505b9392505050565b60405163095ea7b360e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610bad578383151615610ba1573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b6106d38383836001611062565b5f805f805f610bd587876110ac565b9250925092505f80610be78585611108565b9150915081838015610bf65750815b9650965050505050505b9250929050565b80471015610c315760405163cf47918160e01b815247600482015260248101829052604401610119565b610c4a828260405180602001604052805f815250611351565b15610c53575050565b3d15610c6557610c61611366565b5050565b60405163d6bda27560e01b815260040160405180910390fd5b335f8181523060209081526040808320815160a0810183528083018581526060808301879052608083018190529082528185015282518581529384018581528484019093529093909291905b865181101561099057868181518110610ce557610ce56128df565b602002602001015193505f845f015160400151511115610e3a575f845f01515f01516001600160a01b031663d04dfe236040518060e00160405280885f0151602001516001600160a01b03168152602001898152602001885f01516040015181526020015f8152602001610d5d8d8a60200151611371565b8152602001878152602001868152506040518263ffffffff1660e01b8152600401610d889190612aef565b5f60405180830381865afa158015610da2573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610dc99190810190612be7565b9150505f81511115610e385784516020015160405163012c676d60e21b81526001600160a01b03909116906304b19db490610e0a908a908590600401612c93565b5f604051808303815f87803b158015610e21575f80fd5b505af1158015610e33573d5f803e3d5ffd5b505050505b505b600101610cca565b606081471015610e6e5760405163cf47918160e01b815247600482015260248101839052604401610119565b5f610e7a858486611351565b9050808015610e9b57505f3d1180610e9b57505f856001600160a01b03163b115b15610eb057610ea8611653565b915050610b50565b8015610eda57604051639996b31560e01b81526001600160a01b0386166004820152602401610119565b3d15610c6557610ee8611366565b509392505050565b5f805f851215610f1d57604051634a7d166b60e01b81526004810186905260248101859052604401610119565b845f03610f2f57505f9050600161105a565b8460ff8416850185811215610f6a5760405163c849483b60e01b8152600481018890526024810187905260ff86166044820152606401610119565b5f805f831215610fb657604c19831215610f8d575f80955095505050505061105a565b825f03600a0a9150818481610fa457610fa4612cb3565b049550508402909114915061105a9050565b5f83131561104f57604d831315610ff35760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610119565b82600a0a9150815f198161100957611009612cb3565b0484111561103d5760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610119565b509190910292506001915061105a9050565b509193506001925050505b935093915050565b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610bad578383151615610ba1573d5f823e3d81fd5b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8611156110f757600a860460018201600a88065f1493509350935050611101565b8593509150600190505b9250925092565b5f808383601b82900b82148061123e577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e1000000000000000000870515611189577f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000087051561117a576305f5e10087059650600886019550611189565b620186a0870596506005860195505b8687601b0b146111a457600a87059650856001019550611189565b7b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc7b1999999999999999999999999999999999999999999999999999999888820111611238575f600188039050808160030b036112365760e01b6001600160e01b037b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff60ff8b901d18161795505f9450610c009350505050565b505b50611255565b865f0361125557505f935060019250610c00915050565b858660030b1461130c575f8213156112b457611271838361166c565b156112995760405163d556b11160e01b81526004810184905260248101839052604401610119565b637ffffffe19909501600a0a82029550637fffffff9461130c565b637fffffff1986900360438113156112d657505f9450849350610c0092505050565b80600a0a88816112e8576112e8612cb3565b059750875f0361130257505f9450849350610c0092505050565b50637fffffff1995505b81861361131c5760019350611335565b818603600a0a838161133057611330612cb3565b071593505b5050506001600160e01b03841660e084901b1791509250929050565b5f805f83516020850186885af1949350505050565b6040513d5f823e3d81fd5b60605f825167ffffffffffffffff81111561138e5761138e611aaf565b6040519080825280602002602001820160405280156113b7578160200160208202803683370190505b5090505f808451116113c9575f6113cf565b83516001015b85516001010190505f8167ffffffffffffffff8111156113f1576113f1611aaf565b60405190808252806020026020018201604052801561142457816020015b606081526020019060019003908161140f5790505b5090505f611448604080516002815233602082015230818301526060810190915290565b82828151811061145a5761145a6128df565b60200260200101819052505f5b87518110156114b757818060010192505087818151811061148a5761148a6128df565b60200260200101518383815181106114a4576114a46128df565b6020908102919091010152600101611467565b50855115611649578080600101915050838282815181106114da576114da6128df565b60200260200101819052505f5b865181101561164757611596878281518110611505576115056128df565b60200260200101515f01516115736115418a8581518110611528576115286128df565b6020026020010151602001518051602090810291012090565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f908152601c91909152603c902090565b898481518110611585576115856128df565b602002602001015160400151611687565b6115b657604051630a57f30960e31b815260048101829052602401610119565b8681815181106115c8576115c86128df565b60200260200101515f01516001600160a01b03165f1b8582815181106115f0576115f06128df565b6020026020010181815250508180600101925050868181518110611616576116166128df565b602002602001015160200151838381518110611634576116346128df565b60209081029190910101526001016114e7565b505b5095945050505050565b6040513d81523d5f602083013e3d602001810160405290565b5f610b505f841261167d5783611681565b835f035b836116f7565b5f836001600160a01b03163b5f036116e5575f806116a58585611795565b5090925090505f8160038111156116be576116be612cc7565b1480156116dc5750856001600160a01b0316826001600160a01b0316145b92505050610b50565b6116f08484846117db565b9050610b50565b5f637ffffff5821361170a57505f6100e1565b637ffffffe19820160438113156117255750508115156100e1565b5f81126117655780600a0a7b800000000000000000000000000000000000000000000000000000018161175a5761175a612cb3565b0484119150506100e1565b805f03600a0a7b800000000000000000000000000000000000000000000000000000020284101591505092915050565b5f805f83516041036117cc576020840151604085015160608601515f1a6117be88828585611840565b955095509550505050611101565b505081515f9150600290611101565b805160408051630b135d3f60e11b8082526004820186905260248201929092525f92906020820185604483015e5f82606483010152601f820160051c60051b915060205f60648401838a5afa9050825f5114601f3d1116811693505050509392505050565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084111561187957505f915060039050826118fe565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa1580156118ca573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b0381166118f557505f9250600191508290506118fe565b92505f91508190505b9450945094915050565b5f60208284031215611918575f80fd5b81356001600160e01b031981168114610b50575f80fd5b6001600160a01b0381168114610218575f80fd5b803561194e8161192f565b919050565b5f8083601f840112611963575f80fd5b50813567ffffffffffffffff81111561197a575f80fd5b602083019150836020828501011115610c00575f80fd5b5f805f805f8060a087890312156119a6575f80fd5b86356119b18161192f565b955060208701356119c18161192f565b94506040870135935060608701359250608087013567ffffffffffffffff8111156119ea575f80fd5b6119f689828a01611953565b979a9699509497509295939492505050565b5f805f805f60808688031215611a1c575f80fd5b8535611a278161192f565b9450602086013567ffffffffffffffff80821115611a43575f80fd5b9087019060c0828a031215611a56575f80fd5b90945060408701359080821115611a6b575f80fd5b611a7789838a01611953565b90955093506060880135915080821115611a8f575f80fd5b50860160408189031215611aa1575f80fd5b809150509295509295909350565b634e487b7160e01b5f52604160045260245ffd5b6040516060810167ffffffffffffffff81118282101715611ae657611ae6611aaf565b60405290565b6040805190810167ffffffffffffffff81118282101715611ae657611ae6611aaf565b6040516080810167ffffffffffffffff81118282101715611ae657611ae6611aaf565b60405160a0810167ffffffffffffffff81118282101715611ae657611ae6611aaf565b60405160c0810167ffffffffffffffff81118282101715611ae657611ae6611aaf565b604051601f8201601f1916810167ffffffffffffffff81118282101715611ba157611ba1611aaf565b604052919050565b8015158114610218575f80fd5b803561194e81611ba9565b5f67ffffffffffffffff821115611bda57611bda611aaf565b5060051b60200190565b5f67ffffffffffffffff821115611bfd57611bfd611aaf565b50601f01601f191660200190565b5f82601f830112611c1a575f80fd5b8135611c2d611c2882611be4565b611b78565b818152846020838601011115611c41575f80fd5b816020850160208301375f918101602001919091529392505050565b5f60608284031215611c6d575f80fd5b611c75611ac3565b90508135611c828161192f565b81526020820135611c928161192f565b6020820152604082013567ffffffffffffffff811115611cb0575f80fd5b611cbc84828501611c0b565b60408301525092915050565b5f82601f830112611cd7575f80fd5b81356020611ce7611c2883611bc1565b82815260069290921b84018101918181019086841115611d05575f80fd5b8286015b84811015611d4b5760408189031215611d20575f80fd5b611d28611aec565b8135611d338161192f565b81528185013585820152835291830191604001611d09565b509695505050505050565b5f82601f830112611d65575f80fd5b81356020611d75611c2883611bc1565b82815260059290921b84018101918181019086841115611d93575f80fd5b8286015b84811015611d4b57803567ffffffffffffffff80821115611db6575f80fd5b908801906060828b03601f19011215611dcd575f80fd5b611dd5611ac3565b86830135611de28161192f565b815260408381013583811115611df6575f80fd5b8401603f81018d13611e06575f80fd5b88810135611e16611c2882611bc1565b81815260059190911b82018301908a8101908f831115611e34575f80fd5b928401925b82841015611e525783358252928b0192908b0190611e39565b858c0152505050606084013583811115611e6a575f80fd5b611e788d8a83880101611c0b565b918301919091525085525050918301918301611d97565b5f82601f830112611e9e575f80fd5b81356020611eae611c2883611bc1565b82815260059290921b84018101918181019086841115611ecc575f80fd5b8286015b84811015611d4b57803567ffffffffffffffff80821115611eef575f80fd5b90880190601f196080838c0382011215611f07575f80fd5b611f0f611b0f565b8784013583811115611f1f575f80fd5b840160a0818e0384011215611f32575f80fd5b611f3a611b32565b9250611f47898201611943565b8352604081013584811115611f5a575f80fd5b611f688e8b83850101611c5d565b8a8501525060608082013585811115611f7f575f80fd5b611f8d8f8c83860101611cc8565b604086015250608082013585811115611fa4575f80fd5b611fb28f8c83860101611cc8565b828601525060a0820135608085015283835260408601358a8401528086013560408401526080860135935084841115611fe9575f80fd5b611ff78e8b86890101611d56565b90830152508652505050918301918301611ed0565b5f806040838503121561201d575f80fd5b823567ffffffffffffffff80821115612034575f80fd5b9084019060c08287031215612047575f80fd5b61204f611b55565b82358152602083013560208201526040830135604082015261207360608401611bb6565b6060820152608083013582811115612089575f80fd5b61209588828601611e8f565b60808301525060a0830135828111156120ac575f80fd5b6120b888828601611c0b565b60a083015250935060208501359150808211156120d3575f80fd5b506120e085828601611c0b565b9150509250929050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f815180845260208085019450602084015f5b8381101561215b57815180516001600160a01b03168852830151838801526040909601959082019060010161212b565b509495945050505050565b5f815180845260208085019450602084015f5b8381101561215b57815187529582019590820190600101612179565b5f82825180855260208086019550808260051b8401018186015f5b8481101561221857601f19868403018952815160606001600160a01b0382511685528582015181878701526121e782870182612166565b9150506040808301519250858203818701525061220481836120ea565b9a86019a94505050908301906001016121b0565b5090979650505050505050565b5f602080835260e08301845182850152818501516040818187015280870151915060608281880152808801519250608083151560808901526080890151935060a060c060a08a01528585518088526101009750878b019150878160051b8c010189880197505f5b82811015612374578c820360ff190184528851805187845280516001600160a01b03908116898601528d82015188860189905280518216610120870152808f01519091166101408601528a015161016085018a90526122ef6101808601826120ea565b90508a820151607f19808784030160c088015261230c8383612118565b92508b8401519150808784030160e0880152506123298282612118565b915050888201518d8601528d8301518e8601528a8301518b8601528983015192508481038a86015261235b8184612195565b9b8e019b968e019694505050600191909101905061228c565b5060a08d01518c8203601f190160c08e01529950612392818b6120ea565b9d9c50505050505050505050505050565b5f80604083850312156123b4575f80fd5b505080516020909101519092909150565b5f604082360312156123d5575f80fd5b6123dd611aec565b823567ffffffffffffffff808211156123f4575f80fd5b61240036838701611c5d565b83526020850135915080821115612415575f80fd5b5061242236828601611d56565b60208301525092915050565b5f808335601e19843603018112612443575f80fd5b83018035915067ffffffffffffffff82111561245d575f80fd5b6020019150600581901b3603821315610c00575f80fd5b5f60208284031215612484575f80fd5b8135610b5081611ba9565b5f808335601e198436030181126124a4575f80fd5b830160208101925035905067ffffffffffffffff8111156124c3575f80fd5b8060051b3603821315610c00575f80fd5b5f8235605e198336030181126124e8575f80fd5b90910192915050565b5f808335601e19843603018112612506575f80fd5b830160208101925035905067ffffffffffffffff811115612525575f80fd5b803603821315610c00575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f808335601e19843603018112612570575f80fd5b830160208101925035905067ffffffffffffffff81111561258f575f80fd5b8060061b3603821315610c00575f80fd5b8183525f60208085019450825f5b8581101561215b5781356125c18161192f565b6001600160a01b031687528183013583880152604096870196909101906001016125ae565b8183526020808401935f91600585811b8301820185855b888110156126bf57858303601f19018a5261261882896124d4565b606081356126258161192f565b6001600160a01b0316855261263c8288018361248f565b82898801528083880152608092507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811115612676575f80fd5b871b808288850137860190506040612690848201856124f1565b94508388840301828901526126a88484018683612533565b9e8a019e97505050938701935050506001016125fd565b509098975050505050505050565b5f604080835261010080840187358386015260206060818a013581880152848a01356080880152808a013561270181611ba9565b151560a088015261271560808b018b61248f565b60c0898101529384905261012093848901600582901b8a018601835f5b8481101561288f578c830361011f19018452813536879003607e19018112612758575f80fd5b8601803536829003609e1901811261276e575f80fd5b608085528101803561277f8161192f565b6001600160a01b03808216608088015261279b8c8401846124d4565b915060a08088015281356127ae8161192f565b8116878e0152818c01356127c18161192f565b166101408701526127d4818f01826124f1565b91508a6101608801526127ec61018088018383612533565b9150506127fb8e83018361255b565b607f19808985030160c08a01526128138483856125a0565b93506128218d86018661255b565b93509150808985030160e08a01525061283b8383836125a0565b9250505060808201358d8701528a8301358b8701528d8301358e8701526128648a84018461248f565b935091508581038a87015261287a8184846125e6565b968b0196955050509188019150600101612732565b505061289e60a08f018f6124f1565b8c8303603f190160e08e0152995097506128b9818a8a612533565b98505050505050858403818701525050506128d5818587612533565b9695505050505050565b634e487b7160e01b5f52603260045260245ffd5b5f8235607e19833603018112612907575f80fd5b9190910192915050565b5f8235609e19833603018112612907575f80fd5b5f808335601e1984360301811261293a575f80fd5b83018035915067ffffffffffffffff821115612954575f80fd5b6020019150600681901b3603821315610c00575f80fd5b5f6020828403121561297b575f80fd5b8135610b508161192f565b5f6001600160a01b038087168352808616602084015250836040830152608060608301526128d560808301846120ea565b5f602082840312156129c7575f80fd5b8151610b5081611ba9565b5f602082840312156129e2575f80fd5b815160ff81168114610b50575f80fd5b5f60208284031215612a02575f80fd5b5051919050565b5f805f60608486031215612a1b575f80fd5b8351612a268161192f565b6020850151909350612a378161192f565b604085015190925067ffffffffffffffff811115612a53575f80fd5b8401601f81018613612a63575f80fd5b8051612a71611c2882611be4565b818152876020838501011115612a85575f80fd5b8160208401602083015e5f602083830101528093505050509250925092565b5f8282518085526020808601955060208260051b840101602086015f5b8481101561221857601f19868403018952612add838351612166565b98840198925090830190600101612ac1565b602081526001600160a01b038251166020820152602082015160408201525f604083015160e06060840152612b286101008401826120ea565b9050606084015160808401526080840151601f19808584030160a0860152612b508383612aa4565b925060a08601519150808584030160c0860152612b6d8383612166565b925060c08601519150808584030160e0860152506106788282612166565b5f82601f830112612b9a575f80fd5b81516020612baa611c2883611bc1565b8083825260208201915060208460051b870101935086841115612bcb575f80fd5b602086015b84811015611d4b5780518352918301918301612bd0565b5f8060408385031215612bf8575f80fd5b825167ffffffffffffffff80821115612c0f575f80fd5b818501915085601f830112612c22575f80fd5b81516020612c32611c2883611bc1565b82815260059290921b84018101918181019089841115612c50575f80fd5b948201945b83861015612c6e57855182529482019490820190612c55565b91880151919650909350505080821115612c86575f80fd5b506120e085828601612b8b565b828152604060208201525f612cab6040830184612166565b949350505050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52602160045260245ffd"; /// @dev The runtime bytecode of the contract. bytes constant RUNTIME_CODE = - hex"608060405260043610610034575f3560e01c806301ffc9a71461003d57806323e30c8b146100715780638c18e4ba1461009e57005b3661003b57005b005b348015610048575f80fd5b5061005c610057366004611908565b6100b1565b60405190151581526020015b60405180910390f35b34801561007c575f80fd5b5061009061008b366004611991565b6100e7565b604051908152602001610068565b61003b6100ac366004611a08565b610204565b5f6001600160e01b031982166323e30c8b60e01b14806100e157506301ffc9a760e01b6001600160e01b03198316145b92915050565b5f33732f04ff4cf5a3a19c619fe2c892bdbd72a76bf1321461012257604051625e1e6f60e51b81523360048201526024015b60405180910390fd5b6001600160a01b0387163014610156576040516322c7df1960e21b81526001600160a01b0388166004820152602401610119565b5f806101648486018661200c565b915091506101728282610534565b6040516334e3942b60e11b815233906369c7285690610195908590600401612225565b60408051808303815f875af11580156101b0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101d491906123a3565b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd99a9950505050505050505050565b61020c6105a8565b61021b610218826123c5565b50565b610228608085018561242e565b90505f0361024957604051639c95219f60e01b815260040160405180910390fd5b6102596080850160608601612474565b61027657604051636d3a9fe560e01b815260040160405180910390fd5b5f84848460405160200161028c939291906126cd565b60408051601f1981840301815291905290505f6102ac608087018761242e565b5f8181106102bc576102bc6128df565b90506020028101906102ce91906128f3565b6102d89080612911565b6102e6906060810190612925565b6102f3608089018961242e565b5f818110610303576103036128df565b905060200281019061031591906128f3565b60400135818110610328576103286128df565b61033e926020604090920201908101915061296b565b90505f61034e608088018861242e565b5f81811061035e5761035e6128df565b905060200281019061037091906128f3565b61037a9080612911565b610388906040810190612925565b61039560808a018a61242e565b5f8181106103a5576103a56128df565b90506020028101906103b791906128f3565b602001358181106103ca576103ca6128df565b6103e0926020604090920201908101915061296b565b90505f6103ec826105d6565b90505f6103f8846105d6565b90505f6104068a358361065a565b905061041d6001600160a01b0385168c5f19610681565b6104326001600160a01b0386168c5f19610681565b604051632e7ff4ef60e11b81526001600160a01b038c1690635cffe9de90610464903090899086908c90600401612986565b6020604051808303815f875af1158015610480573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104a491906129b7565b6104c1576040516349088f5960e11b815260040160405180910390fd5b6104d56001600160a01b0386168c5f610681565b6104e96001600160a01b0385168c5f610681565b6104fe6104f5886123c5565b858588866106fb565b50505050505061052d60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5050505050565b5f82608001515f8151811061054b5761054b6128df565b60200260200101515f01516060015183608001515f81518110610570576105706128df565b6020026020010151604001518151811061058c5761058c6128df565b60200260200101515f015190506105a3818361099a565b505050565b6105b0610a44565b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f6105df610a88565b6040516354636d2b60e01b81526001600160a01b038316600482015273200e12d10bb0c5e4a17e7018f0f1161919bb9389906354636d2b906024016020604051808303815f875af1158015610636573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100e191906129d2565b5f6001600160e01b038316601b0b60e084901d610678828286610b13565b95945050505050565b61068d8383835f610b57565b6105a35761069e83835f6001610b57565b6106c657604051635274afe760e01b81526001600160a01b0384166004820152602401610119565b6106d38383836001610b57565b6105a357604051635274afe760e01b81526001600160a01b0384166004820152602401610119565b6040805160018082528183019092525f91816020015b6060815260200190600190039081610711575050604080516003808252608082019092529192505f919060208201606080368337019050506040516370a0823160e01b81523060048201529091505f906001600160a01b038816906370a0823190602401602060405180830381865afa158015610790573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107b491906129f2565b905080156107d0576107d06001600160a01b0388163383610bb9565b5f6107db8288610bc6565b50905080835f815181106107f1576107f16128df565b602090810291909101015250506040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015610842573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061086691906129f2565b90508015610882576108826001600160a01b0386163383610bb9565b5f61088d8286610bc6565b50905080836001815181106108a4576108a46128df565b60209081029190910101525047905080156108c3576108c33382610c07565b5f6108cf826012610bc6565b50905080836002815181106108e6576108e66128df565b602002602001018181525050505080825f81518110610907576109076128df565b60209081029190910101526040805160018082528183019092525f91816020015b6040805160a0810182525f918101828152606080830193909352608082018390528152602081019190915281526020019060019003908161092857905050905087815f8151811061097b5761097b6128df565b60200260200101819052506109908382610c7e565b5050505050505050565b5f805f838060200190518101906109b19190612a09565b919450925090506001600160a01b0383166109df576040516398521dc560e01b815260040160405180910390fd5b6001600160a01b038216610a065760405163456ac4c360e11b815260040160405180910390fd5b610a1b6001600160a01b038616845f19610681565b610a2f6001600160a01b0383168247610e42565b5061052d6001600160a01b038616845f610681565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054600203610a8657604051633ee5aeb560e01b815260040160405180910390fd5b565b73200e12d10bb0c5e4a17e7018f0f1161919bb93893b1580610adf575073200e12d10bb0c5e4a17e7018f0f1161919bb93893f7f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d4114155b15610a86576040516373e6d7b360e01b815273200e12d10bb0c5e4a17e7018f0f1161919bb93896004820152602401610119565b5f805f610b21868686610ef0565b9150915080610b4c5760405162bc8ecf60e31b81526004810187905260248101869052604401610119565b5090505b9392505050565b60405163095ea7b360e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610bad578383151615610ba1573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b6106d38383836001611062565b5f805f805f610bd587876110ac565b9250925092505f80610be78585611108565b9150915081838015610bf65750815b9650965050505050505b9250929050565b80471015610c315760405163cf47918160e01b815247600482015260248101829052604401610119565b610c4a828260405180602001604052805f815250611351565b15610c53575050565b3d15610c6557610c61611366565b5050565b60405163d6bda27560e01b815260040160405180910390fd5b335f8181523060209081526040808320815160a0810183528083018581526060808301879052608083018190529082528185015282518581529384018581528484019093529093909291905b865181101561099057868181518110610ce557610ce56128df565b602002602001015193505f845f015160400151511115610e3a575f845f01515f01516001600160a01b031663d04dfe236040518060e00160405280885f0151602001516001600160a01b03168152602001898152602001885f01516040015181526020015f8152602001610d5d8d8a60200151611371565b8152602001878152602001868152506040518263ffffffff1660e01b8152600401610d889190612aef565b5f60405180830381865afa158015610da2573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610dc99190810190612be7565b9150505f81511115610e385784516020015160405163012c676d60e21b81526001600160a01b03909116906304b19db490610e0a908a908590600401612c93565b5f604051808303815f87803b158015610e21575f80fd5b505af1158015610e33573d5f803e3d5ffd5b505050505b505b600101610cca565b606081471015610e6e5760405163cf47918160e01b815247600482015260248101839052604401610119565b5f610e7a858486611351565b9050808015610e9b57505f3d1180610e9b57505f856001600160a01b03163b115b15610eb057610ea8611653565b915050610b50565b8015610eda57604051639996b31560e01b81526001600160a01b0386166004820152602401610119565b3d15610c6557610ee8611366565b509392505050565b5f805f851215610f1d57604051634a7d166b60e01b81526004810186905260248101859052604401610119565b845f03610f2f57505f9050600161105a565b8460ff8416850185811215610f6a5760405163c849483b60e01b8152600481018890526024810187905260ff86166044820152606401610119565b5f805f831215610fb657604c19831215610f8d575f80955095505050505061105a565b825f03600a0a9150818481610fa457610fa4612cb3565b049550508402909114915061105a9050565b5f83131561104f57604d831315610ff35760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610119565b82600a0a9150815f198161100957611009612cb3565b0484111561103d5760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610119565b509190910292506001915061105a9050565b509193506001925050505b935093915050565b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610bad578383151615610ba1573d5f823e3d81fd5b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8611156110f757600a860460018201600a88065f1493509350935050611101565b8593509150600190505b9250925092565b5f808383601b82900b82148061123e577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e1000000000000000000870515611189577f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000087051561117a576305f5e10087059650600886019550611189565b620186a0870596506005860195505b8687601b0b146111a457600a87059650856001019550611189565b7b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc7b1999999999999999999999999999999999999999999999999999999888820111611238575f600188039050808160030b036112365760e01b6001600160e01b037b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff60ff8b901d18161795505f9450610c009350505050565b505b50611255565b865f0361125557505f935060019250610c00915050565b858660030b1461130c575f8213156112b457611271838361166c565b156112995760405163d556b11160e01b81526004810184905260248101839052604401610119565b637ffffffe19909501600a0a82029550637fffffff9461130c565b637fffffff1986900360438113156112d657505f9450849350610c0092505050565b80600a0a88816112e8576112e8612cb3565b059750875f0361130257505f9450849350610c0092505050565b50637fffffff1995505b81861361131c5760019350611335565b818603600a0a838161133057611330612cb3565b071593505b5050506001600160e01b03841660e084901b1791509250929050565b5f805f83516020850186885af1949350505050565b6040513d5f823e3d81fd5b60605f825167ffffffffffffffff81111561138e5761138e611aaf565b6040519080825280602002602001820160405280156113b7578160200160208202803683370190505b5090505f808451116113c9575f6113cf565b83516001015b85516001010190505f8167ffffffffffffffff8111156113f1576113f1611aaf565b60405190808252806020026020018201604052801561142457816020015b606081526020019060019003908161140f5790505b5090505f611448604080516002815233602082015230818301526060810190915290565b82828151811061145a5761145a6128df565b60200260200101819052505f5b87518110156114b757818060010192505087818151811061148a5761148a6128df565b60200260200101518383815181106114a4576114a46128df565b6020908102919091010152600101611467565b50855115611649578080600101915050838282815181106114da576114da6128df565b60200260200101819052505f5b865181101561164757611596878281518110611505576115056128df565b60200260200101515f01516115736115418a8581518110611528576115286128df565b6020026020010151602001518051602090810291012090565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f908152601c91909152603c902090565b898481518110611585576115856128df565b602002602001015160400151611687565b6115b657604051630a57f30960e31b815260048101829052602401610119565b8681815181106115c8576115c86128df565b60200260200101515f01516001600160a01b03165f1b8582815181106115f0576115f06128df565b6020026020010181815250508180600101925050868181518110611616576116166128df565b602002602001015160200151838381518110611634576116346128df565b60209081029190910101526001016114e7565b505b5095945050505050565b6040513d81523d5f602083013e3d602001810160405290565b5f610b505f841261167d5783611681565b835f035b836116f7565b5f836001600160a01b03163b5f036116e5575f806116a58585611795565b5090925090505f8160038111156116be576116be612cc7565b1480156116dc5750856001600160a01b0316826001600160a01b0316145b92505050610b50565b6116f08484846117db565b9050610b50565b5f637ffffff5821361170a57505f6100e1565b637ffffffe19820160438113156117255750508115156100e1565b5f81126117655780600a0a7b800000000000000000000000000000000000000000000000000000018161175a5761175a612cb3565b0484119150506100e1565b805f03600a0a7b800000000000000000000000000000000000000000000000000000020284101591505092915050565b5f805f83516041036117cc576020840151604085015160608601515f1a6117be88828585611840565b955095509550505050611101565b505081515f9150600290611101565b805160408051630b135d3f60e11b8082526004820186905260248201929092525f92906020820185604483015e5f82606483010152601f820160051c60051b915060205f60648401838a5afa9050825f5114601f3d1116811693505050509392505050565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084111561187957505f915060039050826118fe565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa1580156118ca573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b0381166118f557505f9250600191508290506118fe565b92505f91508190505b9450945094915050565b5f60208284031215611918575f80fd5b81356001600160e01b031981168114610b50575f80fd5b6001600160a01b0381168114610218575f80fd5b803561194e8161192f565b919050565b5f8083601f840112611963575f80fd5b50813567ffffffffffffffff81111561197a575f80fd5b602083019150836020828501011115610c00575f80fd5b5f805f805f8060a087890312156119a6575f80fd5b86356119b18161192f565b955060208701356119c18161192f565b94506040870135935060608701359250608087013567ffffffffffffffff8111156119ea575f80fd5b6119f689828a01611953565b979a9699509497509295939492505050565b5f805f805f60808688031215611a1c575f80fd5b8535611a278161192f565b9450602086013567ffffffffffffffff80821115611a43575f80fd5b9087019060c0828a031215611a56575f80fd5b90945060408701359080821115611a6b575f80fd5b611a7789838a01611953565b90955093506060880135915080821115611a8f575f80fd5b50860160408189031215611aa1575f80fd5b809150509295509295909350565b634e487b7160e01b5f52604160045260245ffd5b6040516060810167ffffffffffffffff81118282101715611ae657611ae6611aaf565b60405290565b6040805190810167ffffffffffffffff81118282101715611ae657611ae6611aaf565b6040516080810167ffffffffffffffff81118282101715611ae657611ae6611aaf565b60405160a0810167ffffffffffffffff81118282101715611ae657611ae6611aaf565b60405160c0810167ffffffffffffffff81118282101715611ae657611ae6611aaf565b604051601f8201601f1916810167ffffffffffffffff81118282101715611ba157611ba1611aaf565b604052919050565b8015158114610218575f80fd5b803561194e81611ba9565b5f67ffffffffffffffff821115611bda57611bda611aaf565b5060051b60200190565b5f67ffffffffffffffff821115611bfd57611bfd611aaf565b50601f01601f191660200190565b5f82601f830112611c1a575f80fd5b8135611c2d611c2882611be4565b611b78565b818152846020838601011115611c41575f80fd5b816020850160208301375f918101602001919091529392505050565b5f60608284031215611c6d575f80fd5b611c75611ac3565b90508135611c828161192f565b81526020820135611c928161192f565b6020820152604082013567ffffffffffffffff811115611cb0575f80fd5b611cbc84828501611c0b565b60408301525092915050565b5f82601f830112611cd7575f80fd5b81356020611ce7611c2883611bc1565b82815260069290921b84018101918181019086841115611d05575f80fd5b8286015b84811015611d4b5760408189031215611d20575f80fd5b611d28611aec565b8135611d338161192f565b81528185013585820152835291830191604001611d09565b509695505050505050565b5f82601f830112611d65575f80fd5b81356020611d75611c2883611bc1565b82815260059290921b84018101918181019086841115611d93575f80fd5b8286015b84811015611d4b57803567ffffffffffffffff80821115611db6575f80fd5b908801906060828b03601f19011215611dcd575f80fd5b611dd5611ac3565b86830135611de28161192f565b815260408381013583811115611df6575f80fd5b8401603f81018d13611e06575f80fd5b88810135611e16611c2882611bc1565b81815260059190911b82018301908a8101908f831115611e34575f80fd5b928401925b82841015611e525783358252928b0192908b0190611e39565b858c0152505050606084013583811115611e6a575f80fd5b611e788d8a83880101611c0b565b918301919091525085525050918301918301611d97565b5f82601f830112611e9e575f80fd5b81356020611eae611c2883611bc1565b82815260059290921b84018101918181019086841115611ecc575f80fd5b8286015b84811015611d4b57803567ffffffffffffffff80821115611eef575f80fd5b90880190601f196080838c0382011215611f07575f80fd5b611f0f611b0f565b8784013583811115611f1f575f80fd5b840160a0818e0384011215611f32575f80fd5b611f3a611b32565b9250611f47898201611943565b8352604081013584811115611f5a575f80fd5b611f688e8b83850101611c5d565b8a8501525060608082013585811115611f7f575f80fd5b611f8d8f8c83860101611cc8565b604086015250608082013585811115611fa4575f80fd5b611fb28f8c83860101611cc8565b828601525060a0820135608085015283835260408601358a8401528086013560408401526080860135935084841115611fe9575f80fd5b611ff78e8b86890101611d56565b90830152508652505050918301918301611ed0565b5f806040838503121561201d575f80fd5b823567ffffffffffffffff80821115612034575f80fd5b9084019060c08287031215612047575f80fd5b61204f611b55565b82358152602083013560208201526040830135604082015261207360608401611bb6565b6060820152608083013582811115612089575f80fd5b61209588828601611e8f565b60808301525060a0830135828111156120ac575f80fd5b6120b888828601611c0b565b60a083015250935060208501359150808211156120d3575f80fd5b506120e085828601611c0b565b9150509250929050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f815180845260208085019450602084015f5b8381101561215b57815180516001600160a01b03168852830151838801526040909601959082019060010161212b565b509495945050505050565b5f815180845260208085019450602084015f5b8381101561215b57815187529582019590820190600101612179565b5f82825180855260208086019550808260051b8401018186015f5b8481101561221857601f19868403018952815160606001600160a01b0382511685528582015181878701526121e782870182612166565b9150506040808301519250858203818701525061220481836120ea565b9a86019a94505050908301906001016121b0565b5090979650505050505050565b5f602080835260e08301845182850152818501516040818187015280870151915060608281880152808801519250608083151560808901526080890151935060a060c060a08a01528585518088526101009750878b019150878160051b8c010189880197505f5b82811015612374578c820360ff190184528851805187845280516001600160a01b03908116898601528d82015188860189905280518216610120870152808f01519091166101408601528a015161016085018a90526122ef6101808601826120ea565b90508a820151607f19808784030160c088015261230c8383612118565b92508b8401519150808784030160e0880152506123298282612118565b915050888201518d8601528d8301518e8601528a8301518b8601528983015192508481038a86015261235b8184612195565b9b8e019b968e019694505050600191909101905061228c565b5060a08d01518c8203601f190160c08e01529950612392818b6120ea565b9d9c50505050505050505050505050565b5f80604083850312156123b4575f80fd5b505080516020909101519092909150565b5f604082360312156123d5575f80fd5b6123dd611aec565b823567ffffffffffffffff808211156123f4575f80fd5b61240036838701611c5d565b83526020850135915080821115612415575f80fd5b5061242236828601611d56565b60208301525092915050565b5f808335601e19843603018112612443575f80fd5b83018035915067ffffffffffffffff82111561245d575f80fd5b6020019150600581901b3603821315610c00575f80fd5b5f60208284031215612484575f80fd5b8135610b5081611ba9565b5f808335601e198436030181126124a4575f80fd5b830160208101925035905067ffffffffffffffff8111156124c3575f80fd5b8060051b3603821315610c00575f80fd5b5f8235605e198336030181126124e8575f80fd5b90910192915050565b5f808335601e19843603018112612506575f80fd5b830160208101925035905067ffffffffffffffff811115612525575f80fd5b803603821315610c00575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f808335601e19843603018112612570575f80fd5b830160208101925035905067ffffffffffffffff81111561258f575f80fd5b8060061b3603821315610c00575f80fd5b8183525f60208085019450825f5b8581101561215b5781356125c18161192f565b6001600160a01b031687528183013583880152604096870196909101906001016125ae565b8183526020808401935f91600585811b8301820185855b888110156126bf57858303601f19018a5261261882896124d4565b606081356126258161192f565b6001600160a01b0316855261263c8288018361248f565b82898801528083880152608092507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811115612676575f80fd5b871b808288850137860190506040612690848201856124f1565b94508388840301828901526126a88484018683612533565b9e8a019e97505050938701935050506001016125fd565b509098975050505050505050565b5f604080835261010080840187358386015260206060818a013581880152848a01356080880152808a013561270181611ba9565b151560a088015261271560808b018b61248f565b60c0898101529384905261012093848901600582901b8a018601835f5b8481101561288f578c830361011f19018452813536879003607e19018112612758575f80fd5b8601803536829003609e1901811261276e575f80fd5b608085528101803561277f8161192f565b6001600160a01b03808216608088015261279b8c8401846124d4565b915060a08088015281356127ae8161192f565b8116878e0152818c01356127c18161192f565b166101408701526127d4818f01826124f1565b91508a6101608801526127ec61018088018383612533565b9150506127fb8e83018361255b565b607f19808985030160c08a01526128138483856125a0565b93506128218d86018661255b565b93509150808985030160e08a01525061283b8383836125a0565b9250505060808201358d8701528a8301358b8701528d8301358e8701526128648a84018461248f565b935091508581038a87015261287a8184846125e6565b968b0196955050509188019150600101612732565b505061289e60a08f018f6124f1565b8c8303603f190160e08e0152995097506128b9818a8a612533565b98505050505050858403818701525050506128d5818587612533565b9695505050505050565b634e487b7160e01b5f52603260045260245ffd5b5f8235607e19833603018112612907575f80fd5b9190910192915050565b5f8235609e19833603018112612907575f80fd5b5f808335601e1984360301811261293a575f80fd5b83018035915067ffffffffffffffff821115612954575f80fd5b6020019150600681901b3603821315610c00575f80fd5b5f6020828403121561297b575f80fd5b8135610b508161192f565b5f6001600160a01b038087168352808616602084015250836040830152608060608301526128d560808301846120ea565b5f602082840312156129c7575f80fd5b8151610b5081611ba9565b5f602082840312156129e2575f80fd5b815160ff81168114610b50575f80fd5b5f60208284031215612a02575f80fd5b5051919050565b5f805f60608486031215612a1b575f80fd5b8351612a268161192f565b6020850151909350612a378161192f565b604085015190925067ffffffffffffffff811115612a53575f80fd5b8401601f81018613612a63575f80fd5b8051612a71611c2882611be4565b818152876020838501011115612a85575f80fd5b8160208401602083015e5f602083830101528093505050509250925092565b5f8282518085526020808601955060208260051b840101602086015f5b8481101561221857601f19868403018952612add838351612166565b98840198925090830190600101612ac1565b602081526001600160a01b038251166020820152602082015160408201525f604083015160e06060840152612b286101008401826120ea565b9050606084015160808401526080840151601f19808584030160a0860152612b508383612aa4565b925060a08601519150808584030160c0860152612b6d8383612166565b925060c08601519150808584030160e0860152506106788282612166565b5f82601f830112612b9a575f80fd5b81516020612baa611c2883611bc1565b8083825260208201915060208460051b870101935086841115612bcb575f80fd5b602086015b84811015611d4b5780518352918301918301612bd0565b5f8060408385031215612bf8575f80fd5b825167ffffffffffffffff80821115612c0f575f80fd5b818501915085601f830112612c22575f80fd5b81516020612c32611c2883611bc1565b82815260059290921b84018101918181019089841115612c50575f80fd5b948201945b83861015612c6e57855182529482019490820190612c55565b91880151919650909350505080821115612c86575f80fd5b506120e085828601612b8b565b828152604060208201525f612cab6040830184612166565b949350505050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52602160045260245ffd"; + hex"608060405260043610610034575f3560e01c806301ffc9a71461003d57806323e30c8b146100715780638c18e4ba1461009e57005b3661003b57005b005b348015610048575f80fd5b5061005c610057366004611908565b6100b1565b60405190151581526020015b60405180910390f35b34801561007c575f80fd5b5061009061008b366004611991565b6100e7565b604051908152602001610068565b61003b6100ac366004611a08565b610204565b5f6001600160e01b031982166323e30c8b60e01b14806100e157506301ffc9a760e01b6001600160e01b03198316145b92915050565b5f33737900fd69e0785195f6e4622e3138146c4cc4abd21461012257604051625e1e6f60e51b81523360048201526024015b60405180910390fd5b6001600160a01b0387163014610156576040516322c7df1960e21b81526001600160a01b0388166004820152602401610119565b5f806101648486018661200c565b915091506101728282610534565b6040516334e3942b60e11b815233906369c7285690610195908590600401612225565b60408051808303815f875af11580156101b0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101d491906123a3565b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd99a9950505050505050505050565b61020c6105a8565b61021b610218826123c5565b50565b610228608085018561242e565b90505f0361024957604051639c95219f60e01b815260040160405180910390fd5b6102596080850160608601612474565b61027657604051636d3a9fe560e01b815260040160405180910390fd5b5f84848460405160200161028c939291906126cd565b60408051601f1981840301815291905290505f6102ac608087018761242e565b5f8181106102bc576102bc6128df565b90506020028101906102ce91906128f3565b6102d89080612911565b6102e6906060810190612925565b6102f3608089018961242e565b5f818110610303576103036128df565b905060200281019061031591906128f3565b60400135818110610328576103286128df565b61033e926020604090920201908101915061296b565b90505f61034e608088018861242e565b5f81811061035e5761035e6128df565b905060200281019061037091906128f3565b61037a9080612911565b610388906040810190612925565b61039560808a018a61242e565b5f8181106103a5576103a56128df565b90506020028101906103b791906128f3565b602001358181106103ca576103ca6128df565b6103e0926020604090920201908101915061296b565b90505f6103ec826105d6565b90505f6103f8846105d6565b90505f6104068a358361065a565b905061041d6001600160a01b0385168c5f19610681565b6104326001600160a01b0386168c5f19610681565b604051632e7ff4ef60e11b81526001600160a01b038c1690635cffe9de90610464903090899086908c90600401612986565b6020604051808303815f875af1158015610480573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104a491906129b7565b6104c1576040516349088f5960e11b815260040160405180910390fd5b6104d56001600160a01b0386168c5f610681565b6104e96001600160a01b0385168c5f610681565b6104fe6104f5886123c5565b858588866106fb565b50505050505061052d60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5050505050565b5f82608001515f8151811061054b5761054b6128df565b60200260200101515f01516060015183608001515f81518110610570576105706128df565b6020026020010151604001518151811061058c5761058c6128df565b60200260200101515f015190506105a3818361099a565b505050565b6105b0610a44565b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f6105df610a88565b6040516354636d2b60e01b81526001600160a01b038316600482015273200e12d10bb0c5e4a17e7018f0f1161919bb9389906354636d2b906024016020604051808303815f875af1158015610636573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100e191906129d2565b5f6001600160e01b038316601b0b60e084901d610678828286610b13565b95945050505050565b61068d8383835f610b57565b6105a35761069e83835f6001610b57565b6106c657604051635274afe760e01b81526001600160a01b0384166004820152602401610119565b6106d38383836001610b57565b6105a357604051635274afe760e01b81526001600160a01b0384166004820152602401610119565b6040805160018082528183019092525f91816020015b6060815260200190600190039081610711575050604080516003808252608082019092529192505f919060208201606080368337019050506040516370a0823160e01b81523060048201529091505f906001600160a01b038816906370a0823190602401602060405180830381865afa158015610790573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107b491906129f2565b905080156107d0576107d06001600160a01b0388163383610bb9565b5f6107db8288610bc6565b50905080835f815181106107f1576107f16128df565b602090810291909101015250506040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015610842573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061086691906129f2565b90508015610882576108826001600160a01b0386163383610bb9565b5f61088d8286610bc6565b50905080836001815181106108a4576108a46128df565b60209081029190910101525047905080156108c3576108c33382610c07565b5f6108cf826012610bc6565b50905080836002815181106108e6576108e66128df565b602002602001018181525050505080825f81518110610907576109076128df565b60209081029190910101526040805160018082528183019092525f91816020015b6040805160a0810182525f918101828152606080830193909352608082018390528152602081019190915281526020019060019003908161092857905050905087815f8151811061097b5761097b6128df565b60200260200101819052506109908382610c7e565b5050505050505050565b5f805f838060200190518101906109b19190612a09565b919450925090506001600160a01b0383166109df576040516398521dc560e01b815260040160405180910390fd5b6001600160a01b038216610a065760405163456ac4c360e11b815260040160405180910390fd5b610a1b6001600160a01b038616845f19610681565b610a2f6001600160a01b0383168247610e42565b5061052d6001600160a01b038616845f610681565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054600203610a8657604051633ee5aeb560e01b815260040160405180910390fd5b565b73200e12d10bb0c5e4a17e7018f0f1161919bb93893b1580610adf575073200e12d10bb0c5e4a17e7018f0f1161919bb93893f7f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d4114155b15610a86576040516373e6d7b360e01b815273200e12d10bb0c5e4a17e7018f0f1161919bb93896004820152602401610119565b5f805f610b21868686610ef0565b9150915080610b4c5760405162bc8ecf60e31b81526004810187905260248101869052604401610119565b5090505b9392505050565b60405163095ea7b360e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610bad578383151615610ba1573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b6106d38383836001611062565b5f805f805f610bd587876110ac565b9250925092505f80610be78585611108565b9150915081838015610bf65750815b9650965050505050505b9250929050565b80471015610c315760405163cf47918160e01b815247600482015260248101829052604401610119565b610c4a828260405180602001604052805f815250611351565b15610c53575050565b3d15610c6557610c61611366565b5050565b60405163d6bda27560e01b815260040160405180910390fd5b335f8181523060209081526040808320815160a0810183528083018581526060808301879052608083018190529082528185015282518581529384018581528484019093529093909291905b865181101561099057868181518110610ce557610ce56128df565b602002602001015193505f845f015160400151511115610e3a575f845f01515f01516001600160a01b031663d04dfe236040518060e00160405280885f0151602001516001600160a01b03168152602001898152602001885f01516040015181526020015f8152602001610d5d8d8a60200151611371565b8152602001878152602001868152506040518263ffffffff1660e01b8152600401610d889190612aef565b5f60405180830381865afa158015610da2573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610dc99190810190612be7565b9150505f81511115610e385784516020015160405163012c676d60e21b81526001600160a01b03909116906304b19db490610e0a908a908590600401612c93565b5f604051808303815f87803b158015610e21575f80fd5b505af1158015610e33573d5f803e3d5ffd5b505050505b505b600101610cca565b606081471015610e6e5760405163cf47918160e01b815247600482015260248101839052604401610119565b5f610e7a858486611351565b9050808015610e9b57505f3d1180610e9b57505f856001600160a01b03163b115b15610eb057610ea8611653565b915050610b50565b8015610eda57604051639996b31560e01b81526001600160a01b0386166004820152602401610119565b3d15610c6557610ee8611366565b509392505050565b5f805f851215610f1d57604051634a7d166b60e01b81526004810186905260248101859052604401610119565b845f03610f2f57505f9050600161105a565b8460ff8416850185811215610f6a5760405163c849483b60e01b8152600481018890526024810187905260ff86166044820152606401610119565b5f805f831215610fb657604c19831215610f8d575f80955095505050505061105a565b825f03600a0a9150818481610fa457610fa4612cb3565b049550508402909114915061105a9050565b5f83131561104f57604d831315610ff35760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610119565b82600a0a9150815f198161100957611009612cb3565b0484111561103d5760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610119565b509190910292506001915061105a9050565b509193506001925050505b935093915050565b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610bad578383151615610ba1573d5f823e3d81fd5b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8611156110f757600a860460018201600a88065f1493509350935050611101565b8593509150600190505b9250925092565b5f808383601b82900b82148061123e577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e1000000000000000000870515611189577f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000087051561117a576305f5e10087059650600886019550611189565b620186a0870596506005860195505b8687601b0b146111a457600a87059650856001019550611189565b7b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc7b1999999999999999999999999999999999999999999999999999999888820111611238575f600188039050808160030b036112365760e01b6001600160e01b037b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff60ff8b901d18161795505f9450610c009350505050565b505b50611255565b865f0361125557505f935060019250610c00915050565b858660030b1461130c575f8213156112b457611271838361166c565b156112995760405163d556b11160e01b81526004810184905260248101839052604401610119565b637ffffffe19909501600a0a82029550637fffffff9461130c565b637fffffff1986900360438113156112d657505f9450849350610c0092505050565b80600a0a88816112e8576112e8612cb3565b059750875f0361130257505f9450849350610c0092505050565b50637fffffff1995505b81861361131c5760019350611335565b818603600a0a838161133057611330612cb3565b071593505b5050506001600160e01b03841660e084901b1791509250929050565b5f805f83516020850186885af1949350505050565b6040513d5f823e3d81fd5b60605f825167ffffffffffffffff81111561138e5761138e611aaf565b6040519080825280602002602001820160405280156113b7578160200160208202803683370190505b5090505f808451116113c9575f6113cf565b83516001015b85516001010190505f8167ffffffffffffffff8111156113f1576113f1611aaf565b60405190808252806020026020018201604052801561142457816020015b606081526020019060019003908161140f5790505b5090505f611448604080516002815233602082015230818301526060810190915290565b82828151811061145a5761145a6128df565b60200260200101819052505f5b87518110156114b757818060010192505087818151811061148a5761148a6128df565b60200260200101518383815181106114a4576114a46128df565b6020908102919091010152600101611467565b50855115611649578080600101915050838282815181106114da576114da6128df565b60200260200101819052505f5b865181101561164757611596878281518110611505576115056128df565b60200260200101515f01516115736115418a8581518110611528576115286128df565b6020026020010151602001518051602090810291012090565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f908152601c91909152603c902090565b898481518110611585576115856128df565b602002602001015160400151611687565b6115b657604051630a57f30960e31b815260048101829052602401610119565b8681815181106115c8576115c86128df565b60200260200101515f01516001600160a01b03165f1b8582815181106115f0576115f06128df565b6020026020010181815250508180600101925050868181518110611616576116166128df565b602002602001015160200151838381518110611634576116346128df565b60209081029190910101526001016114e7565b505b5095945050505050565b6040513d81523d5f602083013e3d602001810160405290565b5f610b505f841261167d5783611681565b835f035b836116f7565b5f836001600160a01b03163b5f036116e5575f806116a58585611795565b5090925090505f8160038111156116be576116be612cc7565b1480156116dc5750856001600160a01b0316826001600160a01b0316145b92505050610b50565b6116f08484846117db565b9050610b50565b5f637ffffff5821361170a57505f6100e1565b637ffffffe19820160438113156117255750508115156100e1565b5f81126117655780600a0a7b800000000000000000000000000000000000000000000000000000018161175a5761175a612cb3565b0484119150506100e1565b805f03600a0a7b800000000000000000000000000000000000000000000000000000020284101591505092915050565b5f805f83516041036117cc576020840151604085015160608601515f1a6117be88828585611840565b955095509550505050611101565b505081515f9150600290611101565b805160408051630b135d3f60e11b8082526004820186905260248201929092525f92906020820185604483015e5f82606483010152601f820160051c60051b915060205f60648401838a5afa9050825f5114601f3d1116811693505050509392505050565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084111561187957505f915060039050826118fe565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa1580156118ca573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b0381166118f557505f9250600191508290506118fe565b92505f91508190505b9450945094915050565b5f60208284031215611918575f80fd5b81356001600160e01b031981168114610b50575f80fd5b6001600160a01b0381168114610218575f80fd5b803561194e8161192f565b919050565b5f8083601f840112611963575f80fd5b50813567ffffffffffffffff81111561197a575f80fd5b602083019150836020828501011115610c00575f80fd5b5f805f805f8060a087890312156119a6575f80fd5b86356119b18161192f565b955060208701356119c18161192f565b94506040870135935060608701359250608087013567ffffffffffffffff8111156119ea575f80fd5b6119f689828a01611953565b979a9699509497509295939492505050565b5f805f805f60808688031215611a1c575f80fd5b8535611a278161192f565b9450602086013567ffffffffffffffff80821115611a43575f80fd5b9087019060c0828a031215611a56575f80fd5b90945060408701359080821115611a6b575f80fd5b611a7789838a01611953565b90955093506060880135915080821115611a8f575f80fd5b50860160408189031215611aa1575f80fd5b809150509295509295909350565b634e487b7160e01b5f52604160045260245ffd5b6040516060810167ffffffffffffffff81118282101715611ae657611ae6611aaf565b60405290565b6040805190810167ffffffffffffffff81118282101715611ae657611ae6611aaf565b6040516080810167ffffffffffffffff81118282101715611ae657611ae6611aaf565b60405160a0810167ffffffffffffffff81118282101715611ae657611ae6611aaf565b60405160c0810167ffffffffffffffff81118282101715611ae657611ae6611aaf565b604051601f8201601f1916810167ffffffffffffffff81118282101715611ba157611ba1611aaf565b604052919050565b8015158114610218575f80fd5b803561194e81611ba9565b5f67ffffffffffffffff821115611bda57611bda611aaf565b5060051b60200190565b5f67ffffffffffffffff821115611bfd57611bfd611aaf565b50601f01601f191660200190565b5f82601f830112611c1a575f80fd5b8135611c2d611c2882611be4565b611b78565b818152846020838601011115611c41575f80fd5b816020850160208301375f918101602001919091529392505050565b5f60608284031215611c6d575f80fd5b611c75611ac3565b90508135611c828161192f565b81526020820135611c928161192f565b6020820152604082013567ffffffffffffffff811115611cb0575f80fd5b611cbc84828501611c0b565b60408301525092915050565b5f82601f830112611cd7575f80fd5b81356020611ce7611c2883611bc1565b82815260069290921b84018101918181019086841115611d05575f80fd5b8286015b84811015611d4b5760408189031215611d20575f80fd5b611d28611aec565b8135611d338161192f565b81528185013585820152835291830191604001611d09565b509695505050505050565b5f82601f830112611d65575f80fd5b81356020611d75611c2883611bc1565b82815260059290921b84018101918181019086841115611d93575f80fd5b8286015b84811015611d4b57803567ffffffffffffffff80821115611db6575f80fd5b908801906060828b03601f19011215611dcd575f80fd5b611dd5611ac3565b86830135611de28161192f565b815260408381013583811115611df6575f80fd5b8401603f81018d13611e06575f80fd5b88810135611e16611c2882611bc1565b81815260059190911b82018301908a8101908f831115611e34575f80fd5b928401925b82841015611e525783358252928b0192908b0190611e39565b858c0152505050606084013583811115611e6a575f80fd5b611e788d8a83880101611c0b565b918301919091525085525050918301918301611d97565b5f82601f830112611e9e575f80fd5b81356020611eae611c2883611bc1565b82815260059290921b84018101918181019086841115611ecc575f80fd5b8286015b84811015611d4b57803567ffffffffffffffff80821115611eef575f80fd5b90880190601f196080838c0382011215611f07575f80fd5b611f0f611b0f565b8784013583811115611f1f575f80fd5b840160a0818e0384011215611f32575f80fd5b611f3a611b32565b9250611f47898201611943565b8352604081013584811115611f5a575f80fd5b611f688e8b83850101611c5d565b8a8501525060608082013585811115611f7f575f80fd5b611f8d8f8c83860101611cc8565b604086015250608082013585811115611fa4575f80fd5b611fb28f8c83860101611cc8565b828601525060a0820135608085015283835260408601358a8401528086013560408401526080860135935084841115611fe9575f80fd5b611ff78e8b86890101611d56565b90830152508652505050918301918301611ed0565b5f806040838503121561201d575f80fd5b823567ffffffffffffffff80821115612034575f80fd5b9084019060c08287031215612047575f80fd5b61204f611b55565b82358152602083013560208201526040830135604082015261207360608401611bb6565b6060820152608083013582811115612089575f80fd5b61209588828601611e8f565b60808301525060a0830135828111156120ac575f80fd5b6120b888828601611c0b565b60a083015250935060208501359150808211156120d3575f80fd5b506120e085828601611c0b565b9150509250929050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f815180845260208085019450602084015f5b8381101561215b57815180516001600160a01b03168852830151838801526040909601959082019060010161212b565b509495945050505050565b5f815180845260208085019450602084015f5b8381101561215b57815187529582019590820190600101612179565b5f82825180855260208086019550808260051b8401018186015f5b8481101561221857601f19868403018952815160606001600160a01b0382511685528582015181878701526121e782870182612166565b9150506040808301519250858203818701525061220481836120ea565b9a86019a94505050908301906001016121b0565b5090979650505050505050565b5f602080835260e08301845182850152818501516040818187015280870151915060608281880152808801519250608083151560808901526080890151935060a060c060a08a01528585518088526101009750878b019150878160051b8c010189880197505f5b82811015612374578c820360ff190184528851805187845280516001600160a01b03908116898601528d82015188860189905280518216610120870152808f01519091166101408601528a015161016085018a90526122ef6101808601826120ea565b90508a820151607f19808784030160c088015261230c8383612118565b92508b8401519150808784030160e0880152506123298282612118565b915050888201518d8601528d8301518e8601528a8301518b8601528983015192508481038a86015261235b8184612195565b9b8e019b968e019694505050600191909101905061228c565b5060a08d01518c8203601f190160c08e01529950612392818b6120ea565b9d9c50505050505050505050505050565b5f80604083850312156123b4575f80fd5b505080516020909101519092909150565b5f604082360312156123d5575f80fd5b6123dd611aec565b823567ffffffffffffffff808211156123f4575f80fd5b61240036838701611c5d565b83526020850135915080821115612415575f80fd5b5061242236828601611d56565b60208301525092915050565b5f808335601e19843603018112612443575f80fd5b83018035915067ffffffffffffffff82111561245d575f80fd5b6020019150600581901b3603821315610c00575f80fd5b5f60208284031215612484575f80fd5b8135610b5081611ba9565b5f808335601e198436030181126124a4575f80fd5b830160208101925035905067ffffffffffffffff8111156124c3575f80fd5b8060051b3603821315610c00575f80fd5b5f8235605e198336030181126124e8575f80fd5b90910192915050565b5f808335601e19843603018112612506575f80fd5b830160208101925035905067ffffffffffffffff811115612525575f80fd5b803603821315610c00575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f808335601e19843603018112612570575f80fd5b830160208101925035905067ffffffffffffffff81111561258f575f80fd5b8060061b3603821315610c00575f80fd5b8183525f60208085019450825f5b8581101561215b5781356125c18161192f565b6001600160a01b031687528183013583880152604096870196909101906001016125ae565b8183526020808401935f91600585811b8301820185855b888110156126bf57858303601f19018a5261261882896124d4565b606081356126258161192f565b6001600160a01b0316855261263c8288018361248f565b82898801528083880152608092507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811115612676575f80fd5b871b808288850137860190506040612690848201856124f1565b94508388840301828901526126a88484018683612533565b9e8a019e97505050938701935050506001016125fd565b509098975050505050505050565b5f604080835261010080840187358386015260206060818a013581880152848a01356080880152808a013561270181611ba9565b151560a088015261271560808b018b61248f565b60c0898101529384905261012093848901600582901b8a018601835f5b8481101561288f578c830361011f19018452813536879003607e19018112612758575f80fd5b8601803536829003609e1901811261276e575f80fd5b608085528101803561277f8161192f565b6001600160a01b03808216608088015261279b8c8401846124d4565b915060a08088015281356127ae8161192f565b8116878e0152818c01356127c18161192f565b166101408701526127d4818f01826124f1565b91508a6101608801526127ec61018088018383612533565b9150506127fb8e83018361255b565b607f19808985030160c08a01526128138483856125a0565b93506128218d86018661255b565b93509150808985030160e08a01525061283b8383836125a0565b9250505060808201358d8701528a8301358b8701528d8301358e8701526128648a84018461248f565b935091508581038a87015261287a8184846125e6565b968b0196955050509188019150600101612732565b505061289e60a08f018f6124f1565b8c8303603f190160e08e0152995097506128b9818a8a612533565b98505050505050858403818701525050506128d5818587612533565b9695505050505050565b634e487b7160e01b5f52603260045260245ffd5b5f8235607e19833603018112612907575f80fd5b9190910192915050565b5f8235609e19833603018112612907575f80fd5b5f808335601e1984360301811261293a575f80fd5b83018035915067ffffffffffffffff821115612954575f80fd5b6020019150600681901b3603821315610c00575f80fd5b5f6020828403121561297b575f80fd5b8135610b508161192f565b5f6001600160a01b038087168352808616602084015250836040830152608060608301526128d560808301846120ea565b5f602082840312156129c7575f80fd5b8151610b5081611ba9565b5f602082840312156129e2575f80fd5b815160ff81168114610b50575f80fd5b5f60208284031215612a02575f80fd5b5051919050565b5f805f60608486031215612a1b575f80fd5b8351612a268161192f565b6020850151909350612a378161192f565b604085015190925067ffffffffffffffff811115612a53575f80fd5b8401601f81018613612a63575f80fd5b8051612a71611c2882611be4565b818152876020838501011115612a85575f80fd5b8160208401602083015e5f602083830101528093505050509250925092565b5f8282518085526020808601955060208260051b840101602086015f5b8481101561221857601f19868403018952612add838351612166565b98840198925090830190600101612ac1565b602081526001600160a01b038251166020820152602082015160408201525f604083015160e06060840152612b286101008401826120ea565b9050606084015160808401526080840151601f19808584030160a0860152612b508383612aa4565b925060a08601519150808584030160c0860152612b6d8383612166565b925060c08601519150808584030160e0860152506106788282612166565b5f82601f830112612b9a575f80fd5b81516020612baa611c2883611bc1565b8083825260208201915060208460051b870101935086841115612bcb575f80fd5b602086015b84811015611d4b5780518352918301918301612bd0565b5f8060408385031215612bf8575f80fd5b825167ffffffffffffffff80821115612c0f575f80fd5b818501915085601f830112612c22575f80fd5b81516020612c32611c2883611bc1565b82815260059290921b84018101918181019089841115612c50575f80fd5b948201945b83861015612c6e57855182529482019490820190612c55565b91880151919650909350505080821115612c86575f80fd5b506120e085828601612b8b565b828152604060208201525f612cab6040830184612166565b949350505050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52602160045260245ffd"; /// @dev What MUST already be on a network before this release can be /// broadcast there: an address, and the runtime code that belongs at it. /// `abi.encode`d as a `DeployDependency[]` because Solidity has no /// file-scope constant of dynamic array type. bytes constant DEPENDENCIES = - hex"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000051c00000000000000000000000002f04ff4cf5a3a19c619fe2c892bdbd72a76bf132000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000051206080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a7146117cc575080631f69cb751461156f5780632cb77e9f146115435780632fbc4ba0146113f957806341d1514f146113c25780635cffe9de1461126657806360746119146110e2578063613255ab1461105f57806369c7285614610771578063709fb8a5146104375780639235084d146103e3578063ac9650d814610295578063d7e442ec14610237578063d9d98ce4146101865763fa501182146100c1575f80fd5b34610182576101403660031901126101825767ffffffffffffffff600435818111610182576100f4903690600401611b61565b6024358281116101825761010c903690600401611b61565b60c0366043190112610182576101043583811161018257610131903690600401611d07565b90610124359384116101825761014e61015c943690600401611d07565b926101576126cb565b612211565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b5f80fd5b34610182576040366003190112610182576001600160a01b036101a7611850565b166040516370a0823160e01b8152306004820152602081602481855afa90811561022c575f916101fa575b50156101e25760206040515f8152f35b60249060405190633c5bf76960e21b82526004820152fd5b90506020813d602011610224575b81610215602093836119d0565b810103126101825751826101d2565b3d9150610208565b6040513d5f823e3d90fd5b346101825760203660031901126101825760043567ffffffffffffffff81116101825761028f61026e61015c92369060040161181f565b91906102786126cb565b60405192610285846119b4565b5f84523691611ddb565b90612b63565b34610182576020806003193601126101825760043567ffffffffffffffff8111610182576102c790369060040161181f565b9190604051926102d6846119b4565b5f84528284016102e582611ab4565b946102f360405196876119d0565b8286526102ff83611ab4565b9361031186880195601f1901866121f5565b5f5b84811061037557604080518881528951818a018190525f92600582901b83018101918a918c9085015b8287106103495785850386f35b909192938280610365600193603f198a820301865288516118dc565b960192019601959291909261033c565b806103c4886103be61039160019560059d9c9d1b8701876120f1565b929089846040519586938585013782018381015f81528b519283915e015f838201520380845201826119d0565b30613990565b6103ce828a611fd7565b526103d98189611fd7565b5001969596610313565b3461018257600319602036820112610182576004359067ffffffffffffffff821161018257608090823603011261018257610422606091600401612139565b90604051921515835260208301526040820152f35b34610182576003196040368201126101825760043567ffffffffffffffff8082116101825760c082600401938336030112610182576024359081116101825761048490369060040161181f565b9061048d6126cb565b6104be6104b96104b46104ad6104a38880612124565b60408101906120f1565b36916119f2565b613926565b61397b565b801561075f576001101561074d57602483016104da8186611f44565b90501561073b5760448401946104f08682611f44565b9050156107295761055661051e9661054a61051561050e8580612124565b9585611f44565b99909285611f44565b91909261053b6040519761053189611900565b3389523690611a56565b9a60209b8c8901523691611acc565b60408601523691611acc565b60608301526064850135608083015261056e8261270d565b91825f525f875260405f209586541596876105b2575b888860017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055604051908152f35b6001905560a46001600160a01b03917f87491344dfbcf91f6cbbc610cbbeedc85313d37a02df0c93527f7ea5f8db717f83855116604051908152878c8201526060604082015280610606606082018861203f565b0390a1019161061583856120f1565b9050610679575b5050505061066d929161066561064e61028f933390919060405192600284526020840152604083015260608201604052565b906040519160018352602083015260408201604052565b923691611ddb565b82808080808080610584565b6106866104ad84866120f1565b61068f81614717565b156107025750937fd46c2c56b35c8210e9e712ec3f02242d5fc90187c0ac8ed80cc33626846ec3698961066d9897956106f56106d86106659761064e9761028f9b5116936120f1565b866040519586958652850152606060408501526060840191611d36565b0390a1938395965061061c565b89610725604051928392630c89984b60e31b8452600484015260248301906118dc565b0390fd5b60405163540e5f0b60e01b8152600490fd5b604051636c44ef8f60e01b8152600490fd5b604051633c8270bd60e21b8152600490fd5b604051632cff108b60e21b8152600490fd5b34610182576003196020368201126101825767ffffffffffffffff600435116101825760c09060043536030112610182576107aa6126cb565b5f80806107bf60048035608481019101611e8d565b90501561104d5760246004350135926107d784612772565b1561103b576060806040516107eb81611968565b6107f3611ee2565b81525f60208201525f6040820152015261080b611ee2565b5061086b61086661084561083b61083561082f608460043501600435600401611e8d565b90611f14565b80611f2f565b6040810190611f44565b602061085e61082f608460043501600435600401611e8d565b013591611f7a565b611d22565b936001600160a01b036108ba6108666108a161089761083561082f608460043501600435600401611e8d565b6060810190611f44565b604061085e61082f608460043501600435600401611e8d565b81604051976108c889611930565b16875216602086015260408501526108ea608460043501600435600401611e8d565b9490506001604051950160051b85016040525f905f5b610914608460043501600435600401611e8d565b9050811080611028575b15610e7557610937608460043501600435600401611e8d565b821015610e61578160051b810135607e1982360301811215610182576080818301360312610182576040519161096c83611968565b8181013567ffffffffffffffff81116101825761098e90369084840101611b61565b835280820160208181013590850152604080820135908501526060013567ffffffffffffffff8111610182576109c79236920101611d07565b606082015280516001600160a01b036109e96040830151602085015190611fd7565b5151166001600160a01b0385511614801590610e2d575b610e1b57610a1860208301516040840151908361305c565b610a218161270d565b91825f525f60205260405f2054155f14610a85575051604080513381526001600160a01b039092166020830152810191909152600191907fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f390606090a15b01610900565b9190610ab6602084979597015160408501519060608601519060405192610aab846119b4565b5f8452339186613091565b925f93610ace60608201516044600435013590612795565b15610b3557505051604080513381526001600160a01b03909216602083015281019190915260019291907fe3151dc8cb7a54ffc4baabd28c1f241c94d510b5e5b502491ac3cad6c16316d590606090a15b8115610b2d575b5092610a7f565b905088610b26565b610b426040820151612772565b158015610e08575b15610b9f57505051604080513381526001600160a01b03909216602083015281019190915260019291907f500b713857325f9e6dcb52ae832eca9109d107ed1aae9cb4928b4c1e13f051aa90606090a1610b1f565b9250925050600196959691610bb8606460043501611feb565b15610d755796610c2897610c3860408401516040880151610bd98183613400565b15610d6d5750925b610c32848592610c1b610c1560608a01516001600160e01b03601b918660e01d92828816810b928260e01d9216900b613dd0565b90613f8b565b9d8e9260408d01516134cb565b60408c01526134f5565b996134f5565b98610c43848461351f565b610c4d848261357d565b60405192338452608060208501526060610c73845160808088015261010087019061203f565b93602081015160a0870152604081015160c0870152015192607f198582030160e0860152835180825260208201906020808260051b8501019601925f5b828110610d0f57505050505092806001979695937f194f1feb3b4d7076a2c272e774e792e0c48bb8c7aa1a9a3671c1cd6da9e6b4c193610d0a96604084015260608301520390a180858c5101808d5260051b8c015261368f565b610b1f565b9091929396602080610d60600193601f198782030189528b51906001600160a01b0382511681526040610d4f8584015160608785015260608401906120be565b9201519060408184039101526118dc565b9901950193929101610cb0565b905092610be1565b610c2890610c386060840151610c32610db3610c1560408801516001600160e01b0394601b90868360e01d9316820b91878260e01d9216900b613dd0565b60408a0151610dc28183613400565b15610e005750915b829c8d916060890151908116155f14610df1575060408801515b96879460408d01516134cb565b610dfb9085613427565b610de4565b905091610dca565b50610e1660608201516133dd565b610b4a565b60405163936bb5ad60e01b8152600490fd5b506001600160a01b03610e496060830151604085015190611fd7565b5151166001600160a01b036020860151161415610a00565b634e487b7160e01b5f52603260045260245ffd5b50919390610e87606460043501611feb565b1561102257835b6004356004013590610ea08282613400565b6110045750508490610ec0856001600160a01b0360208701511633612ff3565b505060a46004350190610ed8826004356004016120f1565b905015159081610ffc575b50610f5b575b506001600160a01b03610eff92935116336127bc565b50505b8351811015610f275780610f21610f1b60019387611fd7565b51613868565b01610f02565b5060409160017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005582519182526020820152f35b90506001600160a01b03602084015116610f856001600160a01b03855116926004356004016120f1565b929091333b1561018257610fcd5f93604051958694859463691f9ed760e01b8652600486015260248501528960448501528a606485015260a0608485015260a4840191611d36565b038183335af190811561022c57859115610ee9579050610fed9150611984565b5f836001600160a01b03610ee9565b905088610ee3565b604492506040519163573b6f4160e01b835260048301526024820152fd5b84610e8e565b506110366040830151612772565b61091e565b60405163315f9e2360e21b8152600490fd5b604051639c95219f60e01b8152600490fd5b3461018257602080600319360112610182576024816001600160a01b03611084611850565b16604051928380926370a0823160e01b82523060048301525afa90811561022c575f916110b5575b50604051908152f35b90508181813d83116110db575b6110cc81836119d0565b810103126101825751826110ac565b503d6110c2565b34610182576110f036611890565b92916110fd9491946126cb565b61110883833361273e565b61111181612772565b15611235578160ff91611129856111ec969533612d26565b6111338183613400565b1561122f575080935b61114885828533612f95565b917f8045c25080b0868951141ed0a91720bcad09a8364a2b3109ee1fd49c1f0bc8b860c0611177898833612ff3565b97906001600160a01b0360405192338452169a8b6020840152856040840152886060840152608083015260a0820152a16040519660068852602088015260408701526060860152608085015260a08401521660c082015260e08101604052906040519160018352602083015260408201604052565b90806112185760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b6112279261028f913691611ddb565b80808061015c565b9361113c565b50604051623a3a4d60e21b81523360048201526001600160a01b039190911660248201526044810191909152606490fd5b34610182576080366003190112610182576004356001600160a01b039081811680910361018257611295611866565b6044359167ffffffffffffffff916064358381116101825736602382011215610182578060040135938411610182573660248583010111610182576113229560209216936112e4868587612eb6565b60405196879283926323e30c8b60e01b84523360048501528760248501528860448501525f606485015260a06084850152602460a485019201611d36565b03815f855af193841561022c575f9461138e575b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd984036113755761136a93503091612f2f565b602060405160018152f35b604051630b6c58a960e31b815260048101859052602490fd5b9093506020813d6020116113ba575b816113aa602093836119d0565b8101031261018257519284611336565b3d915061139d565b346101825760603660031901126101825760206113f16113e0611850565b6113e8611866565b60443591612d26565b604051908152f35b346101825761140736611890565b928094926114136126cb565b61141e82853361273e565b61142781612772565b15611513578061143b61148a9286336127bc565b9790957f7f9dfa19cf1cc2f806f2f860fbc9c056b601fb1afc0e9b843dfe5c63616268e660806040513381526001600160a01b038416998a60208301528560408301526060820152a133612862565b939091856114b85760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b6115079661028f956106659460ff93604051956005875260208701526040860152606085015260808401521660a082015260c08101604052906040519160018352602083015260408201604052565b8080808080808061015c565b506040516306dde9c360e41b81523360048201526001600160a01b03841660248201526044810191909152606490fd5b34610182576020366003190112610182576004355f525f6020526020600160405f205414604051908152f35b34610182576003196040368201126101825767ffffffffffffffff9060043582811161018257806004019160a08236039182011261018257602435848111610182576115bf90369060040161181f565b90936115c96126cb565b5f946001600160a01b0394856115de84611d22565b1633036117aa576115f76115f23685611b61565b61270d565b805f525f60205260405f2096600188541461163e575b60208960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556040519015158152f35b9091929394959697505f6001985560405196338852826020890152606060408901528161166a8761187c565b166060890152602484013590606219018112156101825783019060a06080890152806116986004840161187c565b166101008901526116ab6024830161187c565b16610120880152604481013560221982360301811215610182570190602460048301359201988211610182578136038913610182577f09d18501db0080ca2d6cd7c17fa7255daff4b2d503ea93b76ff68b6752ea8e63878061066595608461177361028f9a60209f6117329061179d9f9a606061014061064e9d0152610160880191611d36565b6117646117596117456044880185611d56565b605f198a8603810160a08c01529491611d8b565b926064870190611d56565b918784030160c0880152611d8b565b91013560e08301520390a13390919060405192600284526020840152604083015260608201604052565b828080808080808061160d565b6024866117b685611d22565b6040516335252be360e01b815291166004820152fd5b34610182576020366003190112610182576004359063ffffffff60e01b82168092036101825760209163e414309160e01b811490811561180e575b5015158152f35b6301ffc9a760e01b14905083611807565b9181601f840112156101825782359167ffffffffffffffff8311610182576020808501948460051b01011161018257565b600435906001600160a01b038216820361018257565b602435906001600160a01b038216820361018257565b35906001600160a01b038216820361018257565b906080600319830112610182576004356001600160a01b0381168103610182579160243591604435916064359067ffffffffffffffff8211610182576118d89160040161181f565b9091565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b60a0810190811067ffffffffffffffff82111761191c57604052565b634e487b7160e01b5f52604160045260245ffd5b6060810190811067ffffffffffffffff82111761191c57604052565b6040810190811067ffffffffffffffff82111761191c57604052565b6080810190811067ffffffffffffffff82111761191c57604052565b67ffffffffffffffff811161191c57604052565b60e0810190811067ffffffffffffffff82111761191c57604052565b6020810190811067ffffffffffffffff82111761191c57604052565b90601f8019910116810190811067ffffffffffffffff82111761191c57604052565b92919267ffffffffffffffff821161191c5760405191611a1c601f8201601f1916602001846119d0565b829481845281830111610182578281602093845f960137010152565b9080601f8301121561018257816020611a53933591016119f2565b90565b91906060838203126101825760405190611a6f82611930565b8193611a7a8161187c565b8352611a886020820161187c565b602084015260408101359167ffffffffffffffff831161018257604092611aaf9201611a38565b910152565b67ffffffffffffffff811161191c5760051b60200190565b929192611ad882611ab4565b604092611ae860405192836119d0565b819581835260208093019160061b84019381851161018257915b848310611b1157505050505050565b8583830312610182578386918251611b288161194c565b611b318661187c565b81528286013583820152815201920191611b02565b9080601f8301121561018257816020611a5393359101611acc565b91909160a0818403126101825760405190611b7b82611900565b8193611b868261187c565b835267ffffffffffffffff9160208101358381116101825782611baa918301611a56565b602085015260408101358381116101825782611bc7918301611b46565b6040850152606081013592831161018257611be86080939284938301611b46565b60608501520135910152565b909291611c0084611ab4565b916040611c1060405194856119d0565b839580855260208095019160059160051b8401948086116101825784935b868510611c3f575050505050505050565b67ffffffffffffffff90853582811161018257870190606082850312610182578451611c6a81611930565b611c738361187c565b81528a83013584811161018257830185601f8201121561018257803590611c9982611ab4565b91611ca6895193846119d0565b8083528d808401918b1b83010191888311610182578e809101915b838310611cf757509150508201528583013593841161018257611ce8858c95869501611a38565b86820152815201940193611c2e565b82358152918101918f9101611cc1565b9080601f8301121561018257816020611a5393359101611bf4565b356001600160a01b03811681036101825790565b908060209392818452848401375f828201840152601f01601f1916010190565b9035601e198236030181121561018257016020813591019167ffffffffffffffff8211610182578160061b3603831361018257565b9190808252602080920192915f905b828210611da8575050505090565b909192936001906001600160a01b03611dc08761187c565b16815285830135838201526040908101950193920190611d9a565b90929192611de881611ab4565b91604091611df960405194856119d0565b839581855260208095019160051b8301938185116101825783925b858410611e245750505050505050565b67ffffffffffffffff908435828111610182578601908382860312610182578351611e4e8161194c565b82358481116101825786611e63918501611a56565b81528983013593841161018257611e7e868b95869501611d07565b83820152815201930192611e14565b903590601e1981360301821215610182570180359067ffffffffffffffff821161018257602001918160051b3603831361018257565b60405190611ed082611930565b60606040835f81525f60208201520152565b60405190611eef82611900565b5f608083828152611efe611ec3565b6020820152606060408201526060808201520152565b9015610e6157803590607e1981360301821215610182570190565b903590609e1981360301821215610182570190565b903590601e1981360301821215610182570180359067ffffffffffffffff821161018257602001918160061b3603831361018257565b9190811015610e615760061b0190565b805115610e615760200190565b805160011015610e615760400190565b805160021015610e615760600190565b805160031015610e615760800190565b805160041015610e615760a00190565b8051821015610e615760209160051b010190565b3580151581036101825790565b9081518082526020808093019301915f5b828110612017575050505090565b835180516001600160a01b031686528201518583015260409094019392810192600101612009565b906080806120b56120a361209160406001600160a01b0380895116885260208901519060a060208a01528082511660a08a015260208201511660c08901520151606060e08801526101008701906118dc565b60408701518682036040880152611ff8565b60608601518582036060870152611ff8565b93015191015290565b9081518082526020808093019301915f5b8281106120dd575050505090565b8351855293810193928101926001016120cf565b903590601e1981360301821215610182570180359067ffffffffffffffff82116101825760200191813603831361018257565b903590605e1981360301821215610182570190565b6121506115f26121498380611f2f565b3690611b61565b5f525f602052600160405f2054036121ec5780612170816121dc93611f2f565b6121d461218f6121946020850135938460408701359384923690611b61565b61305c565b6121ac6121a18580611f2f565b946060810190611e8d565b92906121cc604051966121be886119b4565b5f88525f3681373690611b61565b933691611bf4565b923392613091565b6040810151606090910151600192565b505f905f905f90565b5f5b82811061220357505050565b6060828201526020016121f7565b926001600160a01b038451166001600160a01b03835116146126b9576001600160a01b03612246606086015160643590611fd7565b515116906040830151916001600160a01b036122656084358095611fd7565b51511614801590612679575b610e1b576040850151906001600160a01b036122906044358094611fd7565b5151166001600160a01b036122ab60643560608a0151611fd7565b51511614612667576122bc8661270d565b805f525f60205260405f20541561261457506122d78461270d565b805f525f60205260405f2054156125c057506123ba9291612394917f6fa7f4c28634b0a9d6831401c45ae468195fb63aed07308935c35374ff5d9e396040518061233f61233161012033845280602085015283018d61203f565b82810360408401528a61203f565b85606083015260643560808301528760a083015260a43560c083015260c43560e083015260e4356101008301520390a16001600160a01b0386511660405192612387846119b4565b5f8452606435908a613091565b936001600160a01b03865116604051926123ad846119b4565b5f845260a4359086613091565b916123c86040820151612772565b1580156125ac575b8015612599575b8015612586575b61257457604051916123ef83611968565b5f83525f60208401525f60408401525f606084015261240e848361473b565b84526040840152612434612422838661473b565b602086015280606086015284516134cb565b9461244860208501516040860151906134cb565b93612452876133dd565b8015612565575b6125535761251a61254c957fd9fa84dd790c969daa5c33d8050dc06b4a9b59d5b42e2be5f5e8ae20447f618d946124fc6125519a60a09661249b8a885161351f565b6124a98c602089015161351f565b6124b78a604089015161357d565b6124c58c606089015161357d565b6124ce8a613868565b6124d78c613868565b6001600160a01b036124f360c435926060606435910151611fd7565b51511633612862565b50506001600160a01b036124f360e43592606060a435910151611fd7565b5050606060405191338352805160208401526020810151604084015260408101518284015201516080820152a161368f565b61368f565b565b604051630d86822160e01b8152600490fd5b5061256f856133dd565b612459565b6040516321badf1f60e01b8152600490fd5b5061259460608401516133dd565b6123de565b506125a760608201516133dd565b6123d7565b506125ba6040840151612772565b156123d0565b9351604080513381526001600160a01b039092166020830152810194909452507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f3945091925082915050606081015b0390a1565b9551604080513381526001600160a01b039092166020830152810196909652507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f39493508392505060608201905061260f565b604051631cd2f1c760e21b8152600490fd5b506001600160a01b03612693606085015160a43590611fd7565b5151166001600160a01b036126af604088015160443590611fd7565b5151161415612271565b604051630a98f1f360e21b8152600490fd5b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0060028154146126fb5760029055565b604051633ee5aeb560e01b8152600490fd5b6040516127388161272a602082019460208652604083019061203f565b03601f1981018352826119d0565b51902090565b909115612749575050565b6040516305dbdfd960e41b81526001600160a01b03918216600482015291166024820152604490fd5b612791905f60e01d906001600160e01b038160e01d9116601b0b61479e565b1290565b90612791916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b61481f565b9291926127c882613a63565b936127d2816133dd565b6128505784816001600160e01b036127f19360e01d9116601b0b61489e565b9290809315612827575b5082908161280b575b5050509190565b61281f926001600160a01b03309216612f2f565b5f8181612804565b9092505f19811461283c57600101915f6127fb565b634e487b7160e01b5f52601160045260245ffd5b604051632eaefac360e21b8152600490fd5b9392919361286f836133dd565b61290d578461288b57612883939450612ff3565b50505f905f90565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f5281526128c8835f205494856134f5565b956128d2876133dd565b6128f5575f97885260018252838820908852815282872091875252909320829055565b835163c5e12af560e01b815260048101889052602490fd5b60405163793a8f5560e01b815260048101849052602490fd5b919060408382031261018257825167ffffffffffffffff908181116101825784019082601f8301121561018257815160209261296182611ab4565b9161296f60405193846119d0565b808352848084019160051b830101918683116101825785809101915b8383106129fe5750505050948281015191821161018257019180601f840112156101825782516129ba81611ab4565b936129c860405195866119d0565b818552838086019260051b820101928311610182578301905b8282106129ef575050505090565b815181529083019083016129e1565b825181529181019186910161298b565b90808251908181526020809101926020808460051b8301019501935f915b848310612a3c5750505050505090565b9091929394958480612a5a600193601f198682030187528a516120be565b9801930193019194939290612a2c565b91906020928381526001600160a01b0382511684820152838201516040820152612aa4604083015160e060608401526101008301906118dc565b9060608301516080820152612acb608084015192601f1993848483030160a0850152612a0e565b9260a081015193838382030160c08401528680865192838152019501905f5b818110612b0e57505050611a5394955060c060e091015192828503019101526120be565b825187529588019591880191600101612aea565b90604082019082526020606081936040838201528551809452019301915f5b828110612b4f575050505090565b835185529381019392810192600101612b41565b919091335f526020308152604091825f2091835195612b818761194c565b612b89611ec3565b875260608281980152845190612b9e826119b4565b5f8252855190612bad826119b4565b5f82525f3681375f5b8151811015612d1a57898688612bcc8486611fd7565b51888151948d80870151908151612bee575b5050505050505050600101612bb6565b905f92916001600160a01b0396612c138887818d51169c015116998789015190613b42565b95825199612c208b611998565b8a5289015287015285015260808401528760a08401528660c08401525f8c51809563d04dfe2360e01b82528180612c5b600498898301612a6a565b03915afa938415612d10579089915f95612cea575b508451612c86575b50899250808e8c938e612bde565b5101511691823b1561018257612cb4925f92838d5180968195829463012c676d60e21b845233908401612b22565b03925af18015612ce0579060019291612cd1575b81928782612c78565b612cda90611984565b5f612cc8565b89513d5f823e3d90fd5b612d079195503d805f833e612cff81836119d0565b810190612926565b9050935f612c70565b8c513d5f823e3d90fd5b50505050505050509050565b8215612d5b576001600160a01b038091165f52600160205260405f2091165f5260205260405f20905f5260205260405f205490565b909150612d6782613d74565b6001600160a01b03809316906040918251946370a0823160e01b86528416938460048701526020928387602481865afa968715612e7d575f97612e87575b5083612dbe612db783612dee9a614a53565b50906141de565b508651636eb1769f60e11b81526001600160a01b0390941660048501523060248501529297889081906044820190565b0381865afa968715612e7d575f97612e4c575b50612db7612e1291611a5398614a53565b50612e1d8183613400565b15612e445750935b5f5260018252825f20905f528152815f20905f8052525f2054906134f5565b905093612e25565b96508387813d8311612e76575b612e6381836119d0565b8101031261018257955195612db7612e01565b503d612e59565b85513d5f823e3d90fd5b96508387813d8311612eaf575b612e9e81836119d0565b810103126101825795519583612da5565b503d612e94565b6040519263a9059cbb60e01b5f526001600160a01b0380931660045260245260205f60448180855af160015f5114811615612f10575b8360405215612efa57505050565b635274afe760e01b835216600482015260249150fd5b6001811516612f2657813b15153d151616612eec565b833d5f823e3d90fd5b9092604051936323b872dd60e01b5f526001600160a01b0393848092166004521660245260445260205f60648180855af160015f5114811615612f7f575b836040525f60605215612efa57505050565b6001811516612f2657813b15153d151616612f6d565b93929193612fa2836133dd565b61290d5784612fb6576128839394506127bc565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f5281526128c8835f205494856134cb565b9092919261300081613a63565b9361300a816133dd565b61304a5784816001600160e01b036130299360e01d9116601b0b61489e565b50809281613038575050509190565b6001600160a01b0361281f9316612eb6565b604051632d1671a360e11b8152600490fd5b9161308790606061307c936001600160a01b039485916040880151611fd7565b515116940151611fd7565b5151161461266757565b94919392909260408051916130a583611998565b6130ad611ee2565b83526020925f848201525f838201526060945f868301528560c06080938260808201525f60a082015201528351916130e483611900565b600483525f5b8181106133ce5750506132d7959493925f9261320e61325e938d61310d8161270d565b9c896001600160a01b039e8f94859182865116908d5194600386528501528c840152168c820152608081018a5261314386611f8a565b5261314d85611f8a565b50885161315981611930565b6002815289368c83013761316c86611f97565b5261317685611f97565b5060ff8a6131d98b8501936131c38761319c81613194858a51611fd7565b515116613d74565b975116886131ab848951611fd7565b515116856131ba858a51611fd7565b51015191612d26565b966131cf828751611fd7565b5151169451611fd7565b51015192169093929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b61321782611fa7565b5261322181611fa7565b506132458a8d8d60ff8a6131d98d8501936131c38761319c81613194858a51611fd7565b61324e82611fb7565b5261325881611fb7565b50613b42565b95878a511697848b0191825191868184511693015116928a8552308752858086209151015186519161328f836119b4565b86835287519561329e87611998565b86528886015286850152848885015289608085015260a084015260c08301528351808098819463d04dfe2360e01b835260048301612a6a565b03915afa9687156133c4575f945f986133a2575b5084516002811061338b5750818386015195015161331161330b88611fc7565b51611fb7565b5161331c8183613400565b156133835750925b6133468685919060405192600284526020840152604083015260608201604052565b61334f88611fa7565b5261335987611fa7565b508251996133668b611998565b8a52890152870152850152608084015260a083015260c082015290565b905092613324565b602490835190630fbb8e5560e21b82526004820152fd5b9097506133ba9194503d805f833e612cff81836119d0565b939093965f6132eb565b50513d5f823e3d90fd5b808888809387010152016130ea565b6133fc905f60e01d906001600160e01b038160e01d9116601b0b61479e565b1390565b906133fc916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b61481f565b61344e6001600160e01b0392838316601b0b9260e01d938160e01d9116601b0b8484613f95565b90637ffffff5821361349e575b90613465916141de565b9290921580613496575b61347857505090565b6044925060405191638eba4d0760e01b835260048301526024820152fd5b50821561346f565b6134a88282614e7e565b1561345b57604483856040519163d556b11160e01b835260048301526024820152fd5b611a5391610c15916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6143e4565b611a5391610c15916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6145a8565b61357991608081018261353b6135358351611fc7565b51611fc7565b5261357261356c6001600160a01b0380945151169361356361355d8551611fc7565b51611f8a565b51169251611fc7565b51611fa7565b5191612f95565b5050565b906080810191806135916135358551611fb7565b526001600160a01b038092515116916135ad61355d8551611fb7565b51166135bc61356c8551611fb7565b519081613657576135cc836133dd565b61290d579183917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a959361260f955f5260209060018252613622604094855f20835f528452855f20855f528452855f20546134f5565b945f5260018252835f20905f528152825f20915f52525f20555b51604051918291338352604060208401526040830190612a0e565b91613688917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a959361260f95612862565b505061363c565b60c0810151908151915f92613803575b506137446020918281510151926001600160a01b039081818187511696015116928660a082019485518252308452604097888320898686510151015160808601518b51916136ec836119b4565b8683528c51936136fb856119b4565b8785528d519661370a88611998565b8752898701528c86015260016060860152608085015260a084015260c08301528851808099819463d04dfe2360e01b835260048301612a6a565b03915afa9485156137f95787956137db575b508451613767575b50505050505050565b81905101510151169051813b156137d75791849184938361379c965180978195829463012c676d60e21b845260048401612b22565b03925af19081156137ce57506137b7575b808080808061375e565b6137c18291611984565b6137cb57806137ad565b80fd5b513d84823e3d90fd5b8480fd5b6137f09195503d8089833e612cff81836119d0565b9050935f613756565b86513d89823e3d90fd5b6001600160a01b03602080845101510151169060a083015190823b1561018257613846925f928360405180968195829463012c676d60e21b845260048401612b22565b03925af1801561022c571561369f57613860919250611984565b5f905f61369f565b6080810161387961356c8251611fb7565b5191821561388657505050565b6138a061355d6001600160a01b0380935151169351611fb7565b5116815f5260209160018352604092835f20835f528152835f20855f528152835f2054936001600160e01b0385166138db575b505050505050565b6138ff955f9284845260018152828420868552815282842091845252812055612ff3565b5f8080806138d3565b8115613912570490565b634e487b7160e01b5f52601260045260245ffd5b604081511061396e576020810151908051603f19810190811161283c5760051c821161395a5760016020920160051b010190565b5050604051613968816119b4565b5f815290565b50604051613968816119b4565b80511561398b57602001515f1a90565b505f90565b905f8091602081519101845af48080613a0e575b156139c45750506040513d81523d5f602083013e60203d82010160405290565b156139eb57604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b3d156139fc576040513d5f823e3d90fd5b60405163d6bda27560e01b8152600490fd5b503d1515806139a45750813b15156139a4565b60041115613a2b57565b634e487b7160e01b5f52602160045260245ffd5b602090939291936001600160a01b036040820195168152613a5f83613a21565b0152565b613a6b614f6c565b6040805163b7bad1b160e01b81526001600160a01b0383166004820152909182826024815f73200e12d10bb0c5e4a17e7018f0f1161919bb93895af1928315613b39575f925f94613b04575b50613ac183613a21565b600183141580613af2575b613ad65750505090565b5163ee07877f60e01b8152918291610725919060048401613a3f565b50613afc83613a21565b821515613acc565b90809450613b289293503d8511613b32575b613b2081836119d0565b810190614874565b919091925f613ab7565b503d613b16565b513d5f823e3d90fd5b90805191613b4f83611ab4565b91613b6a604094613b62865195866119d0565b808552611ab4565b601f199460209186013686840137835183519095908015613d69576001613bc09101965b6001978891010197613bb7613ba28a611ab4565b99613baf86519b8c6119d0565b808b52611ab4565b018489016121f5565b85805f9684516002815233878201523086820152606081018652613be38b611f8a565b52613bed8a611f8a565b505f925b613d25575b5050508351613c09575b50505050505090565b85809598979692980181613c1d8289611fd7565b52613c288188611fd7565b505f925b613c3b575b5085969750613c00565b8451831015613d20576001600160a01b03613cb281613c5a8689611fd7565b51511686613c68878a611fd7565b51015187815160051b9101207f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f52601c52603c5f208c613ca9888b611fd7565b510151916149ca565b15613d0857868098999a928192613cc9878a611fd7565b515116613cd68787611fd7565b52019385613ce48289611fd7565b510151613cf1868c611fd7565b52613cfc858b611fd7565b50019290989796613c2c565b8951630a57f30960e31b815260048101859052602490fd5b613c31565b9091968151881015613d60578280910197613d408184611fd7565b51613d4b8a8d611fd7565b52613d56898c611fd7565b5001919081613bf1565b96829150613bf6565b50613bc05f96613b8e565b613d7c614f6c565b60408051630782d7e160e01b81526001600160a01b03831660048201529091828260248173200e12d10bb0c5e4a17e7018f0f1161919bb93895afa928315613b39575f925f94613b045750613ac183613a21565b9091939284158215175f14613dea5750505090505f905f90565b82810192600160fd1b8082019083011760fe1c613f21575b5050613e0d81614b43565b93613e1781614b43565b94613e228682614b63565b90918215613f12575f9083986f0785ee10d5da46d900f436a000000000808611613f04575b50670de0b6b3a7640000808b11613ef5575b50633b9aca00808b11613ee6575b50612710808b11613ed8575b5098805b613ec7575081906118d8989982600a0a9109960195817fcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccd0a93838211900382610100031b9203901c170291614b76565b60019290920191600a900480613e77565b60049a04998a930192613e73565b600991939a049901915f613e67565b601291939a049901915f613e59565b85049950602592505f613e47565b509290506118d8949550614b76565b5f821215613f7557808413613f67575b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb2841315613e02579092506118d8939491614a81565b9092506118d8939491614ae8565b80841215613f31579092506118d8939491614a81565b61346582826141de565b92909180613fbb576044848460405191637a97930f60e01b835260048301526024820152fd5b90919280155f14613fd057505050505f905f90565b613fe993613fdd91614c30565b92919490938492614c30565b9093919284613ff788614b43565b9161400186614b43565b947f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000094604c918688106141a8575b030191600160ff1b98838a018112155f14614175575050035b5f955f82128061416c575b61414e575b5f81128061413c575b61411e5786820103966001600160ff1b0388149081614114575b508061410b575b80614102575b6140e45750906140989291614ddc565b915f81136140ab575b506118d893614b76565b9091604c82136140d9576140c291600a0a90613908565b9081156140cf575f6140a1565b505050505f905f90565b50505050505f905f90565b876044916040519163d556b11160e01b835260048301526024820152fd5b505f8512614088565b50828414614082565b905088145f61407b565b604489836040519163d556b11160e01b835260048301526024820152fd5b50806001600160ff1b03018213614061565b95508087018613156141665786818703015b95614058565b5f614160565b505f8113614053565b89985090920390506001600160ff1b03819003870182136141995701860194614048565b5050505050505050505f905f90565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009650604b925061402f565b8115613912570590565b8082601b82810b83146143d3577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e1000000000000000000840561437f575b8380820b0361436e57507b199999999999999999999999999999999999999999999999999999987b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc8401111561431f575b838060030b036142a3575b8084136142875750506001600160e01b036001925b60e01b91161791565b8303600a0a8015613912576001600160e01b039107159261427e565b92915f8413156142f35750906142b98383614e7e565b6142d557637ffffffe1901600a0a810290637fffffff92614269565b506044916040519163d556b11160e01b835260048301526024820152fd5b637fffffff1992830390604382136140d95761431291600a0a906141d4565b9182156140cf5792614269565b5f198401808060030b14614333575061425e565b90506001600160e01b039293507b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff915060e01b9260ff1d181617905f90565b600190940193600a90930592614211565b937f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000008405156143c0576305f5e100600894058094819201955b915050614211565b620186a0600594058094819201956143b8565b508261425e57505050505f90600190565b919291600160ff1b84016143fc576118d89350614e97565b906118d8935f03916145a8565b919291600160ff1b919080158061459657509061442591614c30565b9490929091905f86858585828213801561458d575b614570575b505050508682841860ff1c94860391039081604c0381116145555701600a0a80820591908461453b575b505081019182821860ff1c111561453357826001600160ff1b031461451557905f600192135f146144e657600a9004915b01925b811581176144aa57509190565b806144c3575b5080156144bb579190565b505f91508190565b91926144d99203600160ff1b01600a0a906141d4565b600160ff1b91905f6144b0565b600a60037fe666666666666666666666666666666666666666666666666666666666666667920104019161449a565b604490836040519163d556b11160e01b835260048301526024820152fd5b50909261449d565b8107614548575b80614469565b60ff1d600117015f614542565b505050919350614563579190565b60018160ff1d1790039190565b5f9a50909750909550600160ff1b9450925090508680808061443f565b50835f1261443a565b156145a15750509190565b9350919050565b93929193841581158181176146f9575050906145c391614c30565b91949082956145d482958294614c30565b80969294919693878684821380156146f0575b6146d7575b5050505050508682841860ff1c94860391039081604c0381116145555701600a0a8082059190846146bd575b505081019182821860ff1c11156146b557826001600160ff1b031461451557905f600192135f1461468657600a9004915b01925b8115811761465957509190565b80614669575080156144bb579190565b600160ff1b936146809291038401600a0a906141d4565b5f6144b0565b600a60037fe6666666666666666666666666666666666666666666666666666666666666679201040191614649565b50909261464c565b81076146ca575b80614618565b60ff1d600117015f6146c4565b929b5098509196509450925090505f80808080806145ec565b508584126145e7565b939593909291901561470f5750506144bb579190565b945092915050565b600881511061398b576008015167ffffffffffffffff1667ff0a89c674ee78741490565b9160408301926040614775610c15606087519401938451906001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b613dd0565b94519301614784815186612795565b61478c575050565b909350611a5391925051925183613427565b92915f9060018184145f87128715171717614818575f9280821361480a575b03604c81135f8212176147fe57600a0a90846147dc83820293846141d4565b146147f1575050156147ed575f9190565b5f90565b9093509015611a53579190565b5050156147ed575f9190565b5f95600194509250906147bd565b5050505f90565b93929190918083145f83125f8712188315871517171761486e575f928082136148615703604c81135f8212176147fe57600a0a90846147dc83820293846141d4565b91946001935091906147bd565b50919050565b919082604091031261018257815160048110156101825760209092015160ff811681036101825790565b91925f8312156148c6576044838360405191634a7d166b60e01b835260048301526024820152fd5b9192836148d857505090505f90600190565b60ff81168201918083126149a0575f831215614910575050604c1981126144bb575f03600a0a916149098382613908565b9283021490565b909293915f81135f1461499657604d811361496b57600a0a92831561391257835f190483116149425750500290600190565b60405163c849483b60e01b815260048101849052602481019290925260ff166044820152606490fd5b5060405163c849483b60e01b81526004810192909252602482015260ff919091166044820152606490fd5b5050905090600190565b60405163c849483b60e01b815260048101869052602481019190915260ff82166044820152606490fd5b9091813b614a05576149dc9192614fd5565b506149e681613a21565b1591826149f257505090565b6001600160a01b03918216911614919050565b6020918160645f935160405192630b135d3f60e11b9788855260048501526040602485015286820190604485015e8281018201859052601f01601f191601915afa905f5114601f3d11161690565b9060ff165f03916001600160ff1b0382115f14614a7957600a6001818404940192061590565b909190600190565b909392915f614a91918184613dd0565b9490945f8483019182019412159081614ade575b8115614ad4575b50614ab657505090565b604492506040519163d556b11160e01b835260048301526024820152fd5b905083125f614aac565b8281129150614aa5565b614afd93600160fe1b90810193920190613dd0565b9081815f821215614b34575050604b19821261288357614b22915f03600a0a906141d4565b9081614b2c575f90565b600160ff1b90565b93600160ff1b90910192509050565b5f811215611a5357600160ff1b90808203614b5c575090565b90505f0390565b905f198183099102908180821091030391565b92939291905f8184181215614c0b576001600160ff1b039283831115614bf557600160ff1b93838503614bab57505050509190565b90919293508514614bc5575050600a600191045f03920190565b604051630ed8062160e21b8152600481019190915260248101919091526044810182905260648101849052608490fd5b5090915050600160ff1b811461283c575f039190565b90916001600160ff1b0380841115612804578514614bc5575050600a60019104920190565b9190918015614dd257827f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000080830515614ce0575b507f19999999999999999999999999999999999999999999999999999999999999997f0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc830110614cd1575b8313614cbb5791905f90565b919060018060ff1b926001600160ff1b03030190565b9290600a02905f190192614caf565b6f4b3b4ca85a86c47a098a22400000000080840515614dc0575b507728c87cb5c89a2571ebfdcb54864ada834a00000000000000830515614da9575b7b097edd871cfda3a5697758bf0e3cbb5ac5741c640000000000000000830515614d95575b7e3899162693736ac531a5a58f1fbb4b746504382ca7e4000000000000000000830515614d8557820515614d76575b5f614c64565b9290600a02905f190192614d70565b9391606402916001190193614d41565b93916402540be40002916009190193614d41565b9391678ac7230489e8000002916012190193614d1c565b6025198301955092909202915f614cfa565b505f915081908190565b90915f198383099280830292838086109503948086039584871015614e5a5714614e52579082910960018219018216809204600280826003021880830282030280830282030280830282030280830282030280830282030280920290030293600183805f03040190848311900302920304170290565b505091500490565b60648386866040519263362ced0960e11b8452600484015260248301526044820152fd5b611a5391905f811215614e92575f0361500f565b61500f565b909291600160ff1b91828101614f295750808414614f1f57808413918215614f17578185035b604c811115614f065750505f915b15614ef757507f8000000000000000000000000000000000000000000000000000000000000001019190565b92506001600160ff1b03039190565b600a0a908115613912570491614ecb565b848203614ebd565b505090505f905f90565b93614f3692945f03614409565b80939180928114614f4a575b50505f039190565b915092506001600160ff1b03831461451557600a600191059201915f80614f42565b73200e12d10bb0c5e4a17e7018f0f1161919bb9389803b158015614faa575b614f925750565b602490604051906373e6d7b360e01b82526004820152fd5b507f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d41813f1415614f8b565b815191906041830361500557614ffe9250602082015190606060408401519301515f1a9061509e565b9192909190565b50505f9160029190565b90637ffffff581131561509857637ffffffe1981019060438213615091575f82121561506557637fffffff91505f0301600a0a7b8000000000000000000000000000000000000000000000000000000202111590565b50600a0a8015613912577b80000000000000000000000000000000000000000000000000000001041090565b5050151590565b50505f90565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411615115579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa1561022c575f516001600160a01b0381161561510b57905f905f90565b505f906001905f90565b5050505f916003919056000000000000000000000000200e12d10bb0c5e4a17e7018f0f1161919bb93890000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000044b608060405234801561000f575f80fd5b506004361061004a575f3560e01c80630782d7e11461004e57806354636d2b14610078578063b7bad1b11461009d578063f5c36eaf146100b0575b5f80fd5b61006161005c366004610363565b6100c3565b60405161006f929190610403565b60405180910390f35b61008b610086366004610363565b6100d8565b60405160ff909116815260200161006f565b6100616100ab366004610363565b6100e9565b61008b6100be366004610363565b6100f5565b5f806100cf5f84610100565b91509150915091565b5f6100e35f836101f0565b92915050565b5f806100cf5f84610281565b5f6100e35f83610356565b73ffffffffffffffffffffffffffffffffffffffff81165f9081526020838152604080832081518083019092525460ff8082161515835261010090910416818301527f313ce56700000000000000000000000000000000000000000000000000000000808452839283908190816004818a5afa915060203d1015610182575f91505b811561019857505f5160ff811115610198575f91505b816101af57505050602001516003925090506101e9565b83516101c3575f955093506101e992505050565b836020015160ff1681146101d85760026101db565b60015b846020015195509550505050505b9250929050565b5f805f6101fd8585610281565b909250905060018260038111156102165761021661039d565b1415801561023557505f8260038111156102325761023261039d565b14155b156102795783826040517fee07877f000000000000000000000000000000000000000000000000000000008152600401610270929190610421565b60405180910390fd5b949350505050565b5f805f8061028f8686610100565b90925090505f8260038111156102a7576102a761039d565b0361034b576040805180820182526001815260ff838116602080840191825273ffffffffffffffffffffffffffffffffffffffff8a165f908152908b9052939093209151825493517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009094169015157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff161761010093909116929092029190911790555b909590945092505050565b5f805f6101fd8585610100565b5f60208284031215610373575f80fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114610396575f80fd5b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b600481106103ff577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b9052565b6040810161041182856103ca565b60ff831660208301529392505050565b73ffffffffffffffffffffffffffffffffffffffff831681526040810161039660208301846103ca56000000000000000000000000000000000000000000"; + hex"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000051e00000000000000000000000007900fd69e0785195f6e4622e3138146c4cc4abd2000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000051216080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a7146117cc575080631f69cb751461156f5780632cb77e9f146115435780632fbc4ba0146113f957806341d1514f146113c25780635cffe9de1461126657806360746119146110e2578063613255ab1461105f57806369c7285614610771578063709fb8a5146104375780639235084d146103e3578063ac9650d814610295578063d5708b46146101fa578063d7e442ec146101765763d9d98ce4146100c1575f80fd5b3461015f57604036600319011261015f576001600160a01b036100e2611850565b166040516370a0823160e01b8152306004820152602081602481855afa90811561016b575f91610135575b501561011d5760206040515f8152f35b60249060405190633c5bf76960e21b82526004820152fd5b90506020813d602011610163575b81610150602093836119d0565b8101031261015f57515f61010d565b5f80fd5b3d9150610143565b6040513d5f823e3d90fd5b3461015f57602036600319011261015f5760043567ffffffffffffffff811161015f576101ce6101ad6101d492369060040161181f565b91906101b76126cc565b604051926101c4846119b4565b5f84523691611ddb565b90612b64565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b3461015f5761014036600319011261015f5767ffffffffffffffff60043581811161015f5761022d903690600401611b61565b60243582811161015f57610245903690600401611b61565b60c036604319011261015f576101043583811161015f5761026a903690600401611d07565b906101243593841161015f576102876101d4943690600401611d07565b926102906126cc565b612211565b3461015f5760208060031936011261015f5760043567ffffffffffffffff811161015f576102c790369060040161181f565b9190604051926102d6846119b4565b5f84528284016102e582611ab4565b946102f360405196876119d0565b8286526102ff83611ab4565b9361031186880195601f1901866121f5565b5f5b84811061037557604080518881528951818a018190525f92600582901b83018101918a918c9085015b8287106103495785850386f35b909192938280610365600193603f198a820301865288516118dc565b960192019601959291909261033c565b806103c4886103be61039160019560059d9c9d1b8701876120f1565b929089846040519586938585013782018381015f81528b519283915e015f838201520380845201826119d0565b30613991565b6103ce828a611fd7565b526103d98189611fd7565b5001969596610313565b3461015f5760031960203682011261015f576004359067ffffffffffffffff821161015f57608090823603011261015f57610422606091600401612139565b90604051921515835260208301526040820152f35b3461015f5760031960403682011261015f5760043567ffffffffffffffff80821161015f5760c08260040193833603011261015f5760243590811161015f5761048490369060040161181f565b9061048d6126cc565b6104be6104b96104b46104ad6104a38880612124565b60408101906120f1565b36916119f2565b613927565b61397c565b801561075f576001101561074d57602483016104da8186611f44565b90501561073b5760448401946104f08682611f44565b9050156107295761055661051e9661054a61051561050e8580612124565b9585611f44565b99909285611f44565b91909261053b6040519761053189611900565b3389523690611a56565b9a60209b8c8901523691611acc565b60408601523691611acc565b60608301526064850135608083015261056e8261270e565b91825f525f875260405f209586541596876105b2575b888860017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055604051908152f35b6001905560a46001600160a01b03917f87491344dfbcf91f6cbbc610cbbeedc85313d37a02df0c93527f7ea5f8db717f83855116604051908152878c8201526060604082015280610606606082018861203f565b0390a1019161061583856120f1565b9050610679575b5050505061066d929161066561064e6101ce933390919060405192600284526020840152604083015260608201604052565b906040519160018352602083015260408201604052565b923691611ddb565b82808080808080610584565b6106866104ad84866120f1565b61068f81614718565b156107025750937fd46c2c56b35c8210e9e712ec3f02242d5fc90187c0ac8ed80cc33626846ec3698961066d9897956106f56106d86106659761064e976101ce9b5116936120f1565b866040519586958652850152606060408501526060840191611d36565b0390a1938395965061061c565b89610725604051928392630c89984b60e31b8452600484015260248301906118dc565b0390fd5b60405163540e5f0b60e01b8152600490fd5b604051636c44ef8f60e01b8152600490fd5b604051633c8270bd60e21b8152600490fd5b604051632cff108b60e21b8152600490fd5b3461015f5760031960203682011261015f5767ffffffffffffffff6004351161015f5760c0906004353603011261015f576107aa6126cc565b5f80806107bf60048035608481019101611e8d565b90501561104d5760246004350135926107d784612773565b1561103b576060806040516107eb81611968565b6107f3611ee2565b81525f60208201525f6040820152015261080b611ee2565b5061086b61086661084561083b61083561082f608460043501600435600401611e8d565b90611f14565b80611f2f565b6040810190611f44565b602061085e61082f608460043501600435600401611e8d565b013591611f7a565b611d22565b936001600160a01b036108ba6108666108a161089761083561082f608460043501600435600401611e8d565b6060810190611f44565b604061085e61082f608460043501600435600401611e8d565b81604051976108c889611930565b16875216602086015260408501526108ea608460043501600435600401611e8d565b9490506001604051950160051b85016040525f905f5b610914608460043501600435600401611e8d565b9050811080611028575b15610e7557610937608460043501600435600401611e8d565b821015610e61578160051b810135607e198236030181121561015f57608081830136031261015f576040519161096c83611968565b8181013567ffffffffffffffff811161015f5761098e90369084840101611b61565b835280820160208181013590850152604080820135908501526060013567ffffffffffffffff811161015f576109c79236920101611d07565b606082015280516001600160a01b036109e96040830151602085015190611fd7565b5151166001600160a01b0385511614801590610e2d575b610e1b57610a1860208301516040840151908361305d565b610a218161270e565b91825f525f60205260405f2054155f14610a85575051604080513381526001600160a01b039092166020830152810191909152600191907fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f390606090a15b01610900565b9190610ab6602084979597015160408501519060608601519060405192610aab846119b4565b5f8452339186613092565b925f93610ace60608201516044600435013590612796565b15610b3557505051604080513381526001600160a01b03909216602083015281019190915260019291907fe3151dc8cb7a54ffc4baabd28c1f241c94d510b5e5b502491ac3cad6c16316d590606090a15b8115610b2d575b5092610a7f565b905088610b26565b610b426040820151612773565b158015610e08575b15610b9f57505051604080513381526001600160a01b03909216602083015281019190915260019291907f500b713857325f9e6dcb52ae832eca9109d107ed1aae9cb4928b4c1e13f051aa90606090a1610b1f565b9250925050600196959691610bb8606460043501611feb565b15610d755796610c2897610c3860408401516040880151610bd98183613401565b15610d6d5750925b610c32848592610c1b610c1560608a01516001600160e01b03601b918660e01d92828816810b928260e01d9216900b613dd1565b90613f8c565b9d8e9260408d01516134cc565b60408c01526134f6565b996134f6565b98610c438484613520565b610c4d848261357e565b60405192338452608060208501526060610c73845160808088015261010087019061203f565b93602081015160a0870152604081015160c0870152015192607f198582030160e0860152835180825260208201906020808260051b8501019601925f5b828110610d0f57505050505092806001979695937f194f1feb3b4d7076a2c272e774e792e0c48bb8c7aa1a9a3671c1cd6da9e6b4c193610d0a96604084015260608301520390a180858c5101808d5260051b8c0152613690565b610b1f565b9091929396602080610d60600193601f198782030189528b51906001600160a01b0382511681526040610d4f8584015160608785015260608401906120be565b9201519060408184039101526118dc565b9901950193929101610cb0565b905092610be1565b610c2890610c386060840151610c32610db3610c1560408801516001600160e01b0394601b90868360e01d9316820b91878260e01d9216900b613dd1565b60408a0151610dc28183613401565b15610e005750915b829c8d916060890151908116155f14610df1575060408801515b96879460408d01516134cc565b610dfb9085613428565b610de4565b905091610dca565b50610e1660608201516133de565b610b4a565b60405163936bb5ad60e01b8152600490fd5b506001600160a01b03610e496060830151604085015190611fd7565b5151166001600160a01b036020860151161415610a00565b634e487b7160e01b5f52603260045260245ffd5b50919390610e87606460043501611feb565b1561102257835b6004356004013590610ea08282613401565b6110045750508490610ec0856001600160a01b0360208701511633612ff4565b505060a46004350190610ed8826004356004016120f1565b905015159081610ffc575b50610f5b575b506001600160a01b03610eff92935116336127bd565b50505b8351811015610f275780610f21610f1b60019387611fd7565b51613869565b01610f02565b5060409160017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005582519182526020820152f35b90506001600160a01b03602084015116610f856001600160a01b03855116926004356004016120f1565b929091333b1561015f57610fcd5f93604051958694859463691f9ed760e01b8652600486015260248501528960448501528a606485015260a0608485015260a4840191611d36565b038183335af190811561016b57859115610ee9579050610fed9150611984565b5f836001600160a01b03610ee9565b905088610ee3565b604492506040519163573b6f4160e01b835260048301526024820152fd5b84610e8e565b506110366040830151612773565b61091e565b60405163315f9e2360e21b8152600490fd5b604051639c95219f60e01b8152600490fd5b3461015f5760208060031936011261015f576024816001600160a01b03611084611850565b16604051928380926370a0823160e01b82523060048301525afa90811561016b575f916110b5575b50604051908152f35b90508181813d83116110db575b6110cc81836119d0565b8101031261015f5751826110ac565b503d6110c2565b3461015f576110f036611890565b92916110fd9491946126cc565b61110883833361273f565b61111181612773565b15611235578160ff91611129856111ec969533612d27565b6111338183613401565b1561122f575080935b61114885828533612f96565b917f8045c25080b0868951141ed0a91720bcad09a8364a2b3109ee1fd49c1f0bc8b860c0611177898833612ff4565b97906001600160a01b0360405192338452169a8b6020840152856040840152886060840152608083015260a0820152a16040519660068852602088015260408701526060860152608085015260a08401521660c082015260e08101604052906040519160018352602083015260408201604052565b90806112185760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b611227926101ce913691611ddb565b8080806101d4565b9361113c565b50604051623a3a4d60e21b81523360048201526001600160a01b039190911660248201526044810191909152606490fd5b3461015f57608036600319011261015f576004356001600160a01b039081811680910361015f57611295611866565b6044359167ffffffffffffffff9160643583811161015f573660238201121561015f57806004013593841161015f57366024858301011161015f576113229560209216936112e4868587612eb7565b60405196879283926323e30c8b60e01b84523360048501528760248501528860448501525f606485015260a06084850152602460a485019201611d36565b03815f855af193841561016b575f9461138e575b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd984036113755761136a93503091612f30565b602060405160018152f35b604051630b6c58a960e31b815260048101859052602490fd5b9093506020813d6020116113ba575b816113aa602093836119d0565b8101031261015f57519284611336565b3d915061139d565b3461015f57606036600319011261015f5760206113f16113e0611850565b6113e8611866565b60443591612d27565b604051908152f35b3461015f5761140736611890565b928094926114136126cc565b61141e82853361273f565b61142781612773565b15611513578061143b61148a9286336127bd565b9790957f7f9dfa19cf1cc2f806f2f860fbc9c056b601fb1afc0e9b843dfe5c63616268e660806040513381526001600160a01b038416998a60208301528560408301526060820152a133612863565b939091856114b85760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b611507966101ce956106659460ff93604051956005875260208701526040860152606085015260808401521660a082015260c08101604052906040519160018352602083015260408201604052565b808080808080806101d4565b506040516306dde9c360e41b81523360048201526001600160a01b03841660248201526044810191909152606490fd5b3461015f57602036600319011261015f576004355f525f6020526020600160405f205414604051908152f35b3461015f5760031960403682011261015f5767ffffffffffffffff9060043582811161015f57806004019160a08236039182011261015f5760243584811161015f576115bf90369060040161181f565b90936115c96126cc565b5f946001600160a01b0394856115de84611d22565b1633036117aa576115f76115f23685611b61565b61270e565b805f525f60205260405f2096600188541461163e575b60208960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556040519015158152f35b9091929394959697505f6001985560405196338852826020890152606060408901528161166a8761187c565b1660608901526024840135906062190181121561015f5783019060a06080890152806116986004840161187c565b166101008901526116ab6024830161187c565b1661012088015260448101356022198236030181121561015f57019060246004830135920198821161015f57813603891361015f577f09d18501db0080ca2d6cd7c17fa7255daff4b2d503ea93b76ff68b6752ea8e6387806106659560846117736101ce9a60209f6117329061179d9f9a606061014061064e9d0152610160880191611d36565b6117646117596117456044880185611d56565b605f198a8603810160a08c01529491611d8b565b926064870190611d56565b918784030160c0880152611d8b565b91013560e08301520390a13390919060405192600284526020840152604083015260608201604052565b828080808080808061160d565b6024866117b685611d22565b6040516335252be360e01b815291166004820152fd5b3461015f57602036600319011261015f576004359063ffffffff60e01b821680920361015f5760209163e414309160e01b811490811561180e575b5015158152f35b6301ffc9a760e01b14905083611807565b9181601f8401121561015f5782359167ffffffffffffffff831161015f576020808501948460051b01011161015f57565b600435906001600160a01b038216820361015f57565b602435906001600160a01b038216820361015f57565b35906001600160a01b038216820361015f57565b90608060031983011261015f576004356001600160a01b038116810361015f579160243591604435916064359067ffffffffffffffff821161015f576118d89160040161181f565b9091565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b60a0810190811067ffffffffffffffff82111761191c57604052565b634e487b7160e01b5f52604160045260245ffd5b6060810190811067ffffffffffffffff82111761191c57604052565b6040810190811067ffffffffffffffff82111761191c57604052565b6080810190811067ffffffffffffffff82111761191c57604052565b67ffffffffffffffff811161191c57604052565b60e0810190811067ffffffffffffffff82111761191c57604052565b6020810190811067ffffffffffffffff82111761191c57604052565b90601f8019910116810190811067ffffffffffffffff82111761191c57604052565b92919267ffffffffffffffff821161191c5760405191611a1c601f8201601f1916602001846119d0565b82948184528183011161015f578281602093845f960137010152565b9080601f8301121561015f57816020611a53933591016119f2565b90565b919060608382031261015f5760405190611a6f82611930565b8193611a7a8161187c565b8352611a886020820161187c565b602084015260408101359167ffffffffffffffff831161015f57604092611aaf9201611a38565b910152565b67ffffffffffffffff811161191c5760051b60200190565b929192611ad882611ab4565b604092611ae860405192836119d0565b819581835260208093019160061b84019381851161015f57915b848310611b1157505050505050565b858383031261015f578386918251611b288161194c565b611b318661187c565b81528286013583820152815201920191611b02565b9080601f8301121561015f57816020611a5393359101611acc565b91909160a08184031261015f5760405190611b7b82611900565b8193611b868261187c565b835267ffffffffffffffff91602081013583811161015f5782611baa918301611a56565b6020850152604081013583811161015f5782611bc7918301611b46565b6040850152606081013592831161015f57611be86080939284938301611b46565b60608501520135910152565b909291611c0084611ab4565b916040611c1060405194856119d0565b839580855260208095019160059160051b84019480861161015f5784935b868510611c3f575050505050505050565b67ffffffffffffffff90853582811161015f5787019060608285031261015f578451611c6a81611930565b611c738361187c565b81528a83013584811161015f57830185601f8201121561015f57803590611c9982611ab4565b91611ca6895193846119d0565b8083528d808401918b1b8301019188831161015f578e809101915b838310611cf757509150508201528583013593841161015f57611ce8858c95869501611a38565b86820152815201940193611c2e565b82358152918101918f9101611cc1565b9080601f8301121561015f57816020611a5393359101611bf4565b356001600160a01b038116810361015f5790565b908060209392818452848401375f828201840152601f01601f1916010190565b9035601e198236030181121561015f57016020813591019167ffffffffffffffff821161015f578160061b3603831361015f57565b9190808252602080920192915f905b828210611da8575050505090565b909192936001906001600160a01b03611dc08761187c565b16815285830135838201526040908101950193920190611d9a565b90929192611de881611ab4565b91604091611df960405194856119d0565b839581855260208095019160051b83019381851161015f5783925b858410611e245750505050505050565b67ffffffffffffffff90843582811161015f57860190838286031261015f578351611e4e8161194c565b823584811161015f5786611e63918501611a56565b81528983013593841161015f57611e7e868b95869501611d07565b83820152815201930192611e14565b903590601e198136030182121561015f570180359067ffffffffffffffff821161015f57602001918160051b3603831361015f57565b60405190611ed082611930565b60606040835f81525f60208201520152565b60405190611eef82611900565b5f608083828152611efe611ec3565b6020820152606060408201526060808201520152565b9015610e6157803590607e198136030182121561015f570190565b903590609e198136030182121561015f570190565b903590601e198136030182121561015f570180359067ffffffffffffffff821161015f57602001918160061b3603831361015f57565b9190811015610e615760061b0190565b805115610e615760200190565b805160011015610e615760400190565b805160021015610e615760600190565b805160031015610e615760800190565b805160041015610e615760a00190565b8051821015610e615760209160051b010190565b35801515810361015f5790565b9081518082526020808093019301915f5b828110612017575050505090565b835180516001600160a01b031686528201518583015260409094019392810192600101612009565b906080806120b56120a361209160406001600160a01b0380895116885260208901519060a060208a01528082511660a08a015260208201511660c08901520151606060e08801526101008701906118dc565b60408701518682036040880152611ff8565b60608601518582036060870152611ff8565b93015191015290565b9081518082526020808093019301915f5b8281106120dd575050505090565b8351855293810193928101926001016120cf565b903590601e198136030182121561015f570180359067ffffffffffffffff821161015f5760200191813603831361015f57565b903590605e198136030182121561015f570190565b6121506115f26121498380611f2f565b3690611b61565b5f525f602052600160405f2054036121ec5780612170816121dc93611f2f565b6121d461218f6121946020850135938460408701359384923690611b61565b61305d565b6121ac6121a18580611f2f565b946060810190611e8d565b92906121cc604051966121be886119b4565b5f88525f3681373690611b61565b933691611bf4565b923392613092565b6040810151606090910151600192565b505f905f905f90565b5f5b82811061220357505050565b6060828201526020016121f7565b92916001600160a01b038451166001600160a01b03835116146126ba576001600160a01b03612247606086015160643590611fd7565b515116906040830151916001600160a01b036122666084358095611fd7565b5151161480159061267a575b610e1b576040850151906001600160a01b036122916044358094611fd7565b5151166001600160a01b036122ac60643560608a0151611fd7565b51511614612668576122bd8661270e565b805f525f60205260405f20541561261557506122d88461270e565b805f525f60205260405f2054156125c157506123bb9291612395917f6fa7f4c28634b0a9d6831401c45ae468195fb63aed07308935c35374ff5d9e396040518061234061233261012033845280602085015283018d61203f565b82810360408401528a61203f565b85606083015260643560808301528760a083015260a43560c083015260c43560e083015260e4356101008301520390a16001600160a01b0386511660405192612388846119b4565b5f8452606435908a613092565b936001600160a01b03865116604051926123ae846119b4565b5f845260a4359086613092565b916123c96040820151612773565b1580156125ad575b801561259a575b8015612587575b61257557604051916123f083611968565b5f83525f60208401525f60408401525f606084015261240f848361473c565b84526040840152612435612423838661473c565b602086015280606086015284516134cc565b9461244960208501516040860151906134cc565b93612453876133de565b8015612566575b6125545761251b61254d957fd9fa84dd790c969daa5c33d8050dc06b4a9b59d5b42e2be5f5e8ae20447f618d946124fd6125529a60a09661249c8a8851613520565b6124aa8c6020890151613520565b6124b88a604089015161357e565b6124c68c606089015161357e565b6124cf8a613869565b6124d88c613869565b6001600160a01b036124f460c435926060606435910151611fd7565b51511633612863565b50506001600160a01b036124f460e43592606060a435910151611fd7565b5050606060405191338352805160208401526020810151604084015260408101518284015201516080820152a1613690565b613690565b565b604051630d86822160e01b8152600490fd5b50612570856133de565b61245a565b6040516321badf1f60e01b8152600490fd5b5061259560608401516133de565b6123df565b506125a860608201516133de565b6123d8565b506125bb6040840151612773565b156123d1565b9351604080513381526001600160a01b039092166020830152810194909452507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f3945091925082915050606081015b0390a1565b9551604080513381526001600160a01b039092166020830152810196909652507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f394935083925050606082019050612610565b604051631cd2f1c760e21b8152600490fd5b506001600160a01b03612694606085015160a43590611fd7565b5151166001600160a01b036126b0604088015160443590611fd7565b5151161415612272565b604051630a98f1f360e21b8152600490fd5b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0060028154146126fc5760029055565b604051633ee5aeb560e01b8152600490fd5b6040516127398161272b602082019460208652604083019061203f565b03601f1981018352826119d0565b51902090565b90911561274a575050565b6040516305dbdfd960e41b81526001600160a01b03918216600482015291166024820152604490fd5b612792905f60e01d906001600160e01b038160e01d9116601b0b61479f565b1290565b90612792916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614820565b9291926127c982613a64565b936127d3816133de565b6128515784816001600160e01b036127f29360e01d9116601b0b61489f565b9290809315612828575b5082908161280c575b5050509190565b612820926001600160a01b03309216612f30565b5f8181612805565b9092505f19811461283d57600101915f6127fc565b634e487b7160e01b5f52601160045260245ffd5b604051632eaefac360e21b8152600490fd5b93929193612870836133de565b61290e578461288c57612884939450612ff4565b50505f905f90565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f5281526128c9835f205494856134f6565b956128d3876133de565b6128f6575f97885260018252838820908852815282872091875252909320829055565b835163c5e12af560e01b815260048101889052602490fd5b60405163793a8f5560e01b815260048101849052602490fd5b919060408382031261015f57825167ffffffffffffffff9081811161015f5784019082601f8301121561015f57815160209261296282611ab4565b9161297060405193846119d0565b808352848084019160051b8301019186831161015f5785809101915b8383106129ff5750505050948281015191821161015f57019180601f8401121561015f5782516129bb81611ab4565b936129c960405195866119d0565b818552838086019260051b82010192831161015f578301905b8282106129f0575050505090565b815181529083019083016129e2565b825181529181019186910161298c565b90808251908181526020809101926020808460051b8301019501935f915b848310612a3d5750505050505090565b9091929394958480612a5b600193601f198682030187528a516120be565b9801930193019194939290612a2d565b91906020928381526001600160a01b0382511684820152838201516040820152612aa5604083015160e060608401526101008301906118dc565b9060608301516080820152612acc608084015192601f1993848483030160a0850152612a0f565b9260a081015193838382030160c08401528680865192838152019501905f5b818110612b0f57505050611a5394955060c060e091015192828503019101526120be565b825187529588019591880191600101612aeb565b90604082019082526020606081936040838201528551809452019301915f5b828110612b50575050505090565b835185529381019392810192600101612b42565b919091335f526020308152604091825f2091835195612b828761194c565b612b8a611ec3565b875260608281980152845190612b9f826119b4565b5f8252855190612bae826119b4565b5f82525f3681375f5b8151811015612d1b57898688612bcd8486611fd7565b51888151948d80870151908151612bef575b5050505050505050600101612bb7565b905f92916001600160a01b0396612c148887818d51169c015116998789015190613b43565b95825199612c218b611998565b8a5289015287015285015260808401528760a08401528660c08401525f8c51809563d04dfe2360e01b82528180612c5c600498898301612a6b565b03915afa938415612d11579089915f95612ceb575b508451612c87575b50899250808e8c938e612bdf565b5101511691823b1561015f57612cb5925f92838d5180968195829463012c676d60e21b845233908401612b23565b03925af18015612ce1579060019291612cd2575b81928782612c79565b612cdb90611984565b5f612cc9565b89513d5f823e3d90fd5b612d089195503d805f833e612d0081836119d0565b810190612927565b9050935f612c71565b8c513d5f823e3d90fd5b50505050505050509050565b8215612d5c576001600160a01b038091165f52600160205260405f2091165f5260205260405f20905f5260205260405f205490565b909150612d6882613d75565b6001600160a01b03809316906040918251946370a0823160e01b86528416938460048701526020928387602481865afa968715612e7e575f97612e88575b5083612dbf612db883612def9a614a54565b50906141df565b508651636eb1769f60e11b81526001600160a01b0390941660048501523060248501529297889081906044820190565b0381865afa968715612e7e575f97612e4d575b50612db8612e1391611a5398614a54565b50612e1e8183613401565b15612e455750935b5f5260018252825f20905f528152815f20905f8052525f2054906134f6565b905093612e26565b96508387813d8311612e77575b612e6481836119d0565b8101031261015f57955195612db8612e02565b503d612e5a565b85513d5f823e3d90fd5b96508387813d8311612eb0575b612e9f81836119d0565b8101031261015f5795519583612da6565b503d612e95565b6040519263a9059cbb60e01b5f526001600160a01b0380931660045260245260205f60448180855af160015f5114811615612f11575b8360405215612efb57505050565b635274afe760e01b835216600482015260249150fd5b6001811516612f2757813b15153d151616612eed565b833d5f823e3d90fd5b9092604051936323b872dd60e01b5f526001600160a01b0393848092166004521660245260445260205f60648180855af160015f5114811615612f80575b836040525f60605215612efb57505050565b6001811516612f2757813b15153d151616612f6e565b93929193612fa3836133de565b61290e5784612fb7576128849394506127bd565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f5281526128c9835f205494856134cc565b9092919261300181613a64565b9361300b816133de565b61304b5784816001600160e01b0361302a9360e01d9116601b0b61489f565b50809281613039575050509190565b6001600160a01b036128209316612eb7565b604051632d1671a360e11b8152600490fd5b9161308890606061307d936001600160a01b039485916040880151611fd7565b515116940151611fd7565b5151161461266857565b94919392909260408051916130a683611998565b6130ae611ee2565b83526020925f848201525f838201526060945f868301528560c06080938260808201525f60a082015201528351916130e583611900565b600483525f5b8181106133cf5750506132d8959493925f9261320f61325f938d61310e8161270e565b9c896001600160a01b039e8f94859182865116908d5194600386528501528c840152168c820152608081018a5261314486611f8a565b5261314e85611f8a565b50885161315a81611930565b6002815289368c83013761316d86611f97565b5261317785611f97565b5060ff8a6131da8b8501936131c48761319d81613195858a51611fd7565b515116613d75565b975116886131ac848951611fd7565b515116856131bb858a51611fd7565b51015191612d27565b966131d0828751611fd7565b5151169451611fd7565b51015192169093929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b61321882611fa7565b5261322281611fa7565b506132468a8d8d60ff8a6131da8d8501936131c48761319d81613195858a51611fd7565b61324f82611fb7565b5261325981611fb7565b50613b43565b95878a511697848b0191825191868184511693015116928a85523087528580862091510151865191613290836119b4565b86835287519561329f87611998565b86528886015286850152848885015289608085015260a084015260c08301528351808098819463d04dfe2360e01b835260048301612a6b565b03915afa9687156133c5575f945f986133a3575b5084516002811061338c5750818386015195015161331261330c88611fc7565b51611fb7565b5161331d8183613401565b156133845750925b6133478685919060405192600284526020840152604083015260608201604052565b61335088611fa7565b5261335a87611fa7565b508251996133678b611998565b8a52890152870152850152608084015260a083015260c082015290565b905092613325565b602490835190630fbb8e5560e21b82526004820152fd5b9097506133bb9194503d805f833e612d0081836119d0565b939093965f6132ec565b50513d5f823e3d90fd5b808888809387010152016130eb565b6133fd905f60e01d906001600160e01b038160e01d9116601b0b61479f565b1390565b906133fd916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614820565b61344f6001600160e01b0392838316601b0b9260e01d938160e01d9116601b0b8484613f96565b90637ffffff5821361349f575b90613466916141df565b9290921580613497575b61347957505090565b6044925060405191638eba4d0760e01b835260048301526024820152fd5b508215613470565b6134a98282614e7f565b1561345c57604483856040519163d556b11160e01b835260048301526024820152fd5b611a5391610c15916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6143e5565b611a5391610c15916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6145a9565b61357a91608081018261353c6135368351611fc7565b51611fc7565b5261357361356d6001600160a01b0380945151169361356461355e8551611fc7565b51611f8a565b51169251611fc7565b51611fa7565b5191612f96565b5050565b906080810191806135926135368551611fb7565b526001600160a01b038092515116916135ae61355e8551611fb7565b51166135bd61356d8551611fb7565b519081613658576135cd836133de565b61290e579183917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a9593612610955f5260209060018252613623604094855f20835f528452855f20855f528452855f20546134f6565b945f5260018252835f20905f528152825f20915f52525f20555b51604051918291338352604060208401526040830190612a0f565b91613689917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a959361261095612863565b505061363d565b60c0810151908151915f92613804575b506137456020918281510151926001600160a01b039081818187511696015116928660a082019485518252308452604097888320898686510151015160808601518b51916136ed836119b4565b8683528c51936136fc856119b4565b8785528d519661370b88611998565b8752898701528c86015260016060860152608085015260a084015260c08301528851808099819463d04dfe2360e01b835260048301612a6b565b03915afa9485156137fa5787956137dc575b508451613768575b50505050505050565b81905101510151169051813b156137d85791849184938361379d965180978195829463012c676d60e21b845260048401612b23565b03925af19081156137cf57506137b8575b808080808061375f565b6137c28291611984565b6137cc57806137ae565b80fd5b513d84823e3d90fd5b8480fd5b6137f19195503d8089833e612d0081836119d0565b9050935f613757565b86513d89823e3d90fd5b6001600160a01b03602080845101510151169060a083015190823b1561015f57613847925f928360405180968195829463012c676d60e21b845260048401612b23565b03925af1801561016b57156136a057613861919250611984565b5f905f6136a0565b6080810161387a61356d8251611fb7565b5191821561388757505050565b6138a161355e6001600160a01b0380935151169351611fb7565b5116815f5260209160018352604092835f20835f528152835f20855f528152835f2054936001600160e01b0385166138dc575b505050505050565b613900955f9284845260018152828420868552815282842091845252812055612ff4565b5f8080806138d4565b8115613913570490565b634e487b7160e01b5f52601260045260245ffd5b604081511061396f576020810151908051603f19810190811161283d5760051c821161395b5760016020920160051b010190565b5050604051613969816119b4565b5f815290565b50604051613969816119b4565b80511561398c57602001515f1a90565b505f90565b905f8091602081519101845af48080613a0f575b156139c55750506040513d81523d5f602083013e60203d82010160405290565b156139ec57604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b3d156139fd576040513d5f823e3d90fd5b60405163d6bda27560e01b8152600490fd5b503d1515806139a55750813b15156139a5565b60041115613a2c57565b634e487b7160e01b5f52602160045260245ffd5b602090939291936001600160a01b036040820195168152613a6083613a22565b0152565b613a6c614f6d565b6040805163b7bad1b160e01b81526001600160a01b0383166004820152909182826024815f73200e12d10bb0c5e4a17e7018f0f1161919bb93895af1928315613b3a575f925f94613b05575b50613ac283613a22565b600183141580613af3575b613ad75750505090565b5163ee07877f60e01b8152918291610725919060048401613a40565b50613afd83613a22565b821515613acd565b90809450613b299293503d8511613b33575b613b2181836119d0565b810190614875565b919091925f613ab8565b503d613b17565b513d5f823e3d90fd5b90805191613b5083611ab4565b91613b6b604094613b63865195866119d0565b808552611ab4565b601f199460209186013686840137835183519095908015613d6a576001613bc19101965b6001978891010197613bb8613ba38a611ab4565b99613bb086519b8c6119d0565b808b52611ab4565b018489016121f5565b85805f9684516002815233878201523086820152606081018652613be48b611f8a565b52613bee8a611f8a565b505f925b613d26575b5050508351613c0a575b50505050505090565b85809598979692980181613c1e8289611fd7565b52613c298188611fd7565b505f925b613c3c575b5085969750613c01565b8451831015613d21576001600160a01b03613cb381613c5b8689611fd7565b51511686613c69878a611fd7565b51015187815160051b9101207f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f52601c52603c5f208c613caa888b611fd7565b510151916149cb565b15613d0957868098999a928192613cca878a611fd7565b515116613cd78787611fd7565b52019385613ce58289611fd7565b510151613cf2868c611fd7565b52613cfd858b611fd7565b50019290989796613c2d565b8951630a57f30960e31b815260048101859052602490fd5b613c32565b9091968151881015613d61578280910197613d418184611fd7565b51613d4c8a8d611fd7565b52613d57898c611fd7565b5001919081613bf2565b96829150613bf7565b50613bc15f96613b8f565b613d7d614f6d565b60408051630782d7e160e01b81526001600160a01b03831660048201529091828260248173200e12d10bb0c5e4a17e7018f0f1161919bb93895afa928315613b3a575f925f94613b055750613ac283613a22565b9091939284158215175f14613deb5750505090505f905f90565b82810192600160fd1b8082019083011760fe1c613f22575b5050613e0e81614b44565b93613e1881614b44565b94613e238682614b64565b90918215613f13575f9083986f0785ee10d5da46d900f436a000000000808611613f05575b50670de0b6b3a7640000808b11613ef6575b50633b9aca00808b11613ee7575b50612710808b11613ed9575b5098805b613ec8575081906118d8989982600a0a9109960195817fcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccd0a93838211900382610100031b9203901c170291614b77565b60019290920191600a900480613e78565b60049a04998a930192613e74565b600991939a049901915f613e68565b601291939a049901915f613e5a565b85049950602592505f613e48565b509290506118d8949550614b77565b5f821215613f7657808413613f68575b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb2841315613e03579092506118d8939491614a82565b9092506118d8939491614ae9565b80841215613f32579092506118d8939491614a82565b61346682826141df565b92909180613fbc576044848460405191637a97930f60e01b835260048301526024820152fd5b90919280155f14613fd157505050505f905f90565b613fea93613fde91614c31565b92919490938492614c31565b9093919284613ff888614b44565b9161400286614b44565b947f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000094604c918688106141a9575b030191600160ff1b98838a018112155f14614176575050035b5f955f82128061416d575b61414f575b5f81128061413d575b61411f5786820103966001600160ff1b0388149081614115575b508061410c575b80614103575b6140e55750906140999291614ddd565b915f81136140ac575b506118d893614b77565b9091604c82136140da576140c391600a0a90613909565b9081156140d0575f6140a2565b505050505f905f90565b50505050505f905f90565b876044916040519163d556b11160e01b835260048301526024820152fd5b505f8512614089565b50828414614083565b905088145f61407c565b604489836040519163d556b11160e01b835260048301526024820152fd5b50806001600160ff1b03018213614062565b95508087018613156141675786818703015b95614059565b5f614161565b505f8113614054565b89985090920390506001600160ff1b038190038701821361419a5701860194614049565b5050505050505050505f905f90565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009650604b9250614030565b8115613913570590565b8082601b82810b83146143d4577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000008405614380575b8380820b0361436f57507b199999999999999999999999999999999999999999999999999999987b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc84011115614320575b838060030b036142a4575b8084136142885750506001600160e01b036001925b60e01b91161791565b8303600a0a8015613913576001600160e01b039107159261427f565b92915f8413156142f45750906142ba8383614e7f565b6142d657637ffffffe1901600a0a810290637fffffff9261426a565b506044916040519163d556b11160e01b835260048301526024820152fd5b637fffffff1992830390604382136140da5761431391600a0a906141d5565b9182156140d0579261426a565b5f198401808060030b14614334575061425f565b90506001600160e01b039293507b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff915060e01b9260ff1d181617905f90565b600190940193600a90930592614212565b937f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000008405156143c1576305f5e100600894058094819201955b915050614212565b620186a0600594058094819201956143b9565b508261425f57505050505f90600190565b919291600160ff1b84016143fd576118d89350614e98565b906118d8935f03916145a9565b919291600160ff1b919080158061459757509061442691614c31565b9490929091905f86858585828213801561458e575b614571575b505050508682841860ff1c94860391039081604c0381116145565701600a0a80820591908461453c575b505081019182821860ff1c111561453457826001600160ff1b031461451657905f600192135f146144e757600a9004915b01925b811581176144ab57509190565b806144c4575b5080156144bc579190565b505f91508190565b91926144da9203600160ff1b01600a0a906141d5565b600160ff1b91905f6144b1565b600a60037fe666666666666666666666666666666666666666666666666666666666666667920104019161449b565b604490836040519163d556b11160e01b835260048301526024820152fd5b50909261449e565b8107614549575b8061446a565b60ff1d600117015f614543565b505050919350614564579190565b60018160ff1d1790039190565b5f9a50909750909550600160ff1b94509250905086808080614440565b50835f1261443b565b156145a25750509190565b9350919050565b93929193841581158181176146fa575050906145c491614c31565b91949082956145d582958294614c31565b80969294919693878684821380156146f1575b6146d8575b5050505050508682841860ff1c94860391039081604c0381116145565701600a0a8082059190846146be575b505081019182821860ff1c11156146b657826001600160ff1b031461451657905f600192135f1461468757600a9004915b01925b8115811761465a57509190565b8061466a575080156144bc579190565b600160ff1b936146819291038401600a0a906141d5565b5f6144b1565b600a60037fe666666666666666666666666666666666666666666666666666666666666667920104019161464a565b50909261464d565b81076146cb575b80614619565b60ff1d600117015f6146c5565b929b5098509196509450925090505f80808080806145ed565b508584126145e8565b93959390929190156147105750506144bc579190565b945092915050565b600881511061398c576008015167ffffffffffffffff1667ff0a89c674ee78741490565b9160408301926040614776610c15606087519401938451906001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b613dd1565b94519301614785815186612796565b61478d575050565b909350611a5391925051925183613428565b92915f9060018184145f87128715171717614819575f9280821361480b575b03604c81135f8212176147ff57600a0a90846147dd83820293846141d5565b146147f2575050156147ee575f9190565b5f90565b9093509015611a53579190565b5050156147ee575f9190565b5f95600194509250906147be565b5050505f90565b93929190918083145f83125f8712188315871517171761486f575f928082136148625703604c81135f8212176147ff57600a0a90846147dd83820293846141d5565b91946001935091906147be565b50919050565b919082604091031261015f578151600481101561015f5760209092015160ff8116810361015f5790565b91925f8312156148c7576044838360405191634a7d166b60e01b835260048301526024820152fd5b9192836148d957505090505f90600190565b60ff81168201918083126149a1575f831215614911575050604c1981126144bc575f03600a0a9161490a8382613909565b9283021490565b909293915f81135f1461499757604d811361496c57600a0a92831561391357835f190483116149435750500290600190565b60405163c849483b60e01b815260048101849052602481019290925260ff166044820152606490fd5b5060405163c849483b60e01b81526004810192909252602482015260ff919091166044820152606490fd5b5050905090600190565b60405163c849483b60e01b815260048101869052602481019190915260ff82166044820152606490fd5b9091813b614a06576149dd9192614fd6565b506149e781613a22565b1591826149f357505090565b6001600160a01b03918216911614919050565b6020918160645f935160405192630b135d3f60e11b9788855260048501526040602485015286820190604485015e8281018201859052601f01601f191601915afa905f5114601f3d11161690565b9060ff165f03916001600160ff1b0382115f14614a7a57600a6001818404940192061590565b909190600190565b909392915f614a92918184613dd1565b9490945f8483019182019412159081614adf575b8115614ad5575b50614ab757505090565b604492506040519163d556b11160e01b835260048301526024820152fd5b905083125f614aad565b8281129150614aa6565b614afe93600160fe1b90810193920190613dd1565b9081815f821215614b35575050604b19821261288457614b23915f03600a0a906141d5565b9081614b2d575f90565b600160ff1b90565b93600160ff1b90910192509050565b5f811215611a5357600160ff1b90808203614b5d575090565b90505f0390565b905f198183099102908180821091030391565b92939291905f8184181215614c0c576001600160ff1b039283831115614bf657600160ff1b93838503614bac57505050509190565b90919293508514614bc6575050600a600191045f03920190565b604051630ed8062160e21b8152600481019190915260248101919091526044810182905260648101849052608490fd5b5090915050600160ff1b811461283d575f039190565b90916001600160ff1b0380841115612805578514614bc6575050600a60019104920190565b9190918015614dd357827f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000080830515614ce1575b507f19999999999999999999999999999999999999999999999999999999999999997f0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc830110614cd2575b8313614cbc5791905f90565b919060018060ff1b926001600160ff1b03030190565b9290600a02905f190192614cb0565b6f4b3b4ca85a86c47a098a22400000000080840515614dc1575b507728c87cb5c89a2571ebfdcb54864ada834a00000000000000830515614daa575b7b097edd871cfda3a5697758bf0e3cbb5ac5741c640000000000000000830515614d96575b7e3899162693736ac531a5a58f1fbb4b746504382ca7e4000000000000000000830515614d8657820515614d77575b5f614c65565b9290600a02905f190192614d71565b9391606402916001190193614d42565b93916402540be40002916009190193614d42565b9391678ac7230489e8000002916012190193614d1d565b6025198301955092909202915f614cfb565b505f915081908190565b90915f198383099280830292838086109503948086039584871015614e5b5714614e53579082910960018219018216809204600280826003021880830282030280830282030280830282030280830282030280830282030280920290030293600183805f03040190848311900302920304170290565b505091500490565b60648386866040519263362ced0960e11b8452600484015260248301526044820152fd5b611a5391905f811215614e93575f03615010565b615010565b909291600160ff1b91828101614f2a5750808414614f2057808413918215614f18578185035b604c811115614f075750505f915b15614ef857507f8000000000000000000000000000000000000000000000000000000000000001019190565b92506001600160ff1b03039190565b600a0a908115613913570491614ecc565b848203614ebe565b505090505f905f90565b93614f3792945f0361440a565b80939180928114614f4b575b50505f039190565b915092506001600160ff1b03831461451657600a600191059201915f80614f43565b73200e12d10bb0c5e4a17e7018f0f1161919bb9389803b158015614fab575b614f935750565b602490604051906373e6d7b360e01b82526004820152fd5b507f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d41813f1415614f8c565b815191906041830361500657614fff9250602082015190606060408401519301515f1a9061509f565b9192909190565b50505f9160029190565b90637ffffff581131561509957637ffffffe1981019060438213615092575f82121561506657637fffffff91505f0301600a0a7b8000000000000000000000000000000000000000000000000000000202111590565b50600a0a8015613913577b80000000000000000000000000000000000000000000000000000001041090565b5050151590565b50505f90565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411615116579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa1561016b575f516001600160a01b0381161561510c57905f905f90565b505f906001905f90565b5050505f91600391905600000000000000000000000000000000000000000000000000000000000000000000000000000000000000200e12d10bb0c5e4a17e7018f0f1161919bb93890000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000044b608060405234801561000f575f80fd5b506004361061004a575f3560e01c80630782d7e11461004e57806354636d2b14610078578063b7bad1b11461009d578063f5c36eaf146100b0575b5f80fd5b61006161005c366004610363565b6100c3565b60405161006f929190610403565b60405180910390f35b61008b610086366004610363565b6100d8565b60405160ff909116815260200161006f565b6100616100ab366004610363565b6100e9565b61008b6100be366004610363565b6100f5565b5f806100cf5f84610100565b91509150915091565b5f6100e35f836101f0565b92915050565b5f806100cf5f84610281565b5f6100e35f83610356565b73ffffffffffffffffffffffffffffffffffffffff81165f9081526020838152604080832081518083019092525460ff8082161515835261010090910416818301527f313ce56700000000000000000000000000000000000000000000000000000000808452839283908190816004818a5afa915060203d1015610182575f91505b811561019857505f5160ff811115610198575f91505b816101af57505050602001516003925090506101e9565b83516101c3575f955093506101e992505050565b836020015160ff1681146101d85760026101db565b60015b846020015195509550505050505b9250929050565b5f805f6101fd8585610281565b909250905060018260038111156102165761021661039d565b1415801561023557505f8260038111156102325761023261039d565b14155b156102795783826040517fee07877f000000000000000000000000000000000000000000000000000000008152600401610270929190610421565b60405180910390fd5b949350505050565b5f805f8061028f8686610100565b90925090505f8260038111156102a7576102a761039d565b0361034b576040805180820182526001815260ff838116602080840191825273ffffffffffffffffffffffffffffffffffffffff8a165f908152908b9052939093209151825493517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009094169015157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff161761010093909116929092029190911790555b909590945092505050565b5f805f6101fd8585610100565b5f60208284031215610373575f80fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114610396575f80fd5b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b600481106103ff577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b9052565b6040810161041182856103ca565b60ff831660208301529392505050565b73ffffffffffffffffffffffffffffffffffffffff831681526040810161039660208301846103ca56000000000000000000000000000000000000000000"; diff --git a/src/generated/candidate/RaindexV6.sol b/src/generated/candidate/RaindexV6.sol index f78492e1df..4392716a2c 100644 --- a/src/generated/candidate/RaindexV6.sol +++ b/src/generated/candidate/RaindexV6.sol @@ -5,19 +5,19 @@ pragma solidity ^0.8.25; // THIS FILE IS AUTOGENERATED BY THE BUILD SCRIPT. DO NOT EDIT BY HAND. /// @dev Hash of the known bytecode. -bytes32 constant BYTECODE_HASH = bytes32(0xd8938133942503d0d86a14b39068048090fcee9526ed234e6521b24cd8784c43); +bytes32 constant BYTECODE_HASH = bytes32(0xa94f7af1a3aeb9d06057eb361b0bcadbe71f69aeeb111304fd98d3075edd29ba); /// @dev The deterministic deploy address of the contract when deployed via /// the Zoltu factory. -address constant DEPLOYED_ADDRESS = address(0x2F04fF4cF5A3a19C619fe2C892BdBd72a76bf132); +address constant DEPLOYED_ADDRESS = address(0x7900fd69E0785195f6e4622e3138146c4cc4ABd2); /// @dev The creation bytecode of the contract. bytes constant CREATION_CODE = - hex"6080806040523460395760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055615120908161003e8239f35b5f80fdfe6080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a7146117cc575080631f69cb751461156f5780632cb77e9f146115435780632fbc4ba0146113f957806341d1514f146113c25780635cffe9de1461126657806360746119146110e2578063613255ab1461105f57806369c7285614610771578063709fb8a5146104375780639235084d146103e3578063ac9650d814610295578063d7e442ec14610237578063d9d98ce4146101865763fa501182146100c1575f80fd5b34610182576101403660031901126101825767ffffffffffffffff600435818111610182576100f4903690600401611b61565b6024358281116101825761010c903690600401611b61565b60c0366043190112610182576101043583811161018257610131903690600401611d07565b90610124359384116101825761014e61015c943690600401611d07565b926101576126cb565b612211565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b5f80fd5b34610182576040366003190112610182576001600160a01b036101a7611850565b166040516370a0823160e01b8152306004820152602081602481855afa90811561022c575f916101fa575b50156101e25760206040515f8152f35b60249060405190633c5bf76960e21b82526004820152fd5b90506020813d602011610224575b81610215602093836119d0565b810103126101825751826101d2565b3d9150610208565b6040513d5f823e3d90fd5b346101825760203660031901126101825760043567ffffffffffffffff81116101825761028f61026e61015c92369060040161181f565b91906102786126cb565b60405192610285846119b4565b5f84523691611ddb565b90612b63565b34610182576020806003193601126101825760043567ffffffffffffffff8111610182576102c790369060040161181f565b9190604051926102d6846119b4565b5f84528284016102e582611ab4565b946102f360405196876119d0565b8286526102ff83611ab4565b9361031186880195601f1901866121f5565b5f5b84811061037557604080518881528951818a018190525f92600582901b83018101918a918c9085015b8287106103495785850386f35b909192938280610365600193603f198a820301865288516118dc565b960192019601959291909261033c565b806103c4886103be61039160019560059d9c9d1b8701876120f1565b929089846040519586938585013782018381015f81528b519283915e015f838201520380845201826119d0565b30613990565b6103ce828a611fd7565b526103d98189611fd7565b5001969596610313565b3461018257600319602036820112610182576004359067ffffffffffffffff821161018257608090823603011261018257610422606091600401612139565b90604051921515835260208301526040820152f35b34610182576003196040368201126101825760043567ffffffffffffffff8082116101825760c082600401938336030112610182576024359081116101825761048490369060040161181f565b9061048d6126cb565b6104be6104b96104b46104ad6104a38880612124565b60408101906120f1565b36916119f2565b613926565b61397b565b801561075f576001101561074d57602483016104da8186611f44565b90501561073b5760448401946104f08682611f44565b9050156107295761055661051e9661054a61051561050e8580612124565b9585611f44565b99909285611f44565b91909261053b6040519761053189611900565b3389523690611a56565b9a60209b8c8901523691611acc565b60408601523691611acc565b60608301526064850135608083015261056e8261270d565b91825f525f875260405f209586541596876105b2575b888860017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055604051908152f35b6001905560a46001600160a01b03917f87491344dfbcf91f6cbbc610cbbeedc85313d37a02df0c93527f7ea5f8db717f83855116604051908152878c8201526060604082015280610606606082018861203f565b0390a1019161061583856120f1565b9050610679575b5050505061066d929161066561064e61028f933390919060405192600284526020840152604083015260608201604052565b906040519160018352602083015260408201604052565b923691611ddb565b82808080808080610584565b6106866104ad84866120f1565b61068f81614717565b156107025750937fd46c2c56b35c8210e9e712ec3f02242d5fc90187c0ac8ed80cc33626846ec3698961066d9897956106f56106d86106659761064e9761028f9b5116936120f1565b866040519586958652850152606060408501526060840191611d36565b0390a1938395965061061c565b89610725604051928392630c89984b60e31b8452600484015260248301906118dc565b0390fd5b60405163540e5f0b60e01b8152600490fd5b604051636c44ef8f60e01b8152600490fd5b604051633c8270bd60e21b8152600490fd5b604051632cff108b60e21b8152600490fd5b34610182576003196020368201126101825767ffffffffffffffff600435116101825760c09060043536030112610182576107aa6126cb565b5f80806107bf60048035608481019101611e8d565b90501561104d5760246004350135926107d784612772565b1561103b576060806040516107eb81611968565b6107f3611ee2565b81525f60208201525f6040820152015261080b611ee2565b5061086b61086661084561083b61083561082f608460043501600435600401611e8d565b90611f14565b80611f2f565b6040810190611f44565b602061085e61082f608460043501600435600401611e8d565b013591611f7a565b611d22565b936001600160a01b036108ba6108666108a161089761083561082f608460043501600435600401611e8d565b6060810190611f44565b604061085e61082f608460043501600435600401611e8d565b81604051976108c889611930565b16875216602086015260408501526108ea608460043501600435600401611e8d565b9490506001604051950160051b85016040525f905f5b610914608460043501600435600401611e8d565b9050811080611028575b15610e7557610937608460043501600435600401611e8d565b821015610e61578160051b810135607e1982360301811215610182576080818301360312610182576040519161096c83611968565b8181013567ffffffffffffffff81116101825761098e90369084840101611b61565b835280820160208181013590850152604080820135908501526060013567ffffffffffffffff8111610182576109c79236920101611d07565b606082015280516001600160a01b036109e96040830151602085015190611fd7565b5151166001600160a01b0385511614801590610e2d575b610e1b57610a1860208301516040840151908361305c565b610a218161270d565b91825f525f60205260405f2054155f14610a85575051604080513381526001600160a01b039092166020830152810191909152600191907fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f390606090a15b01610900565b9190610ab6602084979597015160408501519060608601519060405192610aab846119b4565b5f8452339186613091565b925f93610ace60608201516044600435013590612795565b15610b3557505051604080513381526001600160a01b03909216602083015281019190915260019291907fe3151dc8cb7a54ffc4baabd28c1f241c94d510b5e5b502491ac3cad6c16316d590606090a15b8115610b2d575b5092610a7f565b905088610b26565b610b426040820151612772565b158015610e08575b15610b9f57505051604080513381526001600160a01b03909216602083015281019190915260019291907f500b713857325f9e6dcb52ae832eca9109d107ed1aae9cb4928b4c1e13f051aa90606090a1610b1f565b9250925050600196959691610bb8606460043501611feb565b15610d755796610c2897610c3860408401516040880151610bd98183613400565b15610d6d5750925b610c32848592610c1b610c1560608a01516001600160e01b03601b918660e01d92828816810b928260e01d9216900b613dd0565b90613f8b565b9d8e9260408d01516134cb565b60408c01526134f5565b996134f5565b98610c43848461351f565b610c4d848261357d565b60405192338452608060208501526060610c73845160808088015261010087019061203f565b93602081015160a0870152604081015160c0870152015192607f198582030160e0860152835180825260208201906020808260051b8501019601925f5b828110610d0f57505050505092806001979695937f194f1feb3b4d7076a2c272e774e792e0c48bb8c7aa1a9a3671c1cd6da9e6b4c193610d0a96604084015260608301520390a180858c5101808d5260051b8c015261368f565b610b1f565b9091929396602080610d60600193601f198782030189528b51906001600160a01b0382511681526040610d4f8584015160608785015260608401906120be565b9201519060408184039101526118dc565b9901950193929101610cb0565b905092610be1565b610c2890610c386060840151610c32610db3610c1560408801516001600160e01b0394601b90868360e01d9316820b91878260e01d9216900b613dd0565b60408a0151610dc28183613400565b15610e005750915b829c8d916060890151908116155f14610df1575060408801515b96879460408d01516134cb565b610dfb9085613427565b610de4565b905091610dca565b50610e1660608201516133dd565b610b4a565b60405163936bb5ad60e01b8152600490fd5b506001600160a01b03610e496060830151604085015190611fd7565b5151166001600160a01b036020860151161415610a00565b634e487b7160e01b5f52603260045260245ffd5b50919390610e87606460043501611feb565b1561102257835b6004356004013590610ea08282613400565b6110045750508490610ec0856001600160a01b0360208701511633612ff3565b505060a46004350190610ed8826004356004016120f1565b905015159081610ffc575b50610f5b575b506001600160a01b03610eff92935116336127bc565b50505b8351811015610f275780610f21610f1b60019387611fd7565b51613868565b01610f02565b5060409160017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005582519182526020820152f35b90506001600160a01b03602084015116610f856001600160a01b03855116926004356004016120f1565b929091333b1561018257610fcd5f93604051958694859463691f9ed760e01b8652600486015260248501528960448501528a606485015260a0608485015260a4840191611d36565b038183335af190811561022c57859115610ee9579050610fed9150611984565b5f836001600160a01b03610ee9565b905088610ee3565b604492506040519163573b6f4160e01b835260048301526024820152fd5b84610e8e565b506110366040830151612772565b61091e565b60405163315f9e2360e21b8152600490fd5b604051639c95219f60e01b8152600490fd5b3461018257602080600319360112610182576024816001600160a01b03611084611850565b16604051928380926370a0823160e01b82523060048301525afa90811561022c575f916110b5575b50604051908152f35b90508181813d83116110db575b6110cc81836119d0565b810103126101825751826110ac565b503d6110c2565b34610182576110f036611890565b92916110fd9491946126cb565b61110883833361273e565b61111181612772565b15611235578160ff91611129856111ec969533612d26565b6111338183613400565b1561122f575080935b61114885828533612f95565b917f8045c25080b0868951141ed0a91720bcad09a8364a2b3109ee1fd49c1f0bc8b860c0611177898833612ff3565b97906001600160a01b0360405192338452169a8b6020840152856040840152886060840152608083015260a0820152a16040519660068852602088015260408701526060860152608085015260a08401521660c082015260e08101604052906040519160018352602083015260408201604052565b90806112185760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b6112279261028f913691611ddb565b80808061015c565b9361113c565b50604051623a3a4d60e21b81523360048201526001600160a01b039190911660248201526044810191909152606490fd5b34610182576080366003190112610182576004356001600160a01b039081811680910361018257611295611866565b6044359167ffffffffffffffff916064358381116101825736602382011215610182578060040135938411610182573660248583010111610182576113229560209216936112e4868587612eb6565b60405196879283926323e30c8b60e01b84523360048501528760248501528860448501525f606485015260a06084850152602460a485019201611d36565b03815f855af193841561022c575f9461138e575b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd984036113755761136a93503091612f2f565b602060405160018152f35b604051630b6c58a960e31b815260048101859052602490fd5b9093506020813d6020116113ba575b816113aa602093836119d0565b8101031261018257519284611336565b3d915061139d565b346101825760603660031901126101825760206113f16113e0611850565b6113e8611866565b60443591612d26565b604051908152f35b346101825761140736611890565b928094926114136126cb565b61141e82853361273e565b61142781612772565b15611513578061143b61148a9286336127bc565b9790957f7f9dfa19cf1cc2f806f2f860fbc9c056b601fb1afc0e9b843dfe5c63616268e660806040513381526001600160a01b038416998a60208301528560408301526060820152a133612862565b939091856114b85760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b6115079661028f956106659460ff93604051956005875260208701526040860152606085015260808401521660a082015260c08101604052906040519160018352602083015260408201604052565b8080808080808061015c565b506040516306dde9c360e41b81523360048201526001600160a01b03841660248201526044810191909152606490fd5b34610182576020366003190112610182576004355f525f6020526020600160405f205414604051908152f35b34610182576003196040368201126101825767ffffffffffffffff9060043582811161018257806004019160a08236039182011261018257602435848111610182576115bf90369060040161181f565b90936115c96126cb565b5f946001600160a01b0394856115de84611d22565b1633036117aa576115f76115f23685611b61565b61270d565b805f525f60205260405f2096600188541461163e575b60208960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556040519015158152f35b9091929394959697505f6001985560405196338852826020890152606060408901528161166a8761187c565b166060890152602484013590606219018112156101825783019060a06080890152806116986004840161187c565b166101008901526116ab6024830161187c565b16610120880152604481013560221982360301811215610182570190602460048301359201988211610182578136038913610182577f09d18501db0080ca2d6cd7c17fa7255daff4b2d503ea93b76ff68b6752ea8e63878061066595608461177361028f9a60209f6117329061179d9f9a606061014061064e9d0152610160880191611d36565b6117646117596117456044880185611d56565b605f198a8603810160a08c01529491611d8b565b926064870190611d56565b918784030160c0880152611d8b565b91013560e08301520390a13390919060405192600284526020840152604083015260608201604052565b828080808080808061160d565b6024866117b685611d22565b6040516335252be360e01b815291166004820152fd5b34610182576020366003190112610182576004359063ffffffff60e01b82168092036101825760209163e414309160e01b811490811561180e575b5015158152f35b6301ffc9a760e01b14905083611807565b9181601f840112156101825782359167ffffffffffffffff8311610182576020808501948460051b01011161018257565b600435906001600160a01b038216820361018257565b602435906001600160a01b038216820361018257565b35906001600160a01b038216820361018257565b906080600319830112610182576004356001600160a01b0381168103610182579160243591604435916064359067ffffffffffffffff8211610182576118d89160040161181f565b9091565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b60a0810190811067ffffffffffffffff82111761191c57604052565b634e487b7160e01b5f52604160045260245ffd5b6060810190811067ffffffffffffffff82111761191c57604052565b6040810190811067ffffffffffffffff82111761191c57604052565b6080810190811067ffffffffffffffff82111761191c57604052565b67ffffffffffffffff811161191c57604052565b60e0810190811067ffffffffffffffff82111761191c57604052565b6020810190811067ffffffffffffffff82111761191c57604052565b90601f8019910116810190811067ffffffffffffffff82111761191c57604052565b92919267ffffffffffffffff821161191c5760405191611a1c601f8201601f1916602001846119d0565b829481845281830111610182578281602093845f960137010152565b9080601f8301121561018257816020611a53933591016119f2565b90565b91906060838203126101825760405190611a6f82611930565b8193611a7a8161187c565b8352611a886020820161187c565b602084015260408101359167ffffffffffffffff831161018257604092611aaf9201611a38565b910152565b67ffffffffffffffff811161191c5760051b60200190565b929192611ad882611ab4565b604092611ae860405192836119d0565b819581835260208093019160061b84019381851161018257915b848310611b1157505050505050565b8583830312610182578386918251611b288161194c565b611b318661187c565b81528286013583820152815201920191611b02565b9080601f8301121561018257816020611a5393359101611acc565b91909160a0818403126101825760405190611b7b82611900565b8193611b868261187c565b835267ffffffffffffffff9160208101358381116101825782611baa918301611a56565b602085015260408101358381116101825782611bc7918301611b46565b6040850152606081013592831161018257611be86080939284938301611b46565b60608501520135910152565b909291611c0084611ab4565b916040611c1060405194856119d0565b839580855260208095019160059160051b8401948086116101825784935b868510611c3f575050505050505050565b67ffffffffffffffff90853582811161018257870190606082850312610182578451611c6a81611930565b611c738361187c565b81528a83013584811161018257830185601f8201121561018257803590611c9982611ab4565b91611ca6895193846119d0565b8083528d808401918b1b83010191888311610182578e809101915b838310611cf757509150508201528583013593841161018257611ce8858c95869501611a38565b86820152815201940193611c2e565b82358152918101918f9101611cc1565b9080601f8301121561018257816020611a5393359101611bf4565b356001600160a01b03811681036101825790565b908060209392818452848401375f828201840152601f01601f1916010190565b9035601e198236030181121561018257016020813591019167ffffffffffffffff8211610182578160061b3603831361018257565b9190808252602080920192915f905b828210611da8575050505090565b909192936001906001600160a01b03611dc08761187c565b16815285830135838201526040908101950193920190611d9a565b90929192611de881611ab4565b91604091611df960405194856119d0565b839581855260208095019160051b8301938185116101825783925b858410611e245750505050505050565b67ffffffffffffffff908435828111610182578601908382860312610182578351611e4e8161194c565b82358481116101825786611e63918501611a56565b81528983013593841161018257611e7e868b95869501611d07565b83820152815201930192611e14565b903590601e1981360301821215610182570180359067ffffffffffffffff821161018257602001918160051b3603831361018257565b60405190611ed082611930565b60606040835f81525f60208201520152565b60405190611eef82611900565b5f608083828152611efe611ec3565b6020820152606060408201526060808201520152565b9015610e6157803590607e1981360301821215610182570190565b903590609e1981360301821215610182570190565b903590601e1981360301821215610182570180359067ffffffffffffffff821161018257602001918160061b3603831361018257565b9190811015610e615760061b0190565b805115610e615760200190565b805160011015610e615760400190565b805160021015610e615760600190565b805160031015610e615760800190565b805160041015610e615760a00190565b8051821015610e615760209160051b010190565b3580151581036101825790565b9081518082526020808093019301915f5b828110612017575050505090565b835180516001600160a01b031686528201518583015260409094019392810192600101612009565b906080806120b56120a361209160406001600160a01b0380895116885260208901519060a060208a01528082511660a08a015260208201511660c08901520151606060e08801526101008701906118dc565b60408701518682036040880152611ff8565b60608601518582036060870152611ff8565b93015191015290565b9081518082526020808093019301915f5b8281106120dd575050505090565b8351855293810193928101926001016120cf565b903590601e1981360301821215610182570180359067ffffffffffffffff82116101825760200191813603831361018257565b903590605e1981360301821215610182570190565b6121506115f26121498380611f2f565b3690611b61565b5f525f602052600160405f2054036121ec5780612170816121dc93611f2f565b6121d461218f6121946020850135938460408701359384923690611b61565b61305c565b6121ac6121a18580611f2f565b946060810190611e8d565b92906121cc604051966121be886119b4565b5f88525f3681373690611b61565b933691611bf4565b923392613091565b6040810151606090910151600192565b505f905f905f90565b5f5b82811061220357505050565b6060828201526020016121f7565b926001600160a01b038451166001600160a01b03835116146126b9576001600160a01b03612246606086015160643590611fd7565b515116906040830151916001600160a01b036122656084358095611fd7565b51511614801590612679575b610e1b576040850151906001600160a01b036122906044358094611fd7565b5151166001600160a01b036122ab60643560608a0151611fd7565b51511614612667576122bc8661270d565b805f525f60205260405f20541561261457506122d78461270d565b805f525f60205260405f2054156125c057506123ba9291612394917f6fa7f4c28634b0a9d6831401c45ae468195fb63aed07308935c35374ff5d9e396040518061233f61233161012033845280602085015283018d61203f565b82810360408401528a61203f565b85606083015260643560808301528760a083015260a43560c083015260c43560e083015260e4356101008301520390a16001600160a01b0386511660405192612387846119b4565b5f8452606435908a613091565b936001600160a01b03865116604051926123ad846119b4565b5f845260a4359086613091565b916123c86040820151612772565b1580156125ac575b8015612599575b8015612586575b61257457604051916123ef83611968565b5f83525f60208401525f60408401525f606084015261240e848361473b565b84526040840152612434612422838661473b565b602086015280606086015284516134cb565b9461244860208501516040860151906134cb565b93612452876133dd565b8015612565575b6125535761251a61254c957fd9fa84dd790c969daa5c33d8050dc06b4a9b59d5b42e2be5f5e8ae20447f618d946124fc6125519a60a09661249b8a885161351f565b6124a98c602089015161351f565b6124b78a604089015161357d565b6124c58c606089015161357d565b6124ce8a613868565b6124d78c613868565b6001600160a01b036124f360c435926060606435910151611fd7565b51511633612862565b50506001600160a01b036124f360e43592606060a435910151611fd7565b5050606060405191338352805160208401526020810151604084015260408101518284015201516080820152a161368f565b61368f565b565b604051630d86822160e01b8152600490fd5b5061256f856133dd565b612459565b6040516321badf1f60e01b8152600490fd5b5061259460608401516133dd565b6123de565b506125a760608201516133dd565b6123d7565b506125ba6040840151612772565b156123d0565b9351604080513381526001600160a01b039092166020830152810194909452507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f3945091925082915050606081015b0390a1565b9551604080513381526001600160a01b039092166020830152810196909652507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f39493508392505060608201905061260f565b604051631cd2f1c760e21b8152600490fd5b506001600160a01b03612693606085015160a43590611fd7565b5151166001600160a01b036126af604088015160443590611fd7565b5151161415612271565b604051630a98f1f360e21b8152600490fd5b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0060028154146126fb5760029055565b604051633ee5aeb560e01b8152600490fd5b6040516127388161272a602082019460208652604083019061203f565b03601f1981018352826119d0565b51902090565b909115612749575050565b6040516305dbdfd960e41b81526001600160a01b03918216600482015291166024820152604490fd5b612791905f60e01d906001600160e01b038160e01d9116601b0b61479e565b1290565b90612791916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b61481f565b9291926127c882613a63565b936127d2816133dd565b6128505784816001600160e01b036127f19360e01d9116601b0b61489e565b9290809315612827575b5082908161280b575b5050509190565b61281f926001600160a01b03309216612f2f565b5f8181612804565b9092505f19811461283c57600101915f6127fb565b634e487b7160e01b5f52601160045260245ffd5b604051632eaefac360e21b8152600490fd5b9392919361286f836133dd565b61290d578461288b57612883939450612ff3565b50505f905f90565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f5281526128c8835f205494856134f5565b956128d2876133dd565b6128f5575f97885260018252838820908852815282872091875252909320829055565b835163c5e12af560e01b815260048101889052602490fd5b60405163793a8f5560e01b815260048101849052602490fd5b919060408382031261018257825167ffffffffffffffff908181116101825784019082601f8301121561018257815160209261296182611ab4565b9161296f60405193846119d0565b808352848084019160051b830101918683116101825785809101915b8383106129fe5750505050948281015191821161018257019180601f840112156101825782516129ba81611ab4565b936129c860405195866119d0565b818552838086019260051b820101928311610182578301905b8282106129ef575050505090565b815181529083019083016129e1565b825181529181019186910161298b565b90808251908181526020809101926020808460051b8301019501935f915b848310612a3c5750505050505090565b9091929394958480612a5a600193601f198682030187528a516120be565b9801930193019194939290612a2c565b91906020928381526001600160a01b0382511684820152838201516040820152612aa4604083015160e060608401526101008301906118dc565b9060608301516080820152612acb608084015192601f1993848483030160a0850152612a0e565b9260a081015193838382030160c08401528680865192838152019501905f5b818110612b0e57505050611a5394955060c060e091015192828503019101526120be565b825187529588019591880191600101612aea565b90604082019082526020606081936040838201528551809452019301915f5b828110612b4f575050505090565b835185529381019392810192600101612b41565b919091335f526020308152604091825f2091835195612b818761194c565b612b89611ec3565b875260608281980152845190612b9e826119b4565b5f8252855190612bad826119b4565b5f82525f3681375f5b8151811015612d1a57898688612bcc8486611fd7565b51888151948d80870151908151612bee575b5050505050505050600101612bb6565b905f92916001600160a01b0396612c138887818d51169c015116998789015190613b42565b95825199612c208b611998565b8a5289015287015285015260808401528760a08401528660c08401525f8c51809563d04dfe2360e01b82528180612c5b600498898301612a6a565b03915afa938415612d10579089915f95612cea575b508451612c86575b50899250808e8c938e612bde565b5101511691823b1561018257612cb4925f92838d5180968195829463012c676d60e21b845233908401612b22565b03925af18015612ce0579060019291612cd1575b81928782612c78565b612cda90611984565b5f612cc8565b89513d5f823e3d90fd5b612d079195503d805f833e612cff81836119d0565b810190612926565b9050935f612c70565b8c513d5f823e3d90fd5b50505050505050509050565b8215612d5b576001600160a01b038091165f52600160205260405f2091165f5260205260405f20905f5260205260405f205490565b909150612d6782613d74565b6001600160a01b03809316906040918251946370a0823160e01b86528416938460048701526020928387602481865afa968715612e7d575f97612e87575b5083612dbe612db783612dee9a614a53565b50906141de565b508651636eb1769f60e11b81526001600160a01b0390941660048501523060248501529297889081906044820190565b0381865afa968715612e7d575f97612e4c575b50612db7612e1291611a5398614a53565b50612e1d8183613400565b15612e445750935b5f5260018252825f20905f528152815f20905f8052525f2054906134f5565b905093612e25565b96508387813d8311612e76575b612e6381836119d0565b8101031261018257955195612db7612e01565b503d612e59565b85513d5f823e3d90fd5b96508387813d8311612eaf575b612e9e81836119d0565b810103126101825795519583612da5565b503d612e94565b6040519263a9059cbb60e01b5f526001600160a01b0380931660045260245260205f60448180855af160015f5114811615612f10575b8360405215612efa57505050565b635274afe760e01b835216600482015260249150fd5b6001811516612f2657813b15153d151616612eec565b833d5f823e3d90fd5b9092604051936323b872dd60e01b5f526001600160a01b0393848092166004521660245260445260205f60648180855af160015f5114811615612f7f575b836040525f60605215612efa57505050565b6001811516612f2657813b15153d151616612f6d565b93929193612fa2836133dd565b61290d5784612fb6576128839394506127bc565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f5281526128c8835f205494856134cb565b9092919261300081613a63565b9361300a816133dd565b61304a5784816001600160e01b036130299360e01d9116601b0b61489e565b50809281613038575050509190565b6001600160a01b0361281f9316612eb6565b604051632d1671a360e11b8152600490fd5b9161308790606061307c936001600160a01b039485916040880151611fd7565b515116940151611fd7565b5151161461266757565b94919392909260408051916130a583611998565b6130ad611ee2565b83526020925f848201525f838201526060945f868301528560c06080938260808201525f60a082015201528351916130e483611900565b600483525f5b8181106133ce5750506132d7959493925f9261320e61325e938d61310d8161270d565b9c896001600160a01b039e8f94859182865116908d5194600386528501528c840152168c820152608081018a5261314386611f8a565b5261314d85611f8a565b50885161315981611930565b6002815289368c83013761316c86611f97565b5261317685611f97565b5060ff8a6131d98b8501936131c38761319c81613194858a51611fd7565b515116613d74565b975116886131ab848951611fd7565b515116856131ba858a51611fd7565b51015191612d26565b966131cf828751611fd7565b5151169451611fd7565b51015192169093929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b61321782611fa7565b5261322181611fa7565b506132458a8d8d60ff8a6131d98d8501936131c38761319c81613194858a51611fd7565b61324e82611fb7565b5261325881611fb7565b50613b42565b95878a511697848b0191825191868184511693015116928a8552308752858086209151015186519161328f836119b4565b86835287519561329e87611998565b86528886015286850152848885015289608085015260a084015260c08301528351808098819463d04dfe2360e01b835260048301612a6a565b03915afa9687156133c4575f945f986133a2575b5084516002811061338b5750818386015195015161331161330b88611fc7565b51611fb7565b5161331c8183613400565b156133835750925b6133468685919060405192600284526020840152604083015260608201604052565b61334f88611fa7565b5261335987611fa7565b508251996133668b611998565b8a52890152870152850152608084015260a083015260c082015290565b905092613324565b602490835190630fbb8e5560e21b82526004820152fd5b9097506133ba9194503d805f833e612cff81836119d0565b939093965f6132eb565b50513d5f823e3d90fd5b808888809387010152016130ea565b6133fc905f60e01d906001600160e01b038160e01d9116601b0b61479e565b1390565b906133fc916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b61481f565b61344e6001600160e01b0392838316601b0b9260e01d938160e01d9116601b0b8484613f95565b90637ffffff5821361349e575b90613465916141de565b9290921580613496575b61347857505090565b6044925060405191638eba4d0760e01b835260048301526024820152fd5b50821561346f565b6134a88282614e7e565b1561345b57604483856040519163d556b11160e01b835260048301526024820152fd5b611a5391610c15916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6143e4565b611a5391610c15916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6145a8565b61357991608081018261353b6135358351611fc7565b51611fc7565b5261357261356c6001600160a01b0380945151169361356361355d8551611fc7565b51611f8a565b51169251611fc7565b51611fa7565b5191612f95565b5050565b906080810191806135916135358551611fb7565b526001600160a01b038092515116916135ad61355d8551611fb7565b51166135bc61356c8551611fb7565b519081613657576135cc836133dd565b61290d579183917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a959361260f955f5260209060018252613622604094855f20835f528452855f20855f528452855f20546134f5565b945f5260018252835f20905f528152825f20915f52525f20555b51604051918291338352604060208401526040830190612a0e565b91613688917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a959361260f95612862565b505061363c565b60c0810151908151915f92613803575b506137446020918281510151926001600160a01b039081818187511696015116928660a082019485518252308452604097888320898686510151015160808601518b51916136ec836119b4565b8683528c51936136fb856119b4565b8785528d519661370a88611998565b8752898701528c86015260016060860152608085015260a084015260c08301528851808099819463d04dfe2360e01b835260048301612a6a565b03915afa9485156137f95787956137db575b508451613767575b50505050505050565b81905101510151169051813b156137d75791849184938361379c965180978195829463012c676d60e21b845260048401612b22565b03925af19081156137ce57506137b7575b808080808061375e565b6137c18291611984565b6137cb57806137ad565b80fd5b513d84823e3d90fd5b8480fd5b6137f09195503d8089833e612cff81836119d0565b9050935f613756565b86513d89823e3d90fd5b6001600160a01b03602080845101510151169060a083015190823b1561018257613846925f928360405180968195829463012c676d60e21b845260048401612b22565b03925af1801561022c571561369f57613860919250611984565b5f905f61369f565b6080810161387961356c8251611fb7565b5191821561388657505050565b6138a061355d6001600160a01b0380935151169351611fb7565b5116815f5260209160018352604092835f20835f528152835f20855f528152835f2054936001600160e01b0385166138db575b505050505050565b6138ff955f9284845260018152828420868552815282842091845252812055612ff3565b5f8080806138d3565b8115613912570490565b634e487b7160e01b5f52601260045260245ffd5b604081511061396e576020810151908051603f19810190811161283c5760051c821161395a5760016020920160051b010190565b5050604051613968816119b4565b5f815290565b50604051613968816119b4565b80511561398b57602001515f1a90565b505f90565b905f8091602081519101845af48080613a0e575b156139c45750506040513d81523d5f602083013e60203d82010160405290565b156139eb57604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b3d156139fc576040513d5f823e3d90fd5b60405163d6bda27560e01b8152600490fd5b503d1515806139a45750813b15156139a4565b60041115613a2b57565b634e487b7160e01b5f52602160045260245ffd5b602090939291936001600160a01b036040820195168152613a5f83613a21565b0152565b613a6b614f6c565b6040805163b7bad1b160e01b81526001600160a01b0383166004820152909182826024815f73200e12d10bb0c5e4a17e7018f0f1161919bb93895af1928315613b39575f925f94613b04575b50613ac183613a21565b600183141580613af2575b613ad65750505090565b5163ee07877f60e01b8152918291610725919060048401613a3f565b50613afc83613a21565b821515613acc565b90809450613b289293503d8511613b32575b613b2081836119d0565b810190614874565b919091925f613ab7565b503d613b16565b513d5f823e3d90fd5b90805191613b4f83611ab4565b91613b6a604094613b62865195866119d0565b808552611ab4565b601f199460209186013686840137835183519095908015613d69576001613bc09101965b6001978891010197613bb7613ba28a611ab4565b99613baf86519b8c6119d0565b808b52611ab4565b018489016121f5565b85805f9684516002815233878201523086820152606081018652613be38b611f8a565b52613bed8a611f8a565b505f925b613d25575b5050508351613c09575b50505050505090565b85809598979692980181613c1d8289611fd7565b52613c288188611fd7565b505f925b613c3b575b5085969750613c00565b8451831015613d20576001600160a01b03613cb281613c5a8689611fd7565b51511686613c68878a611fd7565b51015187815160051b9101207f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f52601c52603c5f208c613ca9888b611fd7565b510151916149ca565b15613d0857868098999a928192613cc9878a611fd7565b515116613cd68787611fd7565b52019385613ce48289611fd7565b510151613cf1868c611fd7565b52613cfc858b611fd7565b50019290989796613c2c565b8951630a57f30960e31b815260048101859052602490fd5b613c31565b9091968151881015613d60578280910197613d408184611fd7565b51613d4b8a8d611fd7565b52613d56898c611fd7565b5001919081613bf1565b96829150613bf6565b50613bc05f96613b8e565b613d7c614f6c565b60408051630782d7e160e01b81526001600160a01b03831660048201529091828260248173200e12d10bb0c5e4a17e7018f0f1161919bb93895afa928315613b39575f925f94613b045750613ac183613a21565b9091939284158215175f14613dea5750505090505f905f90565b82810192600160fd1b8082019083011760fe1c613f21575b5050613e0d81614b43565b93613e1781614b43565b94613e228682614b63565b90918215613f12575f9083986f0785ee10d5da46d900f436a000000000808611613f04575b50670de0b6b3a7640000808b11613ef5575b50633b9aca00808b11613ee6575b50612710808b11613ed8575b5098805b613ec7575081906118d8989982600a0a9109960195817fcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccd0a93838211900382610100031b9203901c170291614b76565b60019290920191600a900480613e77565b60049a04998a930192613e73565b600991939a049901915f613e67565b601291939a049901915f613e59565b85049950602592505f613e47565b509290506118d8949550614b76565b5f821215613f7557808413613f67575b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb2841315613e02579092506118d8939491614a81565b9092506118d8939491614ae8565b80841215613f31579092506118d8939491614a81565b61346582826141de565b92909180613fbb576044848460405191637a97930f60e01b835260048301526024820152fd5b90919280155f14613fd057505050505f905f90565b613fe993613fdd91614c30565b92919490938492614c30565b9093919284613ff788614b43565b9161400186614b43565b947f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000094604c918688106141a8575b030191600160ff1b98838a018112155f14614175575050035b5f955f82128061416c575b61414e575b5f81128061413c575b61411e5786820103966001600160ff1b0388149081614114575b508061410b575b80614102575b6140e45750906140989291614ddc565b915f81136140ab575b506118d893614b76565b9091604c82136140d9576140c291600a0a90613908565b9081156140cf575f6140a1565b505050505f905f90565b50505050505f905f90565b876044916040519163d556b11160e01b835260048301526024820152fd5b505f8512614088565b50828414614082565b905088145f61407b565b604489836040519163d556b11160e01b835260048301526024820152fd5b50806001600160ff1b03018213614061565b95508087018613156141665786818703015b95614058565b5f614160565b505f8113614053565b89985090920390506001600160ff1b03819003870182136141995701860194614048565b5050505050505050505f905f90565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009650604b925061402f565b8115613912570590565b8082601b82810b83146143d3577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e1000000000000000000840561437f575b8380820b0361436e57507b199999999999999999999999999999999999999999999999999999987b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc8401111561431f575b838060030b036142a3575b8084136142875750506001600160e01b036001925b60e01b91161791565b8303600a0a8015613912576001600160e01b039107159261427e565b92915f8413156142f35750906142b98383614e7e565b6142d557637ffffffe1901600a0a810290637fffffff92614269565b506044916040519163d556b11160e01b835260048301526024820152fd5b637fffffff1992830390604382136140d95761431291600a0a906141d4565b9182156140cf5792614269565b5f198401808060030b14614333575061425e565b90506001600160e01b039293507b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff915060e01b9260ff1d181617905f90565b600190940193600a90930592614211565b937f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000008405156143c0576305f5e100600894058094819201955b915050614211565b620186a0600594058094819201956143b8565b508261425e57505050505f90600190565b919291600160ff1b84016143fc576118d89350614e97565b906118d8935f03916145a8565b919291600160ff1b919080158061459657509061442591614c30565b9490929091905f86858585828213801561458d575b614570575b505050508682841860ff1c94860391039081604c0381116145555701600a0a80820591908461453b575b505081019182821860ff1c111561453357826001600160ff1b031461451557905f600192135f146144e657600a9004915b01925b811581176144aa57509190565b806144c3575b5080156144bb579190565b505f91508190565b91926144d99203600160ff1b01600a0a906141d4565b600160ff1b91905f6144b0565b600a60037fe666666666666666666666666666666666666666666666666666666666666667920104019161449a565b604490836040519163d556b11160e01b835260048301526024820152fd5b50909261449d565b8107614548575b80614469565b60ff1d600117015f614542565b505050919350614563579190565b60018160ff1d1790039190565b5f9a50909750909550600160ff1b9450925090508680808061443f565b50835f1261443a565b156145a15750509190565b9350919050565b93929193841581158181176146f9575050906145c391614c30565b91949082956145d482958294614c30565b80969294919693878684821380156146f0575b6146d7575b5050505050508682841860ff1c94860391039081604c0381116145555701600a0a8082059190846146bd575b505081019182821860ff1c11156146b557826001600160ff1b031461451557905f600192135f1461468657600a9004915b01925b8115811761465957509190565b80614669575080156144bb579190565b600160ff1b936146809291038401600a0a906141d4565b5f6144b0565b600a60037fe6666666666666666666666666666666666666666666666666666666666666679201040191614649565b50909261464c565b81076146ca575b80614618565b60ff1d600117015f6146c4565b929b5098509196509450925090505f80808080806145ec565b508584126145e7565b939593909291901561470f5750506144bb579190565b945092915050565b600881511061398b576008015167ffffffffffffffff1667ff0a89c674ee78741490565b9160408301926040614775610c15606087519401938451906001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b613dd0565b94519301614784815186612795565b61478c575050565b909350611a5391925051925183613427565b92915f9060018184145f87128715171717614818575f9280821361480a575b03604c81135f8212176147fe57600a0a90846147dc83820293846141d4565b146147f1575050156147ed575f9190565b5f90565b9093509015611a53579190565b5050156147ed575f9190565b5f95600194509250906147bd565b5050505f90565b93929190918083145f83125f8712188315871517171761486e575f928082136148615703604c81135f8212176147fe57600a0a90846147dc83820293846141d4565b91946001935091906147bd565b50919050565b919082604091031261018257815160048110156101825760209092015160ff811681036101825790565b91925f8312156148c6576044838360405191634a7d166b60e01b835260048301526024820152fd5b9192836148d857505090505f90600190565b60ff81168201918083126149a0575f831215614910575050604c1981126144bb575f03600a0a916149098382613908565b9283021490565b909293915f81135f1461499657604d811361496b57600a0a92831561391257835f190483116149425750500290600190565b60405163c849483b60e01b815260048101849052602481019290925260ff166044820152606490fd5b5060405163c849483b60e01b81526004810192909252602482015260ff919091166044820152606490fd5b5050905090600190565b60405163c849483b60e01b815260048101869052602481019190915260ff82166044820152606490fd5b9091813b614a05576149dc9192614fd5565b506149e681613a21565b1591826149f257505090565b6001600160a01b03918216911614919050565b6020918160645f935160405192630b135d3f60e11b9788855260048501526040602485015286820190604485015e8281018201859052601f01601f191601915afa905f5114601f3d11161690565b9060ff165f03916001600160ff1b0382115f14614a7957600a6001818404940192061590565b909190600190565b909392915f614a91918184613dd0565b9490945f8483019182019412159081614ade575b8115614ad4575b50614ab657505090565b604492506040519163d556b11160e01b835260048301526024820152fd5b905083125f614aac565b8281129150614aa5565b614afd93600160fe1b90810193920190613dd0565b9081815f821215614b34575050604b19821261288357614b22915f03600a0a906141d4565b9081614b2c575f90565b600160ff1b90565b93600160ff1b90910192509050565b5f811215611a5357600160ff1b90808203614b5c575090565b90505f0390565b905f198183099102908180821091030391565b92939291905f8184181215614c0b576001600160ff1b039283831115614bf557600160ff1b93838503614bab57505050509190565b90919293508514614bc5575050600a600191045f03920190565b604051630ed8062160e21b8152600481019190915260248101919091526044810182905260648101849052608490fd5b5090915050600160ff1b811461283c575f039190565b90916001600160ff1b0380841115612804578514614bc5575050600a60019104920190565b9190918015614dd257827f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000080830515614ce0575b507f19999999999999999999999999999999999999999999999999999999999999997f0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc830110614cd1575b8313614cbb5791905f90565b919060018060ff1b926001600160ff1b03030190565b9290600a02905f190192614caf565b6f4b3b4ca85a86c47a098a22400000000080840515614dc0575b507728c87cb5c89a2571ebfdcb54864ada834a00000000000000830515614da9575b7b097edd871cfda3a5697758bf0e3cbb5ac5741c640000000000000000830515614d95575b7e3899162693736ac531a5a58f1fbb4b746504382ca7e4000000000000000000830515614d8557820515614d76575b5f614c64565b9290600a02905f190192614d70565b9391606402916001190193614d41565b93916402540be40002916009190193614d41565b9391678ac7230489e8000002916012190193614d1c565b6025198301955092909202915f614cfa565b505f915081908190565b90915f198383099280830292838086109503948086039584871015614e5a5714614e52579082910960018219018216809204600280826003021880830282030280830282030280830282030280830282030280830282030280920290030293600183805f03040190848311900302920304170290565b505091500490565b60648386866040519263362ced0960e11b8452600484015260248301526044820152fd5b611a5391905f811215614e92575f0361500f565b61500f565b909291600160ff1b91828101614f295750808414614f1f57808413918215614f17578185035b604c811115614f065750505f915b15614ef757507f8000000000000000000000000000000000000000000000000000000000000001019190565b92506001600160ff1b03039190565b600a0a908115613912570491614ecb565b848203614ebd565b505090505f905f90565b93614f3692945f03614409565b80939180928114614f4a575b50505f039190565b915092506001600160ff1b03831461451557600a600191059201915f80614f42565b73200e12d10bb0c5e4a17e7018f0f1161919bb9389803b158015614faa575b614f925750565b602490604051906373e6d7b360e01b82526004820152fd5b507f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d41813f1415614f8b565b815191906041830361500557614ffe9250602082015190606060408401519301515f1a9061509e565b9192909190565b50505f9160029190565b90637ffffff581131561509857637ffffffe1981019060438213615091575f82121561506557637fffffff91505f0301600a0a7b8000000000000000000000000000000000000000000000000000000202111590565b50600a0a8015613912577b80000000000000000000000000000000000000000000000000000001041090565b5050151590565b50505f90565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411615115579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa1561022c575f516001600160a01b0381161561510b57905f905f90565b505f906001905f90565b5050505f916003919056"; + hex"6080806040523460395760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055615121908161003e8239f35b5f80fdfe6080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a7146117cc575080631f69cb751461156f5780632cb77e9f146115435780632fbc4ba0146113f957806341d1514f146113c25780635cffe9de1461126657806360746119146110e2578063613255ab1461105f57806369c7285614610771578063709fb8a5146104375780639235084d146103e3578063ac9650d814610295578063d5708b46146101fa578063d7e442ec146101765763d9d98ce4146100c1575f80fd5b3461015f57604036600319011261015f576001600160a01b036100e2611850565b166040516370a0823160e01b8152306004820152602081602481855afa90811561016b575f91610135575b501561011d5760206040515f8152f35b60249060405190633c5bf76960e21b82526004820152fd5b90506020813d602011610163575b81610150602093836119d0565b8101031261015f57515f61010d565b5f80fd5b3d9150610143565b6040513d5f823e3d90fd5b3461015f57602036600319011261015f5760043567ffffffffffffffff811161015f576101ce6101ad6101d492369060040161181f565b91906101b76126cc565b604051926101c4846119b4565b5f84523691611ddb565b90612b64565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b3461015f5761014036600319011261015f5767ffffffffffffffff60043581811161015f5761022d903690600401611b61565b60243582811161015f57610245903690600401611b61565b60c036604319011261015f576101043583811161015f5761026a903690600401611d07565b906101243593841161015f576102876101d4943690600401611d07565b926102906126cc565b612211565b3461015f5760208060031936011261015f5760043567ffffffffffffffff811161015f576102c790369060040161181f565b9190604051926102d6846119b4565b5f84528284016102e582611ab4565b946102f360405196876119d0565b8286526102ff83611ab4565b9361031186880195601f1901866121f5565b5f5b84811061037557604080518881528951818a018190525f92600582901b83018101918a918c9085015b8287106103495785850386f35b909192938280610365600193603f198a820301865288516118dc565b960192019601959291909261033c565b806103c4886103be61039160019560059d9c9d1b8701876120f1565b929089846040519586938585013782018381015f81528b519283915e015f838201520380845201826119d0565b30613991565b6103ce828a611fd7565b526103d98189611fd7565b5001969596610313565b3461015f5760031960203682011261015f576004359067ffffffffffffffff821161015f57608090823603011261015f57610422606091600401612139565b90604051921515835260208301526040820152f35b3461015f5760031960403682011261015f5760043567ffffffffffffffff80821161015f5760c08260040193833603011261015f5760243590811161015f5761048490369060040161181f565b9061048d6126cc565b6104be6104b96104b46104ad6104a38880612124565b60408101906120f1565b36916119f2565b613927565b61397c565b801561075f576001101561074d57602483016104da8186611f44565b90501561073b5760448401946104f08682611f44565b9050156107295761055661051e9661054a61051561050e8580612124565b9585611f44565b99909285611f44565b91909261053b6040519761053189611900565b3389523690611a56565b9a60209b8c8901523691611acc565b60408601523691611acc565b60608301526064850135608083015261056e8261270e565b91825f525f875260405f209586541596876105b2575b888860017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055604051908152f35b6001905560a46001600160a01b03917f87491344dfbcf91f6cbbc610cbbeedc85313d37a02df0c93527f7ea5f8db717f83855116604051908152878c8201526060604082015280610606606082018861203f565b0390a1019161061583856120f1565b9050610679575b5050505061066d929161066561064e6101ce933390919060405192600284526020840152604083015260608201604052565b906040519160018352602083015260408201604052565b923691611ddb565b82808080808080610584565b6106866104ad84866120f1565b61068f81614718565b156107025750937fd46c2c56b35c8210e9e712ec3f02242d5fc90187c0ac8ed80cc33626846ec3698961066d9897956106f56106d86106659761064e976101ce9b5116936120f1565b866040519586958652850152606060408501526060840191611d36565b0390a1938395965061061c565b89610725604051928392630c89984b60e31b8452600484015260248301906118dc565b0390fd5b60405163540e5f0b60e01b8152600490fd5b604051636c44ef8f60e01b8152600490fd5b604051633c8270bd60e21b8152600490fd5b604051632cff108b60e21b8152600490fd5b3461015f5760031960203682011261015f5767ffffffffffffffff6004351161015f5760c0906004353603011261015f576107aa6126cc565b5f80806107bf60048035608481019101611e8d565b90501561104d5760246004350135926107d784612773565b1561103b576060806040516107eb81611968565b6107f3611ee2565b81525f60208201525f6040820152015261080b611ee2565b5061086b61086661084561083b61083561082f608460043501600435600401611e8d565b90611f14565b80611f2f565b6040810190611f44565b602061085e61082f608460043501600435600401611e8d565b013591611f7a565b611d22565b936001600160a01b036108ba6108666108a161089761083561082f608460043501600435600401611e8d565b6060810190611f44565b604061085e61082f608460043501600435600401611e8d565b81604051976108c889611930565b16875216602086015260408501526108ea608460043501600435600401611e8d565b9490506001604051950160051b85016040525f905f5b610914608460043501600435600401611e8d565b9050811080611028575b15610e7557610937608460043501600435600401611e8d565b821015610e61578160051b810135607e198236030181121561015f57608081830136031261015f576040519161096c83611968565b8181013567ffffffffffffffff811161015f5761098e90369084840101611b61565b835280820160208181013590850152604080820135908501526060013567ffffffffffffffff811161015f576109c79236920101611d07565b606082015280516001600160a01b036109e96040830151602085015190611fd7565b5151166001600160a01b0385511614801590610e2d575b610e1b57610a1860208301516040840151908361305d565b610a218161270e565b91825f525f60205260405f2054155f14610a85575051604080513381526001600160a01b039092166020830152810191909152600191907fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f390606090a15b01610900565b9190610ab6602084979597015160408501519060608601519060405192610aab846119b4565b5f8452339186613092565b925f93610ace60608201516044600435013590612796565b15610b3557505051604080513381526001600160a01b03909216602083015281019190915260019291907fe3151dc8cb7a54ffc4baabd28c1f241c94d510b5e5b502491ac3cad6c16316d590606090a15b8115610b2d575b5092610a7f565b905088610b26565b610b426040820151612773565b158015610e08575b15610b9f57505051604080513381526001600160a01b03909216602083015281019190915260019291907f500b713857325f9e6dcb52ae832eca9109d107ed1aae9cb4928b4c1e13f051aa90606090a1610b1f565b9250925050600196959691610bb8606460043501611feb565b15610d755796610c2897610c3860408401516040880151610bd98183613401565b15610d6d5750925b610c32848592610c1b610c1560608a01516001600160e01b03601b918660e01d92828816810b928260e01d9216900b613dd1565b90613f8c565b9d8e9260408d01516134cc565b60408c01526134f6565b996134f6565b98610c438484613520565b610c4d848261357e565b60405192338452608060208501526060610c73845160808088015261010087019061203f565b93602081015160a0870152604081015160c0870152015192607f198582030160e0860152835180825260208201906020808260051b8501019601925f5b828110610d0f57505050505092806001979695937f194f1feb3b4d7076a2c272e774e792e0c48bb8c7aa1a9a3671c1cd6da9e6b4c193610d0a96604084015260608301520390a180858c5101808d5260051b8c0152613690565b610b1f565b9091929396602080610d60600193601f198782030189528b51906001600160a01b0382511681526040610d4f8584015160608785015260608401906120be565b9201519060408184039101526118dc565b9901950193929101610cb0565b905092610be1565b610c2890610c386060840151610c32610db3610c1560408801516001600160e01b0394601b90868360e01d9316820b91878260e01d9216900b613dd1565b60408a0151610dc28183613401565b15610e005750915b829c8d916060890151908116155f14610df1575060408801515b96879460408d01516134cc565b610dfb9085613428565b610de4565b905091610dca565b50610e1660608201516133de565b610b4a565b60405163936bb5ad60e01b8152600490fd5b506001600160a01b03610e496060830151604085015190611fd7565b5151166001600160a01b036020860151161415610a00565b634e487b7160e01b5f52603260045260245ffd5b50919390610e87606460043501611feb565b1561102257835b6004356004013590610ea08282613401565b6110045750508490610ec0856001600160a01b0360208701511633612ff4565b505060a46004350190610ed8826004356004016120f1565b905015159081610ffc575b50610f5b575b506001600160a01b03610eff92935116336127bd565b50505b8351811015610f275780610f21610f1b60019387611fd7565b51613869565b01610f02565b5060409160017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005582519182526020820152f35b90506001600160a01b03602084015116610f856001600160a01b03855116926004356004016120f1565b929091333b1561015f57610fcd5f93604051958694859463691f9ed760e01b8652600486015260248501528960448501528a606485015260a0608485015260a4840191611d36565b038183335af190811561016b57859115610ee9579050610fed9150611984565b5f836001600160a01b03610ee9565b905088610ee3565b604492506040519163573b6f4160e01b835260048301526024820152fd5b84610e8e565b506110366040830151612773565b61091e565b60405163315f9e2360e21b8152600490fd5b604051639c95219f60e01b8152600490fd5b3461015f5760208060031936011261015f576024816001600160a01b03611084611850565b16604051928380926370a0823160e01b82523060048301525afa90811561016b575f916110b5575b50604051908152f35b90508181813d83116110db575b6110cc81836119d0565b8101031261015f5751826110ac565b503d6110c2565b3461015f576110f036611890565b92916110fd9491946126cc565b61110883833361273f565b61111181612773565b15611235578160ff91611129856111ec969533612d27565b6111338183613401565b1561122f575080935b61114885828533612f96565b917f8045c25080b0868951141ed0a91720bcad09a8364a2b3109ee1fd49c1f0bc8b860c0611177898833612ff4565b97906001600160a01b0360405192338452169a8b6020840152856040840152886060840152608083015260a0820152a16040519660068852602088015260408701526060860152608085015260a08401521660c082015260e08101604052906040519160018352602083015260408201604052565b90806112185760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b611227926101ce913691611ddb565b8080806101d4565b9361113c565b50604051623a3a4d60e21b81523360048201526001600160a01b039190911660248201526044810191909152606490fd5b3461015f57608036600319011261015f576004356001600160a01b039081811680910361015f57611295611866565b6044359167ffffffffffffffff9160643583811161015f573660238201121561015f57806004013593841161015f57366024858301011161015f576113229560209216936112e4868587612eb7565b60405196879283926323e30c8b60e01b84523360048501528760248501528860448501525f606485015260a06084850152602460a485019201611d36565b03815f855af193841561016b575f9461138e575b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd984036113755761136a93503091612f30565b602060405160018152f35b604051630b6c58a960e31b815260048101859052602490fd5b9093506020813d6020116113ba575b816113aa602093836119d0565b8101031261015f57519284611336565b3d915061139d565b3461015f57606036600319011261015f5760206113f16113e0611850565b6113e8611866565b60443591612d27565b604051908152f35b3461015f5761140736611890565b928094926114136126cc565b61141e82853361273f565b61142781612773565b15611513578061143b61148a9286336127bd565b9790957f7f9dfa19cf1cc2f806f2f860fbc9c056b601fb1afc0e9b843dfe5c63616268e660806040513381526001600160a01b038416998a60208301528560408301526060820152a133612863565b939091856114b85760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b611507966101ce956106659460ff93604051956005875260208701526040860152606085015260808401521660a082015260c08101604052906040519160018352602083015260408201604052565b808080808080806101d4565b506040516306dde9c360e41b81523360048201526001600160a01b03841660248201526044810191909152606490fd5b3461015f57602036600319011261015f576004355f525f6020526020600160405f205414604051908152f35b3461015f5760031960403682011261015f5767ffffffffffffffff9060043582811161015f57806004019160a08236039182011261015f5760243584811161015f576115bf90369060040161181f565b90936115c96126cc565b5f946001600160a01b0394856115de84611d22565b1633036117aa576115f76115f23685611b61565b61270e565b805f525f60205260405f2096600188541461163e575b60208960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556040519015158152f35b9091929394959697505f6001985560405196338852826020890152606060408901528161166a8761187c565b1660608901526024840135906062190181121561015f5783019060a06080890152806116986004840161187c565b166101008901526116ab6024830161187c565b1661012088015260448101356022198236030181121561015f57019060246004830135920198821161015f57813603891361015f577f09d18501db0080ca2d6cd7c17fa7255daff4b2d503ea93b76ff68b6752ea8e6387806106659560846117736101ce9a60209f6117329061179d9f9a606061014061064e9d0152610160880191611d36565b6117646117596117456044880185611d56565b605f198a8603810160a08c01529491611d8b565b926064870190611d56565b918784030160c0880152611d8b565b91013560e08301520390a13390919060405192600284526020840152604083015260608201604052565b828080808080808061160d565b6024866117b685611d22565b6040516335252be360e01b815291166004820152fd5b3461015f57602036600319011261015f576004359063ffffffff60e01b821680920361015f5760209163e414309160e01b811490811561180e575b5015158152f35b6301ffc9a760e01b14905083611807565b9181601f8401121561015f5782359167ffffffffffffffff831161015f576020808501948460051b01011161015f57565b600435906001600160a01b038216820361015f57565b602435906001600160a01b038216820361015f57565b35906001600160a01b038216820361015f57565b90608060031983011261015f576004356001600160a01b038116810361015f579160243591604435916064359067ffffffffffffffff821161015f576118d89160040161181f565b9091565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b60a0810190811067ffffffffffffffff82111761191c57604052565b634e487b7160e01b5f52604160045260245ffd5b6060810190811067ffffffffffffffff82111761191c57604052565b6040810190811067ffffffffffffffff82111761191c57604052565b6080810190811067ffffffffffffffff82111761191c57604052565b67ffffffffffffffff811161191c57604052565b60e0810190811067ffffffffffffffff82111761191c57604052565b6020810190811067ffffffffffffffff82111761191c57604052565b90601f8019910116810190811067ffffffffffffffff82111761191c57604052565b92919267ffffffffffffffff821161191c5760405191611a1c601f8201601f1916602001846119d0565b82948184528183011161015f578281602093845f960137010152565b9080601f8301121561015f57816020611a53933591016119f2565b90565b919060608382031261015f5760405190611a6f82611930565b8193611a7a8161187c565b8352611a886020820161187c565b602084015260408101359167ffffffffffffffff831161015f57604092611aaf9201611a38565b910152565b67ffffffffffffffff811161191c5760051b60200190565b929192611ad882611ab4565b604092611ae860405192836119d0565b819581835260208093019160061b84019381851161015f57915b848310611b1157505050505050565b858383031261015f578386918251611b288161194c565b611b318661187c565b81528286013583820152815201920191611b02565b9080601f8301121561015f57816020611a5393359101611acc565b91909160a08184031261015f5760405190611b7b82611900565b8193611b868261187c565b835267ffffffffffffffff91602081013583811161015f5782611baa918301611a56565b6020850152604081013583811161015f5782611bc7918301611b46565b6040850152606081013592831161015f57611be86080939284938301611b46565b60608501520135910152565b909291611c0084611ab4565b916040611c1060405194856119d0565b839580855260208095019160059160051b84019480861161015f5784935b868510611c3f575050505050505050565b67ffffffffffffffff90853582811161015f5787019060608285031261015f578451611c6a81611930565b611c738361187c565b81528a83013584811161015f57830185601f8201121561015f57803590611c9982611ab4565b91611ca6895193846119d0565b8083528d808401918b1b8301019188831161015f578e809101915b838310611cf757509150508201528583013593841161015f57611ce8858c95869501611a38565b86820152815201940193611c2e565b82358152918101918f9101611cc1565b9080601f8301121561015f57816020611a5393359101611bf4565b356001600160a01b038116810361015f5790565b908060209392818452848401375f828201840152601f01601f1916010190565b9035601e198236030181121561015f57016020813591019167ffffffffffffffff821161015f578160061b3603831361015f57565b9190808252602080920192915f905b828210611da8575050505090565b909192936001906001600160a01b03611dc08761187c565b16815285830135838201526040908101950193920190611d9a565b90929192611de881611ab4565b91604091611df960405194856119d0565b839581855260208095019160051b83019381851161015f5783925b858410611e245750505050505050565b67ffffffffffffffff90843582811161015f57860190838286031261015f578351611e4e8161194c565b823584811161015f5786611e63918501611a56565b81528983013593841161015f57611e7e868b95869501611d07565b83820152815201930192611e14565b903590601e198136030182121561015f570180359067ffffffffffffffff821161015f57602001918160051b3603831361015f57565b60405190611ed082611930565b60606040835f81525f60208201520152565b60405190611eef82611900565b5f608083828152611efe611ec3565b6020820152606060408201526060808201520152565b9015610e6157803590607e198136030182121561015f570190565b903590609e198136030182121561015f570190565b903590601e198136030182121561015f570180359067ffffffffffffffff821161015f57602001918160061b3603831361015f57565b9190811015610e615760061b0190565b805115610e615760200190565b805160011015610e615760400190565b805160021015610e615760600190565b805160031015610e615760800190565b805160041015610e615760a00190565b8051821015610e615760209160051b010190565b35801515810361015f5790565b9081518082526020808093019301915f5b828110612017575050505090565b835180516001600160a01b031686528201518583015260409094019392810192600101612009565b906080806120b56120a361209160406001600160a01b0380895116885260208901519060a060208a01528082511660a08a015260208201511660c08901520151606060e08801526101008701906118dc565b60408701518682036040880152611ff8565b60608601518582036060870152611ff8565b93015191015290565b9081518082526020808093019301915f5b8281106120dd575050505090565b8351855293810193928101926001016120cf565b903590601e198136030182121561015f570180359067ffffffffffffffff821161015f5760200191813603831361015f57565b903590605e198136030182121561015f570190565b6121506115f26121498380611f2f565b3690611b61565b5f525f602052600160405f2054036121ec5780612170816121dc93611f2f565b6121d461218f6121946020850135938460408701359384923690611b61565b61305d565b6121ac6121a18580611f2f565b946060810190611e8d565b92906121cc604051966121be886119b4565b5f88525f3681373690611b61565b933691611bf4565b923392613092565b6040810151606090910151600192565b505f905f905f90565b5f5b82811061220357505050565b6060828201526020016121f7565b92916001600160a01b038451166001600160a01b03835116146126ba576001600160a01b03612247606086015160643590611fd7565b515116906040830151916001600160a01b036122666084358095611fd7565b5151161480159061267a575b610e1b576040850151906001600160a01b036122916044358094611fd7565b5151166001600160a01b036122ac60643560608a0151611fd7565b51511614612668576122bd8661270e565b805f525f60205260405f20541561261557506122d88461270e565b805f525f60205260405f2054156125c157506123bb9291612395917f6fa7f4c28634b0a9d6831401c45ae468195fb63aed07308935c35374ff5d9e396040518061234061233261012033845280602085015283018d61203f565b82810360408401528a61203f565b85606083015260643560808301528760a083015260a43560c083015260c43560e083015260e4356101008301520390a16001600160a01b0386511660405192612388846119b4565b5f8452606435908a613092565b936001600160a01b03865116604051926123ae846119b4565b5f845260a4359086613092565b916123c96040820151612773565b1580156125ad575b801561259a575b8015612587575b61257557604051916123f083611968565b5f83525f60208401525f60408401525f606084015261240f848361473c565b84526040840152612435612423838661473c565b602086015280606086015284516134cc565b9461244960208501516040860151906134cc565b93612453876133de565b8015612566575b6125545761251b61254d957fd9fa84dd790c969daa5c33d8050dc06b4a9b59d5b42e2be5f5e8ae20447f618d946124fd6125529a60a09661249c8a8851613520565b6124aa8c6020890151613520565b6124b88a604089015161357e565b6124c68c606089015161357e565b6124cf8a613869565b6124d88c613869565b6001600160a01b036124f460c435926060606435910151611fd7565b51511633612863565b50506001600160a01b036124f460e43592606060a435910151611fd7565b5050606060405191338352805160208401526020810151604084015260408101518284015201516080820152a1613690565b613690565b565b604051630d86822160e01b8152600490fd5b50612570856133de565b61245a565b6040516321badf1f60e01b8152600490fd5b5061259560608401516133de565b6123df565b506125a860608201516133de565b6123d8565b506125bb6040840151612773565b156123d1565b9351604080513381526001600160a01b039092166020830152810194909452507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f3945091925082915050606081015b0390a1565b9551604080513381526001600160a01b039092166020830152810196909652507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f394935083925050606082019050612610565b604051631cd2f1c760e21b8152600490fd5b506001600160a01b03612694606085015160a43590611fd7565b5151166001600160a01b036126b0604088015160443590611fd7565b5151161415612272565b604051630a98f1f360e21b8152600490fd5b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0060028154146126fc5760029055565b604051633ee5aeb560e01b8152600490fd5b6040516127398161272b602082019460208652604083019061203f565b03601f1981018352826119d0565b51902090565b90911561274a575050565b6040516305dbdfd960e41b81526001600160a01b03918216600482015291166024820152604490fd5b612792905f60e01d906001600160e01b038160e01d9116601b0b61479f565b1290565b90612792916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614820565b9291926127c982613a64565b936127d3816133de565b6128515784816001600160e01b036127f29360e01d9116601b0b61489f565b9290809315612828575b5082908161280c575b5050509190565b612820926001600160a01b03309216612f30565b5f8181612805565b9092505f19811461283d57600101915f6127fc565b634e487b7160e01b5f52601160045260245ffd5b604051632eaefac360e21b8152600490fd5b93929193612870836133de565b61290e578461288c57612884939450612ff4565b50505f905f90565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f5281526128c9835f205494856134f6565b956128d3876133de565b6128f6575f97885260018252838820908852815282872091875252909320829055565b835163c5e12af560e01b815260048101889052602490fd5b60405163793a8f5560e01b815260048101849052602490fd5b919060408382031261015f57825167ffffffffffffffff9081811161015f5784019082601f8301121561015f57815160209261296282611ab4565b9161297060405193846119d0565b808352848084019160051b8301019186831161015f5785809101915b8383106129ff5750505050948281015191821161015f57019180601f8401121561015f5782516129bb81611ab4565b936129c960405195866119d0565b818552838086019260051b82010192831161015f578301905b8282106129f0575050505090565b815181529083019083016129e2565b825181529181019186910161298c565b90808251908181526020809101926020808460051b8301019501935f915b848310612a3d5750505050505090565b9091929394958480612a5b600193601f198682030187528a516120be565b9801930193019194939290612a2d565b91906020928381526001600160a01b0382511684820152838201516040820152612aa5604083015160e060608401526101008301906118dc565b9060608301516080820152612acc608084015192601f1993848483030160a0850152612a0f565b9260a081015193838382030160c08401528680865192838152019501905f5b818110612b0f57505050611a5394955060c060e091015192828503019101526120be565b825187529588019591880191600101612aeb565b90604082019082526020606081936040838201528551809452019301915f5b828110612b50575050505090565b835185529381019392810192600101612b42565b919091335f526020308152604091825f2091835195612b828761194c565b612b8a611ec3565b875260608281980152845190612b9f826119b4565b5f8252855190612bae826119b4565b5f82525f3681375f5b8151811015612d1b57898688612bcd8486611fd7565b51888151948d80870151908151612bef575b5050505050505050600101612bb7565b905f92916001600160a01b0396612c148887818d51169c015116998789015190613b43565b95825199612c218b611998565b8a5289015287015285015260808401528760a08401528660c08401525f8c51809563d04dfe2360e01b82528180612c5c600498898301612a6b565b03915afa938415612d11579089915f95612ceb575b508451612c87575b50899250808e8c938e612bdf565b5101511691823b1561015f57612cb5925f92838d5180968195829463012c676d60e21b845233908401612b23565b03925af18015612ce1579060019291612cd2575b81928782612c79565b612cdb90611984565b5f612cc9565b89513d5f823e3d90fd5b612d089195503d805f833e612d0081836119d0565b810190612927565b9050935f612c71565b8c513d5f823e3d90fd5b50505050505050509050565b8215612d5c576001600160a01b038091165f52600160205260405f2091165f5260205260405f20905f5260205260405f205490565b909150612d6882613d75565b6001600160a01b03809316906040918251946370a0823160e01b86528416938460048701526020928387602481865afa968715612e7e575f97612e88575b5083612dbf612db883612def9a614a54565b50906141df565b508651636eb1769f60e11b81526001600160a01b0390941660048501523060248501529297889081906044820190565b0381865afa968715612e7e575f97612e4d575b50612db8612e1391611a5398614a54565b50612e1e8183613401565b15612e455750935b5f5260018252825f20905f528152815f20905f8052525f2054906134f6565b905093612e26565b96508387813d8311612e77575b612e6481836119d0565b8101031261015f57955195612db8612e02565b503d612e5a565b85513d5f823e3d90fd5b96508387813d8311612eb0575b612e9f81836119d0565b8101031261015f5795519583612da6565b503d612e95565b6040519263a9059cbb60e01b5f526001600160a01b0380931660045260245260205f60448180855af160015f5114811615612f11575b8360405215612efb57505050565b635274afe760e01b835216600482015260249150fd5b6001811516612f2757813b15153d151616612eed565b833d5f823e3d90fd5b9092604051936323b872dd60e01b5f526001600160a01b0393848092166004521660245260445260205f60648180855af160015f5114811615612f80575b836040525f60605215612efb57505050565b6001811516612f2757813b15153d151616612f6e565b93929193612fa3836133de565b61290e5784612fb7576128849394506127bd565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f5281526128c9835f205494856134cc565b9092919261300181613a64565b9361300b816133de565b61304b5784816001600160e01b0361302a9360e01d9116601b0b61489f565b50809281613039575050509190565b6001600160a01b036128209316612eb7565b604051632d1671a360e11b8152600490fd5b9161308890606061307d936001600160a01b039485916040880151611fd7565b515116940151611fd7565b5151161461266857565b94919392909260408051916130a683611998565b6130ae611ee2565b83526020925f848201525f838201526060945f868301528560c06080938260808201525f60a082015201528351916130e583611900565b600483525f5b8181106133cf5750506132d8959493925f9261320f61325f938d61310e8161270e565b9c896001600160a01b039e8f94859182865116908d5194600386528501528c840152168c820152608081018a5261314486611f8a565b5261314e85611f8a565b50885161315a81611930565b6002815289368c83013761316d86611f97565b5261317785611f97565b5060ff8a6131da8b8501936131c48761319d81613195858a51611fd7565b515116613d75565b975116886131ac848951611fd7565b515116856131bb858a51611fd7565b51015191612d27565b966131d0828751611fd7565b5151169451611fd7565b51015192169093929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b61321882611fa7565b5261322281611fa7565b506132468a8d8d60ff8a6131da8d8501936131c48761319d81613195858a51611fd7565b61324f82611fb7565b5261325981611fb7565b50613b43565b95878a511697848b0191825191868184511693015116928a85523087528580862091510151865191613290836119b4565b86835287519561329f87611998565b86528886015286850152848885015289608085015260a084015260c08301528351808098819463d04dfe2360e01b835260048301612a6b565b03915afa9687156133c5575f945f986133a3575b5084516002811061338c5750818386015195015161331261330c88611fc7565b51611fb7565b5161331d8183613401565b156133845750925b6133478685919060405192600284526020840152604083015260608201604052565b61335088611fa7565b5261335a87611fa7565b508251996133678b611998565b8a52890152870152850152608084015260a083015260c082015290565b905092613325565b602490835190630fbb8e5560e21b82526004820152fd5b9097506133bb9194503d805f833e612d0081836119d0565b939093965f6132ec565b50513d5f823e3d90fd5b808888809387010152016130eb565b6133fd905f60e01d906001600160e01b038160e01d9116601b0b61479f565b1390565b906133fd916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614820565b61344f6001600160e01b0392838316601b0b9260e01d938160e01d9116601b0b8484613f96565b90637ffffff5821361349f575b90613466916141df565b9290921580613497575b61347957505090565b6044925060405191638eba4d0760e01b835260048301526024820152fd5b508215613470565b6134a98282614e7f565b1561345c57604483856040519163d556b11160e01b835260048301526024820152fd5b611a5391610c15916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6143e5565b611a5391610c15916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6145a9565b61357a91608081018261353c6135368351611fc7565b51611fc7565b5261357361356d6001600160a01b0380945151169361356461355e8551611fc7565b51611f8a565b51169251611fc7565b51611fa7565b5191612f96565b5050565b906080810191806135926135368551611fb7565b526001600160a01b038092515116916135ae61355e8551611fb7565b51166135bd61356d8551611fb7565b519081613658576135cd836133de565b61290e579183917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a9593612610955f5260209060018252613623604094855f20835f528452855f20855f528452855f20546134f6565b945f5260018252835f20905f528152825f20915f52525f20555b51604051918291338352604060208401526040830190612a0f565b91613689917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a959361261095612863565b505061363d565b60c0810151908151915f92613804575b506137456020918281510151926001600160a01b039081818187511696015116928660a082019485518252308452604097888320898686510151015160808601518b51916136ed836119b4565b8683528c51936136fc856119b4565b8785528d519661370b88611998565b8752898701528c86015260016060860152608085015260a084015260c08301528851808099819463d04dfe2360e01b835260048301612a6b565b03915afa9485156137fa5787956137dc575b508451613768575b50505050505050565b81905101510151169051813b156137d85791849184938361379d965180978195829463012c676d60e21b845260048401612b23565b03925af19081156137cf57506137b8575b808080808061375f565b6137c28291611984565b6137cc57806137ae565b80fd5b513d84823e3d90fd5b8480fd5b6137f19195503d8089833e612d0081836119d0565b9050935f613757565b86513d89823e3d90fd5b6001600160a01b03602080845101510151169060a083015190823b1561015f57613847925f928360405180968195829463012c676d60e21b845260048401612b23565b03925af1801561016b57156136a057613861919250611984565b5f905f6136a0565b6080810161387a61356d8251611fb7565b5191821561388757505050565b6138a161355e6001600160a01b0380935151169351611fb7565b5116815f5260209160018352604092835f20835f528152835f20855f528152835f2054936001600160e01b0385166138dc575b505050505050565b613900955f9284845260018152828420868552815282842091845252812055612ff4565b5f8080806138d4565b8115613913570490565b634e487b7160e01b5f52601260045260245ffd5b604081511061396f576020810151908051603f19810190811161283d5760051c821161395b5760016020920160051b010190565b5050604051613969816119b4565b5f815290565b50604051613969816119b4565b80511561398c57602001515f1a90565b505f90565b905f8091602081519101845af48080613a0f575b156139c55750506040513d81523d5f602083013e60203d82010160405290565b156139ec57604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b3d156139fd576040513d5f823e3d90fd5b60405163d6bda27560e01b8152600490fd5b503d1515806139a55750813b15156139a5565b60041115613a2c57565b634e487b7160e01b5f52602160045260245ffd5b602090939291936001600160a01b036040820195168152613a6083613a22565b0152565b613a6c614f6d565b6040805163b7bad1b160e01b81526001600160a01b0383166004820152909182826024815f73200e12d10bb0c5e4a17e7018f0f1161919bb93895af1928315613b3a575f925f94613b05575b50613ac283613a22565b600183141580613af3575b613ad75750505090565b5163ee07877f60e01b8152918291610725919060048401613a40565b50613afd83613a22565b821515613acd565b90809450613b299293503d8511613b33575b613b2181836119d0565b810190614875565b919091925f613ab8565b503d613b17565b513d5f823e3d90fd5b90805191613b5083611ab4565b91613b6b604094613b63865195866119d0565b808552611ab4565b601f199460209186013686840137835183519095908015613d6a576001613bc19101965b6001978891010197613bb8613ba38a611ab4565b99613bb086519b8c6119d0565b808b52611ab4565b018489016121f5565b85805f9684516002815233878201523086820152606081018652613be48b611f8a565b52613bee8a611f8a565b505f925b613d26575b5050508351613c0a575b50505050505090565b85809598979692980181613c1e8289611fd7565b52613c298188611fd7565b505f925b613c3c575b5085969750613c01565b8451831015613d21576001600160a01b03613cb381613c5b8689611fd7565b51511686613c69878a611fd7565b51015187815160051b9101207f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f52601c52603c5f208c613caa888b611fd7565b510151916149cb565b15613d0957868098999a928192613cca878a611fd7565b515116613cd78787611fd7565b52019385613ce58289611fd7565b510151613cf2868c611fd7565b52613cfd858b611fd7565b50019290989796613c2d565b8951630a57f30960e31b815260048101859052602490fd5b613c32565b9091968151881015613d61578280910197613d418184611fd7565b51613d4c8a8d611fd7565b52613d57898c611fd7565b5001919081613bf2565b96829150613bf7565b50613bc15f96613b8f565b613d7d614f6d565b60408051630782d7e160e01b81526001600160a01b03831660048201529091828260248173200e12d10bb0c5e4a17e7018f0f1161919bb93895afa928315613b3a575f925f94613b055750613ac283613a22565b9091939284158215175f14613deb5750505090505f905f90565b82810192600160fd1b8082019083011760fe1c613f22575b5050613e0e81614b44565b93613e1881614b44565b94613e238682614b64565b90918215613f13575f9083986f0785ee10d5da46d900f436a000000000808611613f05575b50670de0b6b3a7640000808b11613ef6575b50633b9aca00808b11613ee7575b50612710808b11613ed9575b5098805b613ec8575081906118d8989982600a0a9109960195817fcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccd0a93838211900382610100031b9203901c170291614b77565b60019290920191600a900480613e78565b60049a04998a930192613e74565b600991939a049901915f613e68565b601291939a049901915f613e5a565b85049950602592505f613e48565b509290506118d8949550614b77565b5f821215613f7657808413613f68575b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb2841315613e03579092506118d8939491614a82565b9092506118d8939491614ae9565b80841215613f32579092506118d8939491614a82565b61346682826141df565b92909180613fbc576044848460405191637a97930f60e01b835260048301526024820152fd5b90919280155f14613fd157505050505f905f90565b613fea93613fde91614c31565b92919490938492614c31565b9093919284613ff888614b44565b9161400286614b44565b947f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000094604c918688106141a9575b030191600160ff1b98838a018112155f14614176575050035b5f955f82128061416d575b61414f575b5f81128061413d575b61411f5786820103966001600160ff1b0388149081614115575b508061410c575b80614103575b6140e55750906140999291614ddd565b915f81136140ac575b506118d893614b77565b9091604c82136140da576140c391600a0a90613909565b9081156140d0575f6140a2565b505050505f905f90565b50505050505f905f90565b876044916040519163d556b11160e01b835260048301526024820152fd5b505f8512614089565b50828414614083565b905088145f61407c565b604489836040519163d556b11160e01b835260048301526024820152fd5b50806001600160ff1b03018213614062565b95508087018613156141675786818703015b95614059565b5f614161565b505f8113614054565b89985090920390506001600160ff1b038190038701821361419a5701860194614049565b5050505050505050505f905f90565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009650604b9250614030565b8115613913570590565b8082601b82810b83146143d4577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000008405614380575b8380820b0361436f57507b199999999999999999999999999999999999999999999999999999987b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc84011115614320575b838060030b036142a4575b8084136142885750506001600160e01b036001925b60e01b91161791565b8303600a0a8015613913576001600160e01b039107159261427f565b92915f8413156142f45750906142ba8383614e7f565b6142d657637ffffffe1901600a0a810290637fffffff9261426a565b506044916040519163d556b11160e01b835260048301526024820152fd5b637fffffff1992830390604382136140da5761431391600a0a906141d5565b9182156140d0579261426a565b5f198401808060030b14614334575061425f565b90506001600160e01b039293507b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff915060e01b9260ff1d181617905f90565b600190940193600a90930592614212565b937f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000008405156143c1576305f5e100600894058094819201955b915050614212565b620186a0600594058094819201956143b9565b508261425f57505050505f90600190565b919291600160ff1b84016143fd576118d89350614e98565b906118d8935f03916145a9565b919291600160ff1b919080158061459757509061442691614c31565b9490929091905f86858585828213801561458e575b614571575b505050508682841860ff1c94860391039081604c0381116145565701600a0a80820591908461453c575b505081019182821860ff1c111561453457826001600160ff1b031461451657905f600192135f146144e757600a9004915b01925b811581176144ab57509190565b806144c4575b5080156144bc579190565b505f91508190565b91926144da9203600160ff1b01600a0a906141d5565b600160ff1b91905f6144b1565b600a60037fe666666666666666666666666666666666666666666666666666666666666667920104019161449b565b604490836040519163d556b11160e01b835260048301526024820152fd5b50909261449e565b8107614549575b8061446a565b60ff1d600117015f614543565b505050919350614564579190565b60018160ff1d1790039190565b5f9a50909750909550600160ff1b94509250905086808080614440565b50835f1261443b565b156145a25750509190565b9350919050565b93929193841581158181176146fa575050906145c491614c31565b91949082956145d582958294614c31565b80969294919693878684821380156146f1575b6146d8575b5050505050508682841860ff1c94860391039081604c0381116145565701600a0a8082059190846146be575b505081019182821860ff1c11156146b657826001600160ff1b031461451657905f600192135f1461468757600a9004915b01925b8115811761465a57509190565b8061466a575080156144bc579190565b600160ff1b936146819291038401600a0a906141d5565b5f6144b1565b600a60037fe666666666666666666666666666666666666666666666666666666666666667920104019161464a565b50909261464d565b81076146cb575b80614619565b60ff1d600117015f6146c5565b929b5098509196509450925090505f80808080806145ed565b508584126145e8565b93959390929190156147105750506144bc579190565b945092915050565b600881511061398c576008015167ffffffffffffffff1667ff0a89c674ee78741490565b9160408301926040614776610c15606087519401938451906001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b613dd1565b94519301614785815186612796565b61478d575050565b909350611a5391925051925183613428565b92915f9060018184145f87128715171717614819575f9280821361480b575b03604c81135f8212176147ff57600a0a90846147dd83820293846141d5565b146147f2575050156147ee575f9190565b5f90565b9093509015611a53579190565b5050156147ee575f9190565b5f95600194509250906147be565b5050505f90565b93929190918083145f83125f8712188315871517171761486f575f928082136148625703604c81135f8212176147ff57600a0a90846147dd83820293846141d5565b91946001935091906147be565b50919050565b919082604091031261015f578151600481101561015f5760209092015160ff8116810361015f5790565b91925f8312156148c7576044838360405191634a7d166b60e01b835260048301526024820152fd5b9192836148d957505090505f90600190565b60ff81168201918083126149a1575f831215614911575050604c1981126144bc575f03600a0a9161490a8382613909565b9283021490565b909293915f81135f1461499757604d811361496c57600a0a92831561391357835f190483116149435750500290600190565b60405163c849483b60e01b815260048101849052602481019290925260ff166044820152606490fd5b5060405163c849483b60e01b81526004810192909252602482015260ff919091166044820152606490fd5b5050905090600190565b60405163c849483b60e01b815260048101869052602481019190915260ff82166044820152606490fd5b9091813b614a06576149dd9192614fd6565b506149e781613a22565b1591826149f357505090565b6001600160a01b03918216911614919050565b6020918160645f935160405192630b135d3f60e11b9788855260048501526040602485015286820190604485015e8281018201859052601f01601f191601915afa905f5114601f3d11161690565b9060ff165f03916001600160ff1b0382115f14614a7a57600a6001818404940192061590565b909190600190565b909392915f614a92918184613dd1565b9490945f8483019182019412159081614adf575b8115614ad5575b50614ab757505090565b604492506040519163d556b11160e01b835260048301526024820152fd5b905083125f614aad565b8281129150614aa6565b614afe93600160fe1b90810193920190613dd1565b9081815f821215614b35575050604b19821261288457614b23915f03600a0a906141d5565b9081614b2d575f90565b600160ff1b90565b93600160ff1b90910192509050565b5f811215611a5357600160ff1b90808203614b5d575090565b90505f0390565b905f198183099102908180821091030391565b92939291905f8184181215614c0c576001600160ff1b039283831115614bf657600160ff1b93838503614bac57505050509190565b90919293508514614bc6575050600a600191045f03920190565b604051630ed8062160e21b8152600481019190915260248101919091526044810182905260648101849052608490fd5b5090915050600160ff1b811461283d575f039190565b90916001600160ff1b0380841115612805578514614bc6575050600a60019104920190565b9190918015614dd357827f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000080830515614ce1575b507f19999999999999999999999999999999999999999999999999999999999999997f0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc830110614cd2575b8313614cbc5791905f90565b919060018060ff1b926001600160ff1b03030190565b9290600a02905f190192614cb0565b6f4b3b4ca85a86c47a098a22400000000080840515614dc1575b507728c87cb5c89a2571ebfdcb54864ada834a00000000000000830515614daa575b7b097edd871cfda3a5697758bf0e3cbb5ac5741c640000000000000000830515614d96575b7e3899162693736ac531a5a58f1fbb4b746504382ca7e4000000000000000000830515614d8657820515614d77575b5f614c65565b9290600a02905f190192614d71565b9391606402916001190193614d42565b93916402540be40002916009190193614d42565b9391678ac7230489e8000002916012190193614d1d565b6025198301955092909202915f614cfb565b505f915081908190565b90915f198383099280830292838086109503948086039584871015614e5b5714614e53579082910960018219018216809204600280826003021880830282030280830282030280830282030280830282030280830282030280920290030293600183805f03040190848311900302920304170290565b505091500490565b60648386866040519263362ced0960e11b8452600484015260248301526044820152fd5b611a5391905f811215614e93575f03615010565b615010565b909291600160ff1b91828101614f2a5750808414614f2057808413918215614f18578185035b604c811115614f075750505f915b15614ef857507f8000000000000000000000000000000000000000000000000000000000000001019190565b92506001600160ff1b03039190565b600a0a908115613913570491614ecc565b848203614ebe565b505090505f905f90565b93614f3792945f0361440a565b80939180928114614f4b575b50505f039190565b915092506001600160ff1b03831461451657600a600191059201915f80614f43565b73200e12d10bb0c5e4a17e7018f0f1161919bb9389803b158015614fab575b614f935750565b602490604051906373e6d7b360e01b82526004820152fd5b507f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d41813f1415614f8c565b815191906041830361500657614fff9250602082015190606060408401519301515f1a9061509f565b9192909190565b50505f9160029190565b90637ffffff581131561509957637ffffffe1981019060438213615092575f82121561506657637fffffff91505f0301600a0a7b8000000000000000000000000000000000000000000000000000000202111590565b50600a0a8015613913577b80000000000000000000000000000000000000000000000000000001041090565b5050151590565b50505f90565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411615116579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa1561016b575f516001600160a01b0381161561510c57905f905f90565b505f906001905f90565b5050505f916003919056"; /// @dev The runtime bytecode of the contract. bytes constant RUNTIME_CODE = - hex"6080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a7146117cc575080631f69cb751461156f5780632cb77e9f146115435780632fbc4ba0146113f957806341d1514f146113c25780635cffe9de1461126657806360746119146110e2578063613255ab1461105f57806369c7285614610771578063709fb8a5146104375780639235084d146103e3578063ac9650d814610295578063d7e442ec14610237578063d9d98ce4146101865763fa501182146100c1575f80fd5b34610182576101403660031901126101825767ffffffffffffffff600435818111610182576100f4903690600401611b61565b6024358281116101825761010c903690600401611b61565b60c0366043190112610182576101043583811161018257610131903690600401611d07565b90610124359384116101825761014e61015c943690600401611d07565b926101576126cb565b612211565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b5f80fd5b34610182576040366003190112610182576001600160a01b036101a7611850565b166040516370a0823160e01b8152306004820152602081602481855afa90811561022c575f916101fa575b50156101e25760206040515f8152f35b60249060405190633c5bf76960e21b82526004820152fd5b90506020813d602011610224575b81610215602093836119d0565b810103126101825751826101d2565b3d9150610208565b6040513d5f823e3d90fd5b346101825760203660031901126101825760043567ffffffffffffffff81116101825761028f61026e61015c92369060040161181f565b91906102786126cb565b60405192610285846119b4565b5f84523691611ddb565b90612b63565b34610182576020806003193601126101825760043567ffffffffffffffff8111610182576102c790369060040161181f565b9190604051926102d6846119b4565b5f84528284016102e582611ab4565b946102f360405196876119d0565b8286526102ff83611ab4565b9361031186880195601f1901866121f5565b5f5b84811061037557604080518881528951818a018190525f92600582901b83018101918a918c9085015b8287106103495785850386f35b909192938280610365600193603f198a820301865288516118dc565b960192019601959291909261033c565b806103c4886103be61039160019560059d9c9d1b8701876120f1565b929089846040519586938585013782018381015f81528b519283915e015f838201520380845201826119d0565b30613990565b6103ce828a611fd7565b526103d98189611fd7565b5001969596610313565b3461018257600319602036820112610182576004359067ffffffffffffffff821161018257608090823603011261018257610422606091600401612139565b90604051921515835260208301526040820152f35b34610182576003196040368201126101825760043567ffffffffffffffff8082116101825760c082600401938336030112610182576024359081116101825761048490369060040161181f565b9061048d6126cb565b6104be6104b96104b46104ad6104a38880612124565b60408101906120f1565b36916119f2565b613926565b61397b565b801561075f576001101561074d57602483016104da8186611f44565b90501561073b5760448401946104f08682611f44565b9050156107295761055661051e9661054a61051561050e8580612124565b9585611f44565b99909285611f44565b91909261053b6040519761053189611900565b3389523690611a56565b9a60209b8c8901523691611acc565b60408601523691611acc565b60608301526064850135608083015261056e8261270d565b91825f525f875260405f209586541596876105b2575b888860017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055604051908152f35b6001905560a46001600160a01b03917f87491344dfbcf91f6cbbc610cbbeedc85313d37a02df0c93527f7ea5f8db717f83855116604051908152878c8201526060604082015280610606606082018861203f565b0390a1019161061583856120f1565b9050610679575b5050505061066d929161066561064e61028f933390919060405192600284526020840152604083015260608201604052565b906040519160018352602083015260408201604052565b923691611ddb565b82808080808080610584565b6106866104ad84866120f1565b61068f81614717565b156107025750937fd46c2c56b35c8210e9e712ec3f02242d5fc90187c0ac8ed80cc33626846ec3698961066d9897956106f56106d86106659761064e9761028f9b5116936120f1565b866040519586958652850152606060408501526060840191611d36565b0390a1938395965061061c565b89610725604051928392630c89984b60e31b8452600484015260248301906118dc565b0390fd5b60405163540e5f0b60e01b8152600490fd5b604051636c44ef8f60e01b8152600490fd5b604051633c8270bd60e21b8152600490fd5b604051632cff108b60e21b8152600490fd5b34610182576003196020368201126101825767ffffffffffffffff600435116101825760c09060043536030112610182576107aa6126cb565b5f80806107bf60048035608481019101611e8d565b90501561104d5760246004350135926107d784612772565b1561103b576060806040516107eb81611968565b6107f3611ee2565b81525f60208201525f6040820152015261080b611ee2565b5061086b61086661084561083b61083561082f608460043501600435600401611e8d565b90611f14565b80611f2f565b6040810190611f44565b602061085e61082f608460043501600435600401611e8d565b013591611f7a565b611d22565b936001600160a01b036108ba6108666108a161089761083561082f608460043501600435600401611e8d565b6060810190611f44565b604061085e61082f608460043501600435600401611e8d565b81604051976108c889611930565b16875216602086015260408501526108ea608460043501600435600401611e8d565b9490506001604051950160051b85016040525f905f5b610914608460043501600435600401611e8d565b9050811080611028575b15610e7557610937608460043501600435600401611e8d565b821015610e61578160051b810135607e1982360301811215610182576080818301360312610182576040519161096c83611968565b8181013567ffffffffffffffff81116101825761098e90369084840101611b61565b835280820160208181013590850152604080820135908501526060013567ffffffffffffffff8111610182576109c79236920101611d07565b606082015280516001600160a01b036109e96040830151602085015190611fd7565b5151166001600160a01b0385511614801590610e2d575b610e1b57610a1860208301516040840151908361305c565b610a218161270d565b91825f525f60205260405f2054155f14610a85575051604080513381526001600160a01b039092166020830152810191909152600191907fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f390606090a15b01610900565b9190610ab6602084979597015160408501519060608601519060405192610aab846119b4565b5f8452339186613091565b925f93610ace60608201516044600435013590612795565b15610b3557505051604080513381526001600160a01b03909216602083015281019190915260019291907fe3151dc8cb7a54ffc4baabd28c1f241c94d510b5e5b502491ac3cad6c16316d590606090a15b8115610b2d575b5092610a7f565b905088610b26565b610b426040820151612772565b158015610e08575b15610b9f57505051604080513381526001600160a01b03909216602083015281019190915260019291907f500b713857325f9e6dcb52ae832eca9109d107ed1aae9cb4928b4c1e13f051aa90606090a1610b1f565b9250925050600196959691610bb8606460043501611feb565b15610d755796610c2897610c3860408401516040880151610bd98183613400565b15610d6d5750925b610c32848592610c1b610c1560608a01516001600160e01b03601b918660e01d92828816810b928260e01d9216900b613dd0565b90613f8b565b9d8e9260408d01516134cb565b60408c01526134f5565b996134f5565b98610c43848461351f565b610c4d848261357d565b60405192338452608060208501526060610c73845160808088015261010087019061203f565b93602081015160a0870152604081015160c0870152015192607f198582030160e0860152835180825260208201906020808260051b8501019601925f5b828110610d0f57505050505092806001979695937f194f1feb3b4d7076a2c272e774e792e0c48bb8c7aa1a9a3671c1cd6da9e6b4c193610d0a96604084015260608301520390a180858c5101808d5260051b8c015261368f565b610b1f565b9091929396602080610d60600193601f198782030189528b51906001600160a01b0382511681526040610d4f8584015160608785015260608401906120be565b9201519060408184039101526118dc565b9901950193929101610cb0565b905092610be1565b610c2890610c386060840151610c32610db3610c1560408801516001600160e01b0394601b90868360e01d9316820b91878260e01d9216900b613dd0565b60408a0151610dc28183613400565b15610e005750915b829c8d916060890151908116155f14610df1575060408801515b96879460408d01516134cb565b610dfb9085613427565b610de4565b905091610dca565b50610e1660608201516133dd565b610b4a565b60405163936bb5ad60e01b8152600490fd5b506001600160a01b03610e496060830151604085015190611fd7565b5151166001600160a01b036020860151161415610a00565b634e487b7160e01b5f52603260045260245ffd5b50919390610e87606460043501611feb565b1561102257835b6004356004013590610ea08282613400565b6110045750508490610ec0856001600160a01b0360208701511633612ff3565b505060a46004350190610ed8826004356004016120f1565b905015159081610ffc575b50610f5b575b506001600160a01b03610eff92935116336127bc565b50505b8351811015610f275780610f21610f1b60019387611fd7565b51613868565b01610f02565b5060409160017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005582519182526020820152f35b90506001600160a01b03602084015116610f856001600160a01b03855116926004356004016120f1565b929091333b1561018257610fcd5f93604051958694859463691f9ed760e01b8652600486015260248501528960448501528a606485015260a0608485015260a4840191611d36565b038183335af190811561022c57859115610ee9579050610fed9150611984565b5f836001600160a01b03610ee9565b905088610ee3565b604492506040519163573b6f4160e01b835260048301526024820152fd5b84610e8e565b506110366040830151612772565b61091e565b60405163315f9e2360e21b8152600490fd5b604051639c95219f60e01b8152600490fd5b3461018257602080600319360112610182576024816001600160a01b03611084611850565b16604051928380926370a0823160e01b82523060048301525afa90811561022c575f916110b5575b50604051908152f35b90508181813d83116110db575b6110cc81836119d0565b810103126101825751826110ac565b503d6110c2565b34610182576110f036611890565b92916110fd9491946126cb565b61110883833361273e565b61111181612772565b15611235578160ff91611129856111ec969533612d26565b6111338183613400565b1561122f575080935b61114885828533612f95565b917f8045c25080b0868951141ed0a91720bcad09a8364a2b3109ee1fd49c1f0bc8b860c0611177898833612ff3565b97906001600160a01b0360405192338452169a8b6020840152856040840152886060840152608083015260a0820152a16040519660068852602088015260408701526060860152608085015260a08401521660c082015260e08101604052906040519160018352602083015260408201604052565b90806112185760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b6112279261028f913691611ddb565b80808061015c565b9361113c565b50604051623a3a4d60e21b81523360048201526001600160a01b039190911660248201526044810191909152606490fd5b34610182576080366003190112610182576004356001600160a01b039081811680910361018257611295611866565b6044359167ffffffffffffffff916064358381116101825736602382011215610182578060040135938411610182573660248583010111610182576113229560209216936112e4868587612eb6565b60405196879283926323e30c8b60e01b84523360048501528760248501528860448501525f606485015260a06084850152602460a485019201611d36565b03815f855af193841561022c575f9461138e575b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd984036113755761136a93503091612f2f565b602060405160018152f35b604051630b6c58a960e31b815260048101859052602490fd5b9093506020813d6020116113ba575b816113aa602093836119d0565b8101031261018257519284611336565b3d915061139d565b346101825760603660031901126101825760206113f16113e0611850565b6113e8611866565b60443591612d26565b604051908152f35b346101825761140736611890565b928094926114136126cb565b61141e82853361273e565b61142781612772565b15611513578061143b61148a9286336127bc565b9790957f7f9dfa19cf1cc2f806f2f860fbc9c056b601fb1afc0e9b843dfe5c63616268e660806040513381526001600160a01b038416998a60208301528560408301526060820152a133612862565b939091856114b85760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b6115079661028f956106659460ff93604051956005875260208701526040860152606085015260808401521660a082015260c08101604052906040519160018352602083015260408201604052565b8080808080808061015c565b506040516306dde9c360e41b81523360048201526001600160a01b03841660248201526044810191909152606490fd5b34610182576020366003190112610182576004355f525f6020526020600160405f205414604051908152f35b34610182576003196040368201126101825767ffffffffffffffff9060043582811161018257806004019160a08236039182011261018257602435848111610182576115bf90369060040161181f565b90936115c96126cb565b5f946001600160a01b0394856115de84611d22565b1633036117aa576115f76115f23685611b61565b61270d565b805f525f60205260405f2096600188541461163e575b60208960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556040519015158152f35b9091929394959697505f6001985560405196338852826020890152606060408901528161166a8761187c565b166060890152602484013590606219018112156101825783019060a06080890152806116986004840161187c565b166101008901526116ab6024830161187c565b16610120880152604481013560221982360301811215610182570190602460048301359201988211610182578136038913610182577f09d18501db0080ca2d6cd7c17fa7255daff4b2d503ea93b76ff68b6752ea8e63878061066595608461177361028f9a60209f6117329061179d9f9a606061014061064e9d0152610160880191611d36565b6117646117596117456044880185611d56565b605f198a8603810160a08c01529491611d8b565b926064870190611d56565b918784030160c0880152611d8b565b91013560e08301520390a13390919060405192600284526020840152604083015260608201604052565b828080808080808061160d565b6024866117b685611d22565b6040516335252be360e01b815291166004820152fd5b34610182576020366003190112610182576004359063ffffffff60e01b82168092036101825760209163e414309160e01b811490811561180e575b5015158152f35b6301ffc9a760e01b14905083611807565b9181601f840112156101825782359167ffffffffffffffff8311610182576020808501948460051b01011161018257565b600435906001600160a01b038216820361018257565b602435906001600160a01b038216820361018257565b35906001600160a01b038216820361018257565b906080600319830112610182576004356001600160a01b0381168103610182579160243591604435916064359067ffffffffffffffff8211610182576118d89160040161181f565b9091565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b60a0810190811067ffffffffffffffff82111761191c57604052565b634e487b7160e01b5f52604160045260245ffd5b6060810190811067ffffffffffffffff82111761191c57604052565b6040810190811067ffffffffffffffff82111761191c57604052565b6080810190811067ffffffffffffffff82111761191c57604052565b67ffffffffffffffff811161191c57604052565b60e0810190811067ffffffffffffffff82111761191c57604052565b6020810190811067ffffffffffffffff82111761191c57604052565b90601f8019910116810190811067ffffffffffffffff82111761191c57604052565b92919267ffffffffffffffff821161191c5760405191611a1c601f8201601f1916602001846119d0565b829481845281830111610182578281602093845f960137010152565b9080601f8301121561018257816020611a53933591016119f2565b90565b91906060838203126101825760405190611a6f82611930565b8193611a7a8161187c565b8352611a886020820161187c565b602084015260408101359167ffffffffffffffff831161018257604092611aaf9201611a38565b910152565b67ffffffffffffffff811161191c5760051b60200190565b929192611ad882611ab4565b604092611ae860405192836119d0565b819581835260208093019160061b84019381851161018257915b848310611b1157505050505050565b8583830312610182578386918251611b288161194c565b611b318661187c565b81528286013583820152815201920191611b02565b9080601f8301121561018257816020611a5393359101611acc565b91909160a0818403126101825760405190611b7b82611900565b8193611b868261187c565b835267ffffffffffffffff9160208101358381116101825782611baa918301611a56565b602085015260408101358381116101825782611bc7918301611b46565b6040850152606081013592831161018257611be86080939284938301611b46565b60608501520135910152565b909291611c0084611ab4565b916040611c1060405194856119d0565b839580855260208095019160059160051b8401948086116101825784935b868510611c3f575050505050505050565b67ffffffffffffffff90853582811161018257870190606082850312610182578451611c6a81611930565b611c738361187c565b81528a83013584811161018257830185601f8201121561018257803590611c9982611ab4565b91611ca6895193846119d0565b8083528d808401918b1b83010191888311610182578e809101915b838310611cf757509150508201528583013593841161018257611ce8858c95869501611a38565b86820152815201940193611c2e565b82358152918101918f9101611cc1565b9080601f8301121561018257816020611a5393359101611bf4565b356001600160a01b03811681036101825790565b908060209392818452848401375f828201840152601f01601f1916010190565b9035601e198236030181121561018257016020813591019167ffffffffffffffff8211610182578160061b3603831361018257565b9190808252602080920192915f905b828210611da8575050505090565b909192936001906001600160a01b03611dc08761187c565b16815285830135838201526040908101950193920190611d9a565b90929192611de881611ab4565b91604091611df960405194856119d0565b839581855260208095019160051b8301938185116101825783925b858410611e245750505050505050565b67ffffffffffffffff908435828111610182578601908382860312610182578351611e4e8161194c565b82358481116101825786611e63918501611a56565b81528983013593841161018257611e7e868b95869501611d07565b83820152815201930192611e14565b903590601e1981360301821215610182570180359067ffffffffffffffff821161018257602001918160051b3603831361018257565b60405190611ed082611930565b60606040835f81525f60208201520152565b60405190611eef82611900565b5f608083828152611efe611ec3565b6020820152606060408201526060808201520152565b9015610e6157803590607e1981360301821215610182570190565b903590609e1981360301821215610182570190565b903590601e1981360301821215610182570180359067ffffffffffffffff821161018257602001918160061b3603831361018257565b9190811015610e615760061b0190565b805115610e615760200190565b805160011015610e615760400190565b805160021015610e615760600190565b805160031015610e615760800190565b805160041015610e615760a00190565b8051821015610e615760209160051b010190565b3580151581036101825790565b9081518082526020808093019301915f5b828110612017575050505090565b835180516001600160a01b031686528201518583015260409094019392810192600101612009565b906080806120b56120a361209160406001600160a01b0380895116885260208901519060a060208a01528082511660a08a015260208201511660c08901520151606060e08801526101008701906118dc565b60408701518682036040880152611ff8565b60608601518582036060870152611ff8565b93015191015290565b9081518082526020808093019301915f5b8281106120dd575050505090565b8351855293810193928101926001016120cf565b903590601e1981360301821215610182570180359067ffffffffffffffff82116101825760200191813603831361018257565b903590605e1981360301821215610182570190565b6121506115f26121498380611f2f565b3690611b61565b5f525f602052600160405f2054036121ec5780612170816121dc93611f2f565b6121d461218f6121946020850135938460408701359384923690611b61565b61305c565b6121ac6121a18580611f2f565b946060810190611e8d565b92906121cc604051966121be886119b4565b5f88525f3681373690611b61565b933691611bf4565b923392613091565b6040810151606090910151600192565b505f905f905f90565b5f5b82811061220357505050565b6060828201526020016121f7565b926001600160a01b038451166001600160a01b03835116146126b9576001600160a01b03612246606086015160643590611fd7565b515116906040830151916001600160a01b036122656084358095611fd7565b51511614801590612679575b610e1b576040850151906001600160a01b036122906044358094611fd7565b5151166001600160a01b036122ab60643560608a0151611fd7565b51511614612667576122bc8661270d565b805f525f60205260405f20541561261457506122d78461270d565b805f525f60205260405f2054156125c057506123ba9291612394917f6fa7f4c28634b0a9d6831401c45ae468195fb63aed07308935c35374ff5d9e396040518061233f61233161012033845280602085015283018d61203f565b82810360408401528a61203f565b85606083015260643560808301528760a083015260a43560c083015260c43560e083015260e4356101008301520390a16001600160a01b0386511660405192612387846119b4565b5f8452606435908a613091565b936001600160a01b03865116604051926123ad846119b4565b5f845260a4359086613091565b916123c86040820151612772565b1580156125ac575b8015612599575b8015612586575b61257457604051916123ef83611968565b5f83525f60208401525f60408401525f606084015261240e848361473b565b84526040840152612434612422838661473b565b602086015280606086015284516134cb565b9461244860208501516040860151906134cb565b93612452876133dd565b8015612565575b6125535761251a61254c957fd9fa84dd790c969daa5c33d8050dc06b4a9b59d5b42e2be5f5e8ae20447f618d946124fc6125519a60a09661249b8a885161351f565b6124a98c602089015161351f565b6124b78a604089015161357d565b6124c58c606089015161357d565b6124ce8a613868565b6124d78c613868565b6001600160a01b036124f360c435926060606435910151611fd7565b51511633612862565b50506001600160a01b036124f360e43592606060a435910151611fd7565b5050606060405191338352805160208401526020810151604084015260408101518284015201516080820152a161368f565b61368f565b565b604051630d86822160e01b8152600490fd5b5061256f856133dd565b612459565b6040516321badf1f60e01b8152600490fd5b5061259460608401516133dd565b6123de565b506125a760608201516133dd565b6123d7565b506125ba6040840151612772565b156123d0565b9351604080513381526001600160a01b039092166020830152810194909452507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f3945091925082915050606081015b0390a1565b9551604080513381526001600160a01b039092166020830152810196909652507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f39493508392505060608201905061260f565b604051631cd2f1c760e21b8152600490fd5b506001600160a01b03612693606085015160a43590611fd7565b5151166001600160a01b036126af604088015160443590611fd7565b5151161415612271565b604051630a98f1f360e21b8152600490fd5b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0060028154146126fb5760029055565b604051633ee5aeb560e01b8152600490fd5b6040516127388161272a602082019460208652604083019061203f565b03601f1981018352826119d0565b51902090565b909115612749575050565b6040516305dbdfd960e41b81526001600160a01b03918216600482015291166024820152604490fd5b612791905f60e01d906001600160e01b038160e01d9116601b0b61479e565b1290565b90612791916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b61481f565b9291926127c882613a63565b936127d2816133dd565b6128505784816001600160e01b036127f19360e01d9116601b0b61489e565b9290809315612827575b5082908161280b575b5050509190565b61281f926001600160a01b03309216612f2f565b5f8181612804565b9092505f19811461283c57600101915f6127fb565b634e487b7160e01b5f52601160045260245ffd5b604051632eaefac360e21b8152600490fd5b9392919361286f836133dd565b61290d578461288b57612883939450612ff3565b50505f905f90565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f5281526128c8835f205494856134f5565b956128d2876133dd565b6128f5575f97885260018252838820908852815282872091875252909320829055565b835163c5e12af560e01b815260048101889052602490fd5b60405163793a8f5560e01b815260048101849052602490fd5b919060408382031261018257825167ffffffffffffffff908181116101825784019082601f8301121561018257815160209261296182611ab4565b9161296f60405193846119d0565b808352848084019160051b830101918683116101825785809101915b8383106129fe5750505050948281015191821161018257019180601f840112156101825782516129ba81611ab4565b936129c860405195866119d0565b818552838086019260051b820101928311610182578301905b8282106129ef575050505090565b815181529083019083016129e1565b825181529181019186910161298b565b90808251908181526020809101926020808460051b8301019501935f915b848310612a3c5750505050505090565b9091929394958480612a5a600193601f198682030187528a516120be565b9801930193019194939290612a2c565b91906020928381526001600160a01b0382511684820152838201516040820152612aa4604083015160e060608401526101008301906118dc565b9060608301516080820152612acb608084015192601f1993848483030160a0850152612a0e565b9260a081015193838382030160c08401528680865192838152019501905f5b818110612b0e57505050611a5394955060c060e091015192828503019101526120be565b825187529588019591880191600101612aea565b90604082019082526020606081936040838201528551809452019301915f5b828110612b4f575050505090565b835185529381019392810192600101612b41565b919091335f526020308152604091825f2091835195612b818761194c565b612b89611ec3565b875260608281980152845190612b9e826119b4565b5f8252855190612bad826119b4565b5f82525f3681375f5b8151811015612d1a57898688612bcc8486611fd7565b51888151948d80870151908151612bee575b5050505050505050600101612bb6565b905f92916001600160a01b0396612c138887818d51169c015116998789015190613b42565b95825199612c208b611998565b8a5289015287015285015260808401528760a08401528660c08401525f8c51809563d04dfe2360e01b82528180612c5b600498898301612a6a565b03915afa938415612d10579089915f95612cea575b508451612c86575b50899250808e8c938e612bde565b5101511691823b1561018257612cb4925f92838d5180968195829463012c676d60e21b845233908401612b22565b03925af18015612ce0579060019291612cd1575b81928782612c78565b612cda90611984565b5f612cc8565b89513d5f823e3d90fd5b612d079195503d805f833e612cff81836119d0565b810190612926565b9050935f612c70565b8c513d5f823e3d90fd5b50505050505050509050565b8215612d5b576001600160a01b038091165f52600160205260405f2091165f5260205260405f20905f5260205260405f205490565b909150612d6782613d74565b6001600160a01b03809316906040918251946370a0823160e01b86528416938460048701526020928387602481865afa968715612e7d575f97612e87575b5083612dbe612db783612dee9a614a53565b50906141de565b508651636eb1769f60e11b81526001600160a01b0390941660048501523060248501529297889081906044820190565b0381865afa968715612e7d575f97612e4c575b50612db7612e1291611a5398614a53565b50612e1d8183613400565b15612e445750935b5f5260018252825f20905f528152815f20905f8052525f2054906134f5565b905093612e25565b96508387813d8311612e76575b612e6381836119d0565b8101031261018257955195612db7612e01565b503d612e59565b85513d5f823e3d90fd5b96508387813d8311612eaf575b612e9e81836119d0565b810103126101825795519583612da5565b503d612e94565b6040519263a9059cbb60e01b5f526001600160a01b0380931660045260245260205f60448180855af160015f5114811615612f10575b8360405215612efa57505050565b635274afe760e01b835216600482015260249150fd5b6001811516612f2657813b15153d151616612eec565b833d5f823e3d90fd5b9092604051936323b872dd60e01b5f526001600160a01b0393848092166004521660245260445260205f60648180855af160015f5114811615612f7f575b836040525f60605215612efa57505050565b6001811516612f2657813b15153d151616612f6d565b93929193612fa2836133dd565b61290d5784612fb6576128839394506127bc565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f5281526128c8835f205494856134cb565b9092919261300081613a63565b9361300a816133dd565b61304a5784816001600160e01b036130299360e01d9116601b0b61489e565b50809281613038575050509190565b6001600160a01b0361281f9316612eb6565b604051632d1671a360e11b8152600490fd5b9161308790606061307c936001600160a01b039485916040880151611fd7565b515116940151611fd7565b5151161461266757565b94919392909260408051916130a583611998565b6130ad611ee2565b83526020925f848201525f838201526060945f868301528560c06080938260808201525f60a082015201528351916130e483611900565b600483525f5b8181106133ce5750506132d7959493925f9261320e61325e938d61310d8161270d565b9c896001600160a01b039e8f94859182865116908d5194600386528501528c840152168c820152608081018a5261314386611f8a565b5261314d85611f8a565b50885161315981611930565b6002815289368c83013761316c86611f97565b5261317685611f97565b5060ff8a6131d98b8501936131c38761319c81613194858a51611fd7565b515116613d74565b975116886131ab848951611fd7565b515116856131ba858a51611fd7565b51015191612d26565b966131cf828751611fd7565b5151169451611fd7565b51015192169093929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b61321782611fa7565b5261322181611fa7565b506132458a8d8d60ff8a6131d98d8501936131c38761319c81613194858a51611fd7565b61324e82611fb7565b5261325881611fb7565b50613b42565b95878a511697848b0191825191868184511693015116928a8552308752858086209151015186519161328f836119b4565b86835287519561329e87611998565b86528886015286850152848885015289608085015260a084015260c08301528351808098819463d04dfe2360e01b835260048301612a6a565b03915afa9687156133c4575f945f986133a2575b5084516002811061338b5750818386015195015161331161330b88611fc7565b51611fb7565b5161331c8183613400565b156133835750925b6133468685919060405192600284526020840152604083015260608201604052565b61334f88611fa7565b5261335987611fa7565b508251996133668b611998565b8a52890152870152850152608084015260a083015260c082015290565b905092613324565b602490835190630fbb8e5560e21b82526004820152fd5b9097506133ba9194503d805f833e612cff81836119d0565b939093965f6132eb565b50513d5f823e3d90fd5b808888809387010152016130ea565b6133fc905f60e01d906001600160e01b038160e01d9116601b0b61479e565b1390565b906133fc916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b61481f565b61344e6001600160e01b0392838316601b0b9260e01d938160e01d9116601b0b8484613f95565b90637ffffff5821361349e575b90613465916141de565b9290921580613496575b61347857505090565b6044925060405191638eba4d0760e01b835260048301526024820152fd5b50821561346f565b6134a88282614e7e565b1561345b57604483856040519163d556b11160e01b835260048301526024820152fd5b611a5391610c15916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6143e4565b611a5391610c15916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6145a8565b61357991608081018261353b6135358351611fc7565b51611fc7565b5261357261356c6001600160a01b0380945151169361356361355d8551611fc7565b51611f8a565b51169251611fc7565b51611fa7565b5191612f95565b5050565b906080810191806135916135358551611fb7565b526001600160a01b038092515116916135ad61355d8551611fb7565b51166135bc61356c8551611fb7565b519081613657576135cc836133dd565b61290d579183917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a959361260f955f5260209060018252613622604094855f20835f528452855f20855f528452855f20546134f5565b945f5260018252835f20905f528152825f20915f52525f20555b51604051918291338352604060208401526040830190612a0e565b91613688917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a959361260f95612862565b505061363c565b60c0810151908151915f92613803575b506137446020918281510151926001600160a01b039081818187511696015116928660a082019485518252308452604097888320898686510151015160808601518b51916136ec836119b4565b8683528c51936136fb856119b4565b8785528d519661370a88611998565b8752898701528c86015260016060860152608085015260a084015260c08301528851808099819463d04dfe2360e01b835260048301612a6a565b03915afa9485156137f95787956137db575b508451613767575b50505050505050565b81905101510151169051813b156137d75791849184938361379c965180978195829463012c676d60e21b845260048401612b22565b03925af19081156137ce57506137b7575b808080808061375e565b6137c18291611984565b6137cb57806137ad565b80fd5b513d84823e3d90fd5b8480fd5b6137f09195503d8089833e612cff81836119d0565b9050935f613756565b86513d89823e3d90fd5b6001600160a01b03602080845101510151169060a083015190823b1561018257613846925f928360405180968195829463012c676d60e21b845260048401612b22565b03925af1801561022c571561369f57613860919250611984565b5f905f61369f565b6080810161387961356c8251611fb7565b5191821561388657505050565b6138a061355d6001600160a01b0380935151169351611fb7565b5116815f5260209160018352604092835f20835f528152835f20855f528152835f2054936001600160e01b0385166138db575b505050505050565b6138ff955f9284845260018152828420868552815282842091845252812055612ff3565b5f8080806138d3565b8115613912570490565b634e487b7160e01b5f52601260045260245ffd5b604081511061396e576020810151908051603f19810190811161283c5760051c821161395a5760016020920160051b010190565b5050604051613968816119b4565b5f815290565b50604051613968816119b4565b80511561398b57602001515f1a90565b505f90565b905f8091602081519101845af48080613a0e575b156139c45750506040513d81523d5f602083013e60203d82010160405290565b156139eb57604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b3d156139fc576040513d5f823e3d90fd5b60405163d6bda27560e01b8152600490fd5b503d1515806139a45750813b15156139a4565b60041115613a2b57565b634e487b7160e01b5f52602160045260245ffd5b602090939291936001600160a01b036040820195168152613a5f83613a21565b0152565b613a6b614f6c565b6040805163b7bad1b160e01b81526001600160a01b0383166004820152909182826024815f73200e12d10bb0c5e4a17e7018f0f1161919bb93895af1928315613b39575f925f94613b04575b50613ac183613a21565b600183141580613af2575b613ad65750505090565b5163ee07877f60e01b8152918291610725919060048401613a3f565b50613afc83613a21565b821515613acc565b90809450613b289293503d8511613b32575b613b2081836119d0565b810190614874565b919091925f613ab7565b503d613b16565b513d5f823e3d90fd5b90805191613b4f83611ab4565b91613b6a604094613b62865195866119d0565b808552611ab4565b601f199460209186013686840137835183519095908015613d69576001613bc09101965b6001978891010197613bb7613ba28a611ab4565b99613baf86519b8c6119d0565b808b52611ab4565b018489016121f5565b85805f9684516002815233878201523086820152606081018652613be38b611f8a565b52613bed8a611f8a565b505f925b613d25575b5050508351613c09575b50505050505090565b85809598979692980181613c1d8289611fd7565b52613c288188611fd7565b505f925b613c3b575b5085969750613c00565b8451831015613d20576001600160a01b03613cb281613c5a8689611fd7565b51511686613c68878a611fd7565b51015187815160051b9101207f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f52601c52603c5f208c613ca9888b611fd7565b510151916149ca565b15613d0857868098999a928192613cc9878a611fd7565b515116613cd68787611fd7565b52019385613ce48289611fd7565b510151613cf1868c611fd7565b52613cfc858b611fd7565b50019290989796613c2c565b8951630a57f30960e31b815260048101859052602490fd5b613c31565b9091968151881015613d60578280910197613d408184611fd7565b51613d4b8a8d611fd7565b52613d56898c611fd7565b5001919081613bf1565b96829150613bf6565b50613bc05f96613b8e565b613d7c614f6c565b60408051630782d7e160e01b81526001600160a01b03831660048201529091828260248173200e12d10bb0c5e4a17e7018f0f1161919bb93895afa928315613b39575f925f94613b045750613ac183613a21565b9091939284158215175f14613dea5750505090505f905f90565b82810192600160fd1b8082019083011760fe1c613f21575b5050613e0d81614b43565b93613e1781614b43565b94613e228682614b63565b90918215613f12575f9083986f0785ee10d5da46d900f436a000000000808611613f04575b50670de0b6b3a7640000808b11613ef5575b50633b9aca00808b11613ee6575b50612710808b11613ed8575b5098805b613ec7575081906118d8989982600a0a9109960195817fcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccd0a93838211900382610100031b9203901c170291614b76565b60019290920191600a900480613e77565b60049a04998a930192613e73565b600991939a049901915f613e67565b601291939a049901915f613e59565b85049950602592505f613e47565b509290506118d8949550614b76565b5f821215613f7557808413613f67575b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb2841315613e02579092506118d8939491614a81565b9092506118d8939491614ae8565b80841215613f31579092506118d8939491614a81565b61346582826141de565b92909180613fbb576044848460405191637a97930f60e01b835260048301526024820152fd5b90919280155f14613fd057505050505f905f90565b613fe993613fdd91614c30565b92919490938492614c30565b9093919284613ff788614b43565b9161400186614b43565b947f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000094604c918688106141a8575b030191600160ff1b98838a018112155f14614175575050035b5f955f82128061416c575b61414e575b5f81128061413c575b61411e5786820103966001600160ff1b0388149081614114575b508061410b575b80614102575b6140e45750906140989291614ddc565b915f81136140ab575b506118d893614b76565b9091604c82136140d9576140c291600a0a90613908565b9081156140cf575f6140a1565b505050505f905f90565b50505050505f905f90565b876044916040519163d556b11160e01b835260048301526024820152fd5b505f8512614088565b50828414614082565b905088145f61407b565b604489836040519163d556b11160e01b835260048301526024820152fd5b50806001600160ff1b03018213614061565b95508087018613156141665786818703015b95614058565b5f614160565b505f8113614053565b89985090920390506001600160ff1b03819003870182136141995701860194614048565b5050505050505050505f905f90565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009650604b925061402f565b8115613912570590565b8082601b82810b83146143d3577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e1000000000000000000840561437f575b8380820b0361436e57507b199999999999999999999999999999999999999999999999999999987b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc8401111561431f575b838060030b036142a3575b8084136142875750506001600160e01b036001925b60e01b91161791565b8303600a0a8015613912576001600160e01b039107159261427e565b92915f8413156142f35750906142b98383614e7e565b6142d557637ffffffe1901600a0a810290637fffffff92614269565b506044916040519163d556b11160e01b835260048301526024820152fd5b637fffffff1992830390604382136140d95761431291600a0a906141d4565b9182156140cf5792614269565b5f198401808060030b14614333575061425e565b90506001600160e01b039293507b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff915060e01b9260ff1d181617905f90565b600190940193600a90930592614211565b937f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000008405156143c0576305f5e100600894058094819201955b915050614211565b620186a0600594058094819201956143b8565b508261425e57505050505f90600190565b919291600160ff1b84016143fc576118d89350614e97565b906118d8935f03916145a8565b919291600160ff1b919080158061459657509061442591614c30565b9490929091905f86858585828213801561458d575b614570575b505050508682841860ff1c94860391039081604c0381116145555701600a0a80820591908461453b575b505081019182821860ff1c111561453357826001600160ff1b031461451557905f600192135f146144e657600a9004915b01925b811581176144aa57509190565b806144c3575b5080156144bb579190565b505f91508190565b91926144d99203600160ff1b01600a0a906141d4565b600160ff1b91905f6144b0565b600a60037fe666666666666666666666666666666666666666666666666666666666666667920104019161449a565b604490836040519163d556b11160e01b835260048301526024820152fd5b50909261449d565b8107614548575b80614469565b60ff1d600117015f614542565b505050919350614563579190565b60018160ff1d1790039190565b5f9a50909750909550600160ff1b9450925090508680808061443f565b50835f1261443a565b156145a15750509190565b9350919050565b93929193841581158181176146f9575050906145c391614c30565b91949082956145d482958294614c30565b80969294919693878684821380156146f0575b6146d7575b5050505050508682841860ff1c94860391039081604c0381116145555701600a0a8082059190846146bd575b505081019182821860ff1c11156146b557826001600160ff1b031461451557905f600192135f1461468657600a9004915b01925b8115811761465957509190565b80614669575080156144bb579190565b600160ff1b936146809291038401600a0a906141d4565b5f6144b0565b600a60037fe6666666666666666666666666666666666666666666666666666666666666679201040191614649565b50909261464c565b81076146ca575b80614618565b60ff1d600117015f6146c4565b929b5098509196509450925090505f80808080806145ec565b508584126145e7565b939593909291901561470f5750506144bb579190565b945092915050565b600881511061398b576008015167ffffffffffffffff1667ff0a89c674ee78741490565b9160408301926040614775610c15606087519401938451906001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b613dd0565b94519301614784815186612795565b61478c575050565b909350611a5391925051925183613427565b92915f9060018184145f87128715171717614818575f9280821361480a575b03604c81135f8212176147fe57600a0a90846147dc83820293846141d4565b146147f1575050156147ed575f9190565b5f90565b9093509015611a53579190565b5050156147ed575f9190565b5f95600194509250906147bd565b5050505f90565b93929190918083145f83125f8712188315871517171761486e575f928082136148615703604c81135f8212176147fe57600a0a90846147dc83820293846141d4565b91946001935091906147bd565b50919050565b919082604091031261018257815160048110156101825760209092015160ff811681036101825790565b91925f8312156148c6576044838360405191634a7d166b60e01b835260048301526024820152fd5b9192836148d857505090505f90600190565b60ff81168201918083126149a0575f831215614910575050604c1981126144bb575f03600a0a916149098382613908565b9283021490565b909293915f81135f1461499657604d811361496b57600a0a92831561391257835f190483116149425750500290600190565b60405163c849483b60e01b815260048101849052602481019290925260ff166044820152606490fd5b5060405163c849483b60e01b81526004810192909252602482015260ff919091166044820152606490fd5b5050905090600190565b60405163c849483b60e01b815260048101869052602481019190915260ff82166044820152606490fd5b9091813b614a05576149dc9192614fd5565b506149e681613a21565b1591826149f257505090565b6001600160a01b03918216911614919050565b6020918160645f935160405192630b135d3f60e11b9788855260048501526040602485015286820190604485015e8281018201859052601f01601f191601915afa905f5114601f3d11161690565b9060ff165f03916001600160ff1b0382115f14614a7957600a6001818404940192061590565b909190600190565b909392915f614a91918184613dd0565b9490945f8483019182019412159081614ade575b8115614ad4575b50614ab657505090565b604492506040519163d556b11160e01b835260048301526024820152fd5b905083125f614aac565b8281129150614aa5565b614afd93600160fe1b90810193920190613dd0565b9081815f821215614b34575050604b19821261288357614b22915f03600a0a906141d4565b9081614b2c575f90565b600160ff1b90565b93600160ff1b90910192509050565b5f811215611a5357600160ff1b90808203614b5c575090565b90505f0390565b905f198183099102908180821091030391565b92939291905f8184181215614c0b576001600160ff1b039283831115614bf557600160ff1b93838503614bab57505050509190565b90919293508514614bc5575050600a600191045f03920190565b604051630ed8062160e21b8152600481019190915260248101919091526044810182905260648101849052608490fd5b5090915050600160ff1b811461283c575f039190565b90916001600160ff1b0380841115612804578514614bc5575050600a60019104920190565b9190918015614dd257827f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000080830515614ce0575b507f19999999999999999999999999999999999999999999999999999999999999997f0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc830110614cd1575b8313614cbb5791905f90565b919060018060ff1b926001600160ff1b03030190565b9290600a02905f190192614caf565b6f4b3b4ca85a86c47a098a22400000000080840515614dc0575b507728c87cb5c89a2571ebfdcb54864ada834a00000000000000830515614da9575b7b097edd871cfda3a5697758bf0e3cbb5ac5741c640000000000000000830515614d95575b7e3899162693736ac531a5a58f1fbb4b746504382ca7e4000000000000000000830515614d8557820515614d76575b5f614c64565b9290600a02905f190192614d70565b9391606402916001190193614d41565b93916402540be40002916009190193614d41565b9391678ac7230489e8000002916012190193614d1c565b6025198301955092909202915f614cfa565b505f915081908190565b90915f198383099280830292838086109503948086039584871015614e5a5714614e52579082910960018219018216809204600280826003021880830282030280830282030280830282030280830282030280830282030280920290030293600183805f03040190848311900302920304170290565b505091500490565b60648386866040519263362ced0960e11b8452600484015260248301526044820152fd5b611a5391905f811215614e92575f0361500f565b61500f565b909291600160ff1b91828101614f295750808414614f1f57808413918215614f17578185035b604c811115614f065750505f915b15614ef757507f8000000000000000000000000000000000000000000000000000000000000001019190565b92506001600160ff1b03039190565b600a0a908115613912570491614ecb565b848203614ebd565b505090505f905f90565b93614f3692945f03614409565b80939180928114614f4a575b50505f039190565b915092506001600160ff1b03831461451557600a600191059201915f80614f42565b73200e12d10bb0c5e4a17e7018f0f1161919bb9389803b158015614faa575b614f925750565b602490604051906373e6d7b360e01b82526004820152fd5b507f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d41813f1415614f8b565b815191906041830361500557614ffe9250602082015190606060408401519301515f1a9061509e565b9192909190565b50505f9160029190565b90637ffffff581131561509857637ffffffe1981019060438213615091575f82121561506557637fffffff91505f0301600a0a7b8000000000000000000000000000000000000000000000000000000202111590565b50600a0a8015613912577b80000000000000000000000000000000000000000000000000000001041090565b5050151590565b50505f90565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411615115579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa1561022c575f516001600160a01b0381161561510b57905f905f90565b505f906001905f90565b5050505f916003919056"; + hex"6080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a7146117cc575080631f69cb751461156f5780632cb77e9f146115435780632fbc4ba0146113f957806341d1514f146113c25780635cffe9de1461126657806360746119146110e2578063613255ab1461105f57806369c7285614610771578063709fb8a5146104375780639235084d146103e3578063ac9650d814610295578063d5708b46146101fa578063d7e442ec146101765763d9d98ce4146100c1575f80fd5b3461015f57604036600319011261015f576001600160a01b036100e2611850565b166040516370a0823160e01b8152306004820152602081602481855afa90811561016b575f91610135575b501561011d5760206040515f8152f35b60249060405190633c5bf76960e21b82526004820152fd5b90506020813d602011610163575b81610150602093836119d0565b8101031261015f57515f61010d565b5f80fd5b3d9150610143565b6040513d5f823e3d90fd5b3461015f57602036600319011261015f5760043567ffffffffffffffff811161015f576101ce6101ad6101d492369060040161181f565b91906101b76126cc565b604051926101c4846119b4565b5f84523691611ddb565b90612b64565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b3461015f5761014036600319011261015f5767ffffffffffffffff60043581811161015f5761022d903690600401611b61565b60243582811161015f57610245903690600401611b61565b60c036604319011261015f576101043583811161015f5761026a903690600401611d07565b906101243593841161015f576102876101d4943690600401611d07565b926102906126cc565b612211565b3461015f5760208060031936011261015f5760043567ffffffffffffffff811161015f576102c790369060040161181f565b9190604051926102d6846119b4565b5f84528284016102e582611ab4565b946102f360405196876119d0565b8286526102ff83611ab4565b9361031186880195601f1901866121f5565b5f5b84811061037557604080518881528951818a018190525f92600582901b83018101918a918c9085015b8287106103495785850386f35b909192938280610365600193603f198a820301865288516118dc565b960192019601959291909261033c565b806103c4886103be61039160019560059d9c9d1b8701876120f1565b929089846040519586938585013782018381015f81528b519283915e015f838201520380845201826119d0565b30613991565b6103ce828a611fd7565b526103d98189611fd7565b5001969596610313565b3461015f5760031960203682011261015f576004359067ffffffffffffffff821161015f57608090823603011261015f57610422606091600401612139565b90604051921515835260208301526040820152f35b3461015f5760031960403682011261015f5760043567ffffffffffffffff80821161015f5760c08260040193833603011261015f5760243590811161015f5761048490369060040161181f565b9061048d6126cc565b6104be6104b96104b46104ad6104a38880612124565b60408101906120f1565b36916119f2565b613927565b61397c565b801561075f576001101561074d57602483016104da8186611f44565b90501561073b5760448401946104f08682611f44565b9050156107295761055661051e9661054a61051561050e8580612124565b9585611f44565b99909285611f44565b91909261053b6040519761053189611900565b3389523690611a56565b9a60209b8c8901523691611acc565b60408601523691611acc565b60608301526064850135608083015261056e8261270e565b91825f525f875260405f209586541596876105b2575b888860017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055604051908152f35b6001905560a46001600160a01b03917f87491344dfbcf91f6cbbc610cbbeedc85313d37a02df0c93527f7ea5f8db717f83855116604051908152878c8201526060604082015280610606606082018861203f565b0390a1019161061583856120f1565b9050610679575b5050505061066d929161066561064e6101ce933390919060405192600284526020840152604083015260608201604052565b906040519160018352602083015260408201604052565b923691611ddb565b82808080808080610584565b6106866104ad84866120f1565b61068f81614718565b156107025750937fd46c2c56b35c8210e9e712ec3f02242d5fc90187c0ac8ed80cc33626846ec3698961066d9897956106f56106d86106659761064e976101ce9b5116936120f1565b866040519586958652850152606060408501526060840191611d36565b0390a1938395965061061c565b89610725604051928392630c89984b60e31b8452600484015260248301906118dc565b0390fd5b60405163540e5f0b60e01b8152600490fd5b604051636c44ef8f60e01b8152600490fd5b604051633c8270bd60e21b8152600490fd5b604051632cff108b60e21b8152600490fd5b3461015f5760031960203682011261015f5767ffffffffffffffff6004351161015f5760c0906004353603011261015f576107aa6126cc565b5f80806107bf60048035608481019101611e8d565b90501561104d5760246004350135926107d784612773565b1561103b576060806040516107eb81611968565b6107f3611ee2565b81525f60208201525f6040820152015261080b611ee2565b5061086b61086661084561083b61083561082f608460043501600435600401611e8d565b90611f14565b80611f2f565b6040810190611f44565b602061085e61082f608460043501600435600401611e8d565b013591611f7a565b611d22565b936001600160a01b036108ba6108666108a161089761083561082f608460043501600435600401611e8d565b6060810190611f44565b604061085e61082f608460043501600435600401611e8d565b81604051976108c889611930565b16875216602086015260408501526108ea608460043501600435600401611e8d565b9490506001604051950160051b85016040525f905f5b610914608460043501600435600401611e8d565b9050811080611028575b15610e7557610937608460043501600435600401611e8d565b821015610e61578160051b810135607e198236030181121561015f57608081830136031261015f576040519161096c83611968565b8181013567ffffffffffffffff811161015f5761098e90369084840101611b61565b835280820160208181013590850152604080820135908501526060013567ffffffffffffffff811161015f576109c79236920101611d07565b606082015280516001600160a01b036109e96040830151602085015190611fd7565b5151166001600160a01b0385511614801590610e2d575b610e1b57610a1860208301516040840151908361305d565b610a218161270e565b91825f525f60205260405f2054155f14610a85575051604080513381526001600160a01b039092166020830152810191909152600191907fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f390606090a15b01610900565b9190610ab6602084979597015160408501519060608601519060405192610aab846119b4565b5f8452339186613092565b925f93610ace60608201516044600435013590612796565b15610b3557505051604080513381526001600160a01b03909216602083015281019190915260019291907fe3151dc8cb7a54ffc4baabd28c1f241c94d510b5e5b502491ac3cad6c16316d590606090a15b8115610b2d575b5092610a7f565b905088610b26565b610b426040820151612773565b158015610e08575b15610b9f57505051604080513381526001600160a01b03909216602083015281019190915260019291907f500b713857325f9e6dcb52ae832eca9109d107ed1aae9cb4928b4c1e13f051aa90606090a1610b1f565b9250925050600196959691610bb8606460043501611feb565b15610d755796610c2897610c3860408401516040880151610bd98183613401565b15610d6d5750925b610c32848592610c1b610c1560608a01516001600160e01b03601b918660e01d92828816810b928260e01d9216900b613dd1565b90613f8c565b9d8e9260408d01516134cc565b60408c01526134f6565b996134f6565b98610c438484613520565b610c4d848261357e565b60405192338452608060208501526060610c73845160808088015261010087019061203f565b93602081015160a0870152604081015160c0870152015192607f198582030160e0860152835180825260208201906020808260051b8501019601925f5b828110610d0f57505050505092806001979695937f194f1feb3b4d7076a2c272e774e792e0c48bb8c7aa1a9a3671c1cd6da9e6b4c193610d0a96604084015260608301520390a180858c5101808d5260051b8c0152613690565b610b1f565b9091929396602080610d60600193601f198782030189528b51906001600160a01b0382511681526040610d4f8584015160608785015260608401906120be565b9201519060408184039101526118dc565b9901950193929101610cb0565b905092610be1565b610c2890610c386060840151610c32610db3610c1560408801516001600160e01b0394601b90868360e01d9316820b91878260e01d9216900b613dd1565b60408a0151610dc28183613401565b15610e005750915b829c8d916060890151908116155f14610df1575060408801515b96879460408d01516134cc565b610dfb9085613428565b610de4565b905091610dca565b50610e1660608201516133de565b610b4a565b60405163936bb5ad60e01b8152600490fd5b506001600160a01b03610e496060830151604085015190611fd7565b5151166001600160a01b036020860151161415610a00565b634e487b7160e01b5f52603260045260245ffd5b50919390610e87606460043501611feb565b1561102257835b6004356004013590610ea08282613401565b6110045750508490610ec0856001600160a01b0360208701511633612ff4565b505060a46004350190610ed8826004356004016120f1565b905015159081610ffc575b50610f5b575b506001600160a01b03610eff92935116336127bd565b50505b8351811015610f275780610f21610f1b60019387611fd7565b51613869565b01610f02565b5060409160017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005582519182526020820152f35b90506001600160a01b03602084015116610f856001600160a01b03855116926004356004016120f1565b929091333b1561015f57610fcd5f93604051958694859463691f9ed760e01b8652600486015260248501528960448501528a606485015260a0608485015260a4840191611d36565b038183335af190811561016b57859115610ee9579050610fed9150611984565b5f836001600160a01b03610ee9565b905088610ee3565b604492506040519163573b6f4160e01b835260048301526024820152fd5b84610e8e565b506110366040830151612773565b61091e565b60405163315f9e2360e21b8152600490fd5b604051639c95219f60e01b8152600490fd5b3461015f5760208060031936011261015f576024816001600160a01b03611084611850565b16604051928380926370a0823160e01b82523060048301525afa90811561016b575f916110b5575b50604051908152f35b90508181813d83116110db575b6110cc81836119d0565b8101031261015f5751826110ac565b503d6110c2565b3461015f576110f036611890565b92916110fd9491946126cc565b61110883833361273f565b61111181612773565b15611235578160ff91611129856111ec969533612d27565b6111338183613401565b1561122f575080935b61114885828533612f96565b917f8045c25080b0868951141ed0a91720bcad09a8364a2b3109ee1fd49c1f0bc8b860c0611177898833612ff4565b97906001600160a01b0360405192338452169a8b6020840152856040840152886060840152608083015260a0820152a16040519660068852602088015260408701526060860152608085015260a08401521660c082015260e08101604052906040519160018352602083015260408201604052565b90806112185760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b611227926101ce913691611ddb565b8080806101d4565b9361113c565b50604051623a3a4d60e21b81523360048201526001600160a01b039190911660248201526044810191909152606490fd5b3461015f57608036600319011261015f576004356001600160a01b039081811680910361015f57611295611866565b6044359167ffffffffffffffff9160643583811161015f573660238201121561015f57806004013593841161015f57366024858301011161015f576113229560209216936112e4868587612eb7565b60405196879283926323e30c8b60e01b84523360048501528760248501528860448501525f606485015260a06084850152602460a485019201611d36565b03815f855af193841561016b575f9461138e575b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd984036113755761136a93503091612f30565b602060405160018152f35b604051630b6c58a960e31b815260048101859052602490fd5b9093506020813d6020116113ba575b816113aa602093836119d0565b8101031261015f57519284611336565b3d915061139d565b3461015f57606036600319011261015f5760206113f16113e0611850565b6113e8611866565b60443591612d27565b604051908152f35b3461015f5761140736611890565b928094926114136126cc565b61141e82853361273f565b61142781612773565b15611513578061143b61148a9286336127bd565b9790957f7f9dfa19cf1cc2f806f2f860fbc9c056b601fb1afc0e9b843dfe5c63616268e660806040513381526001600160a01b038416998a60208301528560408301526060820152a133612863565b939091856114b85760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b611507966101ce956106659460ff93604051956005875260208701526040860152606085015260808401521660a082015260c08101604052906040519160018352602083015260408201604052565b808080808080806101d4565b506040516306dde9c360e41b81523360048201526001600160a01b03841660248201526044810191909152606490fd5b3461015f57602036600319011261015f576004355f525f6020526020600160405f205414604051908152f35b3461015f5760031960403682011261015f5767ffffffffffffffff9060043582811161015f57806004019160a08236039182011261015f5760243584811161015f576115bf90369060040161181f565b90936115c96126cc565b5f946001600160a01b0394856115de84611d22565b1633036117aa576115f76115f23685611b61565b61270e565b805f525f60205260405f2096600188541461163e575b60208960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556040519015158152f35b9091929394959697505f6001985560405196338852826020890152606060408901528161166a8761187c565b1660608901526024840135906062190181121561015f5783019060a06080890152806116986004840161187c565b166101008901526116ab6024830161187c565b1661012088015260448101356022198236030181121561015f57019060246004830135920198821161015f57813603891361015f577f09d18501db0080ca2d6cd7c17fa7255daff4b2d503ea93b76ff68b6752ea8e6387806106659560846117736101ce9a60209f6117329061179d9f9a606061014061064e9d0152610160880191611d36565b6117646117596117456044880185611d56565b605f198a8603810160a08c01529491611d8b565b926064870190611d56565b918784030160c0880152611d8b565b91013560e08301520390a13390919060405192600284526020840152604083015260608201604052565b828080808080808061160d565b6024866117b685611d22565b6040516335252be360e01b815291166004820152fd5b3461015f57602036600319011261015f576004359063ffffffff60e01b821680920361015f5760209163e414309160e01b811490811561180e575b5015158152f35b6301ffc9a760e01b14905083611807565b9181601f8401121561015f5782359167ffffffffffffffff831161015f576020808501948460051b01011161015f57565b600435906001600160a01b038216820361015f57565b602435906001600160a01b038216820361015f57565b35906001600160a01b038216820361015f57565b90608060031983011261015f576004356001600160a01b038116810361015f579160243591604435916064359067ffffffffffffffff821161015f576118d89160040161181f565b9091565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b60a0810190811067ffffffffffffffff82111761191c57604052565b634e487b7160e01b5f52604160045260245ffd5b6060810190811067ffffffffffffffff82111761191c57604052565b6040810190811067ffffffffffffffff82111761191c57604052565b6080810190811067ffffffffffffffff82111761191c57604052565b67ffffffffffffffff811161191c57604052565b60e0810190811067ffffffffffffffff82111761191c57604052565b6020810190811067ffffffffffffffff82111761191c57604052565b90601f8019910116810190811067ffffffffffffffff82111761191c57604052565b92919267ffffffffffffffff821161191c5760405191611a1c601f8201601f1916602001846119d0565b82948184528183011161015f578281602093845f960137010152565b9080601f8301121561015f57816020611a53933591016119f2565b90565b919060608382031261015f5760405190611a6f82611930565b8193611a7a8161187c565b8352611a886020820161187c565b602084015260408101359167ffffffffffffffff831161015f57604092611aaf9201611a38565b910152565b67ffffffffffffffff811161191c5760051b60200190565b929192611ad882611ab4565b604092611ae860405192836119d0565b819581835260208093019160061b84019381851161015f57915b848310611b1157505050505050565b858383031261015f578386918251611b288161194c565b611b318661187c565b81528286013583820152815201920191611b02565b9080601f8301121561015f57816020611a5393359101611acc565b91909160a08184031261015f5760405190611b7b82611900565b8193611b868261187c565b835267ffffffffffffffff91602081013583811161015f5782611baa918301611a56565b6020850152604081013583811161015f5782611bc7918301611b46565b6040850152606081013592831161015f57611be86080939284938301611b46565b60608501520135910152565b909291611c0084611ab4565b916040611c1060405194856119d0565b839580855260208095019160059160051b84019480861161015f5784935b868510611c3f575050505050505050565b67ffffffffffffffff90853582811161015f5787019060608285031261015f578451611c6a81611930565b611c738361187c565b81528a83013584811161015f57830185601f8201121561015f57803590611c9982611ab4565b91611ca6895193846119d0565b8083528d808401918b1b8301019188831161015f578e809101915b838310611cf757509150508201528583013593841161015f57611ce8858c95869501611a38565b86820152815201940193611c2e565b82358152918101918f9101611cc1565b9080601f8301121561015f57816020611a5393359101611bf4565b356001600160a01b038116810361015f5790565b908060209392818452848401375f828201840152601f01601f1916010190565b9035601e198236030181121561015f57016020813591019167ffffffffffffffff821161015f578160061b3603831361015f57565b9190808252602080920192915f905b828210611da8575050505090565b909192936001906001600160a01b03611dc08761187c565b16815285830135838201526040908101950193920190611d9a565b90929192611de881611ab4565b91604091611df960405194856119d0565b839581855260208095019160051b83019381851161015f5783925b858410611e245750505050505050565b67ffffffffffffffff90843582811161015f57860190838286031261015f578351611e4e8161194c565b823584811161015f5786611e63918501611a56565b81528983013593841161015f57611e7e868b95869501611d07565b83820152815201930192611e14565b903590601e198136030182121561015f570180359067ffffffffffffffff821161015f57602001918160051b3603831361015f57565b60405190611ed082611930565b60606040835f81525f60208201520152565b60405190611eef82611900565b5f608083828152611efe611ec3565b6020820152606060408201526060808201520152565b9015610e6157803590607e198136030182121561015f570190565b903590609e198136030182121561015f570190565b903590601e198136030182121561015f570180359067ffffffffffffffff821161015f57602001918160061b3603831361015f57565b9190811015610e615760061b0190565b805115610e615760200190565b805160011015610e615760400190565b805160021015610e615760600190565b805160031015610e615760800190565b805160041015610e615760a00190565b8051821015610e615760209160051b010190565b35801515810361015f5790565b9081518082526020808093019301915f5b828110612017575050505090565b835180516001600160a01b031686528201518583015260409094019392810192600101612009565b906080806120b56120a361209160406001600160a01b0380895116885260208901519060a060208a01528082511660a08a015260208201511660c08901520151606060e08801526101008701906118dc565b60408701518682036040880152611ff8565b60608601518582036060870152611ff8565b93015191015290565b9081518082526020808093019301915f5b8281106120dd575050505090565b8351855293810193928101926001016120cf565b903590601e198136030182121561015f570180359067ffffffffffffffff821161015f5760200191813603831361015f57565b903590605e198136030182121561015f570190565b6121506115f26121498380611f2f565b3690611b61565b5f525f602052600160405f2054036121ec5780612170816121dc93611f2f565b6121d461218f6121946020850135938460408701359384923690611b61565b61305d565b6121ac6121a18580611f2f565b946060810190611e8d565b92906121cc604051966121be886119b4565b5f88525f3681373690611b61565b933691611bf4565b923392613092565b6040810151606090910151600192565b505f905f905f90565b5f5b82811061220357505050565b6060828201526020016121f7565b92916001600160a01b038451166001600160a01b03835116146126ba576001600160a01b03612247606086015160643590611fd7565b515116906040830151916001600160a01b036122666084358095611fd7565b5151161480159061267a575b610e1b576040850151906001600160a01b036122916044358094611fd7565b5151166001600160a01b036122ac60643560608a0151611fd7565b51511614612668576122bd8661270e565b805f525f60205260405f20541561261557506122d88461270e565b805f525f60205260405f2054156125c157506123bb9291612395917f6fa7f4c28634b0a9d6831401c45ae468195fb63aed07308935c35374ff5d9e396040518061234061233261012033845280602085015283018d61203f565b82810360408401528a61203f565b85606083015260643560808301528760a083015260a43560c083015260c43560e083015260e4356101008301520390a16001600160a01b0386511660405192612388846119b4565b5f8452606435908a613092565b936001600160a01b03865116604051926123ae846119b4565b5f845260a4359086613092565b916123c96040820151612773565b1580156125ad575b801561259a575b8015612587575b61257557604051916123f083611968565b5f83525f60208401525f60408401525f606084015261240f848361473c565b84526040840152612435612423838661473c565b602086015280606086015284516134cc565b9461244960208501516040860151906134cc565b93612453876133de565b8015612566575b6125545761251b61254d957fd9fa84dd790c969daa5c33d8050dc06b4a9b59d5b42e2be5f5e8ae20447f618d946124fd6125529a60a09661249c8a8851613520565b6124aa8c6020890151613520565b6124b88a604089015161357e565b6124c68c606089015161357e565b6124cf8a613869565b6124d88c613869565b6001600160a01b036124f460c435926060606435910151611fd7565b51511633612863565b50506001600160a01b036124f460e43592606060a435910151611fd7565b5050606060405191338352805160208401526020810151604084015260408101518284015201516080820152a1613690565b613690565b565b604051630d86822160e01b8152600490fd5b50612570856133de565b61245a565b6040516321badf1f60e01b8152600490fd5b5061259560608401516133de565b6123df565b506125a860608201516133de565b6123d8565b506125bb6040840151612773565b156123d1565b9351604080513381526001600160a01b039092166020830152810194909452507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f3945091925082915050606081015b0390a1565b9551604080513381526001600160a01b039092166020830152810196909652507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f394935083925050606082019050612610565b604051631cd2f1c760e21b8152600490fd5b506001600160a01b03612694606085015160a43590611fd7565b5151166001600160a01b036126b0604088015160443590611fd7565b5151161415612272565b604051630a98f1f360e21b8152600490fd5b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0060028154146126fc5760029055565b604051633ee5aeb560e01b8152600490fd5b6040516127398161272b602082019460208652604083019061203f565b03601f1981018352826119d0565b51902090565b90911561274a575050565b6040516305dbdfd960e41b81526001600160a01b03918216600482015291166024820152604490fd5b612792905f60e01d906001600160e01b038160e01d9116601b0b61479f565b1290565b90612792916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614820565b9291926127c982613a64565b936127d3816133de565b6128515784816001600160e01b036127f29360e01d9116601b0b61489f565b9290809315612828575b5082908161280c575b5050509190565b612820926001600160a01b03309216612f30565b5f8181612805565b9092505f19811461283d57600101915f6127fc565b634e487b7160e01b5f52601160045260245ffd5b604051632eaefac360e21b8152600490fd5b93929193612870836133de565b61290e578461288c57612884939450612ff4565b50505f905f90565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f5281526128c9835f205494856134f6565b956128d3876133de565b6128f6575f97885260018252838820908852815282872091875252909320829055565b835163c5e12af560e01b815260048101889052602490fd5b60405163793a8f5560e01b815260048101849052602490fd5b919060408382031261015f57825167ffffffffffffffff9081811161015f5784019082601f8301121561015f57815160209261296282611ab4565b9161297060405193846119d0565b808352848084019160051b8301019186831161015f5785809101915b8383106129ff5750505050948281015191821161015f57019180601f8401121561015f5782516129bb81611ab4565b936129c960405195866119d0565b818552838086019260051b82010192831161015f578301905b8282106129f0575050505090565b815181529083019083016129e2565b825181529181019186910161298c565b90808251908181526020809101926020808460051b8301019501935f915b848310612a3d5750505050505090565b9091929394958480612a5b600193601f198682030187528a516120be565b9801930193019194939290612a2d565b91906020928381526001600160a01b0382511684820152838201516040820152612aa5604083015160e060608401526101008301906118dc565b9060608301516080820152612acc608084015192601f1993848483030160a0850152612a0f565b9260a081015193838382030160c08401528680865192838152019501905f5b818110612b0f57505050611a5394955060c060e091015192828503019101526120be565b825187529588019591880191600101612aeb565b90604082019082526020606081936040838201528551809452019301915f5b828110612b50575050505090565b835185529381019392810192600101612b42565b919091335f526020308152604091825f2091835195612b828761194c565b612b8a611ec3565b875260608281980152845190612b9f826119b4565b5f8252855190612bae826119b4565b5f82525f3681375f5b8151811015612d1b57898688612bcd8486611fd7565b51888151948d80870151908151612bef575b5050505050505050600101612bb7565b905f92916001600160a01b0396612c148887818d51169c015116998789015190613b43565b95825199612c218b611998565b8a5289015287015285015260808401528760a08401528660c08401525f8c51809563d04dfe2360e01b82528180612c5c600498898301612a6b565b03915afa938415612d11579089915f95612ceb575b508451612c87575b50899250808e8c938e612bdf565b5101511691823b1561015f57612cb5925f92838d5180968195829463012c676d60e21b845233908401612b23565b03925af18015612ce1579060019291612cd2575b81928782612c79565b612cdb90611984565b5f612cc9565b89513d5f823e3d90fd5b612d089195503d805f833e612d0081836119d0565b810190612927565b9050935f612c71565b8c513d5f823e3d90fd5b50505050505050509050565b8215612d5c576001600160a01b038091165f52600160205260405f2091165f5260205260405f20905f5260205260405f205490565b909150612d6882613d75565b6001600160a01b03809316906040918251946370a0823160e01b86528416938460048701526020928387602481865afa968715612e7e575f97612e88575b5083612dbf612db883612def9a614a54565b50906141df565b508651636eb1769f60e11b81526001600160a01b0390941660048501523060248501529297889081906044820190565b0381865afa968715612e7e575f97612e4d575b50612db8612e1391611a5398614a54565b50612e1e8183613401565b15612e455750935b5f5260018252825f20905f528152815f20905f8052525f2054906134f6565b905093612e26565b96508387813d8311612e77575b612e6481836119d0565b8101031261015f57955195612db8612e02565b503d612e5a565b85513d5f823e3d90fd5b96508387813d8311612eb0575b612e9f81836119d0565b8101031261015f5795519583612da6565b503d612e95565b6040519263a9059cbb60e01b5f526001600160a01b0380931660045260245260205f60448180855af160015f5114811615612f11575b8360405215612efb57505050565b635274afe760e01b835216600482015260249150fd5b6001811516612f2757813b15153d151616612eed565b833d5f823e3d90fd5b9092604051936323b872dd60e01b5f526001600160a01b0393848092166004521660245260445260205f60648180855af160015f5114811615612f80575b836040525f60605215612efb57505050565b6001811516612f2757813b15153d151616612f6e565b93929193612fa3836133de565b61290e5784612fb7576128849394506127bd565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f5281526128c9835f205494856134cc565b9092919261300181613a64565b9361300b816133de565b61304b5784816001600160e01b0361302a9360e01d9116601b0b61489f565b50809281613039575050509190565b6001600160a01b036128209316612eb7565b604051632d1671a360e11b8152600490fd5b9161308890606061307d936001600160a01b039485916040880151611fd7565b515116940151611fd7565b5151161461266857565b94919392909260408051916130a683611998565b6130ae611ee2565b83526020925f848201525f838201526060945f868301528560c06080938260808201525f60a082015201528351916130e583611900565b600483525f5b8181106133cf5750506132d8959493925f9261320f61325f938d61310e8161270e565b9c896001600160a01b039e8f94859182865116908d5194600386528501528c840152168c820152608081018a5261314486611f8a565b5261314e85611f8a565b50885161315a81611930565b6002815289368c83013761316d86611f97565b5261317785611f97565b5060ff8a6131da8b8501936131c48761319d81613195858a51611fd7565b515116613d75565b975116886131ac848951611fd7565b515116856131bb858a51611fd7565b51015191612d27565b966131d0828751611fd7565b5151169451611fd7565b51015192169093929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b61321882611fa7565b5261322281611fa7565b506132468a8d8d60ff8a6131da8d8501936131c48761319d81613195858a51611fd7565b61324f82611fb7565b5261325981611fb7565b50613b43565b95878a511697848b0191825191868184511693015116928a85523087528580862091510151865191613290836119b4565b86835287519561329f87611998565b86528886015286850152848885015289608085015260a084015260c08301528351808098819463d04dfe2360e01b835260048301612a6b565b03915afa9687156133c5575f945f986133a3575b5084516002811061338c5750818386015195015161331261330c88611fc7565b51611fb7565b5161331d8183613401565b156133845750925b6133478685919060405192600284526020840152604083015260608201604052565b61335088611fa7565b5261335a87611fa7565b508251996133678b611998565b8a52890152870152850152608084015260a083015260c082015290565b905092613325565b602490835190630fbb8e5560e21b82526004820152fd5b9097506133bb9194503d805f833e612d0081836119d0565b939093965f6132ec565b50513d5f823e3d90fd5b808888809387010152016130eb565b6133fd905f60e01d906001600160e01b038160e01d9116601b0b61479f565b1390565b906133fd916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614820565b61344f6001600160e01b0392838316601b0b9260e01d938160e01d9116601b0b8484613f96565b90637ffffff5821361349f575b90613466916141df565b9290921580613497575b61347957505090565b6044925060405191638eba4d0760e01b835260048301526024820152fd5b508215613470565b6134a98282614e7f565b1561345c57604483856040519163d556b11160e01b835260048301526024820152fd5b611a5391610c15916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6143e5565b611a5391610c15916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6145a9565b61357a91608081018261353c6135368351611fc7565b51611fc7565b5261357361356d6001600160a01b0380945151169361356461355e8551611fc7565b51611f8a565b51169251611fc7565b51611fa7565b5191612f96565b5050565b906080810191806135926135368551611fb7565b526001600160a01b038092515116916135ae61355e8551611fb7565b51166135bd61356d8551611fb7565b519081613658576135cd836133de565b61290e579183917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a9593612610955f5260209060018252613623604094855f20835f528452855f20855f528452855f20546134f6565b945f5260018252835f20905f528152825f20915f52525f20555b51604051918291338352604060208401526040830190612a0f565b91613689917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a959361261095612863565b505061363d565b60c0810151908151915f92613804575b506137456020918281510151926001600160a01b039081818187511696015116928660a082019485518252308452604097888320898686510151015160808601518b51916136ed836119b4565b8683528c51936136fc856119b4565b8785528d519661370b88611998565b8752898701528c86015260016060860152608085015260a084015260c08301528851808099819463d04dfe2360e01b835260048301612a6b565b03915afa9485156137fa5787956137dc575b508451613768575b50505050505050565b81905101510151169051813b156137d85791849184938361379d965180978195829463012c676d60e21b845260048401612b23565b03925af19081156137cf57506137b8575b808080808061375f565b6137c28291611984565b6137cc57806137ae565b80fd5b513d84823e3d90fd5b8480fd5b6137f19195503d8089833e612d0081836119d0565b9050935f613757565b86513d89823e3d90fd5b6001600160a01b03602080845101510151169060a083015190823b1561015f57613847925f928360405180968195829463012c676d60e21b845260048401612b23565b03925af1801561016b57156136a057613861919250611984565b5f905f6136a0565b6080810161387a61356d8251611fb7565b5191821561388757505050565b6138a161355e6001600160a01b0380935151169351611fb7565b5116815f5260209160018352604092835f20835f528152835f20855f528152835f2054936001600160e01b0385166138dc575b505050505050565b613900955f9284845260018152828420868552815282842091845252812055612ff4565b5f8080806138d4565b8115613913570490565b634e487b7160e01b5f52601260045260245ffd5b604081511061396f576020810151908051603f19810190811161283d5760051c821161395b5760016020920160051b010190565b5050604051613969816119b4565b5f815290565b50604051613969816119b4565b80511561398c57602001515f1a90565b505f90565b905f8091602081519101845af48080613a0f575b156139c55750506040513d81523d5f602083013e60203d82010160405290565b156139ec57604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b3d156139fd576040513d5f823e3d90fd5b60405163d6bda27560e01b8152600490fd5b503d1515806139a55750813b15156139a5565b60041115613a2c57565b634e487b7160e01b5f52602160045260245ffd5b602090939291936001600160a01b036040820195168152613a6083613a22565b0152565b613a6c614f6d565b6040805163b7bad1b160e01b81526001600160a01b0383166004820152909182826024815f73200e12d10bb0c5e4a17e7018f0f1161919bb93895af1928315613b3a575f925f94613b05575b50613ac283613a22565b600183141580613af3575b613ad75750505090565b5163ee07877f60e01b8152918291610725919060048401613a40565b50613afd83613a22565b821515613acd565b90809450613b299293503d8511613b33575b613b2181836119d0565b810190614875565b919091925f613ab8565b503d613b17565b513d5f823e3d90fd5b90805191613b5083611ab4565b91613b6b604094613b63865195866119d0565b808552611ab4565b601f199460209186013686840137835183519095908015613d6a576001613bc19101965b6001978891010197613bb8613ba38a611ab4565b99613bb086519b8c6119d0565b808b52611ab4565b018489016121f5565b85805f9684516002815233878201523086820152606081018652613be48b611f8a565b52613bee8a611f8a565b505f925b613d26575b5050508351613c0a575b50505050505090565b85809598979692980181613c1e8289611fd7565b52613c298188611fd7565b505f925b613c3c575b5085969750613c01565b8451831015613d21576001600160a01b03613cb381613c5b8689611fd7565b51511686613c69878a611fd7565b51015187815160051b9101207f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f52601c52603c5f208c613caa888b611fd7565b510151916149cb565b15613d0957868098999a928192613cca878a611fd7565b515116613cd78787611fd7565b52019385613ce58289611fd7565b510151613cf2868c611fd7565b52613cfd858b611fd7565b50019290989796613c2d565b8951630a57f30960e31b815260048101859052602490fd5b613c32565b9091968151881015613d61578280910197613d418184611fd7565b51613d4c8a8d611fd7565b52613d57898c611fd7565b5001919081613bf2565b96829150613bf7565b50613bc15f96613b8f565b613d7d614f6d565b60408051630782d7e160e01b81526001600160a01b03831660048201529091828260248173200e12d10bb0c5e4a17e7018f0f1161919bb93895afa928315613b3a575f925f94613b055750613ac283613a22565b9091939284158215175f14613deb5750505090505f905f90565b82810192600160fd1b8082019083011760fe1c613f22575b5050613e0e81614b44565b93613e1881614b44565b94613e238682614b64565b90918215613f13575f9083986f0785ee10d5da46d900f436a000000000808611613f05575b50670de0b6b3a7640000808b11613ef6575b50633b9aca00808b11613ee7575b50612710808b11613ed9575b5098805b613ec8575081906118d8989982600a0a9109960195817fcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccd0a93838211900382610100031b9203901c170291614b77565b60019290920191600a900480613e78565b60049a04998a930192613e74565b600991939a049901915f613e68565b601291939a049901915f613e5a565b85049950602592505f613e48565b509290506118d8949550614b77565b5f821215613f7657808413613f68575b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb2841315613e03579092506118d8939491614a82565b9092506118d8939491614ae9565b80841215613f32579092506118d8939491614a82565b61346682826141df565b92909180613fbc576044848460405191637a97930f60e01b835260048301526024820152fd5b90919280155f14613fd157505050505f905f90565b613fea93613fde91614c31565b92919490938492614c31565b9093919284613ff888614b44565b9161400286614b44565b947f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000094604c918688106141a9575b030191600160ff1b98838a018112155f14614176575050035b5f955f82128061416d575b61414f575b5f81128061413d575b61411f5786820103966001600160ff1b0388149081614115575b508061410c575b80614103575b6140e55750906140999291614ddd565b915f81136140ac575b506118d893614b77565b9091604c82136140da576140c391600a0a90613909565b9081156140d0575f6140a2565b505050505f905f90565b50505050505f905f90565b876044916040519163d556b11160e01b835260048301526024820152fd5b505f8512614089565b50828414614083565b905088145f61407c565b604489836040519163d556b11160e01b835260048301526024820152fd5b50806001600160ff1b03018213614062565b95508087018613156141675786818703015b95614059565b5f614161565b505f8113614054565b89985090920390506001600160ff1b038190038701821361419a5701860194614049565b5050505050505050505f905f90565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009650604b9250614030565b8115613913570590565b8082601b82810b83146143d4577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000008405614380575b8380820b0361436f57507b199999999999999999999999999999999999999999999999999999987b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc84011115614320575b838060030b036142a4575b8084136142885750506001600160e01b036001925b60e01b91161791565b8303600a0a8015613913576001600160e01b039107159261427f565b92915f8413156142f45750906142ba8383614e7f565b6142d657637ffffffe1901600a0a810290637fffffff9261426a565b506044916040519163d556b11160e01b835260048301526024820152fd5b637fffffff1992830390604382136140da5761431391600a0a906141d5565b9182156140d0579261426a565b5f198401808060030b14614334575061425f565b90506001600160e01b039293507b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff915060e01b9260ff1d181617905f90565b600190940193600a90930592614212565b937f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000008405156143c1576305f5e100600894058094819201955b915050614212565b620186a0600594058094819201956143b9565b508261425f57505050505f90600190565b919291600160ff1b84016143fd576118d89350614e98565b906118d8935f03916145a9565b919291600160ff1b919080158061459757509061442691614c31565b9490929091905f86858585828213801561458e575b614571575b505050508682841860ff1c94860391039081604c0381116145565701600a0a80820591908461453c575b505081019182821860ff1c111561453457826001600160ff1b031461451657905f600192135f146144e757600a9004915b01925b811581176144ab57509190565b806144c4575b5080156144bc579190565b505f91508190565b91926144da9203600160ff1b01600a0a906141d5565b600160ff1b91905f6144b1565b600a60037fe666666666666666666666666666666666666666666666666666666666666667920104019161449b565b604490836040519163d556b11160e01b835260048301526024820152fd5b50909261449e565b8107614549575b8061446a565b60ff1d600117015f614543565b505050919350614564579190565b60018160ff1d1790039190565b5f9a50909750909550600160ff1b94509250905086808080614440565b50835f1261443b565b156145a25750509190565b9350919050565b93929193841581158181176146fa575050906145c491614c31565b91949082956145d582958294614c31565b80969294919693878684821380156146f1575b6146d8575b5050505050508682841860ff1c94860391039081604c0381116145565701600a0a8082059190846146be575b505081019182821860ff1c11156146b657826001600160ff1b031461451657905f600192135f1461468757600a9004915b01925b8115811761465a57509190565b8061466a575080156144bc579190565b600160ff1b936146819291038401600a0a906141d5565b5f6144b1565b600a60037fe666666666666666666666666666666666666666666666666666666666666667920104019161464a565b50909261464d565b81076146cb575b80614619565b60ff1d600117015f6146c5565b929b5098509196509450925090505f80808080806145ed565b508584126145e8565b93959390929190156147105750506144bc579190565b945092915050565b600881511061398c576008015167ffffffffffffffff1667ff0a89c674ee78741490565b9160408301926040614776610c15606087519401938451906001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b613dd1565b94519301614785815186612796565b61478d575050565b909350611a5391925051925183613428565b92915f9060018184145f87128715171717614819575f9280821361480b575b03604c81135f8212176147ff57600a0a90846147dd83820293846141d5565b146147f2575050156147ee575f9190565b5f90565b9093509015611a53579190565b5050156147ee575f9190565b5f95600194509250906147be565b5050505f90565b93929190918083145f83125f8712188315871517171761486f575f928082136148625703604c81135f8212176147ff57600a0a90846147dd83820293846141d5565b91946001935091906147be565b50919050565b919082604091031261015f578151600481101561015f5760209092015160ff8116810361015f5790565b91925f8312156148c7576044838360405191634a7d166b60e01b835260048301526024820152fd5b9192836148d957505090505f90600190565b60ff81168201918083126149a1575f831215614911575050604c1981126144bc575f03600a0a9161490a8382613909565b9283021490565b909293915f81135f1461499757604d811361496c57600a0a92831561391357835f190483116149435750500290600190565b60405163c849483b60e01b815260048101849052602481019290925260ff166044820152606490fd5b5060405163c849483b60e01b81526004810192909252602482015260ff919091166044820152606490fd5b5050905090600190565b60405163c849483b60e01b815260048101869052602481019190915260ff82166044820152606490fd5b9091813b614a06576149dd9192614fd6565b506149e781613a22565b1591826149f357505090565b6001600160a01b03918216911614919050565b6020918160645f935160405192630b135d3f60e11b9788855260048501526040602485015286820190604485015e8281018201859052601f01601f191601915afa905f5114601f3d11161690565b9060ff165f03916001600160ff1b0382115f14614a7a57600a6001818404940192061590565b909190600190565b909392915f614a92918184613dd1565b9490945f8483019182019412159081614adf575b8115614ad5575b50614ab757505090565b604492506040519163d556b11160e01b835260048301526024820152fd5b905083125f614aad565b8281129150614aa6565b614afe93600160fe1b90810193920190613dd1565b9081815f821215614b35575050604b19821261288457614b23915f03600a0a906141d5565b9081614b2d575f90565b600160ff1b90565b93600160ff1b90910192509050565b5f811215611a5357600160ff1b90808203614b5d575090565b90505f0390565b905f198183099102908180821091030391565b92939291905f8184181215614c0c576001600160ff1b039283831115614bf657600160ff1b93838503614bac57505050509190565b90919293508514614bc6575050600a600191045f03920190565b604051630ed8062160e21b8152600481019190915260248101919091526044810182905260648101849052608490fd5b5090915050600160ff1b811461283d575f039190565b90916001600160ff1b0380841115612805578514614bc6575050600a60019104920190565b9190918015614dd357827f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000080830515614ce1575b507f19999999999999999999999999999999999999999999999999999999999999997f0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc830110614cd2575b8313614cbc5791905f90565b919060018060ff1b926001600160ff1b03030190565b9290600a02905f190192614cb0565b6f4b3b4ca85a86c47a098a22400000000080840515614dc1575b507728c87cb5c89a2571ebfdcb54864ada834a00000000000000830515614daa575b7b097edd871cfda3a5697758bf0e3cbb5ac5741c640000000000000000830515614d96575b7e3899162693736ac531a5a58f1fbb4b746504382ca7e4000000000000000000830515614d8657820515614d77575b5f614c65565b9290600a02905f190192614d71565b9391606402916001190193614d42565b93916402540be40002916009190193614d42565b9391678ac7230489e8000002916012190193614d1d565b6025198301955092909202915f614cfb565b505f915081908190565b90915f198383099280830292838086109503948086039584871015614e5b5714614e53579082910960018219018216809204600280826003021880830282030280830282030280830282030280830282030280830282030280920290030293600183805f03040190848311900302920304170290565b505091500490565b60648386866040519263362ced0960e11b8452600484015260248301526044820152fd5b611a5391905f811215614e93575f03615010565b615010565b909291600160ff1b91828101614f2a5750808414614f2057808413918215614f18578185035b604c811115614f075750505f915b15614ef857507f8000000000000000000000000000000000000000000000000000000000000001019190565b92506001600160ff1b03039190565b600a0a908115613913570491614ecc565b848203614ebe565b505090505f905f90565b93614f3792945f0361440a565b80939180928114614f4b575b50505f039190565b915092506001600160ff1b03831461451657600a600191059201915f80614f43565b73200e12d10bb0c5e4a17e7018f0f1161919bb9389803b158015614fab575b614f935750565b602490604051906373e6d7b360e01b82526004820152fd5b507f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d41813f1415614f8c565b815191906041830361500657614fff9250602082015190606060408401519301515f1a9061509f565b9192909190565b50505f9160029190565b90637ffffff581131561509957637ffffffe1981019060438213615092575f82121561506657637fffffff91505f0301600a0a7b8000000000000000000000000000000000000000000000000000000202111590565b50600a0a8015613913577b80000000000000000000000000000000000000000000000000000001041090565b5050151590565b50505f90565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411615116579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa1561016b575f516001600160a01b0381161561510c57905f905f90565b505f906001905f90565b5050505f916003919056"; /// @dev What MUST already be on a network before this release can be /// broadcast there: an address, and the runtime code that belongs at it. diff --git a/src/generated/candidate/RouteProcessorRaindexV6ArbOrderTaker.sol b/src/generated/candidate/RouteProcessorRaindexV6ArbOrderTaker.sol index 969d8cac03..7f87a4910c 100644 --- a/src/generated/candidate/RouteProcessorRaindexV6ArbOrderTaker.sol +++ b/src/generated/candidate/RouteProcessorRaindexV6ArbOrderTaker.sol @@ -5,23 +5,23 @@ pragma solidity ^0.8.25; // THIS FILE IS AUTOGENERATED BY THE BUILD SCRIPT. DO NOT EDIT BY HAND. /// @dev Hash of the known bytecode. -bytes32 constant BYTECODE_HASH = bytes32(0xdb1aff57a7954d46a697b19d7be9b6bb056bc1778d7f3e936c8c960e39c5ee3b); +bytes32 constant BYTECODE_HASH = bytes32(0x91b6c33096ddd91831ee989930b776de996c82d67825b3119271a6fbcdd7dbe0); /// @dev The deterministic deploy address of the contract when deployed via /// the Zoltu factory. -address constant DEPLOYED_ADDRESS = address(0x6895A11f38ef92884B0087235626f39fFDFBb9a2); +address constant DEPLOYED_ADDRESS = address(0xfC4e1B5Bd44e3c2afBB6551dA0138f4E4a386F46); /// @dev The creation bytecode of the contract. bytes constant CREATION_CODE = - hex"6080604052348015600e575f80fd5b5060017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055612451806100405f395ff3fe608060405260043610610034575f3560e01c806301ffc9a71461003d578063691f9ed714610070578063b17c83c11461008f57005b3661003b57005b005b348015610048575f80fd5b5061005c6100573660046116f5565b6100a2565b604051901515815260200160405180910390f35b34801561007b575f80fd5b5061003b61008a366004611730565b6100f3565b61003b61009d3660046117d2565b61020e565b5f6001600160e01b0319821663691f9ed760e01b14806100d257506001600160e01b0319821663b17c83c160e01b145b806100ed57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6101018686868686866104d0565b736e2d0e71d900474b262e545bc4c98b71ab368d2161012b6001600160a01b038816825f1961053d565b5f6101388385018561194d565b90505f61014d876101488b6105b7565b61063b565b5090505f8061015f886101488c6105b7565b915091508061017657816101728161197f565b9250505b604051632646478b60e01b81526001600160a01b03861690632646478b906101ac908e9087908f90889030908c906004016119d1565b6020604051808303815f875af11580156101c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101ec9190611a1c565b506102016001600160a01b038c16865f61053d565b5050505050505050505050565b610216610668565b61022561022282611b9f565b50565b6102326080830183611c5b565b90505f0361025357604051639c95219f60e01b815260040160405180910390fd5b6001600160a01b038316732f04ff4cf5a3a19c619fe2c892bdbd72a76bf132146102a05760405163516e822d60e01b81526001600160a01b03841660048201526024015b60405180910390fd5b5f6102ae6080840184611c5b565b5f8181106102be576102be611ca1565b90506020028101906102d09190611cb5565b6102da9080611cd3565b6102e8906040810190611ce7565b6102f56080860186611c5b565b5f81811061030557610305611ca1565b90506020028101906103179190611cb5565b6020013581811061032a5761032a611ca1565b6103409260206040909202019081019150611d2d565b90505f6103506080850185611c5b565b5f81811061036057610360611ca1565b90506020028101906103729190611cb5565b61037c9080611cd3565b61038a906060810190611ce7565b6103976080870187611c5b565b5f8181106103a7576103a7611ca1565b90506020028101906103b99190611cb5565b604001358181106103cc576103cc611ca1565b6103e29260206040909202019081019150611d2d565b90506103f96001600160a01b038316865f1961053d565b6040516334e3942b60e11b81526001600160a01b038616906369c7285690610425908790600401611f91565b60408051808303815f875af1158015610440573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104649190612191565b5061047b90506001600160a01b038316865f61053d565b6104a061048784611b9f565b83610491856105b7565b8461049b866105b7565b610696565b50506104cb60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00546002148015610515575033732f04ff4cf5a3a19c619fe2c892bdbd72a76bf13214155b156105355760405163f6688adf60e01b8152336004820152602401610297565b505050505050565b6105498383835f610935565b6104cb5761055a83835f6001610935565b61058257604051635274afe760e01b81526001600160a01b0384166004820152602401610297565b61058f8383836001610935565b6104cb57604051635274afe760e01b81526001600160a01b0384166004820152602401610297565b5f6105c0610997565b6040516354636d2b60e01b81526001600160a01b038316600482015273200e12d10bb0c5e4a17e7018f0f1161919bb9389906354636d2b906024016020604051808303815f875af1158015610617573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100ed91906121b3565b5f806001600160e01b038416601b0b60e085901d61065a828287610a24565b9350935050505b9250929050565b610670610b96565b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b6040805160018082528183019092525f91816020015b60608152602001906001900390816106ac575050604080516003808252608082019092529192505f919060208201606080368337019050506040516370a0823160e01b81523060048201529091505f906001600160a01b038816906370a0823190602401602060405180830381865afa15801561072b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061074f9190611a1c565b9050801561076b5761076b6001600160a01b0388163383610bd8565b5f6107768288610be5565b50905080835f8151811061078c5761078c611ca1565b602090810291909101015250506040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa1580156107dd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108019190611a1c565b9050801561081d5761081d6001600160a01b0386163383610bd8565b5f6108288286610be5565b509050808360018151811061083f5761083f611ca1565b602090810291909101015250479050801561085e5761085e3382610c25565b5f61086a826012610be5565b509050808360028151811061088157610881611ca1565b602002602001018181525050505080825f815181106108a2576108a2611ca1565b60209081029190910101526040805160018082528183019092525f91816020015b6040805160a0810182525f91810182815260608083019390935260808201839052815260208101919091528152602001906001900390816108c357905050905087815f8151811061091657610916611ca1565b602002602001018190525061092b8382610c9c565b5050505050505050565b60405163095ea7b360e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f5114831661098b57838315161561097f573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b73200e12d10bb0c5e4a17e7018f0f1161919bb93893b15806109ee575073200e12d10bb0c5e4a17e7018f0f1161919bb93893f7f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d4114155b15610a22576040516373e6d7b360e01b815273200e12d10bb0c5e4a17e7018f0f1161919bb93896004820152602401610297565b565b5f805f851215610a5157604051634a7d166b60e01b81526004810186905260248101859052604401610297565b845f03610a6357505f90506001610b8e565b8460ff8416850185811215610a9e5760405163c849483b60e01b8152600481018890526024810187905260ff86166044820152606401610297565b5f805f831215610aea57604c19831215610ac1575f809550955050505050610b8e565b825f03600a0a9150818481610ad857610ad86121d3565b0495505084029091149150610b8e9050565b5f831315610b8357604d831315610b275760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610297565b82600a0a9150815f1981610b3d57610b3d6121d3565b04841115610b715760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610297565b5091909102925060019150610b8e9050565b509193506001925050505b935093915050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054600203610a2257604051633ee5aeb560e01b815260040160405180910390fd5b61058f8383836001610e60565b5f805f805f610bf48787610eaa565b9250925092505f80610c068585610f06565b9150915081838015610c155750815b9650965050505050509250929050565b80471015610c4f5760405163cf47918160e01b815247600482015260248101829052604401610297565b610c68828260405180602001604052805f81525061114f565b15610c71575050565b3d15610c8357610c7f611164565b5050565b60405163d6bda27560e01b815260040160405180910390fd5b335f8181523060209081526040808320815160a0810183528083018581526060808301879052608083018190529082528185015282518581529384018581528484019093529093909291905b865181101561092b57868181518110610d0357610d03611ca1565b602002602001015193505f845f015160400151511115610e58575f845f01515f01516001600160a01b031663d04dfe236040518060e00160405280885f0151602001516001600160a01b03168152602001898152602001885f01516040015181526020015f8152602001610d7b8d8a6020015161116f565b8152602001878152602001868152506040518263ffffffff1660e01b8152600401610da6919061226e565b5f60405180830381865afa158015610dc0573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610de7919081019061236f565b9150505f81511115610e565784516020015160405163012c676d60e21b81526001600160a01b03909116906304b19db490610e28908a908590600401612425565b5f604051808303815f87803b158015610e3f575f80fd5b505af1158015610e51573d5f803e3d5ffd5b505050505b505b600101610ce8565b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f5114831661098b57838315161561097f573d5f823e3d81fd5b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff861115610ef557600a860460018201600a88065f1493509350935050610eff565b8593509150600190505b9250925092565b5f808383601b82900b82148061103c577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e1000000000000000000870515610f87577f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000870515610f78576305f5e10087059650600886019550610f87565b620186a0870596506005860195505b8687601b0b14610fa257600a87059650856001019550610f87565b7b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc7b1999999999999999999999999999999999999999999999999999999888820111611036575f600188039050808160030b036110345760e01b6001600160e01b037b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff60ff8b901d18161795505f94506106619350505050565b505b50611053565b865f0361105357505f935060019250610661915050565b858660030b1461110a575f8213156110b25761106f8383611451565b156110975760405163d556b11160e01b81526004810184905260248101839052604401610297565b637ffffffe19909501600a0a82029550637fffffff9461110a565b637fffffff1986900360438113156110d457505f945084935061066192505050565b80600a0a88816110e6576110e66121d3565b059750875f0361110057505f945084935061066192505050565b50637fffffff1995505b81861361111a5760019350611133565b818603600a0a838161112e5761112e6121d3565b071593505b5050506001600160e01b03841660e084901b1791509250929050565b5f805f83516020850186885af1949350505050565b6040513d5f823e3d81fd5b60605f825167ffffffffffffffff81111561118c5761118c611850565b6040519080825280602002602001820160405280156111b5578160200160208202803683370190505b5090505f808451116111c7575f6111cd565b83516001015b85516001010190505f8167ffffffffffffffff8111156111ef576111ef611850565b60405190808252806020026020018201604052801561122257816020015b606081526020019060019003908161120d5790505b5090505f611246604080516002815233602082015230818301526060810190915290565b82828151811061125857611258611ca1565b60200260200101819052505f5b87518110156112b557818060010192505087818151811061128857611288611ca1565b60200260200101518383815181106112a2576112a2611ca1565b6020908102919091010152600101611265565b50855115611447578080600101915050838282815181106112d8576112d8611ca1565b60200260200101819052505f5b86518110156114455761139487828151811061130357611303611ca1565b60200260200101515f015161137161133f8a858151811061132657611326611ca1565b6020026020010151602001518051602090810291012090565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f908152601c91909152603c902090565b89848151811061138357611383611ca1565b602002602001015160400151611473565b6113b457604051630a57f30960e31b815260048101829052602401610297565b8681815181106113c6576113c6611ca1565b60200260200101515f01516001600160a01b03165f1b8582815181106113ee576113ee611ca1565b602002602001018181525050818060010192505086818151811061141457611414611ca1565b60200260200101516020015183838151811061143257611432611ca1565b60209081029190910101526001016112e5565b505b5095945050505050565b5f61146c5f84126114625783611466565b835f035b836114e4565b9392505050565b5f836001600160a01b03163b5f036114d1575f806114918585611582565b5090925090505f8160038111156114aa576114aa61243d565b1480156114c85750856001600160a01b0316826001600160a01b0316145b9250505061146c565b6114dc8484846115c8565b949350505050565b5f637ffffff582136114f757505f6100ed565b637ffffffe19820160438113156115125750508115156100ed565b5f81126115525780600a0a7b8000000000000000000000000000000000000000000000000000000181611547576115476121d3565b0484119150506100ed565b805f03600a0a7b800000000000000000000000000000000000000000000000000000020284101591505092915050565b5f805f83516041036115b9576020840151604085015160608601515f1a6115ab8882858561162d565b955095509550505050610eff565b505081515f9150600290610eff565b805160408051630b135d3f60e11b8082526004820186905260248201929092525f92906020820185604483015e5f82606483010152601f820160051c60051b915060205f60648401838a5afa9050825f5114601f3d1116811693505050509392505050565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084111561166657505f915060039050826116eb565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa1580156116b7573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b0381166116e257505f9250600191508290506116eb565b92505f91508190505b9450945094915050565b5f60208284031215611705575f80fd5b81356001600160e01b03198116811461146c575f80fd5b6001600160a01b0381168114610222575f80fd5b5f805f805f8060a08789031215611745575f80fd5b86356117508161171c565b955060208701356117608161171c565b94506040870135935060608701359250608087013567ffffffffffffffff8082111561178a575f80fd5b818901915089601f83011261179d575f80fd5b8135818111156117ab575f80fd5b8a60208285010111156117bc575f80fd5b6020830194508093505050509295509295509295565b5f805f606084860312156117e4575f80fd5b83356117ef8161171c565b9250602084013567ffffffffffffffff8082111561180b575f80fd5b9085019060c0828803121561181e575f80fd5b90925060408501359080821115611833575f80fd5b50840160408187031215611845575f80fd5b809150509250925092565b634e487b7160e01b5f52604160045260245ffd5b6040516060810167ffffffffffffffff8111828210171561188757611887611850565b60405290565b6040805190810167ffffffffffffffff8111828210171561188757611887611850565b604051601f8201601f1916810167ffffffffffffffff811182821017156118d9576118d9611850565b604052919050565b5f82601f8301126118f0575f80fd5b813567ffffffffffffffff81111561190a5761190a611850565b61191d601f8201601f19166020016118b0565b818152846020838601011115611931575f80fd5b816020850160208301375f918101602001919091529392505050565b5f6020828403121561195d575f80fd5b813567ffffffffffffffff811115611973575f80fd5b6114dc848285016118e1565b5f6001820161199c57634e487b7160e01b5f52601160045260245ffd5b5060010190565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f6001600160a01b038089168352876020840152808716604084015285606084015280851660808401525060c060a0830152611a1060c08301846119a3565b98975050505050505050565b5f60208284031215611a2c575f80fd5b5051919050565b5f67ffffffffffffffff821115611a4c57611a4c611850565b5060051b60200190565b5f82601f830112611a65575f80fd5b81356020611a7a611a7583611a33565b6118b0565b82815260059290921b84018101918181019086841115611a98575f80fd5b8286015b84811015611b9457803567ffffffffffffffff80821115611abb575f80fd5b908801906060828b03601f19011215611ad2575f80fd5b611ada611864565b86830135611ae78161171c565b815260408381013583811115611afb575f80fd5b8401603f81018d13611b0b575f80fd5b88810135611b1b611a7582611a33565b81815260059190911b82018301908a8101908f831115611b39575f80fd5b928401925b82841015611b575783358252928b0192908b0190611b3e565b858c0152505050606084013583811115611b6f575f80fd5b611b7d8d8a838801016118e1565b918301919091525085525050918301918301611a9c565b509695505050505050565b5f60408236031215611baf575f80fd5b611bb761188d565b823567ffffffffffffffff80821115611bce575f80fd5b818501915060608236031215611be2575f80fd5b611bea611864565b8235611bf58161171c565b81526020830135611c058161171c565b6020820152604083013582811115611c1b575f80fd5b611c27368286016118e1565b60408301525083526020850135915080821115611c42575f80fd5b50611c4f36828601611a56565b60208301525092915050565b5f808335601e19843603018112611c70575f80fd5b83018035915067ffffffffffffffff821115611c8a575f80fd5b6020019150600581901b3603821315610661575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235607e19833603018112611cc9575f80fd5b9190910192915050565b5f8235609e19833603018112611cc9575f80fd5b5f808335601e19843603018112611cfc575f80fd5b83018035915067ffffffffffffffff821115611d16575f80fd5b6020019150600681901b3603821315610661575f80fd5b5f60208284031215611d3d575f80fd5b813561146c8161171c565b5f808335601e19843603018112611d5d575f80fd5b830160208101925035905067ffffffffffffffff811115611d7c575f80fd5b8060051b3603821315610661575f80fd5b5f8235605e19833603018112611da1575f80fd5b90910192915050565b5f808335601e19843603018112611dbf575f80fd5b830160208101925035905067ffffffffffffffff811115611dde575f80fd5b803603821315610661575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f808335601e19843603018112611e29575f80fd5b830160208101925035905067ffffffffffffffff811115611e48575f80fd5b8060061b3603821315610661575f80fd5b8183525f60208085019450825f5b85811015611e9f578135611e7a8161171c565b6001600160a01b03168752818301358388015260409687019690910190600101611e67565b509495945050505050565b8183526020808401935f91600585811b8301820185855b88811015611f8357858303601f19018a52611edc8289611d8d565b60608135611ee98161171c565b6001600160a01b03168552611f0082880183611d48565b82898801528083880152608092507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811115611f3a575f80fd5b871b808288850137860190506040611f5484820185611daa565b9450838884030182890152611f6c8484018683611dec565b9e8a019e9750505093870193505050600101611ec1565b509098975050505050505050565b5f602080835260e08301843582850152604082860135818601526060818701358187015280870135801515808214611fc7575f80fd5b8060808901525050611fdc6080880188611d48565b60c060a08901529384905261010093848801600582901b89018601835f5b84811015612158578b830360ff19018452813536879003607e1901811261201f575f80fd5b8601803536829003609e19018112612035575f80fd5b60808552810180356120468161171c565b6001600160a01b0380821660808801526120628e840184611d8d565b915060a08088015281356120758161171c565b8116610120880152818e013561208a8161171c565b1661014087015261209d818c0182611daa565b91508a6101608801526120b561018088018383611dec565b9150506120c48b830183611e14565b607f19808985030160c08a01526120dc848385611e59565b93506120ea8d860186611e14565b93509150808985030160e08a015250612104838383611e59565b9250505060808201358c8701528c8301358d8701528a8301358b87015261212d8a840184611d48565b935091508581038a870152612143818484611eaa565b968d019695505050918a019150600101611ffa565b505061216760a08c018c611daa565b8b8303601f190160c08d015298509650612182818989611dec565b9b9a5050505050505050505050565b5f80604083850312156121a2575f80fd5b505080516020909101519092909150565b5f602082840312156121c3575f80fd5b815160ff8116811461146c575f80fd5b634e487b7160e01b5f52601260045260245ffd5b5f815180845260208085019450602084015f5b83811015611e9f578151875295820195908201906001016121fa565b5f8282518085526020808601955060208260051b840101602086015f5b8481101561226157601f1986840301895261224f8383516121e7565b98840198925090830190600101612233565b5090979650505050505050565b602081526001600160a01b038251166020820152602082015160408201525f604083015160e060608401526122a76101008401826119a3565b9050606084015160808401526080840151601f19808584030160a08601526122cf8383612216565b925060a08601519150808584030160c08601526122ec83836121e7565b925060c08601519150808584030160e08601525061230a82826121e7565b95945050505050565b5f82601f830112612322575f80fd5b81516020612332611a7583611a33565b8083825260208201915060208460051b870101935086841115612353575f80fd5b602086015b84811015611b945780518352918301918301612358565b5f8060408385031215612380575f80fd5b825167ffffffffffffffff80821115612397575f80fd5b818501915085601f8301126123aa575f80fd5b815160206123ba611a7583611a33565b82815260059290921b840181019181810190898411156123d8575f80fd5b948201945b838610156123f6578551825294820194908201906123dd565b9188015191965090935050508082111561240e575f80fd5b5061241b85828601612313565b9150509250929050565b828152604060208201525f6114dc60408301846121e7565b634e487b7160e01b5f52602160045260245ffd"; + hex"6080604052348015600e575f80fd5b5060017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055612451806100405f395ff3fe608060405260043610610034575f3560e01c806301ffc9a71461003d578063691f9ed714610070578063b17c83c11461008f57005b3661003b57005b005b348015610048575f80fd5b5061005c6100573660046116f5565b6100a2565b604051901515815260200160405180910390f35b34801561007b575f80fd5b5061003b61008a366004611730565b6100f3565b61003b61009d3660046117d2565b61020e565b5f6001600160e01b0319821663691f9ed760e01b14806100d257506001600160e01b0319821663b17c83c160e01b145b806100ed57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6101018686868686866104d0565b736e2d0e71d900474b262e545bc4c98b71ab368d2161012b6001600160a01b038816825f1961053d565b5f6101388385018561194d565b90505f61014d876101488b6105b7565b61063b565b5090505f8061015f886101488c6105b7565b915091508061017657816101728161197f565b9250505b604051632646478b60e01b81526001600160a01b03861690632646478b906101ac908e9087908f90889030908c906004016119d1565b6020604051808303815f875af11580156101c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101ec9190611a1c565b506102016001600160a01b038c16865f61053d565b5050505050505050505050565b610216610668565b61022561022282611b9f565b50565b6102326080830183611c5b565b90505f0361025357604051639c95219f60e01b815260040160405180910390fd5b6001600160a01b038316737900fd69e0785195f6e4622e3138146c4cc4abd2146102a05760405163516e822d60e01b81526001600160a01b03841660048201526024015b60405180910390fd5b5f6102ae6080840184611c5b565b5f8181106102be576102be611ca1565b90506020028101906102d09190611cb5565b6102da9080611cd3565b6102e8906040810190611ce7565b6102f56080860186611c5b565b5f81811061030557610305611ca1565b90506020028101906103179190611cb5565b6020013581811061032a5761032a611ca1565b6103409260206040909202019081019150611d2d565b90505f6103506080850185611c5b565b5f81811061036057610360611ca1565b90506020028101906103729190611cb5565b61037c9080611cd3565b61038a906060810190611ce7565b6103976080870187611c5b565b5f8181106103a7576103a7611ca1565b90506020028101906103b99190611cb5565b604001358181106103cc576103cc611ca1565b6103e29260206040909202019081019150611d2d565b90506103f96001600160a01b038316865f1961053d565b6040516334e3942b60e11b81526001600160a01b038616906369c7285690610425908790600401611f91565b60408051808303815f875af1158015610440573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104649190612191565b5061047b90506001600160a01b038316865f61053d565b6104a061048784611b9f565b83610491856105b7565b8461049b866105b7565b610696565b50506104cb60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00546002148015610515575033737900fd69e0785195f6e4622e3138146c4cc4abd214155b156105355760405163f6688adf60e01b8152336004820152602401610297565b505050505050565b6105498383835f610935565b6104cb5761055a83835f6001610935565b61058257604051635274afe760e01b81526001600160a01b0384166004820152602401610297565b61058f8383836001610935565b6104cb57604051635274afe760e01b81526001600160a01b0384166004820152602401610297565b5f6105c0610997565b6040516354636d2b60e01b81526001600160a01b038316600482015273200e12d10bb0c5e4a17e7018f0f1161919bb9389906354636d2b906024016020604051808303815f875af1158015610617573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100ed91906121b3565b5f806001600160e01b038416601b0b60e085901d61065a828287610a24565b9350935050505b9250929050565b610670610b96565b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b6040805160018082528183019092525f91816020015b60608152602001906001900390816106ac575050604080516003808252608082019092529192505f919060208201606080368337019050506040516370a0823160e01b81523060048201529091505f906001600160a01b038816906370a0823190602401602060405180830381865afa15801561072b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061074f9190611a1c565b9050801561076b5761076b6001600160a01b0388163383610bd8565b5f6107768288610be5565b50905080835f8151811061078c5761078c611ca1565b602090810291909101015250506040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa1580156107dd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108019190611a1c565b9050801561081d5761081d6001600160a01b0386163383610bd8565b5f6108288286610be5565b509050808360018151811061083f5761083f611ca1565b602090810291909101015250479050801561085e5761085e3382610c25565b5f61086a826012610be5565b509050808360028151811061088157610881611ca1565b602002602001018181525050505080825f815181106108a2576108a2611ca1565b60209081029190910101526040805160018082528183019092525f91816020015b6040805160a0810182525f91810182815260608083019390935260808201839052815260208101919091528152602001906001900390816108c357905050905087815f8151811061091657610916611ca1565b602002602001018190525061092b8382610c9c565b5050505050505050565b60405163095ea7b360e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f5114831661098b57838315161561097f573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b73200e12d10bb0c5e4a17e7018f0f1161919bb93893b15806109ee575073200e12d10bb0c5e4a17e7018f0f1161919bb93893f7f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d4114155b15610a22576040516373e6d7b360e01b815273200e12d10bb0c5e4a17e7018f0f1161919bb93896004820152602401610297565b565b5f805f851215610a5157604051634a7d166b60e01b81526004810186905260248101859052604401610297565b845f03610a6357505f90506001610b8e565b8460ff8416850185811215610a9e5760405163c849483b60e01b8152600481018890526024810187905260ff86166044820152606401610297565b5f805f831215610aea57604c19831215610ac1575f809550955050505050610b8e565b825f03600a0a9150818481610ad857610ad86121d3565b0495505084029091149150610b8e9050565b5f831315610b8357604d831315610b275760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610297565b82600a0a9150815f1981610b3d57610b3d6121d3565b04841115610b715760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610297565b5091909102925060019150610b8e9050565b509193506001925050505b935093915050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054600203610a2257604051633ee5aeb560e01b815260040160405180910390fd5b61058f8383836001610e60565b5f805f805f610bf48787610eaa565b9250925092505f80610c068585610f06565b9150915081838015610c155750815b9650965050505050509250929050565b80471015610c4f5760405163cf47918160e01b815247600482015260248101829052604401610297565b610c68828260405180602001604052805f81525061114f565b15610c71575050565b3d15610c8357610c7f611164565b5050565b60405163d6bda27560e01b815260040160405180910390fd5b335f8181523060209081526040808320815160a0810183528083018581526060808301879052608083018190529082528185015282518581529384018581528484019093529093909291905b865181101561092b57868181518110610d0357610d03611ca1565b602002602001015193505f845f015160400151511115610e58575f845f01515f01516001600160a01b031663d04dfe236040518060e00160405280885f0151602001516001600160a01b03168152602001898152602001885f01516040015181526020015f8152602001610d7b8d8a6020015161116f565b8152602001878152602001868152506040518263ffffffff1660e01b8152600401610da6919061226e565b5f60405180830381865afa158015610dc0573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610de7919081019061236f565b9150505f81511115610e565784516020015160405163012c676d60e21b81526001600160a01b03909116906304b19db490610e28908a908590600401612425565b5f604051808303815f87803b158015610e3f575f80fd5b505af1158015610e51573d5f803e3d5ffd5b505050505b505b600101610ce8565b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f5114831661098b57838315161561097f573d5f823e3d81fd5b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff861115610ef557600a860460018201600a88065f1493509350935050610eff565b8593509150600190505b9250925092565b5f808383601b82900b82148061103c577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e1000000000000000000870515610f87577f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000870515610f78576305f5e10087059650600886019550610f87565b620186a0870596506005860195505b8687601b0b14610fa257600a87059650856001019550610f87565b7b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc7b1999999999999999999999999999999999999999999999999999999888820111611036575f600188039050808160030b036110345760e01b6001600160e01b037b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff60ff8b901d18161795505f94506106619350505050565b505b50611053565b865f0361105357505f935060019250610661915050565b858660030b1461110a575f8213156110b25761106f8383611451565b156110975760405163d556b11160e01b81526004810184905260248101839052604401610297565b637ffffffe19909501600a0a82029550637fffffff9461110a565b637fffffff1986900360438113156110d457505f945084935061066192505050565b80600a0a88816110e6576110e66121d3565b059750875f0361110057505f945084935061066192505050565b50637fffffff1995505b81861361111a5760019350611133565b818603600a0a838161112e5761112e6121d3565b071593505b5050506001600160e01b03841660e084901b1791509250929050565b5f805f83516020850186885af1949350505050565b6040513d5f823e3d81fd5b60605f825167ffffffffffffffff81111561118c5761118c611850565b6040519080825280602002602001820160405280156111b5578160200160208202803683370190505b5090505f808451116111c7575f6111cd565b83516001015b85516001010190505f8167ffffffffffffffff8111156111ef576111ef611850565b60405190808252806020026020018201604052801561122257816020015b606081526020019060019003908161120d5790505b5090505f611246604080516002815233602082015230818301526060810190915290565b82828151811061125857611258611ca1565b60200260200101819052505f5b87518110156112b557818060010192505087818151811061128857611288611ca1565b60200260200101518383815181106112a2576112a2611ca1565b6020908102919091010152600101611265565b50855115611447578080600101915050838282815181106112d8576112d8611ca1565b60200260200101819052505f5b86518110156114455761139487828151811061130357611303611ca1565b60200260200101515f015161137161133f8a858151811061132657611326611ca1565b6020026020010151602001518051602090810291012090565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f908152601c91909152603c902090565b89848151811061138357611383611ca1565b602002602001015160400151611473565b6113b457604051630a57f30960e31b815260048101829052602401610297565b8681815181106113c6576113c6611ca1565b60200260200101515f01516001600160a01b03165f1b8582815181106113ee576113ee611ca1565b602002602001018181525050818060010192505086818151811061141457611414611ca1565b60200260200101516020015183838151811061143257611432611ca1565b60209081029190910101526001016112e5565b505b5095945050505050565b5f61146c5f84126114625783611466565b835f035b836114e4565b9392505050565b5f836001600160a01b03163b5f036114d1575f806114918585611582565b5090925090505f8160038111156114aa576114aa61243d565b1480156114c85750856001600160a01b0316826001600160a01b0316145b9250505061146c565b6114dc8484846115c8565b949350505050565b5f637ffffff582136114f757505f6100ed565b637ffffffe19820160438113156115125750508115156100ed565b5f81126115525780600a0a7b8000000000000000000000000000000000000000000000000000000181611547576115476121d3565b0484119150506100ed565b805f03600a0a7b800000000000000000000000000000000000000000000000000000020284101591505092915050565b5f805f83516041036115b9576020840151604085015160608601515f1a6115ab8882858561162d565b955095509550505050610eff565b505081515f9150600290610eff565b805160408051630b135d3f60e11b8082526004820186905260248201929092525f92906020820185604483015e5f82606483010152601f820160051c60051b915060205f60648401838a5afa9050825f5114601f3d1116811693505050509392505050565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084111561166657505f915060039050826116eb565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa1580156116b7573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b0381166116e257505f9250600191508290506116eb565b92505f91508190505b9450945094915050565b5f60208284031215611705575f80fd5b81356001600160e01b03198116811461146c575f80fd5b6001600160a01b0381168114610222575f80fd5b5f805f805f8060a08789031215611745575f80fd5b86356117508161171c565b955060208701356117608161171c565b94506040870135935060608701359250608087013567ffffffffffffffff8082111561178a575f80fd5b818901915089601f83011261179d575f80fd5b8135818111156117ab575f80fd5b8a60208285010111156117bc575f80fd5b6020830194508093505050509295509295509295565b5f805f606084860312156117e4575f80fd5b83356117ef8161171c565b9250602084013567ffffffffffffffff8082111561180b575f80fd5b9085019060c0828803121561181e575f80fd5b90925060408501359080821115611833575f80fd5b50840160408187031215611845575f80fd5b809150509250925092565b634e487b7160e01b5f52604160045260245ffd5b6040516060810167ffffffffffffffff8111828210171561188757611887611850565b60405290565b6040805190810167ffffffffffffffff8111828210171561188757611887611850565b604051601f8201601f1916810167ffffffffffffffff811182821017156118d9576118d9611850565b604052919050565b5f82601f8301126118f0575f80fd5b813567ffffffffffffffff81111561190a5761190a611850565b61191d601f8201601f19166020016118b0565b818152846020838601011115611931575f80fd5b816020850160208301375f918101602001919091529392505050565b5f6020828403121561195d575f80fd5b813567ffffffffffffffff811115611973575f80fd5b6114dc848285016118e1565b5f6001820161199c57634e487b7160e01b5f52601160045260245ffd5b5060010190565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f6001600160a01b038089168352876020840152808716604084015285606084015280851660808401525060c060a0830152611a1060c08301846119a3565b98975050505050505050565b5f60208284031215611a2c575f80fd5b5051919050565b5f67ffffffffffffffff821115611a4c57611a4c611850565b5060051b60200190565b5f82601f830112611a65575f80fd5b81356020611a7a611a7583611a33565b6118b0565b82815260059290921b84018101918181019086841115611a98575f80fd5b8286015b84811015611b9457803567ffffffffffffffff80821115611abb575f80fd5b908801906060828b03601f19011215611ad2575f80fd5b611ada611864565b86830135611ae78161171c565b815260408381013583811115611afb575f80fd5b8401603f81018d13611b0b575f80fd5b88810135611b1b611a7582611a33565b81815260059190911b82018301908a8101908f831115611b39575f80fd5b928401925b82841015611b575783358252928b0192908b0190611b3e565b858c0152505050606084013583811115611b6f575f80fd5b611b7d8d8a838801016118e1565b918301919091525085525050918301918301611a9c565b509695505050505050565b5f60408236031215611baf575f80fd5b611bb761188d565b823567ffffffffffffffff80821115611bce575f80fd5b818501915060608236031215611be2575f80fd5b611bea611864565b8235611bf58161171c565b81526020830135611c058161171c565b6020820152604083013582811115611c1b575f80fd5b611c27368286016118e1565b60408301525083526020850135915080821115611c42575f80fd5b50611c4f36828601611a56565b60208301525092915050565b5f808335601e19843603018112611c70575f80fd5b83018035915067ffffffffffffffff821115611c8a575f80fd5b6020019150600581901b3603821315610661575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235607e19833603018112611cc9575f80fd5b9190910192915050565b5f8235609e19833603018112611cc9575f80fd5b5f808335601e19843603018112611cfc575f80fd5b83018035915067ffffffffffffffff821115611d16575f80fd5b6020019150600681901b3603821315610661575f80fd5b5f60208284031215611d3d575f80fd5b813561146c8161171c565b5f808335601e19843603018112611d5d575f80fd5b830160208101925035905067ffffffffffffffff811115611d7c575f80fd5b8060051b3603821315610661575f80fd5b5f8235605e19833603018112611da1575f80fd5b90910192915050565b5f808335601e19843603018112611dbf575f80fd5b830160208101925035905067ffffffffffffffff811115611dde575f80fd5b803603821315610661575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f808335601e19843603018112611e29575f80fd5b830160208101925035905067ffffffffffffffff811115611e48575f80fd5b8060061b3603821315610661575f80fd5b8183525f60208085019450825f5b85811015611e9f578135611e7a8161171c565b6001600160a01b03168752818301358388015260409687019690910190600101611e67565b509495945050505050565b8183526020808401935f91600585811b8301820185855b88811015611f8357858303601f19018a52611edc8289611d8d565b60608135611ee98161171c565b6001600160a01b03168552611f0082880183611d48565b82898801528083880152608092507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811115611f3a575f80fd5b871b808288850137860190506040611f5484820185611daa565b9450838884030182890152611f6c8484018683611dec565b9e8a019e9750505093870193505050600101611ec1565b509098975050505050505050565b5f602080835260e08301843582850152604082860135818601526060818701358187015280870135801515808214611fc7575f80fd5b8060808901525050611fdc6080880188611d48565b60c060a08901529384905261010093848801600582901b89018601835f5b84811015612158578b830360ff19018452813536879003607e1901811261201f575f80fd5b8601803536829003609e19018112612035575f80fd5b60808552810180356120468161171c565b6001600160a01b0380821660808801526120628e840184611d8d565b915060a08088015281356120758161171c565b8116610120880152818e013561208a8161171c565b1661014087015261209d818c0182611daa565b91508a6101608801526120b561018088018383611dec565b9150506120c48b830183611e14565b607f19808985030160c08a01526120dc848385611e59565b93506120ea8d860186611e14565b93509150808985030160e08a015250612104838383611e59565b9250505060808201358c8701528c8301358d8701528a8301358b87015261212d8a840184611d48565b935091508581038a870152612143818484611eaa565b968d019695505050918a019150600101611ffa565b505061216760a08c018c611daa565b8b8303601f190160c08d015298509650612182818989611dec565b9b9a5050505050505050505050565b5f80604083850312156121a2575f80fd5b505080516020909101519092909150565b5f602082840312156121c3575f80fd5b815160ff8116811461146c575f80fd5b634e487b7160e01b5f52601260045260245ffd5b5f815180845260208085019450602084015f5b83811015611e9f578151875295820195908201906001016121fa565b5f8282518085526020808601955060208260051b840101602086015f5b8481101561226157601f1986840301895261224f8383516121e7565b98840198925090830190600101612233565b5090979650505050505050565b602081526001600160a01b038251166020820152602082015160408201525f604083015160e060608401526122a76101008401826119a3565b9050606084015160808401526080840151601f19808584030160a08601526122cf8383612216565b925060a08601519150808584030160c08601526122ec83836121e7565b925060c08601519150808584030160e08601525061230a82826121e7565b95945050505050565b5f82601f830112612322575f80fd5b81516020612332611a7583611a33565b8083825260208201915060208460051b870101935086841115612353575f80fd5b602086015b84811015611b945780518352918301918301612358565b5f8060408385031215612380575f80fd5b825167ffffffffffffffff80821115612397575f80fd5b818501915085601f8301126123aa575f80fd5b815160206123ba611a7583611a33565b82815260059290921b840181019181810190898411156123d8575f80fd5b948201945b838610156123f6578551825294820194908201906123dd565b9188015191965090935050508082111561240e575f80fd5b5061241b85828601612313565b9150509250929050565b828152604060208201525f6114dc60408301846121e7565b634e487b7160e01b5f52602160045260245ffd"; /// @dev The runtime bytecode of the contract. bytes constant RUNTIME_CODE = - hex"608060405260043610610034575f3560e01c806301ffc9a71461003d578063691f9ed714610070578063b17c83c11461008f57005b3661003b57005b005b348015610048575f80fd5b5061005c6100573660046116f5565b6100a2565b604051901515815260200160405180910390f35b34801561007b575f80fd5b5061003b61008a366004611730565b6100f3565b61003b61009d3660046117d2565b61020e565b5f6001600160e01b0319821663691f9ed760e01b14806100d257506001600160e01b0319821663b17c83c160e01b145b806100ed57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6101018686868686866104d0565b736e2d0e71d900474b262e545bc4c98b71ab368d2161012b6001600160a01b038816825f1961053d565b5f6101388385018561194d565b90505f61014d876101488b6105b7565b61063b565b5090505f8061015f886101488c6105b7565b915091508061017657816101728161197f565b9250505b604051632646478b60e01b81526001600160a01b03861690632646478b906101ac908e9087908f90889030908c906004016119d1565b6020604051808303815f875af11580156101c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101ec9190611a1c565b506102016001600160a01b038c16865f61053d565b5050505050505050505050565b610216610668565b61022561022282611b9f565b50565b6102326080830183611c5b565b90505f0361025357604051639c95219f60e01b815260040160405180910390fd5b6001600160a01b038316732f04ff4cf5a3a19c619fe2c892bdbd72a76bf132146102a05760405163516e822d60e01b81526001600160a01b03841660048201526024015b60405180910390fd5b5f6102ae6080840184611c5b565b5f8181106102be576102be611ca1565b90506020028101906102d09190611cb5565b6102da9080611cd3565b6102e8906040810190611ce7565b6102f56080860186611c5b565b5f81811061030557610305611ca1565b90506020028101906103179190611cb5565b6020013581811061032a5761032a611ca1565b6103409260206040909202019081019150611d2d565b90505f6103506080850185611c5b565b5f81811061036057610360611ca1565b90506020028101906103729190611cb5565b61037c9080611cd3565b61038a906060810190611ce7565b6103976080870187611c5b565b5f8181106103a7576103a7611ca1565b90506020028101906103b99190611cb5565b604001358181106103cc576103cc611ca1565b6103e29260206040909202019081019150611d2d565b90506103f96001600160a01b038316865f1961053d565b6040516334e3942b60e11b81526001600160a01b038616906369c7285690610425908790600401611f91565b60408051808303815f875af1158015610440573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104649190612191565b5061047b90506001600160a01b038316865f61053d565b6104a061048784611b9f565b83610491856105b7565b8461049b866105b7565b610696565b50506104cb60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00546002148015610515575033732f04ff4cf5a3a19c619fe2c892bdbd72a76bf13214155b156105355760405163f6688adf60e01b8152336004820152602401610297565b505050505050565b6105498383835f610935565b6104cb5761055a83835f6001610935565b61058257604051635274afe760e01b81526001600160a01b0384166004820152602401610297565b61058f8383836001610935565b6104cb57604051635274afe760e01b81526001600160a01b0384166004820152602401610297565b5f6105c0610997565b6040516354636d2b60e01b81526001600160a01b038316600482015273200e12d10bb0c5e4a17e7018f0f1161919bb9389906354636d2b906024016020604051808303815f875af1158015610617573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100ed91906121b3565b5f806001600160e01b038416601b0b60e085901d61065a828287610a24565b9350935050505b9250929050565b610670610b96565b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b6040805160018082528183019092525f91816020015b60608152602001906001900390816106ac575050604080516003808252608082019092529192505f919060208201606080368337019050506040516370a0823160e01b81523060048201529091505f906001600160a01b038816906370a0823190602401602060405180830381865afa15801561072b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061074f9190611a1c565b9050801561076b5761076b6001600160a01b0388163383610bd8565b5f6107768288610be5565b50905080835f8151811061078c5761078c611ca1565b602090810291909101015250506040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa1580156107dd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108019190611a1c565b9050801561081d5761081d6001600160a01b0386163383610bd8565b5f6108288286610be5565b509050808360018151811061083f5761083f611ca1565b602090810291909101015250479050801561085e5761085e3382610c25565b5f61086a826012610be5565b509050808360028151811061088157610881611ca1565b602002602001018181525050505080825f815181106108a2576108a2611ca1565b60209081029190910101526040805160018082528183019092525f91816020015b6040805160a0810182525f91810182815260608083019390935260808201839052815260208101919091528152602001906001900390816108c357905050905087815f8151811061091657610916611ca1565b602002602001018190525061092b8382610c9c565b5050505050505050565b60405163095ea7b360e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f5114831661098b57838315161561097f573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b73200e12d10bb0c5e4a17e7018f0f1161919bb93893b15806109ee575073200e12d10bb0c5e4a17e7018f0f1161919bb93893f7f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d4114155b15610a22576040516373e6d7b360e01b815273200e12d10bb0c5e4a17e7018f0f1161919bb93896004820152602401610297565b565b5f805f851215610a5157604051634a7d166b60e01b81526004810186905260248101859052604401610297565b845f03610a6357505f90506001610b8e565b8460ff8416850185811215610a9e5760405163c849483b60e01b8152600481018890526024810187905260ff86166044820152606401610297565b5f805f831215610aea57604c19831215610ac1575f809550955050505050610b8e565b825f03600a0a9150818481610ad857610ad86121d3565b0495505084029091149150610b8e9050565b5f831315610b8357604d831315610b275760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610297565b82600a0a9150815f1981610b3d57610b3d6121d3565b04841115610b715760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610297565b5091909102925060019150610b8e9050565b509193506001925050505b935093915050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054600203610a2257604051633ee5aeb560e01b815260040160405180910390fd5b61058f8383836001610e60565b5f805f805f610bf48787610eaa565b9250925092505f80610c068585610f06565b9150915081838015610c155750815b9650965050505050509250929050565b80471015610c4f5760405163cf47918160e01b815247600482015260248101829052604401610297565b610c68828260405180602001604052805f81525061114f565b15610c71575050565b3d15610c8357610c7f611164565b5050565b60405163d6bda27560e01b815260040160405180910390fd5b335f8181523060209081526040808320815160a0810183528083018581526060808301879052608083018190529082528185015282518581529384018581528484019093529093909291905b865181101561092b57868181518110610d0357610d03611ca1565b602002602001015193505f845f015160400151511115610e58575f845f01515f01516001600160a01b031663d04dfe236040518060e00160405280885f0151602001516001600160a01b03168152602001898152602001885f01516040015181526020015f8152602001610d7b8d8a6020015161116f565b8152602001878152602001868152506040518263ffffffff1660e01b8152600401610da6919061226e565b5f60405180830381865afa158015610dc0573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610de7919081019061236f565b9150505f81511115610e565784516020015160405163012c676d60e21b81526001600160a01b03909116906304b19db490610e28908a908590600401612425565b5f604051808303815f87803b158015610e3f575f80fd5b505af1158015610e51573d5f803e3d5ffd5b505050505b505b600101610ce8565b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f5114831661098b57838315161561097f573d5f823e3d81fd5b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff861115610ef557600a860460018201600a88065f1493509350935050610eff565b8593509150600190505b9250925092565b5f808383601b82900b82148061103c577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e1000000000000000000870515610f87577f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000870515610f78576305f5e10087059650600886019550610f87565b620186a0870596506005860195505b8687601b0b14610fa257600a87059650856001019550610f87565b7b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc7b1999999999999999999999999999999999999999999999999999999888820111611036575f600188039050808160030b036110345760e01b6001600160e01b037b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff60ff8b901d18161795505f94506106619350505050565b505b50611053565b865f0361105357505f935060019250610661915050565b858660030b1461110a575f8213156110b25761106f8383611451565b156110975760405163d556b11160e01b81526004810184905260248101839052604401610297565b637ffffffe19909501600a0a82029550637fffffff9461110a565b637fffffff1986900360438113156110d457505f945084935061066192505050565b80600a0a88816110e6576110e66121d3565b059750875f0361110057505f945084935061066192505050565b50637fffffff1995505b81861361111a5760019350611133565b818603600a0a838161112e5761112e6121d3565b071593505b5050506001600160e01b03841660e084901b1791509250929050565b5f805f83516020850186885af1949350505050565b6040513d5f823e3d81fd5b60605f825167ffffffffffffffff81111561118c5761118c611850565b6040519080825280602002602001820160405280156111b5578160200160208202803683370190505b5090505f808451116111c7575f6111cd565b83516001015b85516001010190505f8167ffffffffffffffff8111156111ef576111ef611850565b60405190808252806020026020018201604052801561122257816020015b606081526020019060019003908161120d5790505b5090505f611246604080516002815233602082015230818301526060810190915290565b82828151811061125857611258611ca1565b60200260200101819052505f5b87518110156112b557818060010192505087818151811061128857611288611ca1565b60200260200101518383815181106112a2576112a2611ca1565b6020908102919091010152600101611265565b50855115611447578080600101915050838282815181106112d8576112d8611ca1565b60200260200101819052505f5b86518110156114455761139487828151811061130357611303611ca1565b60200260200101515f015161137161133f8a858151811061132657611326611ca1565b6020026020010151602001518051602090810291012090565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f908152601c91909152603c902090565b89848151811061138357611383611ca1565b602002602001015160400151611473565b6113b457604051630a57f30960e31b815260048101829052602401610297565b8681815181106113c6576113c6611ca1565b60200260200101515f01516001600160a01b03165f1b8582815181106113ee576113ee611ca1565b602002602001018181525050818060010192505086818151811061141457611414611ca1565b60200260200101516020015183838151811061143257611432611ca1565b60209081029190910101526001016112e5565b505b5095945050505050565b5f61146c5f84126114625783611466565b835f035b836114e4565b9392505050565b5f836001600160a01b03163b5f036114d1575f806114918585611582565b5090925090505f8160038111156114aa576114aa61243d565b1480156114c85750856001600160a01b0316826001600160a01b0316145b9250505061146c565b6114dc8484846115c8565b949350505050565b5f637ffffff582136114f757505f6100ed565b637ffffffe19820160438113156115125750508115156100ed565b5f81126115525780600a0a7b8000000000000000000000000000000000000000000000000000000181611547576115476121d3565b0484119150506100ed565b805f03600a0a7b800000000000000000000000000000000000000000000000000000020284101591505092915050565b5f805f83516041036115b9576020840151604085015160608601515f1a6115ab8882858561162d565b955095509550505050610eff565b505081515f9150600290610eff565b805160408051630b135d3f60e11b8082526004820186905260248201929092525f92906020820185604483015e5f82606483010152601f820160051c60051b915060205f60648401838a5afa9050825f5114601f3d1116811693505050509392505050565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084111561166657505f915060039050826116eb565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa1580156116b7573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b0381166116e257505f9250600191508290506116eb565b92505f91508190505b9450945094915050565b5f60208284031215611705575f80fd5b81356001600160e01b03198116811461146c575f80fd5b6001600160a01b0381168114610222575f80fd5b5f805f805f8060a08789031215611745575f80fd5b86356117508161171c565b955060208701356117608161171c565b94506040870135935060608701359250608087013567ffffffffffffffff8082111561178a575f80fd5b818901915089601f83011261179d575f80fd5b8135818111156117ab575f80fd5b8a60208285010111156117bc575f80fd5b6020830194508093505050509295509295509295565b5f805f606084860312156117e4575f80fd5b83356117ef8161171c565b9250602084013567ffffffffffffffff8082111561180b575f80fd5b9085019060c0828803121561181e575f80fd5b90925060408501359080821115611833575f80fd5b50840160408187031215611845575f80fd5b809150509250925092565b634e487b7160e01b5f52604160045260245ffd5b6040516060810167ffffffffffffffff8111828210171561188757611887611850565b60405290565b6040805190810167ffffffffffffffff8111828210171561188757611887611850565b604051601f8201601f1916810167ffffffffffffffff811182821017156118d9576118d9611850565b604052919050565b5f82601f8301126118f0575f80fd5b813567ffffffffffffffff81111561190a5761190a611850565b61191d601f8201601f19166020016118b0565b818152846020838601011115611931575f80fd5b816020850160208301375f918101602001919091529392505050565b5f6020828403121561195d575f80fd5b813567ffffffffffffffff811115611973575f80fd5b6114dc848285016118e1565b5f6001820161199c57634e487b7160e01b5f52601160045260245ffd5b5060010190565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f6001600160a01b038089168352876020840152808716604084015285606084015280851660808401525060c060a0830152611a1060c08301846119a3565b98975050505050505050565b5f60208284031215611a2c575f80fd5b5051919050565b5f67ffffffffffffffff821115611a4c57611a4c611850565b5060051b60200190565b5f82601f830112611a65575f80fd5b81356020611a7a611a7583611a33565b6118b0565b82815260059290921b84018101918181019086841115611a98575f80fd5b8286015b84811015611b9457803567ffffffffffffffff80821115611abb575f80fd5b908801906060828b03601f19011215611ad2575f80fd5b611ada611864565b86830135611ae78161171c565b815260408381013583811115611afb575f80fd5b8401603f81018d13611b0b575f80fd5b88810135611b1b611a7582611a33565b81815260059190911b82018301908a8101908f831115611b39575f80fd5b928401925b82841015611b575783358252928b0192908b0190611b3e565b858c0152505050606084013583811115611b6f575f80fd5b611b7d8d8a838801016118e1565b918301919091525085525050918301918301611a9c565b509695505050505050565b5f60408236031215611baf575f80fd5b611bb761188d565b823567ffffffffffffffff80821115611bce575f80fd5b818501915060608236031215611be2575f80fd5b611bea611864565b8235611bf58161171c565b81526020830135611c058161171c565b6020820152604083013582811115611c1b575f80fd5b611c27368286016118e1565b60408301525083526020850135915080821115611c42575f80fd5b50611c4f36828601611a56565b60208301525092915050565b5f808335601e19843603018112611c70575f80fd5b83018035915067ffffffffffffffff821115611c8a575f80fd5b6020019150600581901b3603821315610661575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235607e19833603018112611cc9575f80fd5b9190910192915050565b5f8235609e19833603018112611cc9575f80fd5b5f808335601e19843603018112611cfc575f80fd5b83018035915067ffffffffffffffff821115611d16575f80fd5b6020019150600681901b3603821315610661575f80fd5b5f60208284031215611d3d575f80fd5b813561146c8161171c565b5f808335601e19843603018112611d5d575f80fd5b830160208101925035905067ffffffffffffffff811115611d7c575f80fd5b8060051b3603821315610661575f80fd5b5f8235605e19833603018112611da1575f80fd5b90910192915050565b5f808335601e19843603018112611dbf575f80fd5b830160208101925035905067ffffffffffffffff811115611dde575f80fd5b803603821315610661575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f808335601e19843603018112611e29575f80fd5b830160208101925035905067ffffffffffffffff811115611e48575f80fd5b8060061b3603821315610661575f80fd5b8183525f60208085019450825f5b85811015611e9f578135611e7a8161171c565b6001600160a01b03168752818301358388015260409687019690910190600101611e67565b509495945050505050565b8183526020808401935f91600585811b8301820185855b88811015611f8357858303601f19018a52611edc8289611d8d565b60608135611ee98161171c565b6001600160a01b03168552611f0082880183611d48565b82898801528083880152608092507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811115611f3a575f80fd5b871b808288850137860190506040611f5484820185611daa565b9450838884030182890152611f6c8484018683611dec565b9e8a019e9750505093870193505050600101611ec1565b509098975050505050505050565b5f602080835260e08301843582850152604082860135818601526060818701358187015280870135801515808214611fc7575f80fd5b8060808901525050611fdc6080880188611d48565b60c060a08901529384905261010093848801600582901b89018601835f5b84811015612158578b830360ff19018452813536879003607e1901811261201f575f80fd5b8601803536829003609e19018112612035575f80fd5b60808552810180356120468161171c565b6001600160a01b0380821660808801526120628e840184611d8d565b915060a08088015281356120758161171c565b8116610120880152818e013561208a8161171c565b1661014087015261209d818c0182611daa565b91508a6101608801526120b561018088018383611dec565b9150506120c48b830183611e14565b607f19808985030160c08a01526120dc848385611e59565b93506120ea8d860186611e14565b93509150808985030160e08a015250612104838383611e59565b9250505060808201358c8701528c8301358d8701528a8301358b87015261212d8a840184611d48565b935091508581038a870152612143818484611eaa565b968d019695505050918a019150600101611ffa565b505061216760a08c018c611daa565b8b8303601f190160c08d015298509650612182818989611dec565b9b9a5050505050505050505050565b5f80604083850312156121a2575f80fd5b505080516020909101519092909150565b5f602082840312156121c3575f80fd5b815160ff8116811461146c575f80fd5b634e487b7160e01b5f52601260045260245ffd5b5f815180845260208085019450602084015f5b83811015611e9f578151875295820195908201906001016121fa565b5f8282518085526020808601955060208260051b840101602086015f5b8481101561226157601f1986840301895261224f8383516121e7565b98840198925090830190600101612233565b5090979650505050505050565b602081526001600160a01b038251166020820152602082015160408201525f604083015160e060608401526122a76101008401826119a3565b9050606084015160808401526080840151601f19808584030160a08601526122cf8383612216565b925060a08601519150808584030160c08601526122ec83836121e7565b925060c08601519150808584030160e08601525061230a82826121e7565b95945050505050565b5f82601f830112612322575f80fd5b81516020612332611a7583611a33565b8083825260208201915060208460051b870101935086841115612353575f80fd5b602086015b84811015611b945780518352918301918301612358565b5f8060408385031215612380575f80fd5b825167ffffffffffffffff80821115612397575f80fd5b818501915085601f8301126123aa575f80fd5b815160206123ba611a7583611a33565b82815260059290921b840181019181810190898411156123d8575f80fd5b948201945b838610156123f6578551825294820194908201906123dd565b9188015191965090935050508082111561240e575f80fd5b5061241b85828601612313565b9150509250929050565b828152604060208201525f6114dc60408301846121e7565b634e487b7160e01b5f52602160045260245ffd"; + hex"608060405260043610610034575f3560e01c806301ffc9a71461003d578063691f9ed714610070578063b17c83c11461008f57005b3661003b57005b005b348015610048575f80fd5b5061005c6100573660046116f5565b6100a2565b604051901515815260200160405180910390f35b34801561007b575f80fd5b5061003b61008a366004611730565b6100f3565b61003b61009d3660046117d2565b61020e565b5f6001600160e01b0319821663691f9ed760e01b14806100d257506001600160e01b0319821663b17c83c160e01b145b806100ed57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6101018686868686866104d0565b736e2d0e71d900474b262e545bc4c98b71ab368d2161012b6001600160a01b038816825f1961053d565b5f6101388385018561194d565b90505f61014d876101488b6105b7565b61063b565b5090505f8061015f886101488c6105b7565b915091508061017657816101728161197f565b9250505b604051632646478b60e01b81526001600160a01b03861690632646478b906101ac908e9087908f90889030908c906004016119d1565b6020604051808303815f875af11580156101c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101ec9190611a1c565b506102016001600160a01b038c16865f61053d565b5050505050505050505050565b610216610668565b61022561022282611b9f565b50565b6102326080830183611c5b565b90505f0361025357604051639c95219f60e01b815260040160405180910390fd5b6001600160a01b038316737900fd69e0785195f6e4622e3138146c4cc4abd2146102a05760405163516e822d60e01b81526001600160a01b03841660048201526024015b60405180910390fd5b5f6102ae6080840184611c5b565b5f8181106102be576102be611ca1565b90506020028101906102d09190611cb5565b6102da9080611cd3565b6102e8906040810190611ce7565b6102f56080860186611c5b565b5f81811061030557610305611ca1565b90506020028101906103179190611cb5565b6020013581811061032a5761032a611ca1565b6103409260206040909202019081019150611d2d565b90505f6103506080850185611c5b565b5f81811061036057610360611ca1565b90506020028101906103729190611cb5565b61037c9080611cd3565b61038a906060810190611ce7565b6103976080870187611c5b565b5f8181106103a7576103a7611ca1565b90506020028101906103b99190611cb5565b604001358181106103cc576103cc611ca1565b6103e29260206040909202019081019150611d2d565b90506103f96001600160a01b038316865f1961053d565b6040516334e3942b60e11b81526001600160a01b038616906369c7285690610425908790600401611f91565b60408051808303815f875af1158015610440573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104649190612191565b5061047b90506001600160a01b038316865f61053d565b6104a061048784611b9f565b83610491856105b7565b8461049b866105b7565b610696565b50506104cb60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00546002148015610515575033737900fd69e0785195f6e4622e3138146c4cc4abd214155b156105355760405163f6688adf60e01b8152336004820152602401610297565b505050505050565b6105498383835f610935565b6104cb5761055a83835f6001610935565b61058257604051635274afe760e01b81526001600160a01b0384166004820152602401610297565b61058f8383836001610935565b6104cb57604051635274afe760e01b81526001600160a01b0384166004820152602401610297565b5f6105c0610997565b6040516354636d2b60e01b81526001600160a01b038316600482015273200e12d10bb0c5e4a17e7018f0f1161919bb9389906354636d2b906024016020604051808303815f875af1158015610617573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100ed91906121b3565b5f806001600160e01b038416601b0b60e085901d61065a828287610a24565b9350935050505b9250929050565b610670610b96565b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b6040805160018082528183019092525f91816020015b60608152602001906001900390816106ac575050604080516003808252608082019092529192505f919060208201606080368337019050506040516370a0823160e01b81523060048201529091505f906001600160a01b038816906370a0823190602401602060405180830381865afa15801561072b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061074f9190611a1c565b9050801561076b5761076b6001600160a01b0388163383610bd8565b5f6107768288610be5565b50905080835f8151811061078c5761078c611ca1565b602090810291909101015250506040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa1580156107dd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108019190611a1c565b9050801561081d5761081d6001600160a01b0386163383610bd8565b5f6108288286610be5565b509050808360018151811061083f5761083f611ca1565b602090810291909101015250479050801561085e5761085e3382610c25565b5f61086a826012610be5565b509050808360028151811061088157610881611ca1565b602002602001018181525050505080825f815181106108a2576108a2611ca1565b60209081029190910101526040805160018082528183019092525f91816020015b6040805160a0810182525f91810182815260608083019390935260808201839052815260208101919091528152602001906001900390816108c357905050905087815f8151811061091657610916611ca1565b602002602001018190525061092b8382610c9c565b5050505050505050565b60405163095ea7b360e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f5114831661098b57838315161561097f573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b73200e12d10bb0c5e4a17e7018f0f1161919bb93893b15806109ee575073200e12d10bb0c5e4a17e7018f0f1161919bb93893f7f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d4114155b15610a22576040516373e6d7b360e01b815273200e12d10bb0c5e4a17e7018f0f1161919bb93896004820152602401610297565b565b5f805f851215610a5157604051634a7d166b60e01b81526004810186905260248101859052604401610297565b845f03610a6357505f90506001610b8e565b8460ff8416850185811215610a9e5760405163c849483b60e01b8152600481018890526024810187905260ff86166044820152606401610297565b5f805f831215610aea57604c19831215610ac1575f809550955050505050610b8e565b825f03600a0a9150818481610ad857610ad86121d3565b0495505084029091149150610b8e9050565b5f831315610b8357604d831315610b275760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610297565b82600a0a9150815f1981610b3d57610b3d6121d3565b04841115610b715760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610297565b5091909102925060019150610b8e9050565b509193506001925050505b935093915050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054600203610a2257604051633ee5aeb560e01b815260040160405180910390fd5b61058f8383836001610e60565b5f805f805f610bf48787610eaa565b9250925092505f80610c068585610f06565b9150915081838015610c155750815b9650965050505050509250929050565b80471015610c4f5760405163cf47918160e01b815247600482015260248101829052604401610297565b610c68828260405180602001604052805f81525061114f565b15610c71575050565b3d15610c8357610c7f611164565b5050565b60405163d6bda27560e01b815260040160405180910390fd5b335f8181523060209081526040808320815160a0810183528083018581526060808301879052608083018190529082528185015282518581529384018581528484019093529093909291905b865181101561092b57868181518110610d0357610d03611ca1565b602002602001015193505f845f015160400151511115610e58575f845f01515f01516001600160a01b031663d04dfe236040518060e00160405280885f0151602001516001600160a01b03168152602001898152602001885f01516040015181526020015f8152602001610d7b8d8a6020015161116f565b8152602001878152602001868152506040518263ffffffff1660e01b8152600401610da6919061226e565b5f60405180830381865afa158015610dc0573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610de7919081019061236f565b9150505f81511115610e565784516020015160405163012c676d60e21b81526001600160a01b03909116906304b19db490610e28908a908590600401612425565b5f604051808303815f87803b158015610e3f575f80fd5b505af1158015610e51573d5f803e3d5ffd5b505050505b505b600101610ce8565b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f5114831661098b57838315161561097f573d5f823e3d81fd5b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff861115610ef557600a860460018201600a88065f1493509350935050610eff565b8593509150600190505b9250925092565b5f808383601b82900b82148061103c577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e1000000000000000000870515610f87577f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000870515610f78576305f5e10087059650600886019550610f87565b620186a0870596506005860195505b8687601b0b14610fa257600a87059650856001019550610f87565b7b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc7b1999999999999999999999999999999999999999999999999999999888820111611036575f600188039050808160030b036110345760e01b6001600160e01b037b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff60ff8b901d18161795505f94506106619350505050565b505b50611053565b865f0361105357505f935060019250610661915050565b858660030b1461110a575f8213156110b25761106f8383611451565b156110975760405163d556b11160e01b81526004810184905260248101839052604401610297565b637ffffffe19909501600a0a82029550637fffffff9461110a565b637fffffff1986900360438113156110d457505f945084935061066192505050565b80600a0a88816110e6576110e66121d3565b059750875f0361110057505f945084935061066192505050565b50637fffffff1995505b81861361111a5760019350611133565b818603600a0a838161112e5761112e6121d3565b071593505b5050506001600160e01b03841660e084901b1791509250929050565b5f805f83516020850186885af1949350505050565b6040513d5f823e3d81fd5b60605f825167ffffffffffffffff81111561118c5761118c611850565b6040519080825280602002602001820160405280156111b5578160200160208202803683370190505b5090505f808451116111c7575f6111cd565b83516001015b85516001010190505f8167ffffffffffffffff8111156111ef576111ef611850565b60405190808252806020026020018201604052801561122257816020015b606081526020019060019003908161120d5790505b5090505f611246604080516002815233602082015230818301526060810190915290565b82828151811061125857611258611ca1565b60200260200101819052505f5b87518110156112b557818060010192505087818151811061128857611288611ca1565b60200260200101518383815181106112a2576112a2611ca1565b6020908102919091010152600101611265565b50855115611447578080600101915050838282815181106112d8576112d8611ca1565b60200260200101819052505f5b86518110156114455761139487828151811061130357611303611ca1565b60200260200101515f015161137161133f8a858151811061132657611326611ca1565b6020026020010151602001518051602090810291012090565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f908152601c91909152603c902090565b89848151811061138357611383611ca1565b602002602001015160400151611473565b6113b457604051630a57f30960e31b815260048101829052602401610297565b8681815181106113c6576113c6611ca1565b60200260200101515f01516001600160a01b03165f1b8582815181106113ee576113ee611ca1565b602002602001018181525050818060010192505086818151811061141457611414611ca1565b60200260200101516020015183838151811061143257611432611ca1565b60209081029190910101526001016112e5565b505b5095945050505050565b5f61146c5f84126114625783611466565b835f035b836114e4565b9392505050565b5f836001600160a01b03163b5f036114d1575f806114918585611582565b5090925090505f8160038111156114aa576114aa61243d565b1480156114c85750856001600160a01b0316826001600160a01b0316145b9250505061146c565b6114dc8484846115c8565b949350505050565b5f637ffffff582136114f757505f6100ed565b637ffffffe19820160438113156115125750508115156100ed565b5f81126115525780600a0a7b8000000000000000000000000000000000000000000000000000000181611547576115476121d3565b0484119150506100ed565b805f03600a0a7b800000000000000000000000000000000000000000000000000000020284101591505092915050565b5f805f83516041036115b9576020840151604085015160608601515f1a6115ab8882858561162d565b955095509550505050610eff565b505081515f9150600290610eff565b805160408051630b135d3f60e11b8082526004820186905260248201929092525f92906020820185604483015e5f82606483010152601f820160051c60051b915060205f60648401838a5afa9050825f5114601f3d1116811693505050509392505050565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084111561166657505f915060039050826116eb565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa1580156116b7573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b0381166116e257505f9250600191508290506116eb565b92505f91508190505b9450945094915050565b5f60208284031215611705575f80fd5b81356001600160e01b03198116811461146c575f80fd5b6001600160a01b0381168114610222575f80fd5b5f805f805f8060a08789031215611745575f80fd5b86356117508161171c565b955060208701356117608161171c565b94506040870135935060608701359250608087013567ffffffffffffffff8082111561178a575f80fd5b818901915089601f83011261179d575f80fd5b8135818111156117ab575f80fd5b8a60208285010111156117bc575f80fd5b6020830194508093505050509295509295509295565b5f805f606084860312156117e4575f80fd5b83356117ef8161171c565b9250602084013567ffffffffffffffff8082111561180b575f80fd5b9085019060c0828803121561181e575f80fd5b90925060408501359080821115611833575f80fd5b50840160408187031215611845575f80fd5b809150509250925092565b634e487b7160e01b5f52604160045260245ffd5b6040516060810167ffffffffffffffff8111828210171561188757611887611850565b60405290565b6040805190810167ffffffffffffffff8111828210171561188757611887611850565b604051601f8201601f1916810167ffffffffffffffff811182821017156118d9576118d9611850565b604052919050565b5f82601f8301126118f0575f80fd5b813567ffffffffffffffff81111561190a5761190a611850565b61191d601f8201601f19166020016118b0565b818152846020838601011115611931575f80fd5b816020850160208301375f918101602001919091529392505050565b5f6020828403121561195d575f80fd5b813567ffffffffffffffff811115611973575f80fd5b6114dc848285016118e1565b5f6001820161199c57634e487b7160e01b5f52601160045260245ffd5b5060010190565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f6001600160a01b038089168352876020840152808716604084015285606084015280851660808401525060c060a0830152611a1060c08301846119a3565b98975050505050505050565b5f60208284031215611a2c575f80fd5b5051919050565b5f67ffffffffffffffff821115611a4c57611a4c611850565b5060051b60200190565b5f82601f830112611a65575f80fd5b81356020611a7a611a7583611a33565b6118b0565b82815260059290921b84018101918181019086841115611a98575f80fd5b8286015b84811015611b9457803567ffffffffffffffff80821115611abb575f80fd5b908801906060828b03601f19011215611ad2575f80fd5b611ada611864565b86830135611ae78161171c565b815260408381013583811115611afb575f80fd5b8401603f81018d13611b0b575f80fd5b88810135611b1b611a7582611a33565b81815260059190911b82018301908a8101908f831115611b39575f80fd5b928401925b82841015611b575783358252928b0192908b0190611b3e565b858c0152505050606084013583811115611b6f575f80fd5b611b7d8d8a838801016118e1565b918301919091525085525050918301918301611a9c565b509695505050505050565b5f60408236031215611baf575f80fd5b611bb761188d565b823567ffffffffffffffff80821115611bce575f80fd5b818501915060608236031215611be2575f80fd5b611bea611864565b8235611bf58161171c565b81526020830135611c058161171c565b6020820152604083013582811115611c1b575f80fd5b611c27368286016118e1565b60408301525083526020850135915080821115611c42575f80fd5b50611c4f36828601611a56565b60208301525092915050565b5f808335601e19843603018112611c70575f80fd5b83018035915067ffffffffffffffff821115611c8a575f80fd5b6020019150600581901b3603821315610661575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235607e19833603018112611cc9575f80fd5b9190910192915050565b5f8235609e19833603018112611cc9575f80fd5b5f808335601e19843603018112611cfc575f80fd5b83018035915067ffffffffffffffff821115611d16575f80fd5b6020019150600681901b3603821315610661575f80fd5b5f60208284031215611d3d575f80fd5b813561146c8161171c565b5f808335601e19843603018112611d5d575f80fd5b830160208101925035905067ffffffffffffffff811115611d7c575f80fd5b8060051b3603821315610661575f80fd5b5f8235605e19833603018112611da1575f80fd5b90910192915050565b5f808335601e19843603018112611dbf575f80fd5b830160208101925035905067ffffffffffffffff811115611dde575f80fd5b803603821315610661575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f808335601e19843603018112611e29575f80fd5b830160208101925035905067ffffffffffffffff811115611e48575f80fd5b8060061b3603821315610661575f80fd5b8183525f60208085019450825f5b85811015611e9f578135611e7a8161171c565b6001600160a01b03168752818301358388015260409687019690910190600101611e67565b509495945050505050565b8183526020808401935f91600585811b8301820185855b88811015611f8357858303601f19018a52611edc8289611d8d565b60608135611ee98161171c565b6001600160a01b03168552611f0082880183611d48565b82898801528083880152608092507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811115611f3a575f80fd5b871b808288850137860190506040611f5484820185611daa565b9450838884030182890152611f6c8484018683611dec565b9e8a019e9750505093870193505050600101611ec1565b509098975050505050505050565b5f602080835260e08301843582850152604082860135818601526060818701358187015280870135801515808214611fc7575f80fd5b8060808901525050611fdc6080880188611d48565b60c060a08901529384905261010093848801600582901b89018601835f5b84811015612158578b830360ff19018452813536879003607e1901811261201f575f80fd5b8601803536829003609e19018112612035575f80fd5b60808552810180356120468161171c565b6001600160a01b0380821660808801526120628e840184611d8d565b915060a08088015281356120758161171c565b8116610120880152818e013561208a8161171c565b1661014087015261209d818c0182611daa565b91508a6101608801526120b561018088018383611dec565b9150506120c48b830183611e14565b607f19808985030160c08a01526120dc848385611e59565b93506120ea8d860186611e14565b93509150808985030160e08a015250612104838383611e59565b9250505060808201358c8701528c8301358d8701528a8301358b87015261212d8a840184611d48565b935091508581038a870152612143818484611eaa565b968d019695505050918a019150600101611ffa565b505061216760a08c018c611daa565b8b8303601f190160c08d015298509650612182818989611dec565b9b9a5050505050505050505050565b5f80604083850312156121a2575f80fd5b505080516020909101519092909150565b5f602082840312156121c3575f80fd5b815160ff8116811461146c575f80fd5b634e487b7160e01b5f52601260045260245ffd5b5f815180845260208085019450602084015f5b83811015611e9f578151875295820195908201906001016121fa565b5f8282518085526020808601955060208260051b840101602086015f5b8481101561226157601f1986840301895261224f8383516121e7565b98840198925090830190600101612233565b5090979650505050505050565b602081526001600160a01b038251166020820152602082015160408201525f604083015160e060608401526122a76101008401826119a3565b9050606084015160808401526080840151601f19808584030160a08601526122cf8383612216565b925060a08601519150808584030160c08601526122ec83836121e7565b925060c08601519150808584030160e08601525061230a82826121e7565b95945050505050565b5f82601f830112612322575f80fd5b81516020612332611a7583611a33565b8083825260208201915060208460051b870101935086841115612353575f80fd5b602086015b84811015611b945780518352918301918301612358565b5f8060408385031215612380575f80fd5b825167ffffffffffffffff80821115612397575f80fd5b818501915085601f8301126123aa575f80fd5b815160206123ba611a7583611a33565b82815260059290921b840181019181810190898411156123d8575f80fd5b948201945b838610156123f6578551825294820194908201906123dd565b9188015191965090935050508082111561240e575f80fd5b5061241b85828601612313565b9150509250929050565b828152604060208201525f6114dc60408301846121e7565b634e487b7160e01b5f52602160045260245ffd"; /// @dev What MUST already be on a network before this release can be /// broadcast there: an address, and the runtime code that belongs at it. /// `abi.encode`d as a `DeployDependency[]` because Solidity has no /// file-scope constant of dynamic array type. bytes constant DEPENDENCIES = - hex"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000051e000000000000000000000000000000000000000000000000000000000000056a00000000000000000000000002f04ff4cf5a3a19c619fe2c892bdbd72a76bf132000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000051206080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a7146117cc575080631f69cb751461156f5780632cb77e9f146115435780632fbc4ba0146113f957806341d1514f146113c25780635cffe9de1461126657806360746119146110e2578063613255ab1461105f57806369c7285614610771578063709fb8a5146104375780639235084d146103e3578063ac9650d814610295578063d7e442ec14610237578063d9d98ce4146101865763fa501182146100c1575f80fd5b34610182576101403660031901126101825767ffffffffffffffff600435818111610182576100f4903690600401611b61565b6024358281116101825761010c903690600401611b61565b60c0366043190112610182576101043583811161018257610131903690600401611d07565b90610124359384116101825761014e61015c943690600401611d07565b926101576126cb565b612211565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b5f80fd5b34610182576040366003190112610182576001600160a01b036101a7611850565b166040516370a0823160e01b8152306004820152602081602481855afa90811561022c575f916101fa575b50156101e25760206040515f8152f35b60249060405190633c5bf76960e21b82526004820152fd5b90506020813d602011610224575b81610215602093836119d0565b810103126101825751826101d2565b3d9150610208565b6040513d5f823e3d90fd5b346101825760203660031901126101825760043567ffffffffffffffff81116101825761028f61026e61015c92369060040161181f565b91906102786126cb565b60405192610285846119b4565b5f84523691611ddb565b90612b63565b34610182576020806003193601126101825760043567ffffffffffffffff8111610182576102c790369060040161181f565b9190604051926102d6846119b4565b5f84528284016102e582611ab4565b946102f360405196876119d0565b8286526102ff83611ab4565b9361031186880195601f1901866121f5565b5f5b84811061037557604080518881528951818a018190525f92600582901b83018101918a918c9085015b8287106103495785850386f35b909192938280610365600193603f198a820301865288516118dc565b960192019601959291909261033c565b806103c4886103be61039160019560059d9c9d1b8701876120f1565b929089846040519586938585013782018381015f81528b519283915e015f838201520380845201826119d0565b30613990565b6103ce828a611fd7565b526103d98189611fd7565b5001969596610313565b3461018257600319602036820112610182576004359067ffffffffffffffff821161018257608090823603011261018257610422606091600401612139565b90604051921515835260208301526040820152f35b34610182576003196040368201126101825760043567ffffffffffffffff8082116101825760c082600401938336030112610182576024359081116101825761048490369060040161181f565b9061048d6126cb565b6104be6104b96104b46104ad6104a38880612124565b60408101906120f1565b36916119f2565b613926565b61397b565b801561075f576001101561074d57602483016104da8186611f44565b90501561073b5760448401946104f08682611f44565b9050156107295761055661051e9661054a61051561050e8580612124565b9585611f44565b99909285611f44565b91909261053b6040519761053189611900565b3389523690611a56565b9a60209b8c8901523691611acc565b60408601523691611acc565b60608301526064850135608083015261056e8261270d565b91825f525f875260405f209586541596876105b2575b888860017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055604051908152f35b6001905560a46001600160a01b03917f87491344dfbcf91f6cbbc610cbbeedc85313d37a02df0c93527f7ea5f8db717f83855116604051908152878c8201526060604082015280610606606082018861203f565b0390a1019161061583856120f1565b9050610679575b5050505061066d929161066561064e61028f933390919060405192600284526020840152604083015260608201604052565b906040519160018352602083015260408201604052565b923691611ddb565b82808080808080610584565b6106866104ad84866120f1565b61068f81614717565b156107025750937fd46c2c56b35c8210e9e712ec3f02242d5fc90187c0ac8ed80cc33626846ec3698961066d9897956106f56106d86106659761064e9761028f9b5116936120f1565b866040519586958652850152606060408501526060840191611d36565b0390a1938395965061061c565b89610725604051928392630c89984b60e31b8452600484015260248301906118dc565b0390fd5b60405163540e5f0b60e01b8152600490fd5b604051636c44ef8f60e01b8152600490fd5b604051633c8270bd60e21b8152600490fd5b604051632cff108b60e21b8152600490fd5b34610182576003196020368201126101825767ffffffffffffffff600435116101825760c09060043536030112610182576107aa6126cb565b5f80806107bf60048035608481019101611e8d565b90501561104d5760246004350135926107d784612772565b1561103b576060806040516107eb81611968565b6107f3611ee2565b81525f60208201525f6040820152015261080b611ee2565b5061086b61086661084561083b61083561082f608460043501600435600401611e8d565b90611f14565b80611f2f565b6040810190611f44565b602061085e61082f608460043501600435600401611e8d565b013591611f7a565b611d22565b936001600160a01b036108ba6108666108a161089761083561082f608460043501600435600401611e8d565b6060810190611f44565b604061085e61082f608460043501600435600401611e8d565b81604051976108c889611930565b16875216602086015260408501526108ea608460043501600435600401611e8d565b9490506001604051950160051b85016040525f905f5b610914608460043501600435600401611e8d565b9050811080611028575b15610e7557610937608460043501600435600401611e8d565b821015610e61578160051b810135607e1982360301811215610182576080818301360312610182576040519161096c83611968565b8181013567ffffffffffffffff81116101825761098e90369084840101611b61565b835280820160208181013590850152604080820135908501526060013567ffffffffffffffff8111610182576109c79236920101611d07565b606082015280516001600160a01b036109e96040830151602085015190611fd7565b5151166001600160a01b0385511614801590610e2d575b610e1b57610a1860208301516040840151908361305c565b610a218161270d565b91825f525f60205260405f2054155f14610a85575051604080513381526001600160a01b039092166020830152810191909152600191907fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f390606090a15b01610900565b9190610ab6602084979597015160408501519060608601519060405192610aab846119b4565b5f8452339186613091565b925f93610ace60608201516044600435013590612795565b15610b3557505051604080513381526001600160a01b03909216602083015281019190915260019291907fe3151dc8cb7a54ffc4baabd28c1f241c94d510b5e5b502491ac3cad6c16316d590606090a15b8115610b2d575b5092610a7f565b905088610b26565b610b426040820151612772565b158015610e08575b15610b9f57505051604080513381526001600160a01b03909216602083015281019190915260019291907f500b713857325f9e6dcb52ae832eca9109d107ed1aae9cb4928b4c1e13f051aa90606090a1610b1f565b9250925050600196959691610bb8606460043501611feb565b15610d755796610c2897610c3860408401516040880151610bd98183613400565b15610d6d5750925b610c32848592610c1b610c1560608a01516001600160e01b03601b918660e01d92828816810b928260e01d9216900b613dd0565b90613f8b565b9d8e9260408d01516134cb565b60408c01526134f5565b996134f5565b98610c43848461351f565b610c4d848261357d565b60405192338452608060208501526060610c73845160808088015261010087019061203f565b93602081015160a0870152604081015160c0870152015192607f198582030160e0860152835180825260208201906020808260051b8501019601925f5b828110610d0f57505050505092806001979695937f194f1feb3b4d7076a2c272e774e792e0c48bb8c7aa1a9a3671c1cd6da9e6b4c193610d0a96604084015260608301520390a180858c5101808d5260051b8c015261368f565b610b1f565b9091929396602080610d60600193601f198782030189528b51906001600160a01b0382511681526040610d4f8584015160608785015260608401906120be565b9201519060408184039101526118dc565b9901950193929101610cb0565b905092610be1565b610c2890610c386060840151610c32610db3610c1560408801516001600160e01b0394601b90868360e01d9316820b91878260e01d9216900b613dd0565b60408a0151610dc28183613400565b15610e005750915b829c8d916060890151908116155f14610df1575060408801515b96879460408d01516134cb565b610dfb9085613427565b610de4565b905091610dca565b50610e1660608201516133dd565b610b4a565b60405163936bb5ad60e01b8152600490fd5b506001600160a01b03610e496060830151604085015190611fd7565b5151166001600160a01b036020860151161415610a00565b634e487b7160e01b5f52603260045260245ffd5b50919390610e87606460043501611feb565b1561102257835b6004356004013590610ea08282613400565b6110045750508490610ec0856001600160a01b0360208701511633612ff3565b505060a46004350190610ed8826004356004016120f1565b905015159081610ffc575b50610f5b575b506001600160a01b03610eff92935116336127bc565b50505b8351811015610f275780610f21610f1b60019387611fd7565b51613868565b01610f02565b5060409160017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005582519182526020820152f35b90506001600160a01b03602084015116610f856001600160a01b03855116926004356004016120f1565b929091333b1561018257610fcd5f93604051958694859463691f9ed760e01b8652600486015260248501528960448501528a606485015260a0608485015260a4840191611d36565b038183335af190811561022c57859115610ee9579050610fed9150611984565b5f836001600160a01b03610ee9565b905088610ee3565b604492506040519163573b6f4160e01b835260048301526024820152fd5b84610e8e565b506110366040830151612772565b61091e565b60405163315f9e2360e21b8152600490fd5b604051639c95219f60e01b8152600490fd5b3461018257602080600319360112610182576024816001600160a01b03611084611850565b16604051928380926370a0823160e01b82523060048301525afa90811561022c575f916110b5575b50604051908152f35b90508181813d83116110db575b6110cc81836119d0565b810103126101825751826110ac565b503d6110c2565b34610182576110f036611890565b92916110fd9491946126cb565b61110883833361273e565b61111181612772565b15611235578160ff91611129856111ec969533612d26565b6111338183613400565b1561122f575080935b61114885828533612f95565b917f8045c25080b0868951141ed0a91720bcad09a8364a2b3109ee1fd49c1f0bc8b860c0611177898833612ff3565b97906001600160a01b0360405192338452169a8b6020840152856040840152886060840152608083015260a0820152a16040519660068852602088015260408701526060860152608085015260a08401521660c082015260e08101604052906040519160018352602083015260408201604052565b90806112185760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b6112279261028f913691611ddb565b80808061015c565b9361113c565b50604051623a3a4d60e21b81523360048201526001600160a01b039190911660248201526044810191909152606490fd5b34610182576080366003190112610182576004356001600160a01b039081811680910361018257611295611866565b6044359167ffffffffffffffff916064358381116101825736602382011215610182578060040135938411610182573660248583010111610182576113229560209216936112e4868587612eb6565b60405196879283926323e30c8b60e01b84523360048501528760248501528860448501525f606485015260a06084850152602460a485019201611d36565b03815f855af193841561022c575f9461138e575b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd984036113755761136a93503091612f2f565b602060405160018152f35b604051630b6c58a960e31b815260048101859052602490fd5b9093506020813d6020116113ba575b816113aa602093836119d0565b8101031261018257519284611336565b3d915061139d565b346101825760603660031901126101825760206113f16113e0611850565b6113e8611866565b60443591612d26565b604051908152f35b346101825761140736611890565b928094926114136126cb565b61141e82853361273e565b61142781612772565b15611513578061143b61148a9286336127bc565b9790957f7f9dfa19cf1cc2f806f2f860fbc9c056b601fb1afc0e9b843dfe5c63616268e660806040513381526001600160a01b038416998a60208301528560408301526060820152a133612862565b939091856114b85760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b6115079661028f956106659460ff93604051956005875260208701526040860152606085015260808401521660a082015260c08101604052906040519160018352602083015260408201604052565b8080808080808061015c565b506040516306dde9c360e41b81523360048201526001600160a01b03841660248201526044810191909152606490fd5b34610182576020366003190112610182576004355f525f6020526020600160405f205414604051908152f35b34610182576003196040368201126101825767ffffffffffffffff9060043582811161018257806004019160a08236039182011261018257602435848111610182576115bf90369060040161181f565b90936115c96126cb565b5f946001600160a01b0394856115de84611d22565b1633036117aa576115f76115f23685611b61565b61270d565b805f525f60205260405f2096600188541461163e575b60208960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556040519015158152f35b9091929394959697505f6001985560405196338852826020890152606060408901528161166a8761187c565b166060890152602484013590606219018112156101825783019060a06080890152806116986004840161187c565b166101008901526116ab6024830161187c565b16610120880152604481013560221982360301811215610182570190602460048301359201988211610182578136038913610182577f09d18501db0080ca2d6cd7c17fa7255daff4b2d503ea93b76ff68b6752ea8e63878061066595608461177361028f9a60209f6117329061179d9f9a606061014061064e9d0152610160880191611d36565b6117646117596117456044880185611d56565b605f198a8603810160a08c01529491611d8b565b926064870190611d56565b918784030160c0880152611d8b565b91013560e08301520390a13390919060405192600284526020840152604083015260608201604052565b828080808080808061160d565b6024866117b685611d22565b6040516335252be360e01b815291166004820152fd5b34610182576020366003190112610182576004359063ffffffff60e01b82168092036101825760209163e414309160e01b811490811561180e575b5015158152f35b6301ffc9a760e01b14905083611807565b9181601f840112156101825782359167ffffffffffffffff8311610182576020808501948460051b01011161018257565b600435906001600160a01b038216820361018257565b602435906001600160a01b038216820361018257565b35906001600160a01b038216820361018257565b906080600319830112610182576004356001600160a01b0381168103610182579160243591604435916064359067ffffffffffffffff8211610182576118d89160040161181f565b9091565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b60a0810190811067ffffffffffffffff82111761191c57604052565b634e487b7160e01b5f52604160045260245ffd5b6060810190811067ffffffffffffffff82111761191c57604052565b6040810190811067ffffffffffffffff82111761191c57604052565b6080810190811067ffffffffffffffff82111761191c57604052565b67ffffffffffffffff811161191c57604052565b60e0810190811067ffffffffffffffff82111761191c57604052565b6020810190811067ffffffffffffffff82111761191c57604052565b90601f8019910116810190811067ffffffffffffffff82111761191c57604052565b92919267ffffffffffffffff821161191c5760405191611a1c601f8201601f1916602001846119d0565b829481845281830111610182578281602093845f960137010152565b9080601f8301121561018257816020611a53933591016119f2565b90565b91906060838203126101825760405190611a6f82611930565b8193611a7a8161187c565b8352611a886020820161187c565b602084015260408101359167ffffffffffffffff831161018257604092611aaf9201611a38565b910152565b67ffffffffffffffff811161191c5760051b60200190565b929192611ad882611ab4565b604092611ae860405192836119d0565b819581835260208093019160061b84019381851161018257915b848310611b1157505050505050565b8583830312610182578386918251611b288161194c565b611b318661187c565b81528286013583820152815201920191611b02565b9080601f8301121561018257816020611a5393359101611acc565b91909160a0818403126101825760405190611b7b82611900565b8193611b868261187c565b835267ffffffffffffffff9160208101358381116101825782611baa918301611a56565b602085015260408101358381116101825782611bc7918301611b46565b6040850152606081013592831161018257611be86080939284938301611b46565b60608501520135910152565b909291611c0084611ab4565b916040611c1060405194856119d0565b839580855260208095019160059160051b8401948086116101825784935b868510611c3f575050505050505050565b67ffffffffffffffff90853582811161018257870190606082850312610182578451611c6a81611930565b611c738361187c565b81528a83013584811161018257830185601f8201121561018257803590611c9982611ab4565b91611ca6895193846119d0565b8083528d808401918b1b83010191888311610182578e809101915b838310611cf757509150508201528583013593841161018257611ce8858c95869501611a38565b86820152815201940193611c2e565b82358152918101918f9101611cc1565b9080601f8301121561018257816020611a5393359101611bf4565b356001600160a01b03811681036101825790565b908060209392818452848401375f828201840152601f01601f1916010190565b9035601e198236030181121561018257016020813591019167ffffffffffffffff8211610182578160061b3603831361018257565b9190808252602080920192915f905b828210611da8575050505090565b909192936001906001600160a01b03611dc08761187c565b16815285830135838201526040908101950193920190611d9a565b90929192611de881611ab4565b91604091611df960405194856119d0565b839581855260208095019160051b8301938185116101825783925b858410611e245750505050505050565b67ffffffffffffffff908435828111610182578601908382860312610182578351611e4e8161194c565b82358481116101825786611e63918501611a56565b81528983013593841161018257611e7e868b95869501611d07565b83820152815201930192611e14565b903590601e1981360301821215610182570180359067ffffffffffffffff821161018257602001918160051b3603831361018257565b60405190611ed082611930565b60606040835f81525f60208201520152565b60405190611eef82611900565b5f608083828152611efe611ec3565b6020820152606060408201526060808201520152565b9015610e6157803590607e1981360301821215610182570190565b903590609e1981360301821215610182570190565b903590601e1981360301821215610182570180359067ffffffffffffffff821161018257602001918160061b3603831361018257565b9190811015610e615760061b0190565b805115610e615760200190565b805160011015610e615760400190565b805160021015610e615760600190565b805160031015610e615760800190565b805160041015610e615760a00190565b8051821015610e615760209160051b010190565b3580151581036101825790565b9081518082526020808093019301915f5b828110612017575050505090565b835180516001600160a01b031686528201518583015260409094019392810192600101612009565b906080806120b56120a361209160406001600160a01b0380895116885260208901519060a060208a01528082511660a08a015260208201511660c08901520151606060e08801526101008701906118dc565b60408701518682036040880152611ff8565b60608601518582036060870152611ff8565b93015191015290565b9081518082526020808093019301915f5b8281106120dd575050505090565b8351855293810193928101926001016120cf565b903590601e1981360301821215610182570180359067ffffffffffffffff82116101825760200191813603831361018257565b903590605e1981360301821215610182570190565b6121506115f26121498380611f2f565b3690611b61565b5f525f602052600160405f2054036121ec5780612170816121dc93611f2f565b6121d461218f6121946020850135938460408701359384923690611b61565b61305c565b6121ac6121a18580611f2f565b946060810190611e8d565b92906121cc604051966121be886119b4565b5f88525f3681373690611b61565b933691611bf4565b923392613091565b6040810151606090910151600192565b505f905f905f90565b5f5b82811061220357505050565b6060828201526020016121f7565b926001600160a01b038451166001600160a01b03835116146126b9576001600160a01b03612246606086015160643590611fd7565b515116906040830151916001600160a01b036122656084358095611fd7565b51511614801590612679575b610e1b576040850151906001600160a01b036122906044358094611fd7565b5151166001600160a01b036122ab60643560608a0151611fd7565b51511614612667576122bc8661270d565b805f525f60205260405f20541561261457506122d78461270d565b805f525f60205260405f2054156125c057506123ba9291612394917f6fa7f4c28634b0a9d6831401c45ae468195fb63aed07308935c35374ff5d9e396040518061233f61233161012033845280602085015283018d61203f565b82810360408401528a61203f565b85606083015260643560808301528760a083015260a43560c083015260c43560e083015260e4356101008301520390a16001600160a01b0386511660405192612387846119b4565b5f8452606435908a613091565b936001600160a01b03865116604051926123ad846119b4565b5f845260a4359086613091565b916123c86040820151612772565b1580156125ac575b8015612599575b8015612586575b61257457604051916123ef83611968565b5f83525f60208401525f60408401525f606084015261240e848361473b565b84526040840152612434612422838661473b565b602086015280606086015284516134cb565b9461244860208501516040860151906134cb565b93612452876133dd565b8015612565575b6125535761251a61254c957fd9fa84dd790c969daa5c33d8050dc06b4a9b59d5b42e2be5f5e8ae20447f618d946124fc6125519a60a09661249b8a885161351f565b6124a98c602089015161351f565b6124b78a604089015161357d565b6124c58c606089015161357d565b6124ce8a613868565b6124d78c613868565b6001600160a01b036124f360c435926060606435910151611fd7565b51511633612862565b50506001600160a01b036124f360e43592606060a435910151611fd7565b5050606060405191338352805160208401526020810151604084015260408101518284015201516080820152a161368f565b61368f565b565b604051630d86822160e01b8152600490fd5b5061256f856133dd565b612459565b6040516321badf1f60e01b8152600490fd5b5061259460608401516133dd565b6123de565b506125a760608201516133dd565b6123d7565b506125ba6040840151612772565b156123d0565b9351604080513381526001600160a01b039092166020830152810194909452507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f3945091925082915050606081015b0390a1565b9551604080513381526001600160a01b039092166020830152810196909652507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f39493508392505060608201905061260f565b604051631cd2f1c760e21b8152600490fd5b506001600160a01b03612693606085015160a43590611fd7565b5151166001600160a01b036126af604088015160443590611fd7565b5151161415612271565b604051630a98f1f360e21b8152600490fd5b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0060028154146126fb5760029055565b604051633ee5aeb560e01b8152600490fd5b6040516127388161272a602082019460208652604083019061203f565b03601f1981018352826119d0565b51902090565b909115612749575050565b6040516305dbdfd960e41b81526001600160a01b03918216600482015291166024820152604490fd5b612791905f60e01d906001600160e01b038160e01d9116601b0b61479e565b1290565b90612791916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b61481f565b9291926127c882613a63565b936127d2816133dd565b6128505784816001600160e01b036127f19360e01d9116601b0b61489e565b9290809315612827575b5082908161280b575b5050509190565b61281f926001600160a01b03309216612f2f565b5f8181612804565b9092505f19811461283c57600101915f6127fb565b634e487b7160e01b5f52601160045260245ffd5b604051632eaefac360e21b8152600490fd5b9392919361286f836133dd565b61290d578461288b57612883939450612ff3565b50505f905f90565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f5281526128c8835f205494856134f5565b956128d2876133dd565b6128f5575f97885260018252838820908852815282872091875252909320829055565b835163c5e12af560e01b815260048101889052602490fd5b60405163793a8f5560e01b815260048101849052602490fd5b919060408382031261018257825167ffffffffffffffff908181116101825784019082601f8301121561018257815160209261296182611ab4565b9161296f60405193846119d0565b808352848084019160051b830101918683116101825785809101915b8383106129fe5750505050948281015191821161018257019180601f840112156101825782516129ba81611ab4565b936129c860405195866119d0565b818552838086019260051b820101928311610182578301905b8282106129ef575050505090565b815181529083019083016129e1565b825181529181019186910161298b565b90808251908181526020809101926020808460051b8301019501935f915b848310612a3c5750505050505090565b9091929394958480612a5a600193601f198682030187528a516120be565b9801930193019194939290612a2c565b91906020928381526001600160a01b0382511684820152838201516040820152612aa4604083015160e060608401526101008301906118dc565b9060608301516080820152612acb608084015192601f1993848483030160a0850152612a0e565b9260a081015193838382030160c08401528680865192838152019501905f5b818110612b0e57505050611a5394955060c060e091015192828503019101526120be565b825187529588019591880191600101612aea565b90604082019082526020606081936040838201528551809452019301915f5b828110612b4f575050505090565b835185529381019392810192600101612b41565b919091335f526020308152604091825f2091835195612b818761194c565b612b89611ec3565b875260608281980152845190612b9e826119b4565b5f8252855190612bad826119b4565b5f82525f3681375f5b8151811015612d1a57898688612bcc8486611fd7565b51888151948d80870151908151612bee575b5050505050505050600101612bb6565b905f92916001600160a01b0396612c138887818d51169c015116998789015190613b42565b95825199612c208b611998565b8a5289015287015285015260808401528760a08401528660c08401525f8c51809563d04dfe2360e01b82528180612c5b600498898301612a6a565b03915afa938415612d10579089915f95612cea575b508451612c86575b50899250808e8c938e612bde565b5101511691823b1561018257612cb4925f92838d5180968195829463012c676d60e21b845233908401612b22565b03925af18015612ce0579060019291612cd1575b81928782612c78565b612cda90611984565b5f612cc8565b89513d5f823e3d90fd5b612d079195503d805f833e612cff81836119d0565b810190612926565b9050935f612c70565b8c513d5f823e3d90fd5b50505050505050509050565b8215612d5b576001600160a01b038091165f52600160205260405f2091165f5260205260405f20905f5260205260405f205490565b909150612d6782613d74565b6001600160a01b03809316906040918251946370a0823160e01b86528416938460048701526020928387602481865afa968715612e7d575f97612e87575b5083612dbe612db783612dee9a614a53565b50906141de565b508651636eb1769f60e11b81526001600160a01b0390941660048501523060248501529297889081906044820190565b0381865afa968715612e7d575f97612e4c575b50612db7612e1291611a5398614a53565b50612e1d8183613400565b15612e445750935b5f5260018252825f20905f528152815f20905f8052525f2054906134f5565b905093612e25565b96508387813d8311612e76575b612e6381836119d0565b8101031261018257955195612db7612e01565b503d612e59565b85513d5f823e3d90fd5b96508387813d8311612eaf575b612e9e81836119d0565b810103126101825795519583612da5565b503d612e94565b6040519263a9059cbb60e01b5f526001600160a01b0380931660045260245260205f60448180855af160015f5114811615612f10575b8360405215612efa57505050565b635274afe760e01b835216600482015260249150fd5b6001811516612f2657813b15153d151616612eec565b833d5f823e3d90fd5b9092604051936323b872dd60e01b5f526001600160a01b0393848092166004521660245260445260205f60648180855af160015f5114811615612f7f575b836040525f60605215612efa57505050565b6001811516612f2657813b15153d151616612f6d565b93929193612fa2836133dd565b61290d5784612fb6576128839394506127bc565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f5281526128c8835f205494856134cb565b9092919261300081613a63565b9361300a816133dd565b61304a5784816001600160e01b036130299360e01d9116601b0b61489e565b50809281613038575050509190565b6001600160a01b0361281f9316612eb6565b604051632d1671a360e11b8152600490fd5b9161308790606061307c936001600160a01b039485916040880151611fd7565b515116940151611fd7565b5151161461266757565b94919392909260408051916130a583611998565b6130ad611ee2565b83526020925f848201525f838201526060945f868301528560c06080938260808201525f60a082015201528351916130e483611900565b600483525f5b8181106133ce5750506132d7959493925f9261320e61325e938d61310d8161270d565b9c896001600160a01b039e8f94859182865116908d5194600386528501528c840152168c820152608081018a5261314386611f8a565b5261314d85611f8a565b50885161315981611930565b6002815289368c83013761316c86611f97565b5261317685611f97565b5060ff8a6131d98b8501936131c38761319c81613194858a51611fd7565b515116613d74565b975116886131ab848951611fd7565b515116856131ba858a51611fd7565b51015191612d26565b966131cf828751611fd7565b5151169451611fd7565b51015192169093929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b61321782611fa7565b5261322181611fa7565b506132458a8d8d60ff8a6131d98d8501936131c38761319c81613194858a51611fd7565b61324e82611fb7565b5261325881611fb7565b50613b42565b95878a511697848b0191825191868184511693015116928a8552308752858086209151015186519161328f836119b4565b86835287519561329e87611998565b86528886015286850152848885015289608085015260a084015260c08301528351808098819463d04dfe2360e01b835260048301612a6a565b03915afa9687156133c4575f945f986133a2575b5084516002811061338b5750818386015195015161331161330b88611fc7565b51611fb7565b5161331c8183613400565b156133835750925b6133468685919060405192600284526020840152604083015260608201604052565b61334f88611fa7565b5261335987611fa7565b508251996133668b611998565b8a52890152870152850152608084015260a083015260c082015290565b905092613324565b602490835190630fbb8e5560e21b82526004820152fd5b9097506133ba9194503d805f833e612cff81836119d0565b939093965f6132eb565b50513d5f823e3d90fd5b808888809387010152016130ea565b6133fc905f60e01d906001600160e01b038160e01d9116601b0b61479e565b1390565b906133fc916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b61481f565b61344e6001600160e01b0392838316601b0b9260e01d938160e01d9116601b0b8484613f95565b90637ffffff5821361349e575b90613465916141de565b9290921580613496575b61347857505090565b6044925060405191638eba4d0760e01b835260048301526024820152fd5b50821561346f565b6134a88282614e7e565b1561345b57604483856040519163d556b11160e01b835260048301526024820152fd5b611a5391610c15916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6143e4565b611a5391610c15916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6145a8565b61357991608081018261353b6135358351611fc7565b51611fc7565b5261357261356c6001600160a01b0380945151169361356361355d8551611fc7565b51611f8a565b51169251611fc7565b51611fa7565b5191612f95565b5050565b906080810191806135916135358551611fb7565b526001600160a01b038092515116916135ad61355d8551611fb7565b51166135bc61356c8551611fb7565b519081613657576135cc836133dd565b61290d579183917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a959361260f955f5260209060018252613622604094855f20835f528452855f20855f528452855f20546134f5565b945f5260018252835f20905f528152825f20915f52525f20555b51604051918291338352604060208401526040830190612a0e565b91613688917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a959361260f95612862565b505061363c565b60c0810151908151915f92613803575b506137446020918281510151926001600160a01b039081818187511696015116928660a082019485518252308452604097888320898686510151015160808601518b51916136ec836119b4565b8683528c51936136fb856119b4565b8785528d519661370a88611998565b8752898701528c86015260016060860152608085015260a084015260c08301528851808099819463d04dfe2360e01b835260048301612a6a565b03915afa9485156137f95787956137db575b508451613767575b50505050505050565b81905101510151169051813b156137d75791849184938361379c965180978195829463012c676d60e21b845260048401612b22565b03925af19081156137ce57506137b7575b808080808061375e565b6137c18291611984565b6137cb57806137ad565b80fd5b513d84823e3d90fd5b8480fd5b6137f09195503d8089833e612cff81836119d0565b9050935f613756565b86513d89823e3d90fd5b6001600160a01b03602080845101510151169060a083015190823b1561018257613846925f928360405180968195829463012c676d60e21b845260048401612b22565b03925af1801561022c571561369f57613860919250611984565b5f905f61369f565b6080810161387961356c8251611fb7565b5191821561388657505050565b6138a061355d6001600160a01b0380935151169351611fb7565b5116815f5260209160018352604092835f20835f528152835f20855f528152835f2054936001600160e01b0385166138db575b505050505050565b6138ff955f9284845260018152828420868552815282842091845252812055612ff3565b5f8080806138d3565b8115613912570490565b634e487b7160e01b5f52601260045260245ffd5b604081511061396e576020810151908051603f19810190811161283c5760051c821161395a5760016020920160051b010190565b5050604051613968816119b4565b5f815290565b50604051613968816119b4565b80511561398b57602001515f1a90565b505f90565b905f8091602081519101845af48080613a0e575b156139c45750506040513d81523d5f602083013e60203d82010160405290565b156139eb57604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b3d156139fc576040513d5f823e3d90fd5b60405163d6bda27560e01b8152600490fd5b503d1515806139a45750813b15156139a4565b60041115613a2b57565b634e487b7160e01b5f52602160045260245ffd5b602090939291936001600160a01b036040820195168152613a5f83613a21565b0152565b613a6b614f6c565b6040805163b7bad1b160e01b81526001600160a01b0383166004820152909182826024815f73200e12d10bb0c5e4a17e7018f0f1161919bb93895af1928315613b39575f925f94613b04575b50613ac183613a21565b600183141580613af2575b613ad65750505090565b5163ee07877f60e01b8152918291610725919060048401613a3f565b50613afc83613a21565b821515613acc565b90809450613b289293503d8511613b32575b613b2081836119d0565b810190614874565b919091925f613ab7565b503d613b16565b513d5f823e3d90fd5b90805191613b4f83611ab4565b91613b6a604094613b62865195866119d0565b808552611ab4565b601f199460209186013686840137835183519095908015613d69576001613bc09101965b6001978891010197613bb7613ba28a611ab4565b99613baf86519b8c6119d0565b808b52611ab4565b018489016121f5565b85805f9684516002815233878201523086820152606081018652613be38b611f8a565b52613bed8a611f8a565b505f925b613d25575b5050508351613c09575b50505050505090565b85809598979692980181613c1d8289611fd7565b52613c288188611fd7565b505f925b613c3b575b5085969750613c00565b8451831015613d20576001600160a01b03613cb281613c5a8689611fd7565b51511686613c68878a611fd7565b51015187815160051b9101207f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f52601c52603c5f208c613ca9888b611fd7565b510151916149ca565b15613d0857868098999a928192613cc9878a611fd7565b515116613cd68787611fd7565b52019385613ce48289611fd7565b510151613cf1868c611fd7565b52613cfc858b611fd7565b50019290989796613c2c565b8951630a57f30960e31b815260048101859052602490fd5b613c31565b9091968151881015613d60578280910197613d408184611fd7565b51613d4b8a8d611fd7565b52613d56898c611fd7565b5001919081613bf1565b96829150613bf6565b50613bc05f96613b8e565b613d7c614f6c565b60408051630782d7e160e01b81526001600160a01b03831660048201529091828260248173200e12d10bb0c5e4a17e7018f0f1161919bb93895afa928315613b39575f925f94613b045750613ac183613a21565b9091939284158215175f14613dea5750505090505f905f90565b82810192600160fd1b8082019083011760fe1c613f21575b5050613e0d81614b43565b93613e1781614b43565b94613e228682614b63565b90918215613f12575f9083986f0785ee10d5da46d900f436a000000000808611613f04575b50670de0b6b3a7640000808b11613ef5575b50633b9aca00808b11613ee6575b50612710808b11613ed8575b5098805b613ec7575081906118d8989982600a0a9109960195817fcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccd0a93838211900382610100031b9203901c170291614b76565b60019290920191600a900480613e77565b60049a04998a930192613e73565b600991939a049901915f613e67565b601291939a049901915f613e59565b85049950602592505f613e47565b509290506118d8949550614b76565b5f821215613f7557808413613f67575b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb2841315613e02579092506118d8939491614a81565b9092506118d8939491614ae8565b80841215613f31579092506118d8939491614a81565b61346582826141de565b92909180613fbb576044848460405191637a97930f60e01b835260048301526024820152fd5b90919280155f14613fd057505050505f905f90565b613fe993613fdd91614c30565b92919490938492614c30565b9093919284613ff788614b43565b9161400186614b43565b947f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000094604c918688106141a8575b030191600160ff1b98838a018112155f14614175575050035b5f955f82128061416c575b61414e575b5f81128061413c575b61411e5786820103966001600160ff1b0388149081614114575b508061410b575b80614102575b6140e45750906140989291614ddc565b915f81136140ab575b506118d893614b76565b9091604c82136140d9576140c291600a0a90613908565b9081156140cf575f6140a1565b505050505f905f90565b50505050505f905f90565b876044916040519163d556b11160e01b835260048301526024820152fd5b505f8512614088565b50828414614082565b905088145f61407b565b604489836040519163d556b11160e01b835260048301526024820152fd5b50806001600160ff1b03018213614061565b95508087018613156141665786818703015b95614058565b5f614160565b505f8113614053565b89985090920390506001600160ff1b03819003870182136141995701860194614048565b5050505050505050505f905f90565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009650604b925061402f565b8115613912570590565b8082601b82810b83146143d3577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e1000000000000000000840561437f575b8380820b0361436e57507b199999999999999999999999999999999999999999999999999999987b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc8401111561431f575b838060030b036142a3575b8084136142875750506001600160e01b036001925b60e01b91161791565b8303600a0a8015613912576001600160e01b039107159261427e565b92915f8413156142f35750906142b98383614e7e565b6142d557637ffffffe1901600a0a810290637fffffff92614269565b506044916040519163d556b11160e01b835260048301526024820152fd5b637fffffff1992830390604382136140d95761431291600a0a906141d4565b9182156140cf5792614269565b5f198401808060030b14614333575061425e565b90506001600160e01b039293507b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff915060e01b9260ff1d181617905f90565b600190940193600a90930592614211565b937f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000008405156143c0576305f5e100600894058094819201955b915050614211565b620186a0600594058094819201956143b8565b508261425e57505050505f90600190565b919291600160ff1b84016143fc576118d89350614e97565b906118d8935f03916145a8565b919291600160ff1b919080158061459657509061442591614c30565b9490929091905f86858585828213801561458d575b614570575b505050508682841860ff1c94860391039081604c0381116145555701600a0a80820591908461453b575b505081019182821860ff1c111561453357826001600160ff1b031461451557905f600192135f146144e657600a9004915b01925b811581176144aa57509190565b806144c3575b5080156144bb579190565b505f91508190565b91926144d99203600160ff1b01600a0a906141d4565b600160ff1b91905f6144b0565b600a60037fe666666666666666666666666666666666666666666666666666666666666667920104019161449a565b604490836040519163d556b11160e01b835260048301526024820152fd5b50909261449d565b8107614548575b80614469565b60ff1d600117015f614542565b505050919350614563579190565b60018160ff1d1790039190565b5f9a50909750909550600160ff1b9450925090508680808061443f565b50835f1261443a565b156145a15750509190565b9350919050565b93929193841581158181176146f9575050906145c391614c30565b91949082956145d482958294614c30565b80969294919693878684821380156146f0575b6146d7575b5050505050508682841860ff1c94860391039081604c0381116145555701600a0a8082059190846146bd575b505081019182821860ff1c11156146b557826001600160ff1b031461451557905f600192135f1461468657600a9004915b01925b8115811761465957509190565b80614669575080156144bb579190565b600160ff1b936146809291038401600a0a906141d4565b5f6144b0565b600a60037fe6666666666666666666666666666666666666666666666666666666666666679201040191614649565b50909261464c565b81076146ca575b80614618565b60ff1d600117015f6146c4565b929b5098509196509450925090505f80808080806145ec565b508584126145e7565b939593909291901561470f5750506144bb579190565b945092915050565b600881511061398b576008015167ffffffffffffffff1667ff0a89c674ee78741490565b9160408301926040614775610c15606087519401938451906001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b613dd0565b94519301614784815186612795565b61478c575050565b909350611a5391925051925183613427565b92915f9060018184145f87128715171717614818575f9280821361480a575b03604c81135f8212176147fe57600a0a90846147dc83820293846141d4565b146147f1575050156147ed575f9190565b5f90565b9093509015611a53579190565b5050156147ed575f9190565b5f95600194509250906147bd565b5050505f90565b93929190918083145f83125f8712188315871517171761486e575f928082136148615703604c81135f8212176147fe57600a0a90846147dc83820293846141d4565b91946001935091906147bd565b50919050565b919082604091031261018257815160048110156101825760209092015160ff811681036101825790565b91925f8312156148c6576044838360405191634a7d166b60e01b835260048301526024820152fd5b9192836148d857505090505f90600190565b60ff81168201918083126149a0575f831215614910575050604c1981126144bb575f03600a0a916149098382613908565b9283021490565b909293915f81135f1461499657604d811361496b57600a0a92831561391257835f190483116149425750500290600190565b60405163c849483b60e01b815260048101849052602481019290925260ff166044820152606490fd5b5060405163c849483b60e01b81526004810192909252602482015260ff919091166044820152606490fd5b5050905090600190565b60405163c849483b60e01b815260048101869052602481019190915260ff82166044820152606490fd5b9091813b614a05576149dc9192614fd5565b506149e681613a21565b1591826149f257505090565b6001600160a01b03918216911614919050565b6020918160645f935160405192630b135d3f60e11b9788855260048501526040602485015286820190604485015e8281018201859052601f01601f191601915afa905f5114601f3d11161690565b9060ff165f03916001600160ff1b0382115f14614a7957600a6001818404940192061590565b909190600190565b909392915f614a91918184613dd0565b9490945f8483019182019412159081614ade575b8115614ad4575b50614ab657505090565b604492506040519163d556b11160e01b835260048301526024820152fd5b905083125f614aac565b8281129150614aa5565b614afd93600160fe1b90810193920190613dd0565b9081815f821215614b34575050604b19821261288357614b22915f03600a0a906141d4565b9081614b2c575f90565b600160ff1b90565b93600160ff1b90910192509050565b5f811215611a5357600160ff1b90808203614b5c575090565b90505f0390565b905f198183099102908180821091030391565b92939291905f8184181215614c0b576001600160ff1b039283831115614bf557600160ff1b93838503614bab57505050509190565b90919293508514614bc5575050600a600191045f03920190565b604051630ed8062160e21b8152600481019190915260248101919091526044810182905260648101849052608490fd5b5090915050600160ff1b811461283c575f039190565b90916001600160ff1b0380841115612804578514614bc5575050600a60019104920190565b9190918015614dd257827f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000080830515614ce0575b507f19999999999999999999999999999999999999999999999999999999999999997f0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc830110614cd1575b8313614cbb5791905f90565b919060018060ff1b926001600160ff1b03030190565b9290600a02905f190192614caf565b6f4b3b4ca85a86c47a098a22400000000080840515614dc0575b507728c87cb5c89a2571ebfdcb54864ada834a00000000000000830515614da9575b7b097edd871cfda3a5697758bf0e3cbb5ac5741c640000000000000000830515614d95575b7e3899162693736ac531a5a58f1fbb4b746504382ca7e4000000000000000000830515614d8557820515614d76575b5f614c64565b9290600a02905f190192614d70565b9391606402916001190193614d41565b93916402540be40002916009190193614d41565b9391678ac7230489e8000002916012190193614d1c565b6025198301955092909202915f614cfa565b505f915081908190565b90915f198383099280830292838086109503948086039584871015614e5a5714614e52579082910960018219018216809204600280826003021880830282030280830282030280830282030280830282030280830282030280920290030293600183805f03040190848311900302920304170290565b505091500490565b60648386866040519263362ced0960e11b8452600484015260248301526044820152fd5b611a5391905f811215614e92575f0361500f565b61500f565b909291600160ff1b91828101614f295750808414614f1f57808413918215614f17578185035b604c811115614f065750505f915b15614ef757507f8000000000000000000000000000000000000000000000000000000000000001019190565b92506001600160ff1b03039190565b600a0a908115613912570491614ecb565b848203614ebd565b505090505f905f90565b93614f3692945f03614409565b80939180928114614f4a575b50505f039190565b915092506001600160ff1b03831461451557600a600191059201915f80614f42565b73200e12d10bb0c5e4a17e7018f0f1161919bb9389803b158015614faa575b614f925750565b602490604051906373e6d7b360e01b82526004820152fd5b507f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d41813f1415614f8b565b815191906041830361500557614ffe9250602082015190606060408401519301515f1a9061509e565b9192909190565b50505f9160029190565b90637ffffff581131561509857637ffffffe1981019060438213615091575f82121561506557637fffffff91505f0301600a0a7b8000000000000000000000000000000000000000000000000000000202111590565b50600a0a8015613912577b80000000000000000000000000000000000000000000000000000001041090565b5050151590565b50505f90565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411615115579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa1561022c575f516001600160a01b0381161561510b57905f905f90565b505f906001905f90565b5050505f916003919056000000000000000000000000200e12d10bb0c5e4a17e7018f0f1161919bb93890000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000044b608060405234801561000f575f80fd5b506004361061004a575f3560e01c80630782d7e11461004e57806354636d2b14610078578063b7bad1b11461009d578063f5c36eaf146100b0575b5f80fd5b61006161005c366004610363565b6100c3565b60405161006f929190610403565b60405180910390f35b61008b610086366004610363565b6100d8565b60405160ff909116815260200161006f565b6100616100ab366004610363565b6100e9565b61008b6100be366004610363565b6100f5565b5f806100cf5f84610100565b91509150915091565b5f6100e35f836101f0565b92915050565b5f806100cf5f84610281565b5f6100e35f83610356565b73ffffffffffffffffffffffffffffffffffffffff81165f9081526020838152604080832081518083019092525460ff8082161515835261010090910416818301527f313ce56700000000000000000000000000000000000000000000000000000000808452839283908190816004818a5afa915060203d1015610182575f91505b811561019857505f5160ff811115610198575f91505b816101af57505050602001516003925090506101e9565b83516101c3575f955093506101e992505050565b836020015160ff1681146101d85760026101db565b60015b846020015195509550505050505b9250929050565b5f805f6101fd8585610281565b909250905060018260038111156102165761021661039d565b1415801561023557505f8260038111156102325761023261039d565b14155b156102795783826040517fee07877f000000000000000000000000000000000000000000000000000000008152600401610270929190610421565b60405180910390fd5b949350505050565b5f805f8061028f8686610100565b90925090505f8260038111156102a7576102a761039d565b0361034b576040805180820182526001815260ff838116602080840191825273ffffffffffffffffffffffffffffffffffffffff8a165f908152908b9052939093209151825493517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009094169015157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff161761010093909116929092029190911790555b909590945092505050565b5f805f6101fd8585610100565b5f60208284031215610373575f80fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114610396575f80fd5b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b600481106103ff577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b9052565b6040810161041182856103ca565b60ff831660208301529392505050565b73ffffffffffffffffffffffffffffffffffffffff831681526040810161039660208301846103ca560000000000000000000000000000000000000000000000000000000000000000006e2d0e71d900474b262e545bc4c98b71ab368d2100000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000003d486080604052600436106100d65760003560e01c80638456cb591161007f5780639a1f3406116100595780639a1f340614610200578063cd0fb7a714610220578063f2fde38b14610260578063fa461e331461028057600080fd5b80638456cb59146101ad5780638da5cb5b146101c257806393b3774c146101ed57600080fd5b80632c8958f6116100b05780632c8958f6146100f95780636b2ace871461013f578063715018a61461019857600080fd5b8063046f7da2146100e257806323a69e75146100f95780632646478b1461011957600080fd5b366100dd57005b600080fd5b3480156100ee57600080fd5b506100f76102a0565b005b34801561010557600080fd5b506100f7610114366004613579565b6103a8565b61012c6101273660046136f5565b6103ba565b6040519081526020015b60405180910390f35b34801561014b57600080fd5b506101737f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610136565b3480156101a457600080fd5b506100f7610564565b3480156101b957600080fd5b506100f7610578565b3480156101ce57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff16610173565b61012c6101fb36600461377c565b61067b565b34801561020c57600080fd5b506100f761021b36600461382f565b61089a565b34801561022c57600080fd5b5061025061023b366004613868565b60016020526000908152604090205460ff1681565b6040519015158152602001610136565b34801561026c57600080fd5b506100f761027b366004613868565b6108f8565b34801561028c57600080fd5b506100f761029b366004613579565b6109af565b60005473ffffffffffffffffffffffffffffffffffffffff163314806102d557503360009081526001602052604090205460ff165b610366576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f52503a2063616c6c6572206973206e6f7420746865206f776e6572206f72206160448201527f2070726976696c6567656420757365720000000000000000000000000000000060648201526084015b60405180910390fd5b600280547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff167501000000000000000000000000000000000000000000179055565b6103b4848484846109af565b50505050565b60025460009074010000000000000000000000000000000000000000900460ff16600114610444576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f526f75746550726f636573736f72206973206c6f636b65640000000000000000604482015260640161035d565b6002547501000000000000000000000000000000000000000000900460ff166001146104cc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f526f75746550726f636573736f72206973207061757365640000000000000000604482015260640161035d565b600280547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1674020000000000000000000000000000000000000000179055610519878787878787610b5d565b9050600280547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790559695505050505050565b61056c6111a3565b6105766000611224565b565b60005473ffffffffffffffffffffffffffffffffffffffff163314806105ad57503360009081526001602052604090205460ff165b610639576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f52503a2063616c6c6572206973206e6f7420746865206f776e6572206f72206160448201527f2070726976696c65676564207573657200000000000000000000000000000000606482015260840161035d565b600280547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff167502000000000000000000000000000000000000000000179055565b60025460009074010000000000000000000000000000000000000000900460ff16600114610705576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f526f75746550726f636573736f72206973206c6f636b65640000000000000000604482015260640161035d565b6002547501000000000000000000000000000000000000000000900460ff1660011461078d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f526f75746550726f636573736f72206973207061757365640000000000000000604482015260640161035d565b600280547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1674020000000000000000000000000000000000000000179055604051600090819073ffffffffffffffffffffffffffffffffffffffff8c16908b908381818185875af1925050503d8060008114610826576040519150601f19603f3d011682016040523d82523d6000602084013e61082b565b606091505b50915091508161083d57805181602001fd5b61084b898989898989610b5d565b92505050600280547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000017905598975050505050505050565b6108a26111a3565b73ffffffffffffffffffffffffffffffffffffffff91909116600090815260016020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b6109006111a3565b73ffffffffffffffffffffffffffffffffffffffff81166109a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161035d565b6109ac81611224565b50565b60025473ffffffffffffffffffffffffffffffffffffffff163314610a56576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f526f75746550726f636573736f722e756e697377617056335377617043616c6c60448201527f6261636b3a2063616c6c2066726f6d20756e6b6e6f776e20736f757263650000606482015260840161035d565b6000808513610a655783610a67565b845b905060008113610af9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f526f75746550726f636573736f722e756e697377617056335377617043616c6c60448201527f6261636b3a206e6f7420706f73697469766520616d6f756e7400000000000000606482015260840161035d565b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001660011790556000610b3283850185613868565b9050610b5573ffffffffffffffffffffffffffffffffffffffff82163384611299565b505050505050565b60008073ffffffffffffffffffffffffffffffffffffffff881673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14610c24576040517f70a0823100000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff8916906370a0823190602401602060405180830381865afa158015610bfb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c1f919061388c565b610c27565b60005b9050600073ffffffffffffffffffffffffffffffffffffffff871673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14610cf1576040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301528816906370a0823190602401602060405180830381865afa158015610cc8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cec919061388c565b610d0a565b8473ffffffffffffffffffffffffffffffffffffffff16315b905087600080610d2e87604080518082019091528181528151909101602082015290565b90505b805160208201511115610e84576000610d508280516001018051915290565b90508060ff1660011415610d7a576000610d6983611372565b905083610d74578094505b50610e73565b8060ff1660021415610d9557610d90828d611437565b610e73565b8060ff1660031415610dac576000610d6983611457565b8060ff1660041415610dc157610d908261147d565b8060ff1660051415610dd657610d90826114a3565b8060ff1660061415610dec57610d908d836115a8565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f526f75746550726f636573736f723a20556e6b6e6f776e20636f6d6d616e642060448201527f636f646500000000000000000000000000000000000000000000000000000000606482015260840161035d565b610e7c836138d4565b925050610d31565b506000905073ffffffffffffffffffffffffffffffffffffffff8b1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14610f4d576040517f70a0823100000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff8c16906370a0823190602401602060405180830381865afa158015610f24573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f48919061388c565b610f50565b60005b905083610f5d8b8361390d565b1015610feb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f526f75746550726f636573736f723a204d696e696d616c20696e70757420626160448201527f6c616e63652076696f6c6174696f6e0000000000000000000000000000000000606482015260840161035d565b600073ffffffffffffffffffffffffffffffffffffffff8a1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee146110b3576040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff89811660048301528b16906370a0823190602401602060405180830381865afa15801561108a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110ae919061388c565b6110cc565b8773ffffffffffffffffffffffffffffffffffffffff16315b90506110d8898561390d565b81101561111e576110e98482613925565b6040517f963b34a500000000000000000000000000000000000000000000000000000000815260040161035d91815260200190565b6111288482613925565b6040805173ffffffffffffffffffffffffffffffffffffffff8b81168252602082018790529181018c905260608101839052919750808c1691908e169033907f2db5ddd0b42bdbca0d69ea16f234a870a485854ae0d91f16643d6f317d8b89949060800160405180910390a450505050509695505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610576576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161035d565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905261136d9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915261163b565b505050565b6000806113858380516014018051915290565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290915073ffffffffffffffffffffffffffffffffffffffff8216906370a0823190602401602060405180830381865afa1580156113f2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611416919061388c565b91508115611425576001820391505b61143183308385611747565b50919050565b60006114498380516014018051915290565b905061136d83338385611747565b47611478823073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee84611747565b919050565b600061148f8280516014018051915290565b905061149f8260008360006117a2565b5050565b60006114b58280516014018051915290565b6040517ff7888aec00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff80831660048301523060248301529192506000917f0000000000000000000000000000000000000000000000000000000000000000169063f7888aec90604401602060405180830381865afa15801561154d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611571919061388c565b9050801561159c577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff015b61136d83308484611747565b60006115ba8280516020018051915290565b905060006115ce8380516020018051915290565b905060006115e28480516001018051915290565b905060006115f68580516020018051915290565b9050600061160a8680516020018051915290565b905061163273ffffffffffffffffffffffffffffffffffffffff8816333088888888886118d6565b50505050505050565b600061169d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16611b569092919063ffffffff16565b80519091501561136d57808060200190518101906116bb919061393c565b61136d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840161035d565b60006117598580516001018051915290565b905060005b8160ff16811015610b5557600061177b8780516002018051915290565b61ffff8082168602049485900394909150611798888888846117a2565b505060010161175e565b60006117b48580516001018051915290565b905060ff81166117cf576117ca85858585611b6d565b6118cf565b8060ff16600114156117e7576117ca85858585611f22565b8060ff16600214156117ff576117ca85858585612162565b8060ff1660031415611817576117ca85858585612410565b8060ff166004141561182f576117ca85858585612a98565b8060ff1660051415611847576117ca85858585612c26565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f526f75746550726f636573736f723a20556e6b6e6f776e20706f6f6c2074797060448201527f6500000000000000000000000000000000000000000000000000000000000000606482015260840161035d565b5050505050565b6040517f7ecebe0000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8881166004830152600091908a1690637ecebe0090602401602060405180830381865afa158015611946573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061196a919061388c565b6040517fd505accf00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a811660048301528981166024830152604482018990526064820188905260ff8716608483015260a4820186905260c48201859052919250908a169063d505accf9060e401600060405180830381600087803b158015611a0457600080fd5b505af1158015611a18573d6000803e3d6000fd5b50506040517f7ecebe0000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8b81166004830152600093508c169150637ecebe0090602401602060405180830381865afa158015611a8b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aaf919061388c565b9050611abc82600161390d565b8114611b4a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f5361666545524332303a207065726d697420646964206e6f742073756363656560448201527f6400000000000000000000000000000000000000000000000000000000000000606482015260840161035d565b50505050505050505050565b6060611b6584846000856131e1565b949350505050565b6000611b7f8580516014018051915290565b90506000611b938680516001018051915290565b90506000611ba78780516014018051915290565b90506000611bbb8880516003018051915290565b905073ffffffffffffffffffffffffffffffffffffffff8716301415611c0157611bfc73ffffffffffffffffffffffffffffffffffffffff87168587611299565b611c41565b73ffffffffffffffffffffffffffffffffffffffff8716331415611c4157611c4173ffffffffffffffffffffffffffffffffffffffff87163386886132fa565b6000808573ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015611c8f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cb39190613977565b506dffffffffffffffffffffffffffff1691506dffffffffffffffffffffffffffff169150600082118015611ce85750600081115b611d4e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f57726f6e6720706f6f6c20726573657276657300000000000000000000000000604482015260640161035d565b6000808660ff16600114611d63578284611d66565b83835b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8b8116600483015292945090925083918c16906370a0823190602401602060405180830381865afa158015611dda573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dfe919061388c565b611e089190613925565b98506000611e1986620f42406139c7565b611e289062ffffff168b6139eb565b9050600081611e3a85620f42406139eb565b611e44919061390d565b611e4e84846139eb565b611e589190613a28565b90506000808a60ff16600114611e7057826000611e74565b6000835b604080516000815260208101918290527f022c0d9f00000000000000000000000000000000000000000000000000000000909152919350915073ffffffffffffffffffffffffffffffffffffffff8d169063022c0d9f90611ede90859085908f9060248101613ad9565b600060405180830381600087803b158015611ef857600080fd5b505af1158015611f0c573d6000803e3d6000fd5b5050505050505050505050505050505050505050565b6000611f348580516014018051915290565b9050600080611f498780516001018051915290565b60ff161190506000611f618780516014018051915290565b905073ffffffffffffffffffffffffffffffffffffffff8616331415611fa357611fa373ffffffffffffffffffffffffffffffffffffffff86163330876132fa565b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff851690811790915563128acb088284878161201757612012600173fffd8963efd1fc6a506488495d951d5263988d26613b14565b612027565b6120276401000276a36001613b41565b6040805173ffffffffffffffffffffffffffffffffffffffff8d166020820152016040516020818303038152906040526040518663ffffffff1660e01b8152600401612077959493929190613b79565b60408051808303816000875af1158015612095573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120b99190613bc0565b505060025473ffffffffffffffffffffffffffffffffffffffff16600114611632576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f526f75746550726f636573736f722e73776170556e6956333a20756e6578706560448201527f6374656400000000000000000000000000000000000000000000000000000000606482015260840161035d565b60006121748580516001018051915290565b905060006121888680516014018051915290565b9050600180831614156122575760006121a78780516014018051915290565b905060028316612213578073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b1580156121f957600080fd5b505af115801561220d573d6000803e3d6000fd5b50505050505b73ffffffffffffffffffffffffffffffffffffffff821630146122515761225173ffffffffffffffffffffffffffffffffffffffff82168386611299565b50610b55565b600282166123205773ffffffffffffffffffffffffffffffffffffffff851633141561229f5761229f73ffffffffffffffffffffffffffffffffffffffff85163330866132fa565b6040517f2e1a7d4d0000000000000000000000000000000000000000000000000000000081526004810184905273ffffffffffffffffffffffffffffffffffffffff851690632e1a7d4d90602401600060405180830381600087803b15801561230757600080fd5b505af115801561231b573d6000803e3d6000fd5b505050505b60008173ffffffffffffffffffffffffffffffffffffffff168460405160006040518083038185875af1925050503d806000811461237a576040519150601f19603f3d011682016040523d82523d6000602084013e61237f565b606091505b5050905080611632576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f526f75746550726f636573736f722e777261704e61746976653a204e6174697660448201527f6520746f6b656e207472616e73666572206661696c6564000000000000000000606482015260840161035d565b60006124228580516001018051915290565b905060006124368680516014018051915290565b905060ff8216156128315773ffffffffffffffffffffffffffffffffffffffff85163014156124a5576124a073ffffffffffffffffffffffffffffffffffffffff85167f000000000000000000000000000000000000000000000000000000000000000085611299565b61275b565b73ffffffffffffffffffffffffffffffffffffffff8516331415612505576124a073ffffffffffffffffffffffffffffffffffffffff8516337f0000000000000000000000000000000000000000000000000000000000000000866132fa565b6040517f4ffe34db00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85811660048301527f00000000000000000000000000000000000000000000000000000000000000001690634ffe34db906024016040805180830381865afa158015612590573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125b49190613c04565b516040517fdf23b45b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301526fffffffffffffffffffffffffffffffff909216917f0000000000000000000000000000000000000000000000000000000000000000169063df23b45b90602401606060405180830381865afa158015612656573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061267a9190613c77565b60409081015190517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811660048301526fffffffffffffffffffffffffffffffff909216918716906370a0823190602401602060405180830381865afa158015612720573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612744919061388c565b61274e919061390d565b6127589190613925565b92505b6040517f02b9446c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85811660048301527f000000000000000000000000000000000000000000000000000000000000000081166024830181905290831660448301526064820185905260006084830152906302b9446c9060a40160408051808303816000875af1158015612806573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061282a9190613bc0565b5050610b55565b73ffffffffffffffffffffffffffffffffffffffff851615612908576040517ff18d03cc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85811660048301528681166024830152306044830152606482018590527f0000000000000000000000000000000000000000000000000000000000000000169063f18d03cc90608401600060405180830381600087803b1580156128eb57600080fd5b505af11580156128ff573d6000803e3d6000fd5b505050506129c1565b6040517ff7888aec00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85811660048301523060248301527f0000000000000000000000000000000000000000000000000000000000000000169063f7888aec90604401602060405180830381865afa15801561299a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129be919061388c565b92505b6040517f97da6d3000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152306024830152828116604483015260006064830152608482018590527f000000000000000000000000000000000000000000000000000000000000000016906397da6d309060a40160408051808303816000875af1158015612a6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a8e9190613bc0565b5050505050505050565b6000612aaa8580516014018051915290565b85516020808201805190920101875290915073ffffffffffffffffffffffffffffffffffffffff851615612b91576040517ff18d03cc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff858116600483015286811660248301528381166044830152606482018590527f0000000000000000000000000000000000000000000000000000000000000000169063f18d03cc90608401600060405180830381600087803b158015612b7857600080fd5b505af1158015612b8c573d6000803e3d6000fd5b505050505b6040517f627dd56a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83169063627dd56a90612be3908490600401613ce3565b6020604051808303816000875af1158015612c02573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611632919061388c565b6000612c388580516014018051915290565b90506000612c4c8680516001018051915290565b90506000612c608780516001018051915290565b60000b90506000612c778880516001018051915290565b60000b90506000612c8e8980516014018051915290565b90506000612ca28a80516014018051915290565b9050600073ffffffffffffffffffffffffffffffffffffffff891673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1415612d8b576040517f3df02124000000000000000000000000000000000000000000000000000000008152600f86810b600483015285900b6024820152604481018990526000606482015273ffffffffffffffffffffffffffffffffffffffff881690633df02124908a9060840160206040518083038185885af1158015612d5f573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612d84919061388c565b905061306e565b73ffffffffffffffffffffffffffffffffffffffff8a16331415612dcb57612dcb73ffffffffffffffffffffffffffffffffffffffff8a1633308b6132fa565b612dec73ffffffffffffffffffffffffffffffffffffffff8a16888a613358565b5060ff8616612e9f576040517f3df02124000000000000000000000000000000000000000000000000000000008152600f86810b600483015285900b6024820152604481018990526000606482015273ffffffffffffffffffffffffffffffffffffffff881690633df02124906084016020604051808303816000875af1158015612e7b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d84919061388c565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8416906370a0823190602401602060405180830381865afa158015612f0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f30919061388c565b6040517f3df02124000000000000000000000000000000000000000000000000000000008152600f88810b600483015287900b6024820152604481018b90526000606482015290915073ffffffffffffffffffffffffffffffffffffffff891690633df0212490608401600060405180830381600087803b158015612fb457600080fd5b505af1158015612fc8573d6000803e3d6000fd5b50506040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000925073ffffffffffffffffffffffffffffffffffffffff861691506370a0823190602401602060405180830381865afa158015613039573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061305d919061388c565b90506130698282613925565b925050505b73ffffffffffffffffffffffffffffffffffffffff831630146131d45773ffffffffffffffffffffffffffffffffffffffff821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14156131b35760008373ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114613117576040519150601f19603f3d011682016040523d82523d6000602084013e61311c565b606091505b50509050806131ad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f526f75746550726f636573736f722e7377617043757276653a204e617469766560448201527f20746f6b656e207472616e73666572206661696c656400000000000000000000606482015260840161035d565b506131d4565b6131d473ffffffffffffffffffffffffffffffffffffffff83168483611299565b5050505050505050505050565b606082471015613273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c0000000000000000000000000000000000000000000000000000606482015260840161035d565b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161329c9190613cf6565b60006040518083038185875af1925050503d80600081146132d9576040519150601f19603f3d011682016040523d82523d6000602084013e6132de565b606091505b50915091506132ef87838387613389565b979650505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526103b49085907f23b872dd00000000000000000000000000000000000000000000000000000000906084016112eb565b6000613365848484613426565b80611b65575061337784846000613426565b8015611b655750611b65848484613426565b6060831561341c5782516134155773ffffffffffffffffffffffffffffffffffffffff85163b613415576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161035d565b5081611b65565b611b658383613535565b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f095ea7b300000000000000000000000000000000000000000000000000000000179052915160009283928392918816916134bf9190613cf6565b6000604051808303816000865af19150503d80600081146134fc576040519150601f19603f3d011682016040523d82523d6000602084013e613501565b606091505b509150915081801561352b57508051158061352b57508080602001905181019061352b919061393c565b9695505050505050565b8151156135455781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161035d9190613ce3565b6000806000806060858703121561358f57600080fd5b8435935060208501359250604085013567ffffffffffffffff808211156135b557600080fd5b818701915087601f8301126135c957600080fd5b8135818111156135d857600080fd5b8860208285010111156135ea57600080fd5b95989497505060200194505050565b73ffffffffffffffffffffffffffffffffffffffff811681146109ac57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f83011261365b57600080fd5b813567ffffffffffffffff808211156136765761367661361b565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156136bc576136bc61361b565b816040528381528660208588010111156136d557600080fd5b836020870160208301376000602085830101528094505050505092915050565b60008060008060008060c0878903121561370e57600080fd5b8635613719816135f9565b9550602087013594506040870135613730816135f9565b9350606087013592506080870135613747816135f9565b915060a087013567ffffffffffffffff81111561376357600080fd5b61376f89828a0161364a565b9150509295509295509295565b600080600080600080600080610100898b03121561379957600080fd5b88356137a4816135f9565b97506020890135965060408901356137bb816135f9565b95506060890135945060808901356137d2816135f9565b935060a0890135925060c08901356137e9816135f9565b915060e089013567ffffffffffffffff81111561380557600080fd5b6138118b828c0161364a565b9150509295985092959890939650565b80151581146109ac57600080fd5b6000806040838503121561384257600080fd5b823561384d816135f9565b9150602083013561385d81613821565b809150509250929050565b60006020828403121561387a57600080fd5b8135613885816135f9565b9392505050565b60006020828403121561389e57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613906576139066138a5565b5060010190565b60008219821115613920576139206138a5565b500190565b600082821015613937576139376138a5565b500390565b60006020828403121561394e57600080fd5b815161388581613821565b80516dffffffffffffffffffffffffffff8116811461147857600080fd5b60008060006060848603121561398c57600080fd5b61399584613959565b92506139a360208501613959565b9150604084015163ffffffff811681146139bc57600080fd5b809150509250925092565b600062ffffff838116908316818110156139e3576139e36138a5565b039392505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613a2357613a236138a5565b500290565b600082613a5e577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60005b83811015613a7e578181015183820152602001613a66565b838111156103b45750506000910152565b60008151808452613aa7816020860160208601613a63565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b84815283602082015273ffffffffffffffffffffffffffffffffffffffff8316604082015260806060820152600061352b6080830184613a8f565b600073ffffffffffffffffffffffffffffffffffffffff838116908316818110156139e3576139e36138a5565b600073ffffffffffffffffffffffffffffffffffffffff808316818516808303821115613b7057613b706138a5565b01949350505050565b600073ffffffffffffffffffffffffffffffffffffffff8088168352861515602084015285604084015280851660608401525060a060808301526132ef60a0830184613a8f565b60008060408385031215613bd357600080fd5b505080516020909101519092909150565b80516fffffffffffffffffffffffffffffffff8116811461147857600080fd5b600060408284031215613c1657600080fd5b6040516040810181811067ffffffffffffffff82111715613c3957613c3961361b565b604052613c4583613be4565b8152613c5360208401613be4565b60208201529392505050565b805167ffffffffffffffff8116811461147857600080fd5b600060608284031215613c8957600080fd5b6040516060810181811067ffffffffffffffff82111715613cac57613cac61361b565b604052613cb883613c5f565b8152613cc660208401613c5f565b6020820152613cd760408401613be4565b60408201529392505050565b6020815260006138856020830184613a8f565b60008251613d08818460208701613a63565b919091019291505056fea26469706673582212201ff294929b57776d43429e47ba13e7bb550e4a27be6afbadf8c8a0d6ad6324b364736f6c634300080a0033000000000000000000000000000000000000000000000000"; + hex"000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000520000000000000000000000000000000000000000000000000000000000000056c00000000000000000000000007900fd69e0785195f6e4622e3138146c4cc4abd2000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000051216080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a7146117cc575080631f69cb751461156f5780632cb77e9f146115435780632fbc4ba0146113f957806341d1514f146113c25780635cffe9de1461126657806360746119146110e2578063613255ab1461105f57806369c7285614610771578063709fb8a5146104375780639235084d146103e3578063ac9650d814610295578063d5708b46146101fa578063d7e442ec146101765763d9d98ce4146100c1575f80fd5b3461015f57604036600319011261015f576001600160a01b036100e2611850565b166040516370a0823160e01b8152306004820152602081602481855afa90811561016b575f91610135575b501561011d5760206040515f8152f35b60249060405190633c5bf76960e21b82526004820152fd5b90506020813d602011610163575b81610150602093836119d0565b8101031261015f57515f61010d565b5f80fd5b3d9150610143565b6040513d5f823e3d90fd5b3461015f57602036600319011261015f5760043567ffffffffffffffff811161015f576101ce6101ad6101d492369060040161181f565b91906101b76126cc565b604051926101c4846119b4565b5f84523691611ddb565b90612b64565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b3461015f5761014036600319011261015f5767ffffffffffffffff60043581811161015f5761022d903690600401611b61565b60243582811161015f57610245903690600401611b61565b60c036604319011261015f576101043583811161015f5761026a903690600401611d07565b906101243593841161015f576102876101d4943690600401611d07565b926102906126cc565b612211565b3461015f5760208060031936011261015f5760043567ffffffffffffffff811161015f576102c790369060040161181f565b9190604051926102d6846119b4565b5f84528284016102e582611ab4565b946102f360405196876119d0565b8286526102ff83611ab4565b9361031186880195601f1901866121f5565b5f5b84811061037557604080518881528951818a018190525f92600582901b83018101918a918c9085015b8287106103495785850386f35b909192938280610365600193603f198a820301865288516118dc565b960192019601959291909261033c565b806103c4886103be61039160019560059d9c9d1b8701876120f1565b929089846040519586938585013782018381015f81528b519283915e015f838201520380845201826119d0565b30613991565b6103ce828a611fd7565b526103d98189611fd7565b5001969596610313565b3461015f5760031960203682011261015f576004359067ffffffffffffffff821161015f57608090823603011261015f57610422606091600401612139565b90604051921515835260208301526040820152f35b3461015f5760031960403682011261015f5760043567ffffffffffffffff80821161015f5760c08260040193833603011261015f5760243590811161015f5761048490369060040161181f565b9061048d6126cc565b6104be6104b96104b46104ad6104a38880612124565b60408101906120f1565b36916119f2565b613927565b61397c565b801561075f576001101561074d57602483016104da8186611f44565b90501561073b5760448401946104f08682611f44565b9050156107295761055661051e9661054a61051561050e8580612124565b9585611f44565b99909285611f44565b91909261053b6040519761053189611900565b3389523690611a56565b9a60209b8c8901523691611acc565b60408601523691611acc565b60608301526064850135608083015261056e8261270e565b91825f525f875260405f209586541596876105b2575b888860017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055604051908152f35b6001905560a46001600160a01b03917f87491344dfbcf91f6cbbc610cbbeedc85313d37a02df0c93527f7ea5f8db717f83855116604051908152878c8201526060604082015280610606606082018861203f565b0390a1019161061583856120f1565b9050610679575b5050505061066d929161066561064e6101ce933390919060405192600284526020840152604083015260608201604052565b906040519160018352602083015260408201604052565b923691611ddb565b82808080808080610584565b6106866104ad84866120f1565b61068f81614718565b156107025750937fd46c2c56b35c8210e9e712ec3f02242d5fc90187c0ac8ed80cc33626846ec3698961066d9897956106f56106d86106659761064e976101ce9b5116936120f1565b866040519586958652850152606060408501526060840191611d36565b0390a1938395965061061c565b89610725604051928392630c89984b60e31b8452600484015260248301906118dc565b0390fd5b60405163540e5f0b60e01b8152600490fd5b604051636c44ef8f60e01b8152600490fd5b604051633c8270bd60e21b8152600490fd5b604051632cff108b60e21b8152600490fd5b3461015f5760031960203682011261015f5767ffffffffffffffff6004351161015f5760c0906004353603011261015f576107aa6126cc565b5f80806107bf60048035608481019101611e8d565b90501561104d5760246004350135926107d784612773565b1561103b576060806040516107eb81611968565b6107f3611ee2565b81525f60208201525f6040820152015261080b611ee2565b5061086b61086661084561083b61083561082f608460043501600435600401611e8d565b90611f14565b80611f2f565b6040810190611f44565b602061085e61082f608460043501600435600401611e8d565b013591611f7a565b611d22565b936001600160a01b036108ba6108666108a161089761083561082f608460043501600435600401611e8d565b6060810190611f44565b604061085e61082f608460043501600435600401611e8d565b81604051976108c889611930565b16875216602086015260408501526108ea608460043501600435600401611e8d565b9490506001604051950160051b85016040525f905f5b610914608460043501600435600401611e8d565b9050811080611028575b15610e7557610937608460043501600435600401611e8d565b821015610e61578160051b810135607e198236030181121561015f57608081830136031261015f576040519161096c83611968565b8181013567ffffffffffffffff811161015f5761098e90369084840101611b61565b835280820160208181013590850152604080820135908501526060013567ffffffffffffffff811161015f576109c79236920101611d07565b606082015280516001600160a01b036109e96040830151602085015190611fd7565b5151166001600160a01b0385511614801590610e2d575b610e1b57610a1860208301516040840151908361305d565b610a218161270e565b91825f525f60205260405f2054155f14610a85575051604080513381526001600160a01b039092166020830152810191909152600191907fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f390606090a15b01610900565b9190610ab6602084979597015160408501519060608601519060405192610aab846119b4565b5f8452339186613092565b925f93610ace60608201516044600435013590612796565b15610b3557505051604080513381526001600160a01b03909216602083015281019190915260019291907fe3151dc8cb7a54ffc4baabd28c1f241c94d510b5e5b502491ac3cad6c16316d590606090a15b8115610b2d575b5092610a7f565b905088610b26565b610b426040820151612773565b158015610e08575b15610b9f57505051604080513381526001600160a01b03909216602083015281019190915260019291907f500b713857325f9e6dcb52ae832eca9109d107ed1aae9cb4928b4c1e13f051aa90606090a1610b1f565b9250925050600196959691610bb8606460043501611feb565b15610d755796610c2897610c3860408401516040880151610bd98183613401565b15610d6d5750925b610c32848592610c1b610c1560608a01516001600160e01b03601b918660e01d92828816810b928260e01d9216900b613dd1565b90613f8c565b9d8e9260408d01516134cc565b60408c01526134f6565b996134f6565b98610c438484613520565b610c4d848261357e565b60405192338452608060208501526060610c73845160808088015261010087019061203f565b93602081015160a0870152604081015160c0870152015192607f198582030160e0860152835180825260208201906020808260051b8501019601925f5b828110610d0f57505050505092806001979695937f194f1feb3b4d7076a2c272e774e792e0c48bb8c7aa1a9a3671c1cd6da9e6b4c193610d0a96604084015260608301520390a180858c5101808d5260051b8c0152613690565b610b1f565b9091929396602080610d60600193601f198782030189528b51906001600160a01b0382511681526040610d4f8584015160608785015260608401906120be565b9201519060408184039101526118dc565b9901950193929101610cb0565b905092610be1565b610c2890610c386060840151610c32610db3610c1560408801516001600160e01b0394601b90868360e01d9316820b91878260e01d9216900b613dd1565b60408a0151610dc28183613401565b15610e005750915b829c8d916060890151908116155f14610df1575060408801515b96879460408d01516134cc565b610dfb9085613428565b610de4565b905091610dca565b50610e1660608201516133de565b610b4a565b60405163936bb5ad60e01b8152600490fd5b506001600160a01b03610e496060830151604085015190611fd7565b5151166001600160a01b036020860151161415610a00565b634e487b7160e01b5f52603260045260245ffd5b50919390610e87606460043501611feb565b1561102257835b6004356004013590610ea08282613401565b6110045750508490610ec0856001600160a01b0360208701511633612ff4565b505060a46004350190610ed8826004356004016120f1565b905015159081610ffc575b50610f5b575b506001600160a01b03610eff92935116336127bd565b50505b8351811015610f275780610f21610f1b60019387611fd7565b51613869565b01610f02565b5060409160017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005582519182526020820152f35b90506001600160a01b03602084015116610f856001600160a01b03855116926004356004016120f1565b929091333b1561015f57610fcd5f93604051958694859463691f9ed760e01b8652600486015260248501528960448501528a606485015260a0608485015260a4840191611d36565b038183335af190811561016b57859115610ee9579050610fed9150611984565b5f836001600160a01b03610ee9565b905088610ee3565b604492506040519163573b6f4160e01b835260048301526024820152fd5b84610e8e565b506110366040830151612773565b61091e565b60405163315f9e2360e21b8152600490fd5b604051639c95219f60e01b8152600490fd5b3461015f5760208060031936011261015f576024816001600160a01b03611084611850565b16604051928380926370a0823160e01b82523060048301525afa90811561016b575f916110b5575b50604051908152f35b90508181813d83116110db575b6110cc81836119d0565b8101031261015f5751826110ac565b503d6110c2565b3461015f576110f036611890565b92916110fd9491946126cc565b61110883833361273f565b61111181612773565b15611235578160ff91611129856111ec969533612d27565b6111338183613401565b1561122f575080935b61114885828533612f96565b917f8045c25080b0868951141ed0a91720bcad09a8364a2b3109ee1fd49c1f0bc8b860c0611177898833612ff4565b97906001600160a01b0360405192338452169a8b6020840152856040840152886060840152608083015260a0820152a16040519660068852602088015260408701526060860152608085015260a08401521660c082015260e08101604052906040519160018352602083015260408201604052565b90806112185760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b611227926101ce913691611ddb565b8080806101d4565b9361113c565b50604051623a3a4d60e21b81523360048201526001600160a01b039190911660248201526044810191909152606490fd5b3461015f57608036600319011261015f576004356001600160a01b039081811680910361015f57611295611866565b6044359167ffffffffffffffff9160643583811161015f573660238201121561015f57806004013593841161015f57366024858301011161015f576113229560209216936112e4868587612eb7565b60405196879283926323e30c8b60e01b84523360048501528760248501528860448501525f606485015260a06084850152602460a485019201611d36565b03815f855af193841561016b575f9461138e575b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd984036113755761136a93503091612f30565b602060405160018152f35b604051630b6c58a960e31b815260048101859052602490fd5b9093506020813d6020116113ba575b816113aa602093836119d0565b8101031261015f57519284611336565b3d915061139d565b3461015f57606036600319011261015f5760206113f16113e0611850565b6113e8611866565b60443591612d27565b604051908152f35b3461015f5761140736611890565b928094926114136126cc565b61141e82853361273f565b61142781612773565b15611513578061143b61148a9286336127bd565b9790957f7f9dfa19cf1cc2f806f2f860fbc9c056b601fb1afc0e9b843dfe5c63616268e660806040513381526001600160a01b038416998a60208301528560408301526060820152a133612863565b939091856114b85760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b611507966101ce956106659460ff93604051956005875260208701526040860152606085015260808401521660a082015260c08101604052906040519160018352602083015260408201604052565b808080808080806101d4565b506040516306dde9c360e41b81523360048201526001600160a01b03841660248201526044810191909152606490fd5b3461015f57602036600319011261015f576004355f525f6020526020600160405f205414604051908152f35b3461015f5760031960403682011261015f5767ffffffffffffffff9060043582811161015f57806004019160a08236039182011261015f5760243584811161015f576115bf90369060040161181f565b90936115c96126cc565b5f946001600160a01b0394856115de84611d22565b1633036117aa576115f76115f23685611b61565b61270e565b805f525f60205260405f2096600188541461163e575b60208960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556040519015158152f35b9091929394959697505f6001985560405196338852826020890152606060408901528161166a8761187c565b1660608901526024840135906062190181121561015f5783019060a06080890152806116986004840161187c565b166101008901526116ab6024830161187c565b1661012088015260448101356022198236030181121561015f57019060246004830135920198821161015f57813603891361015f577f09d18501db0080ca2d6cd7c17fa7255daff4b2d503ea93b76ff68b6752ea8e6387806106659560846117736101ce9a60209f6117329061179d9f9a606061014061064e9d0152610160880191611d36565b6117646117596117456044880185611d56565b605f198a8603810160a08c01529491611d8b565b926064870190611d56565b918784030160c0880152611d8b565b91013560e08301520390a13390919060405192600284526020840152604083015260608201604052565b828080808080808061160d565b6024866117b685611d22565b6040516335252be360e01b815291166004820152fd5b3461015f57602036600319011261015f576004359063ffffffff60e01b821680920361015f5760209163e414309160e01b811490811561180e575b5015158152f35b6301ffc9a760e01b14905083611807565b9181601f8401121561015f5782359167ffffffffffffffff831161015f576020808501948460051b01011161015f57565b600435906001600160a01b038216820361015f57565b602435906001600160a01b038216820361015f57565b35906001600160a01b038216820361015f57565b90608060031983011261015f576004356001600160a01b038116810361015f579160243591604435916064359067ffffffffffffffff821161015f576118d89160040161181f565b9091565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b60a0810190811067ffffffffffffffff82111761191c57604052565b634e487b7160e01b5f52604160045260245ffd5b6060810190811067ffffffffffffffff82111761191c57604052565b6040810190811067ffffffffffffffff82111761191c57604052565b6080810190811067ffffffffffffffff82111761191c57604052565b67ffffffffffffffff811161191c57604052565b60e0810190811067ffffffffffffffff82111761191c57604052565b6020810190811067ffffffffffffffff82111761191c57604052565b90601f8019910116810190811067ffffffffffffffff82111761191c57604052565b92919267ffffffffffffffff821161191c5760405191611a1c601f8201601f1916602001846119d0565b82948184528183011161015f578281602093845f960137010152565b9080601f8301121561015f57816020611a53933591016119f2565b90565b919060608382031261015f5760405190611a6f82611930565b8193611a7a8161187c565b8352611a886020820161187c565b602084015260408101359167ffffffffffffffff831161015f57604092611aaf9201611a38565b910152565b67ffffffffffffffff811161191c5760051b60200190565b929192611ad882611ab4565b604092611ae860405192836119d0565b819581835260208093019160061b84019381851161015f57915b848310611b1157505050505050565b858383031261015f578386918251611b288161194c565b611b318661187c565b81528286013583820152815201920191611b02565b9080601f8301121561015f57816020611a5393359101611acc565b91909160a08184031261015f5760405190611b7b82611900565b8193611b868261187c565b835267ffffffffffffffff91602081013583811161015f5782611baa918301611a56565b6020850152604081013583811161015f5782611bc7918301611b46565b6040850152606081013592831161015f57611be86080939284938301611b46565b60608501520135910152565b909291611c0084611ab4565b916040611c1060405194856119d0565b839580855260208095019160059160051b84019480861161015f5784935b868510611c3f575050505050505050565b67ffffffffffffffff90853582811161015f5787019060608285031261015f578451611c6a81611930565b611c738361187c565b81528a83013584811161015f57830185601f8201121561015f57803590611c9982611ab4565b91611ca6895193846119d0565b8083528d808401918b1b8301019188831161015f578e809101915b838310611cf757509150508201528583013593841161015f57611ce8858c95869501611a38565b86820152815201940193611c2e565b82358152918101918f9101611cc1565b9080601f8301121561015f57816020611a5393359101611bf4565b356001600160a01b038116810361015f5790565b908060209392818452848401375f828201840152601f01601f1916010190565b9035601e198236030181121561015f57016020813591019167ffffffffffffffff821161015f578160061b3603831361015f57565b9190808252602080920192915f905b828210611da8575050505090565b909192936001906001600160a01b03611dc08761187c565b16815285830135838201526040908101950193920190611d9a565b90929192611de881611ab4565b91604091611df960405194856119d0565b839581855260208095019160051b83019381851161015f5783925b858410611e245750505050505050565b67ffffffffffffffff90843582811161015f57860190838286031261015f578351611e4e8161194c565b823584811161015f5786611e63918501611a56565b81528983013593841161015f57611e7e868b95869501611d07565b83820152815201930192611e14565b903590601e198136030182121561015f570180359067ffffffffffffffff821161015f57602001918160051b3603831361015f57565b60405190611ed082611930565b60606040835f81525f60208201520152565b60405190611eef82611900565b5f608083828152611efe611ec3565b6020820152606060408201526060808201520152565b9015610e6157803590607e198136030182121561015f570190565b903590609e198136030182121561015f570190565b903590601e198136030182121561015f570180359067ffffffffffffffff821161015f57602001918160061b3603831361015f57565b9190811015610e615760061b0190565b805115610e615760200190565b805160011015610e615760400190565b805160021015610e615760600190565b805160031015610e615760800190565b805160041015610e615760a00190565b8051821015610e615760209160051b010190565b35801515810361015f5790565b9081518082526020808093019301915f5b828110612017575050505090565b835180516001600160a01b031686528201518583015260409094019392810192600101612009565b906080806120b56120a361209160406001600160a01b0380895116885260208901519060a060208a01528082511660a08a015260208201511660c08901520151606060e08801526101008701906118dc565b60408701518682036040880152611ff8565b60608601518582036060870152611ff8565b93015191015290565b9081518082526020808093019301915f5b8281106120dd575050505090565b8351855293810193928101926001016120cf565b903590601e198136030182121561015f570180359067ffffffffffffffff821161015f5760200191813603831361015f57565b903590605e198136030182121561015f570190565b6121506115f26121498380611f2f565b3690611b61565b5f525f602052600160405f2054036121ec5780612170816121dc93611f2f565b6121d461218f6121946020850135938460408701359384923690611b61565b61305d565b6121ac6121a18580611f2f565b946060810190611e8d565b92906121cc604051966121be886119b4565b5f88525f3681373690611b61565b933691611bf4565b923392613092565b6040810151606090910151600192565b505f905f905f90565b5f5b82811061220357505050565b6060828201526020016121f7565b92916001600160a01b038451166001600160a01b03835116146126ba576001600160a01b03612247606086015160643590611fd7565b515116906040830151916001600160a01b036122666084358095611fd7565b5151161480159061267a575b610e1b576040850151906001600160a01b036122916044358094611fd7565b5151166001600160a01b036122ac60643560608a0151611fd7565b51511614612668576122bd8661270e565b805f525f60205260405f20541561261557506122d88461270e565b805f525f60205260405f2054156125c157506123bb9291612395917f6fa7f4c28634b0a9d6831401c45ae468195fb63aed07308935c35374ff5d9e396040518061234061233261012033845280602085015283018d61203f565b82810360408401528a61203f565b85606083015260643560808301528760a083015260a43560c083015260c43560e083015260e4356101008301520390a16001600160a01b0386511660405192612388846119b4565b5f8452606435908a613092565b936001600160a01b03865116604051926123ae846119b4565b5f845260a4359086613092565b916123c96040820151612773565b1580156125ad575b801561259a575b8015612587575b61257557604051916123f083611968565b5f83525f60208401525f60408401525f606084015261240f848361473c565b84526040840152612435612423838661473c565b602086015280606086015284516134cc565b9461244960208501516040860151906134cc565b93612453876133de565b8015612566575b6125545761251b61254d957fd9fa84dd790c969daa5c33d8050dc06b4a9b59d5b42e2be5f5e8ae20447f618d946124fd6125529a60a09661249c8a8851613520565b6124aa8c6020890151613520565b6124b88a604089015161357e565b6124c68c606089015161357e565b6124cf8a613869565b6124d88c613869565b6001600160a01b036124f460c435926060606435910151611fd7565b51511633612863565b50506001600160a01b036124f460e43592606060a435910151611fd7565b5050606060405191338352805160208401526020810151604084015260408101518284015201516080820152a1613690565b613690565b565b604051630d86822160e01b8152600490fd5b50612570856133de565b61245a565b6040516321badf1f60e01b8152600490fd5b5061259560608401516133de565b6123df565b506125a860608201516133de565b6123d8565b506125bb6040840151612773565b156123d1565b9351604080513381526001600160a01b039092166020830152810194909452507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f3945091925082915050606081015b0390a1565b9551604080513381526001600160a01b039092166020830152810196909652507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f394935083925050606082019050612610565b604051631cd2f1c760e21b8152600490fd5b506001600160a01b03612694606085015160a43590611fd7565b5151166001600160a01b036126b0604088015160443590611fd7565b5151161415612272565b604051630a98f1f360e21b8152600490fd5b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0060028154146126fc5760029055565b604051633ee5aeb560e01b8152600490fd5b6040516127398161272b602082019460208652604083019061203f565b03601f1981018352826119d0565b51902090565b90911561274a575050565b6040516305dbdfd960e41b81526001600160a01b03918216600482015291166024820152604490fd5b612792905f60e01d906001600160e01b038160e01d9116601b0b61479f565b1290565b90612792916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614820565b9291926127c982613a64565b936127d3816133de565b6128515784816001600160e01b036127f29360e01d9116601b0b61489f565b9290809315612828575b5082908161280c575b5050509190565b612820926001600160a01b03309216612f30565b5f8181612805565b9092505f19811461283d57600101915f6127fc565b634e487b7160e01b5f52601160045260245ffd5b604051632eaefac360e21b8152600490fd5b93929193612870836133de565b61290e578461288c57612884939450612ff4565b50505f905f90565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f5281526128c9835f205494856134f6565b956128d3876133de565b6128f6575f97885260018252838820908852815282872091875252909320829055565b835163c5e12af560e01b815260048101889052602490fd5b60405163793a8f5560e01b815260048101849052602490fd5b919060408382031261015f57825167ffffffffffffffff9081811161015f5784019082601f8301121561015f57815160209261296282611ab4565b9161297060405193846119d0565b808352848084019160051b8301019186831161015f5785809101915b8383106129ff5750505050948281015191821161015f57019180601f8401121561015f5782516129bb81611ab4565b936129c960405195866119d0565b818552838086019260051b82010192831161015f578301905b8282106129f0575050505090565b815181529083019083016129e2565b825181529181019186910161298c565b90808251908181526020809101926020808460051b8301019501935f915b848310612a3d5750505050505090565b9091929394958480612a5b600193601f198682030187528a516120be565b9801930193019194939290612a2d565b91906020928381526001600160a01b0382511684820152838201516040820152612aa5604083015160e060608401526101008301906118dc565b9060608301516080820152612acc608084015192601f1993848483030160a0850152612a0f565b9260a081015193838382030160c08401528680865192838152019501905f5b818110612b0f57505050611a5394955060c060e091015192828503019101526120be565b825187529588019591880191600101612aeb565b90604082019082526020606081936040838201528551809452019301915f5b828110612b50575050505090565b835185529381019392810192600101612b42565b919091335f526020308152604091825f2091835195612b828761194c565b612b8a611ec3565b875260608281980152845190612b9f826119b4565b5f8252855190612bae826119b4565b5f82525f3681375f5b8151811015612d1b57898688612bcd8486611fd7565b51888151948d80870151908151612bef575b5050505050505050600101612bb7565b905f92916001600160a01b0396612c148887818d51169c015116998789015190613b43565b95825199612c218b611998565b8a5289015287015285015260808401528760a08401528660c08401525f8c51809563d04dfe2360e01b82528180612c5c600498898301612a6b565b03915afa938415612d11579089915f95612ceb575b508451612c87575b50899250808e8c938e612bdf565b5101511691823b1561015f57612cb5925f92838d5180968195829463012c676d60e21b845233908401612b23565b03925af18015612ce1579060019291612cd2575b81928782612c79565b612cdb90611984565b5f612cc9565b89513d5f823e3d90fd5b612d089195503d805f833e612d0081836119d0565b810190612927565b9050935f612c71565b8c513d5f823e3d90fd5b50505050505050509050565b8215612d5c576001600160a01b038091165f52600160205260405f2091165f5260205260405f20905f5260205260405f205490565b909150612d6882613d75565b6001600160a01b03809316906040918251946370a0823160e01b86528416938460048701526020928387602481865afa968715612e7e575f97612e88575b5083612dbf612db883612def9a614a54565b50906141df565b508651636eb1769f60e11b81526001600160a01b0390941660048501523060248501529297889081906044820190565b0381865afa968715612e7e575f97612e4d575b50612db8612e1391611a5398614a54565b50612e1e8183613401565b15612e455750935b5f5260018252825f20905f528152815f20905f8052525f2054906134f6565b905093612e26565b96508387813d8311612e77575b612e6481836119d0565b8101031261015f57955195612db8612e02565b503d612e5a565b85513d5f823e3d90fd5b96508387813d8311612eb0575b612e9f81836119d0565b8101031261015f5795519583612da6565b503d612e95565b6040519263a9059cbb60e01b5f526001600160a01b0380931660045260245260205f60448180855af160015f5114811615612f11575b8360405215612efb57505050565b635274afe760e01b835216600482015260249150fd5b6001811516612f2757813b15153d151616612eed565b833d5f823e3d90fd5b9092604051936323b872dd60e01b5f526001600160a01b0393848092166004521660245260445260205f60648180855af160015f5114811615612f80575b836040525f60605215612efb57505050565b6001811516612f2757813b15153d151616612f6e565b93929193612fa3836133de565b61290e5784612fb7576128849394506127bd565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f5281526128c9835f205494856134cc565b9092919261300181613a64565b9361300b816133de565b61304b5784816001600160e01b0361302a9360e01d9116601b0b61489f565b50809281613039575050509190565b6001600160a01b036128209316612eb7565b604051632d1671a360e11b8152600490fd5b9161308890606061307d936001600160a01b039485916040880151611fd7565b515116940151611fd7565b5151161461266857565b94919392909260408051916130a683611998565b6130ae611ee2565b83526020925f848201525f838201526060945f868301528560c06080938260808201525f60a082015201528351916130e583611900565b600483525f5b8181106133cf5750506132d8959493925f9261320f61325f938d61310e8161270e565b9c896001600160a01b039e8f94859182865116908d5194600386528501528c840152168c820152608081018a5261314486611f8a565b5261314e85611f8a565b50885161315a81611930565b6002815289368c83013761316d86611f97565b5261317785611f97565b5060ff8a6131da8b8501936131c48761319d81613195858a51611fd7565b515116613d75565b975116886131ac848951611fd7565b515116856131bb858a51611fd7565b51015191612d27565b966131d0828751611fd7565b5151169451611fd7565b51015192169093929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b61321882611fa7565b5261322281611fa7565b506132468a8d8d60ff8a6131da8d8501936131c48761319d81613195858a51611fd7565b61324f82611fb7565b5261325981611fb7565b50613b43565b95878a511697848b0191825191868184511693015116928a85523087528580862091510151865191613290836119b4565b86835287519561329f87611998565b86528886015286850152848885015289608085015260a084015260c08301528351808098819463d04dfe2360e01b835260048301612a6b565b03915afa9687156133c5575f945f986133a3575b5084516002811061338c5750818386015195015161331261330c88611fc7565b51611fb7565b5161331d8183613401565b156133845750925b6133478685919060405192600284526020840152604083015260608201604052565b61335088611fa7565b5261335a87611fa7565b508251996133678b611998565b8a52890152870152850152608084015260a083015260c082015290565b905092613325565b602490835190630fbb8e5560e21b82526004820152fd5b9097506133bb9194503d805f833e612d0081836119d0565b939093965f6132ec565b50513d5f823e3d90fd5b808888809387010152016130eb565b6133fd905f60e01d906001600160e01b038160e01d9116601b0b61479f565b1390565b906133fd916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614820565b61344f6001600160e01b0392838316601b0b9260e01d938160e01d9116601b0b8484613f96565b90637ffffff5821361349f575b90613466916141df565b9290921580613497575b61347957505090565b6044925060405191638eba4d0760e01b835260048301526024820152fd5b508215613470565b6134a98282614e7f565b1561345c57604483856040519163d556b11160e01b835260048301526024820152fd5b611a5391610c15916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6143e5565b611a5391610c15916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6145a9565b61357a91608081018261353c6135368351611fc7565b51611fc7565b5261357361356d6001600160a01b0380945151169361356461355e8551611fc7565b51611f8a565b51169251611fc7565b51611fa7565b5191612f96565b5050565b906080810191806135926135368551611fb7565b526001600160a01b038092515116916135ae61355e8551611fb7565b51166135bd61356d8551611fb7565b519081613658576135cd836133de565b61290e579183917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a9593612610955f5260209060018252613623604094855f20835f528452855f20855f528452855f20546134f6565b945f5260018252835f20905f528152825f20915f52525f20555b51604051918291338352604060208401526040830190612a0f565b91613689917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a959361261095612863565b505061363d565b60c0810151908151915f92613804575b506137456020918281510151926001600160a01b039081818187511696015116928660a082019485518252308452604097888320898686510151015160808601518b51916136ed836119b4565b8683528c51936136fc856119b4565b8785528d519661370b88611998565b8752898701528c86015260016060860152608085015260a084015260c08301528851808099819463d04dfe2360e01b835260048301612a6b565b03915afa9485156137fa5787956137dc575b508451613768575b50505050505050565b81905101510151169051813b156137d85791849184938361379d965180978195829463012c676d60e21b845260048401612b23565b03925af19081156137cf57506137b8575b808080808061375f565b6137c28291611984565b6137cc57806137ae565b80fd5b513d84823e3d90fd5b8480fd5b6137f19195503d8089833e612d0081836119d0565b9050935f613757565b86513d89823e3d90fd5b6001600160a01b03602080845101510151169060a083015190823b1561015f57613847925f928360405180968195829463012c676d60e21b845260048401612b23565b03925af1801561016b57156136a057613861919250611984565b5f905f6136a0565b6080810161387a61356d8251611fb7565b5191821561388757505050565b6138a161355e6001600160a01b0380935151169351611fb7565b5116815f5260209160018352604092835f20835f528152835f20855f528152835f2054936001600160e01b0385166138dc575b505050505050565b613900955f9284845260018152828420868552815282842091845252812055612ff4565b5f8080806138d4565b8115613913570490565b634e487b7160e01b5f52601260045260245ffd5b604081511061396f576020810151908051603f19810190811161283d5760051c821161395b5760016020920160051b010190565b5050604051613969816119b4565b5f815290565b50604051613969816119b4565b80511561398c57602001515f1a90565b505f90565b905f8091602081519101845af48080613a0f575b156139c55750506040513d81523d5f602083013e60203d82010160405290565b156139ec57604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b3d156139fd576040513d5f823e3d90fd5b60405163d6bda27560e01b8152600490fd5b503d1515806139a55750813b15156139a5565b60041115613a2c57565b634e487b7160e01b5f52602160045260245ffd5b602090939291936001600160a01b036040820195168152613a6083613a22565b0152565b613a6c614f6d565b6040805163b7bad1b160e01b81526001600160a01b0383166004820152909182826024815f73200e12d10bb0c5e4a17e7018f0f1161919bb93895af1928315613b3a575f925f94613b05575b50613ac283613a22565b600183141580613af3575b613ad75750505090565b5163ee07877f60e01b8152918291610725919060048401613a40565b50613afd83613a22565b821515613acd565b90809450613b299293503d8511613b33575b613b2181836119d0565b810190614875565b919091925f613ab8565b503d613b17565b513d5f823e3d90fd5b90805191613b5083611ab4565b91613b6b604094613b63865195866119d0565b808552611ab4565b601f199460209186013686840137835183519095908015613d6a576001613bc19101965b6001978891010197613bb8613ba38a611ab4565b99613bb086519b8c6119d0565b808b52611ab4565b018489016121f5565b85805f9684516002815233878201523086820152606081018652613be48b611f8a565b52613bee8a611f8a565b505f925b613d26575b5050508351613c0a575b50505050505090565b85809598979692980181613c1e8289611fd7565b52613c298188611fd7565b505f925b613c3c575b5085969750613c01565b8451831015613d21576001600160a01b03613cb381613c5b8689611fd7565b51511686613c69878a611fd7565b51015187815160051b9101207f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f52601c52603c5f208c613caa888b611fd7565b510151916149cb565b15613d0957868098999a928192613cca878a611fd7565b515116613cd78787611fd7565b52019385613ce58289611fd7565b510151613cf2868c611fd7565b52613cfd858b611fd7565b50019290989796613c2d565b8951630a57f30960e31b815260048101859052602490fd5b613c32565b9091968151881015613d61578280910197613d418184611fd7565b51613d4c8a8d611fd7565b52613d57898c611fd7565b5001919081613bf2565b96829150613bf7565b50613bc15f96613b8f565b613d7d614f6d565b60408051630782d7e160e01b81526001600160a01b03831660048201529091828260248173200e12d10bb0c5e4a17e7018f0f1161919bb93895afa928315613b3a575f925f94613b055750613ac283613a22565b9091939284158215175f14613deb5750505090505f905f90565b82810192600160fd1b8082019083011760fe1c613f22575b5050613e0e81614b44565b93613e1881614b44565b94613e238682614b64565b90918215613f13575f9083986f0785ee10d5da46d900f436a000000000808611613f05575b50670de0b6b3a7640000808b11613ef6575b50633b9aca00808b11613ee7575b50612710808b11613ed9575b5098805b613ec8575081906118d8989982600a0a9109960195817fcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccd0a93838211900382610100031b9203901c170291614b77565b60019290920191600a900480613e78565b60049a04998a930192613e74565b600991939a049901915f613e68565b601291939a049901915f613e5a565b85049950602592505f613e48565b509290506118d8949550614b77565b5f821215613f7657808413613f68575b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb2841315613e03579092506118d8939491614a82565b9092506118d8939491614ae9565b80841215613f32579092506118d8939491614a82565b61346682826141df565b92909180613fbc576044848460405191637a97930f60e01b835260048301526024820152fd5b90919280155f14613fd157505050505f905f90565b613fea93613fde91614c31565b92919490938492614c31565b9093919284613ff888614b44565b9161400286614b44565b947f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000094604c918688106141a9575b030191600160ff1b98838a018112155f14614176575050035b5f955f82128061416d575b61414f575b5f81128061413d575b61411f5786820103966001600160ff1b0388149081614115575b508061410c575b80614103575b6140e55750906140999291614ddd565b915f81136140ac575b506118d893614b77565b9091604c82136140da576140c391600a0a90613909565b9081156140d0575f6140a2565b505050505f905f90565b50505050505f905f90565b876044916040519163d556b11160e01b835260048301526024820152fd5b505f8512614089565b50828414614083565b905088145f61407c565b604489836040519163d556b11160e01b835260048301526024820152fd5b50806001600160ff1b03018213614062565b95508087018613156141675786818703015b95614059565b5f614161565b505f8113614054565b89985090920390506001600160ff1b038190038701821361419a5701860194614049565b5050505050505050505f905f90565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009650604b9250614030565b8115613913570590565b8082601b82810b83146143d4577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000008405614380575b8380820b0361436f57507b199999999999999999999999999999999999999999999999999999987b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc84011115614320575b838060030b036142a4575b8084136142885750506001600160e01b036001925b60e01b91161791565b8303600a0a8015613913576001600160e01b039107159261427f565b92915f8413156142f45750906142ba8383614e7f565b6142d657637ffffffe1901600a0a810290637fffffff9261426a565b506044916040519163d556b11160e01b835260048301526024820152fd5b637fffffff1992830390604382136140da5761431391600a0a906141d5565b9182156140d0579261426a565b5f198401808060030b14614334575061425f565b90506001600160e01b039293507b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff915060e01b9260ff1d181617905f90565b600190940193600a90930592614212565b937f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000008405156143c1576305f5e100600894058094819201955b915050614212565b620186a0600594058094819201956143b9565b508261425f57505050505f90600190565b919291600160ff1b84016143fd576118d89350614e98565b906118d8935f03916145a9565b919291600160ff1b919080158061459757509061442691614c31565b9490929091905f86858585828213801561458e575b614571575b505050508682841860ff1c94860391039081604c0381116145565701600a0a80820591908461453c575b505081019182821860ff1c111561453457826001600160ff1b031461451657905f600192135f146144e757600a9004915b01925b811581176144ab57509190565b806144c4575b5080156144bc579190565b505f91508190565b91926144da9203600160ff1b01600a0a906141d5565b600160ff1b91905f6144b1565b600a60037fe666666666666666666666666666666666666666666666666666666666666667920104019161449b565b604490836040519163d556b11160e01b835260048301526024820152fd5b50909261449e565b8107614549575b8061446a565b60ff1d600117015f614543565b505050919350614564579190565b60018160ff1d1790039190565b5f9a50909750909550600160ff1b94509250905086808080614440565b50835f1261443b565b156145a25750509190565b9350919050565b93929193841581158181176146fa575050906145c491614c31565b91949082956145d582958294614c31565b80969294919693878684821380156146f1575b6146d8575b5050505050508682841860ff1c94860391039081604c0381116145565701600a0a8082059190846146be575b505081019182821860ff1c11156146b657826001600160ff1b031461451657905f600192135f1461468757600a9004915b01925b8115811761465a57509190565b8061466a575080156144bc579190565b600160ff1b936146819291038401600a0a906141d5565b5f6144b1565b600a60037fe666666666666666666666666666666666666666666666666666666666666667920104019161464a565b50909261464d565b81076146cb575b80614619565b60ff1d600117015f6146c5565b929b5098509196509450925090505f80808080806145ed565b508584126145e8565b93959390929190156147105750506144bc579190565b945092915050565b600881511061398c576008015167ffffffffffffffff1667ff0a89c674ee78741490565b9160408301926040614776610c15606087519401938451906001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b613dd1565b94519301614785815186612796565b61478d575050565b909350611a5391925051925183613428565b92915f9060018184145f87128715171717614819575f9280821361480b575b03604c81135f8212176147ff57600a0a90846147dd83820293846141d5565b146147f2575050156147ee575f9190565b5f90565b9093509015611a53579190565b5050156147ee575f9190565b5f95600194509250906147be565b5050505f90565b93929190918083145f83125f8712188315871517171761486f575f928082136148625703604c81135f8212176147ff57600a0a90846147dd83820293846141d5565b91946001935091906147be565b50919050565b919082604091031261015f578151600481101561015f5760209092015160ff8116810361015f5790565b91925f8312156148c7576044838360405191634a7d166b60e01b835260048301526024820152fd5b9192836148d957505090505f90600190565b60ff81168201918083126149a1575f831215614911575050604c1981126144bc575f03600a0a9161490a8382613909565b9283021490565b909293915f81135f1461499757604d811361496c57600a0a92831561391357835f190483116149435750500290600190565b60405163c849483b60e01b815260048101849052602481019290925260ff166044820152606490fd5b5060405163c849483b60e01b81526004810192909252602482015260ff919091166044820152606490fd5b5050905090600190565b60405163c849483b60e01b815260048101869052602481019190915260ff82166044820152606490fd5b9091813b614a06576149dd9192614fd6565b506149e781613a22565b1591826149f357505090565b6001600160a01b03918216911614919050565b6020918160645f935160405192630b135d3f60e11b9788855260048501526040602485015286820190604485015e8281018201859052601f01601f191601915afa905f5114601f3d11161690565b9060ff165f03916001600160ff1b0382115f14614a7a57600a6001818404940192061590565b909190600190565b909392915f614a92918184613dd1565b9490945f8483019182019412159081614adf575b8115614ad5575b50614ab757505090565b604492506040519163d556b11160e01b835260048301526024820152fd5b905083125f614aad565b8281129150614aa6565b614afe93600160fe1b90810193920190613dd1565b9081815f821215614b35575050604b19821261288457614b23915f03600a0a906141d5565b9081614b2d575f90565b600160ff1b90565b93600160ff1b90910192509050565b5f811215611a5357600160ff1b90808203614b5d575090565b90505f0390565b905f198183099102908180821091030391565b92939291905f8184181215614c0c576001600160ff1b039283831115614bf657600160ff1b93838503614bac57505050509190565b90919293508514614bc6575050600a600191045f03920190565b604051630ed8062160e21b8152600481019190915260248101919091526044810182905260648101849052608490fd5b5090915050600160ff1b811461283d575f039190565b90916001600160ff1b0380841115612805578514614bc6575050600a60019104920190565b9190918015614dd357827f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000080830515614ce1575b507f19999999999999999999999999999999999999999999999999999999999999997f0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc830110614cd2575b8313614cbc5791905f90565b919060018060ff1b926001600160ff1b03030190565b9290600a02905f190192614cb0565b6f4b3b4ca85a86c47a098a22400000000080840515614dc1575b507728c87cb5c89a2571ebfdcb54864ada834a00000000000000830515614daa575b7b097edd871cfda3a5697758bf0e3cbb5ac5741c640000000000000000830515614d96575b7e3899162693736ac531a5a58f1fbb4b746504382ca7e4000000000000000000830515614d8657820515614d77575b5f614c65565b9290600a02905f190192614d71565b9391606402916001190193614d42565b93916402540be40002916009190193614d42565b9391678ac7230489e8000002916012190193614d1d565b6025198301955092909202915f614cfb565b505f915081908190565b90915f198383099280830292838086109503948086039584871015614e5b5714614e53579082910960018219018216809204600280826003021880830282030280830282030280830282030280830282030280830282030280920290030293600183805f03040190848311900302920304170290565b505091500490565b60648386866040519263362ced0960e11b8452600484015260248301526044820152fd5b611a5391905f811215614e93575f03615010565b615010565b909291600160ff1b91828101614f2a5750808414614f2057808413918215614f18578185035b604c811115614f075750505f915b15614ef857507f8000000000000000000000000000000000000000000000000000000000000001019190565b92506001600160ff1b03039190565b600a0a908115613913570491614ecc565b848203614ebe565b505090505f905f90565b93614f3792945f0361440a565b80939180928114614f4b575b50505f039190565b915092506001600160ff1b03831461451657600a600191059201915f80614f43565b73200e12d10bb0c5e4a17e7018f0f1161919bb9389803b158015614fab575b614f935750565b602490604051906373e6d7b360e01b82526004820152fd5b507f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d41813f1415614f8c565b815191906041830361500657614fff9250602082015190606060408401519301515f1a9061509f565b9192909190565b50505f9160029190565b90637ffffff581131561509957637ffffffe1981019060438213615092575f82121561506657637fffffff91505f0301600a0a7b8000000000000000000000000000000000000000000000000000000202111590565b50600a0a8015613913577b80000000000000000000000000000000000000000000000000000001041090565b5050151590565b50505f90565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411615116579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa1561016b575f516001600160a01b0381161561510c57905f905f90565b505f906001905f90565b5050505f91600391905600000000000000000000000000000000000000000000000000000000000000000000000000000000000000200e12d10bb0c5e4a17e7018f0f1161919bb93890000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000044b608060405234801561000f575f80fd5b506004361061004a575f3560e01c80630782d7e11461004e57806354636d2b14610078578063b7bad1b11461009d578063f5c36eaf146100b0575b5f80fd5b61006161005c366004610363565b6100c3565b60405161006f929190610403565b60405180910390f35b61008b610086366004610363565b6100d8565b60405160ff909116815260200161006f565b6100616100ab366004610363565b6100e9565b61008b6100be366004610363565b6100f5565b5f806100cf5f84610100565b91509150915091565b5f6100e35f836101f0565b92915050565b5f806100cf5f84610281565b5f6100e35f83610356565b73ffffffffffffffffffffffffffffffffffffffff81165f9081526020838152604080832081518083019092525460ff8082161515835261010090910416818301527f313ce56700000000000000000000000000000000000000000000000000000000808452839283908190816004818a5afa915060203d1015610182575f91505b811561019857505f5160ff811115610198575f91505b816101af57505050602001516003925090506101e9565b83516101c3575f955093506101e992505050565b836020015160ff1681146101d85760026101db565b60015b846020015195509550505050505b9250929050565b5f805f6101fd8585610281565b909250905060018260038111156102165761021661039d565b1415801561023557505f8260038111156102325761023261039d565b14155b156102795783826040517fee07877f000000000000000000000000000000000000000000000000000000008152600401610270929190610421565b60405180910390fd5b949350505050565b5f805f8061028f8686610100565b90925090505f8260038111156102a7576102a761039d565b0361034b576040805180820182526001815260ff838116602080840191825273ffffffffffffffffffffffffffffffffffffffff8a165f908152908b9052939093209151825493517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009094169015157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff161761010093909116929092029190911790555b909590945092505050565b5f805f6101fd8585610100565b5f60208284031215610373575f80fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114610396575f80fd5b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b600481106103ff577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b9052565b6040810161041182856103ca565b60ff831660208301529392505050565b73ffffffffffffffffffffffffffffffffffffffff831681526040810161039660208301846103ca560000000000000000000000000000000000000000000000000000000000000000006e2d0e71d900474b262e545bc4c98b71ab368d2100000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000003d486080604052600436106100d65760003560e01c80638456cb591161007f5780639a1f3406116100595780639a1f340614610200578063cd0fb7a714610220578063f2fde38b14610260578063fa461e331461028057600080fd5b80638456cb59146101ad5780638da5cb5b146101c257806393b3774c146101ed57600080fd5b80632c8958f6116100b05780632c8958f6146100f95780636b2ace871461013f578063715018a61461019857600080fd5b8063046f7da2146100e257806323a69e75146100f95780632646478b1461011957600080fd5b366100dd57005b600080fd5b3480156100ee57600080fd5b506100f76102a0565b005b34801561010557600080fd5b506100f7610114366004613579565b6103a8565b61012c6101273660046136f5565b6103ba565b6040519081526020015b60405180910390f35b34801561014b57600080fd5b506101737f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610136565b3480156101a457600080fd5b506100f7610564565b3480156101b957600080fd5b506100f7610578565b3480156101ce57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff16610173565b61012c6101fb36600461377c565b61067b565b34801561020c57600080fd5b506100f761021b36600461382f565b61089a565b34801561022c57600080fd5b5061025061023b366004613868565b60016020526000908152604090205460ff1681565b6040519015158152602001610136565b34801561026c57600080fd5b506100f761027b366004613868565b6108f8565b34801561028c57600080fd5b506100f761029b366004613579565b6109af565b60005473ffffffffffffffffffffffffffffffffffffffff163314806102d557503360009081526001602052604090205460ff165b610366576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f52503a2063616c6c6572206973206e6f7420746865206f776e6572206f72206160448201527f2070726976696c6567656420757365720000000000000000000000000000000060648201526084015b60405180910390fd5b600280547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff167501000000000000000000000000000000000000000000179055565b6103b4848484846109af565b50505050565b60025460009074010000000000000000000000000000000000000000900460ff16600114610444576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f526f75746550726f636573736f72206973206c6f636b65640000000000000000604482015260640161035d565b6002547501000000000000000000000000000000000000000000900460ff166001146104cc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f526f75746550726f636573736f72206973207061757365640000000000000000604482015260640161035d565b600280547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1674020000000000000000000000000000000000000000179055610519878787878787610b5d565b9050600280547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790559695505050505050565b61056c6111a3565b6105766000611224565b565b60005473ffffffffffffffffffffffffffffffffffffffff163314806105ad57503360009081526001602052604090205460ff165b610639576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f52503a2063616c6c6572206973206e6f7420746865206f776e6572206f72206160448201527f2070726976696c65676564207573657200000000000000000000000000000000606482015260840161035d565b600280547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff167502000000000000000000000000000000000000000000179055565b60025460009074010000000000000000000000000000000000000000900460ff16600114610705576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f526f75746550726f636573736f72206973206c6f636b65640000000000000000604482015260640161035d565b6002547501000000000000000000000000000000000000000000900460ff1660011461078d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f526f75746550726f636573736f72206973207061757365640000000000000000604482015260640161035d565b600280547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1674020000000000000000000000000000000000000000179055604051600090819073ffffffffffffffffffffffffffffffffffffffff8c16908b908381818185875af1925050503d8060008114610826576040519150601f19603f3d011682016040523d82523d6000602084013e61082b565b606091505b50915091508161083d57805181602001fd5b61084b898989898989610b5d565b92505050600280547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000017905598975050505050505050565b6108a26111a3565b73ffffffffffffffffffffffffffffffffffffffff91909116600090815260016020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b6109006111a3565b73ffffffffffffffffffffffffffffffffffffffff81166109a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161035d565b6109ac81611224565b50565b60025473ffffffffffffffffffffffffffffffffffffffff163314610a56576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f526f75746550726f636573736f722e756e697377617056335377617043616c6c60448201527f6261636b3a2063616c6c2066726f6d20756e6b6e6f776e20736f757263650000606482015260840161035d565b6000808513610a655783610a67565b845b905060008113610af9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f526f75746550726f636573736f722e756e697377617056335377617043616c6c60448201527f6261636b3a206e6f7420706f73697469766520616d6f756e7400000000000000606482015260840161035d565b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001660011790556000610b3283850185613868565b9050610b5573ffffffffffffffffffffffffffffffffffffffff82163384611299565b505050505050565b60008073ffffffffffffffffffffffffffffffffffffffff881673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14610c24576040517f70a0823100000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff8916906370a0823190602401602060405180830381865afa158015610bfb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c1f919061388c565b610c27565b60005b9050600073ffffffffffffffffffffffffffffffffffffffff871673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14610cf1576040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301528816906370a0823190602401602060405180830381865afa158015610cc8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cec919061388c565b610d0a565b8473ffffffffffffffffffffffffffffffffffffffff16315b905087600080610d2e87604080518082019091528181528151909101602082015290565b90505b805160208201511115610e84576000610d508280516001018051915290565b90508060ff1660011415610d7a576000610d6983611372565b905083610d74578094505b50610e73565b8060ff1660021415610d9557610d90828d611437565b610e73565b8060ff1660031415610dac576000610d6983611457565b8060ff1660041415610dc157610d908261147d565b8060ff1660051415610dd657610d90826114a3565b8060ff1660061415610dec57610d908d836115a8565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f526f75746550726f636573736f723a20556e6b6e6f776e20636f6d6d616e642060448201527f636f646500000000000000000000000000000000000000000000000000000000606482015260840161035d565b610e7c836138d4565b925050610d31565b506000905073ffffffffffffffffffffffffffffffffffffffff8b1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14610f4d576040517f70a0823100000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff8c16906370a0823190602401602060405180830381865afa158015610f24573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f48919061388c565b610f50565b60005b905083610f5d8b8361390d565b1015610feb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f526f75746550726f636573736f723a204d696e696d616c20696e70757420626160448201527f6c616e63652076696f6c6174696f6e0000000000000000000000000000000000606482015260840161035d565b600073ffffffffffffffffffffffffffffffffffffffff8a1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee146110b3576040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff89811660048301528b16906370a0823190602401602060405180830381865afa15801561108a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110ae919061388c565b6110cc565b8773ffffffffffffffffffffffffffffffffffffffff16315b90506110d8898561390d565b81101561111e576110e98482613925565b6040517f963b34a500000000000000000000000000000000000000000000000000000000815260040161035d91815260200190565b6111288482613925565b6040805173ffffffffffffffffffffffffffffffffffffffff8b81168252602082018790529181018c905260608101839052919750808c1691908e169033907f2db5ddd0b42bdbca0d69ea16f234a870a485854ae0d91f16643d6f317d8b89949060800160405180910390a450505050509695505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610576576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161035d565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905261136d9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915261163b565b505050565b6000806113858380516014018051915290565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290915073ffffffffffffffffffffffffffffffffffffffff8216906370a0823190602401602060405180830381865afa1580156113f2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611416919061388c565b91508115611425576001820391505b61143183308385611747565b50919050565b60006114498380516014018051915290565b905061136d83338385611747565b47611478823073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee84611747565b919050565b600061148f8280516014018051915290565b905061149f8260008360006117a2565b5050565b60006114b58280516014018051915290565b6040517ff7888aec00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff80831660048301523060248301529192506000917f0000000000000000000000000000000000000000000000000000000000000000169063f7888aec90604401602060405180830381865afa15801561154d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611571919061388c565b9050801561159c577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff015b61136d83308484611747565b60006115ba8280516020018051915290565b905060006115ce8380516020018051915290565b905060006115e28480516001018051915290565b905060006115f68580516020018051915290565b9050600061160a8680516020018051915290565b905061163273ffffffffffffffffffffffffffffffffffffffff8816333088888888886118d6565b50505050505050565b600061169d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16611b569092919063ffffffff16565b80519091501561136d57808060200190518101906116bb919061393c565b61136d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840161035d565b60006117598580516001018051915290565b905060005b8160ff16811015610b5557600061177b8780516002018051915290565b61ffff8082168602049485900394909150611798888888846117a2565b505060010161175e565b60006117b48580516001018051915290565b905060ff81166117cf576117ca85858585611b6d565b6118cf565b8060ff16600114156117e7576117ca85858585611f22565b8060ff16600214156117ff576117ca85858585612162565b8060ff1660031415611817576117ca85858585612410565b8060ff166004141561182f576117ca85858585612a98565b8060ff1660051415611847576117ca85858585612c26565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f526f75746550726f636573736f723a20556e6b6e6f776e20706f6f6c2074797060448201527f6500000000000000000000000000000000000000000000000000000000000000606482015260840161035d565b5050505050565b6040517f7ecebe0000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8881166004830152600091908a1690637ecebe0090602401602060405180830381865afa158015611946573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061196a919061388c565b6040517fd505accf00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a811660048301528981166024830152604482018990526064820188905260ff8716608483015260a4820186905260c48201859052919250908a169063d505accf9060e401600060405180830381600087803b158015611a0457600080fd5b505af1158015611a18573d6000803e3d6000fd5b50506040517f7ecebe0000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8b81166004830152600093508c169150637ecebe0090602401602060405180830381865afa158015611a8b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aaf919061388c565b9050611abc82600161390d565b8114611b4a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f5361666545524332303a207065726d697420646964206e6f742073756363656560448201527f6400000000000000000000000000000000000000000000000000000000000000606482015260840161035d565b50505050505050505050565b6060611b6584846000856131e1565b949350505050565b6000611b7f8580516014018051915290565b90506000611b938680516001018051915290565b90506000611ba78780516014018051915290565b90506000611bbb8880516003018051915290565b905073ffffffffffffffffffffffffffffffffffffffff8716301415611c0157611bfc73ffffffffffffffffffffffffffffffffffffffff87168587611299565b611c41565b73ffffffffffffffffffffffffffffffffffffffff8716331415611c4157611c4173ffffffffffffffffffffffffffffffffffffffff87163386886132fa565b6000808573ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015611c8f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cb39190613977565b506dffffffffffffffffffffffffffff1691506dffffffffffffffffffffffffffff169150600082118015611ce85750600081115b611d4e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f57726f6e6720706f6f6c20726573657276657300000000000000000000000000604482015260640161035d565b6000808660ff16600114611d63578284611d66565b83835b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8b8116600483015292945090925083918c16906370a0823190602401602060405180830381865afa158015611dda573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dfe919061388c565b611e089190613925565b98506000611e1986620f42406139c7565b611e289062ffffff168b6139eb565b9050600081611e3a85620f42406139eb565b611e44919061390d565b611e4e84846139eb565b611e589190613a28565b90506000808a60ff16600114611e7057826000611e74565b6000835b604080516000815260208101918290527f022c0d9f00000000000000000000000000000000000000000000000000000000909152919350915073ffffffffffffffffffffffffffffffffffffffff8d169063022c0d9f90611ede90859085908f9060248101613ad9565b600060405180830381600087803b158015611ef857600080fd5b505af1158015611f0c573d6000803e3d6000fd5b5050505050505050505050505050505050505050565b6000611f348580516014018051915290565b9050600080611f498780516001018051915290565b60ff161190506000611f618780516014018051915290565b905073ffffffffffffffffffffffffffffffffffffffff8616331415611fa357611fa373ffffffffffffffffffffffffffffffffffffffff86163330876132fa565b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff851690811790915563128acb088284878161201757612012600173fffd8963efd1fc6a506488495d951d5263988d26613b14565b612027565b6120276401000276a36001613b41565b6040805173ffffffffffffffffffffffffffffffffffffffff8d166020820152016040516020818303038152906040526040518663ffffffff1660e01b8152600401612077959493929190613b79565b60408051808303816000875af1158015612095573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120b99190613bc0565b505060025473ffffffffffffffffffffffffffffffffffffffff16600114611632576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f526f75746550726f636573736f722e73776170556e6956333a20756e6578706560448201527f6374656400000000000000000000000000000000000000000000000000000000606482015260840161035d565b60006121748580516001018051915290565b905060006121888680516014018051915290565b9050600180831614156122575760006121a78780516014018051915290565b905060028316612213578073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b1580156121f957600080fd5b505af115801561220d573d6000803e3d6000fd5b50505050505b73ffffffffffffffffffffffffffffffffffffffff821630146122515761225173ffffffffffffffffffffffffffffffffffffffff82168386611299565b50610b55565b600282166123205773ffffffffffffffffffffffffffffffffffffffff851633141561229f5761229f73ffffffffffffffffffffffffffffffffffffffff85163330866132fa565b6040517f2e1a7d4d0000000000000000000000000000000000000000000000000000000081526004810184905273ffffffffffffffffffffffffffffffffffffffff851690632e1a7d4d90602401600060405180830381600087803b15801561230757600080fd5b505af115801561231b573d6000803e3d6000fd5b505050505b60008173ffffffffffffffffffffffffffffffffffffffff168460405160006040518083038185875af1925050503d806000811461237a576040519150601f19603f3d011682016040523d82523d6000602084013e61237f565b606091505b5050905080611632576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f526f75746550726f636573736f722e777261704e61746976653a204e6174697660448201527f6520746f6b656e207472616e73666572206661696c6564000000000000000000606482015260840161035d565b60006124228580516001018051915290565b905060006124368680516014018051915290565b905060ff8216156128315773ffffffffffffffffffffffffffffffffffffffff85163014156124a5576124a073ffffffffffffffffffffffffffffffffffffffff85167f000000000000000000000000000000000000000000000000000000000000000085611299565b61275b565b73ffffffffffffffffffffffffffffffffffffffff8516331415612505576124a073ffffffffffffffffffffffffffffffffffffffff8516337f0000000000000000000000000000000000000000000000000000000000000000866132fa565b6040517f4ffe34db00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85811660048301527f00000000000000000000000000000000000000000000000000000000000000001690634ffe34db906024016040805180830381865afa158015612590573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125b49190613c04565b516040517fdf23b45b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301526fffffffffffffffffffffffffffffffff909216917f0000000000000000000000000000000000000000000000000000000000000000169063df23b45b90602401606060405180830381865afa158015612656573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061267a9190613c77565b60409081015190517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811660048301526fffffffffffffffffffffffffffffffff909216918716906370a0823190602401602060405180830381865afa158015612720573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612744919061388c565b61274e919061390d565b6127589190613925565b92505b6040517f02b9446c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85811660048301527f000000000000000000000000000000000000000000000000000000000000000081166024830181905290831660448301526064820185905260006084830152906302b9446c9060a40160408051808303816000875af1158015612806573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061282a9190613bc0565b5050610b55565b73ffffffffffffffffffffffffffffffffffffffff851615612908576040517ff18d03cc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85811660048301528681166024830152306044830152606482018590527f0000000000000000000000000000000000000000000000000000000000000000169063f18d03cc90608401600060405180830381600087803b1580156128eb57600080fd5b505af11580156128ff573d6000803e3d6000fd5b505050506129c1565b6040517ff7888aec00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85811660048301523060248301527f0000000000000000000000000000000000000000000000000000000000000000169063f7888aec90604401602060405180830381865afa15801561299a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129be919061388c565b92505b6040517f97da6d3000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152306024830152828116604483015260006064830152608482018590527f000000000000000000000000000000000000000000000000000000000000000016906397da6d309060a40160408051808303816000875af1158015612a6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a8e9190613bc0565b5050505050505050565b6000612aaa8580516014018051915290565b85516020808201805190920101875290915073ffffffffffffffffffffffffffffffffffffffff851615612b91576040517ff18d03cc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff858116600483015286811660248301528381166044830152606482018590527f0000000000000000000000000000000000000000000000000000000000000000169063f18d03cc90608401600060405180830381600087803b158015612b7857600080fd5b505af1158015612b8c573d6000803e3d6000fd5b505050505b6040517f627dd56a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83169063627dd56a90612be3908490600401613ce3565b6020604051808303816000875af1158015612c02573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611632919061388c565b6000612c388580516014018051915290565b90506000612c4c8680516001018051915290565b90506000612c608780516001018051915290565b60000b90506000612c778880516001018051915290565b60000b90506000612c8e8980516014018051915290565b90506000612ca28a80516014018051915290565b9050600073ffffffffffffffffffffffffffffffffffffffff891673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1415612d8b576040517f3df02124000000000000000000000000000000000000000000000000000000008152600f86810b600483015285900b6024820152604481018990526000606482015273ffffffffffffffffffffffffffffffffffffffff881690633df02124908a9060840160206040518083038185885af1158015612d5f573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612d84919061388c565b905061306e565b73ffffffffffffffffffffffffffffffffffffffff8a16331415612dcb57612dcb73ffffffffffffffffffffffffffffffffffffffff8a1633308b6132fa565b612dec73ffffffffffffffffffffffffffffffffffffffff8a16888a613358565b5060ff8616612e9f576040517f3df02124000000000000000000000000000000000000000000000000000000008152600f86810b600483015285900b6024820152604481018990526000606482015273ffffffffffffffffffffffffffffffffffffffff881690633df02124906084016020604051808303816000875af1158015612e7b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d84919061388c565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8416906370a0823190602401602060405180830381865afa158015612f0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f30919061388c565b6040517f3df02124000000000000000000000000000000000000000000000000000000008152600f88810b600483015287900b6024820152604481018b90526000606482015290915073ffffffffffffffffffffffffffffffffffffffff891690633df0212490608401600060405180830381600087803b158015612fb457600080fd5b505af1158015612fc8573d6000803e3d6000fd5b50506040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000925073ffffffffffffffffffffffffffffffffffffffff861691506370a0823190602401602060405180830381865afa158015613039573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061305d919061388c565b90506130698282613925565b925050505b73ffffffffffffffffffffffffffffffffffffffff831630146131d45773ffffffffffffffffffffffffffffffffffffffff821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14156131b35760008373ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114613117576040519150601f19603f3d011682016040523d82523d6000602084013e61311c565b606091505b50509050806131ad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f526f75746550726f636573736f722e7377617043757276653a204e617469766560448201527f20746f6b656e207472616e73666572206661696c656400000000000000000000606482015260840161035d565b506131d4565b6131d473ffffffffffffffffffffffffffffffffffffffff83168483611299565b5050505050505050505050565b606082471015613273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c0000000000000000000000000000000000000000000000000000606482015260840161035d565b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161329c9190613cf6565b60006040518083038185875af1925050503d80600081146132d9576040519150601f19603f3d011682016040523d82523d6000602084013e6132de565b606091505b50915091506132ef87838387613389565b979650505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526103b49085907f23b872dd00000000000000000000000000000000000000000000000000000000906084016112eb565b6000613365848484613426565b80611b65575061337784846000613426565b8015611b655750611b65848484613426565b6060831561341c5782516134155773ffffffffffffffffffffffffffffffffffffffff85163b613415576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161035d565b5081611b65565b611b658383613535565b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f095ea7b300000000000000000000000000000000000000000000000000000000179052915160009283928392918816916134bf9190613cf6565b6000604051808303816000865af19150503d80600081146134fc576040519150601f19603f3d011682016040523d82523d6000602084013e613501565b606091505b509150915081801561352b57508051158061352b57508080602001905181019061352b919061393c565b9695505050505050565b8151156135455781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161035d9190613ce3565b6000806000806060858703121561358f57600080fd5b8435935060208501359250604085013567ffffffffffffffff808211156135b557600080fd5b818701915087601f8301126135c957600080fd5b8135818111156135d857600080fd5b8860208285010111156135ea57600080fd5b95989497505060200194505050565b73ffffffffffffffffffffffffffffffffffffffff811681146109ac57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f83011261365b57600080fd5b813567ffffffffffffffff808211156136765761367661361b565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156136bc576136bc61361b565b816040528381528660208588010111156136d557600080fd5b836020870160208301376000602085830101528094505050505092915050565b60008060008060008060c0878903121561370e57600080fd5b8635613719816135f9565b9550602087013594506040870135613730816135f9565b9350606087013592506080870135613747816135f9565b915060a087013567ffffffffffffffff81111561376357600080fd5b61376f89828a0161364a565b9150509295509295509295565b600080600080600080600080610100898b03121561379957600080fd5b88356137a4816135f9565b97506020890135965060408901356137bb816135f9565b95506060890135945060808901356137d2816135f9565b935060a0890135925060c08901356137e9816135f9565b915060e089013567ffffffffffffffff81111561380557600080fd5b6138118b828c0161364a565b9150509295985092959890939650565b80151581146109ac57600080fd5b6000806040838503121561384257600080fd5b823561384d816135f9565b9150602083013561385d81613821565b809150509250929050565b60006020828403121561387a57600080fd5b8135613885816135f9565b9392505050565b60006020828403121561389e57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613906576139066138a5565b5060010190565b60008219821115613920576139206138a5565b500190565b600082821015613937576139376138a5565b500390565b60006020828403121561394e57600080fd5b815161388581613821565b80516dffffffffffffffffffffffffffff8116811461147857600080fd5b60008060006060848603121561398c57600080fd5b61399584613959565b92506139a360208501613959565b9150604084015163ffffffff811681146139bc57600080fd5b809150509250925092565b600062ffffff838116908316818110156139e3576139e36138a5565b039392505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613a2357613a236138a5565b500290565b600082613a5e577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60005b83811015613a7e578181015183820152602001613a66565b838111156103b45750506000910152565b60008151808452613aa7816020860160208601613a63565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b84815283602082015273ffffffffffffffffffffffffffffffffffffffff8316604082015260806060820152600061352b6080830184613a8f565b600073ffffffffffffffffffffffffffffffffffffffff838116908316818110156139e3576139e36138a5565b600073ffffffffffffffffffffffffffffffffffffffff808316818516808303821115613b7057613b706138a5565b01949350505050565b600073ffffffffffffffffffffffffffffffffffffffff8088168352861515602084015285604084015280851660608401525060a060808301526132ef60a0830184613a8f565b60008060408385031215613bd357600080fd5b505080516020909101519092909150565b80516fffffffffffffffffffffffffffffffff8116811461147857600080fd5b600060408284031215613c1657600080fd5b6040516040810181811067ffffffffffffffff82111715613c3957613c3961361b565b604052613c4583613be4565b8152613c5360208401613be4565b60208201529392505050565b805167ffffffffffffffff8116811461147857600080fd5b600060608284031215613c8957600080fd5b6040516060810181811067ffffffffffffffff82111715613cac57613cac61361b565b604052613cb883613c5f565b8152613cc660208401613c5f565b6020820152613cd760408401613be4565b60408201529392505050565b6020815260006138856020830184613a8f565b60008251613d08818460208701613a63565b919091019291505056fea26469706673582212201ff294929b57776d43429e47ba13e7bb550e4a27be6afbadf8c8a0d6ad6324b364736f6c634300080a0033000000000000000000000000000000000000000000000000"; diff --git a/src/lib/LibOrder.sol b/src/lib/LibOrder.sol index b0cb359bd3..6cd0639896 100644 --- a/src/lib/LibOrder.sol +++ b/src/lib/LibOrder.sol @@ -2,7 +2,7 @@ // SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd pragma solidity ^0.8.19; -import {OrderV4} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +import {OrderV4} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; /// @title LibOrder /// @notice Consistent handling of `OrderV4` for where it matters w.r.t. diff --git a/src/lib/LibRaindex.sol b/src/lib/LibRaindex.sol index ebf4d3c010..8a694ddcfb 100644 --- a/src/lib/LibRaindex.sol +++ b/src/lib/LibRaindex.sol @@ -2,7 +2,7 @@ // SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd pragma solidity ^0.8.19; -import {TaskV2} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +import {TaskV2} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import { SourceIndexV2, StateNamespace, diff --git a/src/lib/LibRaindexArb.sol b/src/lib/LibRaindexArb.sol index d3c064406a..fcf2522289 100644 --- a/src/lib/LibRaindexArb.sol +++ b/src/lib/LibRaindexArb.sol @@ -2,7 +2,7 @@ // SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd pragma solidity ^0.8.19; -import {TaskV2} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +import {TaskV2} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {IERC20} from "@openzeppelin-contracts-5.7.0/token/ERC20/IERC20.sol"; import {LibRaindex} from "./LibRaindex.sol"; import {Address} from "@openzeppelin-contracts-5.7.0/utils/Address.sol"; diff --git a/src/struct/OrderIOCalculationV4.sol b/src/struct/OrderIOCalculationV4.sol index 115ede7b35..c63c985acc 100644 --- a/src/struct/OrderIOCalculationV4.sol +++ b/src/struct/OrderIOCalculationV4.sol @@ -2,7 +2,7 @@ // SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd pragma solidity ^0.8.25; -import {OrderV4, Float} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +import {OrderV4, Float} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {StateNamespace} from "rainlang-interface-0.2.13/src/interface/IInterpreterV4.sol"; /// All information resulting from an order calculation that allows for vault IO diff --git a/subgraph/abis/Raindex.json b/subgraph/abis/Raindex.json index 6972bfecb9..0ac5c40e4f 100644 --- a/subgraph/abis/Raindex.json +++ b/subgraph/abis/Raindex.json @@ -145,7 +145,7 @@ }, { "type": "function", - "name": "clear3", + "name": "clear4", "inputs": [ { "name": "aliceOrder", diff --git a/subgraph/generated/Raindex/Raindex.ts b/subgraph/generated/Raindex/Raindex.ts index d47fc40b23..5b3246aa8c 100644 --- a/subgraph/generated/Raindex/Raindex.ts +++ b/subgraph/generated/Raindex/Raindex.ts @@ -1639,73 +1639,73 @@ export class AddOrder4CallPostSignedContextStruct extends ethereum.Tuple { } } -export class Clear3Call extends ethereum.Call { - get inputs(): Clear3Call__Inputs { - return new Clear3Call__Inputs(this); +export class Clear4Call extends ethereum.Call { + get inputs(): Clear4Call__Inputs { + return new Clear4Call__Inputs(this); } - get outputs(): Clear3Call__Outputs { - return new Clear3Call__Outputs(this); + get outputs(): Clear4Call__Outputs { + return new Clear4Call__Outputs(this); } } -export class Clear3Call__Inputs { - _call: Clear3Call; +export class Clear4Call__Inputs { + _call: Clear4Call; - constructor(call: Clear3Call) { + constructor(call: Clear4Call) { this._call = call; } - get aliceOrder(): Clear3CallAliceOrderStruct { - return changetype( + get aliceOrder(): Clear4CallAliceOrderStruct { + return changetype( this._call.inputValues[0].value.toTuple(), ); } - get bobOrder(): Clear3CallBobOrderStruct { - return changetype( + get bobOrder(): Clear4CallBobOrderStruct { + return changetype( this._call.inputValues[1].value.toTuple(), ); } - get clearConfig(): Clear3CallClearConfigStruct { - return changetype( + get clearConfig(): Clear4CallClearConfigStruct { + return changetype( this._call.inputValues[2].value.toTuple(), ); } - get aliceSignedContext(): Array { - return this._call.inputValues[3].value.toTupleArray(); + get aliceSignedContext(): Array { + return this._call.inputValues[3].value.toTupleArray(); } - get bobSignedContext(): Array { - return this._call.inputValues[4].value.toTupleArray(); + get bobSignedContext(): Array { + return this._call.inputValues[4].value.toTupleArray(); } } -export class Clear3Call__Outputs { - _call: Clear3Call; +export class Clear4Call__Outputs { + _call: Clear4Call; - constructor(call: Clear3Call) { + constructor(call: Clear4Call) { this._call = call; } } -export class Clear3CallAliceOrderStruct extends ethereum.Tuple { +export class Clear4CallAliceOrderStruct extends ethereum.Tuple { get owner(): Address { return this[0].toAddress(); } - get evaluable(): Clear3CallAliceOrderEvaluableStruct { - return changetype(this[1].toTuple()); + get evaluable(): Clear4CallAliceOrderEvaluableStruct { + return changetype(this[1].toTuple()); } - get validInputs(): Array { - return this[2].toTupleArray(); + get validInputs(): Array { + return this[2].toTupleArray(); } - get validOutputs(): Array { - return this[3].toTupleArray(); + get validOutputs(): Array { + return this[3].toTupleArray(); } get nonce(): Bytes { @@ -1713,7 +1713,7 @@ export class Clear3CallAliceOrderStruct extends ethereum.Tuple { } } -export class Clear3CallAliceOrderEvaluableStruct extends ethereum.Tuple { +export class Clear4CallAliceOrderEvaluableStruct extends ethereum.Tuple { get interpreter(): Address { return this[0].toAddress(); } @@ -1727,7 +1727,7 @@ export class Clear3CallAliceOrderEvaluableStruct extends ethereum.Tuple { } } -export class Clear3CallAliceOrderValidInputsStruct extends ethereum.Tuple { +export class Clear4CallAliceOrderValidInputsStruct extends ethereum.Tuple { get token(): Address { return this[0].toAddress(); } @@ -1737,7 +1737,7 @@ export class Clear3CallAliceOrderValidInputsStruct extends ethereum.Tuple { } } -export class Clear3CallAliceOrderValidOutputsStruct extends ethereum.Tuple { +export class Clear4CallAliceOrderValidOutputsStruct extends ethereum.Tuple { get token(): Address { return this[0].toAddress(); } @@ -1747,21 +1747,21 @@ export class Clear3CallAliceOrderValidOutputsStruct extends ethereum.Tuple { } } -export class Clear3CallBobOrderStruct extends ethereum.Tuple { +export class Clear4CallBobOrderStruct extends ethereum.Tuple { get owner(): Address { return this[0].toAddress(); } - get evaluable(): Clear3CallBobOrderEvaluableStruct { - return changetype(this[1].toTuple()); + get evaluable(): Clear4CallBobOrderEvaluableStruct { + return changetype(this[1].toTuple()); } - get validInputs(): Array { - return this[2].toTupleArray(); + get validInputs(): Array { + return this[2].toTupleArray(); } - get validOutputs(): Array { - return this[3].toTupleArray(); + get validOutputs(): Array { + return this[3].toTupleArray(); } get nonce(): Bytes { @@ -1769,7 +1769,7 @@ export class Clear3CallBobOrderStruct extends ethereum.Tuple { } } -export class Clear3CallBobOrderEvaluableStruct extends ethereum.Tuple { +export class Clear4CallBobOrderEvaluableStruct extends ethereum.Tuple { get interpreter(): Address { return this[0].toAddress(); } @@ -1783,7 +1783,7 @@ export class Clear3CallBobOrderEvaluableStruct extends ethereum.Tuple { } } -export class Clear3CallBobOrderValidInputsStruct extends ethereum.Tuple { +export class Clear4CallBobOrderValidInputsStruct extends ethereum.Tuple { get token(): Address { return this[0].toAddress(); } @@ -1793,7 +1793,7 @@ export class Clear3CallBobOrderValidInputsStruct extends ethereum.Tuple { } } -export class Clear3CallBobOrderValidOutputsStruct extends ethereum.Tuple { +export class Clear4CallBobOrderValidOutputsStruct extends ethereum.Tuple { get token(): Address { return this[0].toAddress(); } @@ -1803,7 +1803,7 @@ export class Clear3CallBobOrderValidOutputsStruct extends ethereum.Tuple { } } -export class Clear3CallClearConfigStruct extends ethereum.Tuple { +export class Clear4CallClearConfigStruct extends ethereum.Tuple { get aliceInputIOIndex(): BigInt { return this[0].toBigInt(); } @@ -1829,7 +1829,7 @@ export class Clear3CallClearConfigStruct extends ethereum.Tuple { } } -export class Clear3CallAliceSignedContextStruct extends ethereum.Tuple { +export class Clear4CallAliceSignedContextStruct extends ethereum.Tuple { get signer(): Address { return this[0].toAddress(); } @@ -1843,7 +1843,7 @@ export class Clear3CallAliceSignedContextStruct extends ethereum.Tuple { } } -export class Clear3CallBobSignedContextStruct extends ethereum.Tuple { +export class Clear4CallBobSignedContextStruct extends ethereum.Tuple { get signer(): Address { return this[0].toAddress(); } diff --git a/test/abstract/RaindexV6ArbOrderTaker.badRaindex.t.sol b/test/abstract/RaindexV6ArbOrderTaker.badRaindex.t.sol index f2d27973b8..85645f35a2 100644 --- a/test/abstract/RaindexV6ArbOrderTaker.badRaindex.t.sol +++ b/test/abstract/RaindexV6ArbOrderTaker.badRaindex.t.sol @@ -8,7 +8,7 @@ import {GenericPoolRaindexV6ArbOrderTaker} from "../../src/concrete/arb/GenericP import {BadRaindex} from "../../src/abstract/RaindexV6ArbOrderTaker.sol"; import {LibRaindexDeploy} from "../../src/lib/deploy/LibRaindexDeploy.sol"; import { - IRaindexV6, + IRaindexV7, OrderV4, EvaluableV4, TakeOrderConfigV4, @@ -17,7 +17,7 @@ import { IInterpreterStoreV3, TaskV2, SignedContextV1 -} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; import { TEST_INTERPRETER_ADDRESS, @@ -42,7 +42,7 @@ contract RaindexV6ArbOrderTakerBadRaindexTest is GenericPoolRaindexV6ArbOrderTak vm.expectRevert(abi.encodeWithSelector(BadRaindex.selector, badRaindex)); GenericPoolRaindexV6ArbOrderTaker(iArb) .arb5( - IRaindexV6(badRaindex), + IRaindexV7(badRaindex), TakeOrdersConfigV5({ minimumIO: LibDecimalFloat.packLossless(0, 0), maximumIO: LibDecimalFloat.packLossless(type(int224).max, 0), diff --git a/test/abstract/RaindexV6ArbOrderTaker.beforeArbOrder.t.sol b/test/abstract/RaindexV6ArbOrderTaker.beforeArbOrder.t.sol index 07c75ed556..2b999fad0e 100644 --- a/test/abstract/RaindexV6ArbOrderTaker.beforeArbOrder.t.sol +++ b/test/abstract/RaindexV6ArbOrderTaker.beforeArbOrder.t.sol @@ -6,13 +6,13 @@ import {Test} from "forge-std-1.17.0/src/Test.sol"; import {ChildGatedRaindexV6ArbOrderTaker} from "test/util/concrete/ChildGatedRaindexV6ArbOrderTaker.sol"; import {RaindexV6ArbConfig, WrongTask} from "../../src/abstract/RaindexV6ArbCommon.sol"; import { - IRaindexV6, + IRaindexV7, TakeOrdersConfigV5, TakeOrderConfigV4, TaskV2, EvaluableV4, SignedContextV1 -} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {IInterpreterV4} from "rainlang-interface-0.2.13/src/interface/IInterpreterV4.sol"; import {IInterpreterStoreV3} from "rainlang-interface-0.2.13/src/interface/IInterpreterStoreV3.sol"; import {LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; @@ -59,7 +59,7 @@ contract RaindexV6ArbOrderTakerBeforeArbOrderTest is Test { }); vm.expectRevert(abi.encodeWithSelector(WrongTask.selector)); - arb.arb5(IRaindexV6(address(0xdead)), takeOrdersConfig, wrongTask); + arb.arb5(IRaindexV7(address(0xdead)), takeOrdersConfig, wrongTask); } /// Control: with empty orders and a MATCHING task, the gate passes and the @@ -80,7 +80,7 @@ contract RaindexV6ArbOrderTakerBeforeArbOrderTest is Test { data: "" }); - vm.expectRevert(abi.encodeWithSelector(IRaindexV6.NoOrders.selector)); - arb.arb5(IRaindexV6(address(0xdead)), takeOrdersConfig, configuredTask); + vm.expectRevert(abi.encodeWithSelector(IRaindexV7.NoOrders.selector)); + arb.arb5(IRaindexV7(address(0xdead)), takeOrdersConfig, configuredTask); } } diff --git a/test/abstract/RaindexV6ArbOrderTaker.context.t.sol b/test/abstract/RaindexV6ArbOrderTaker.context.t.sol index ff463efdea..2987d52e68 100644 --- a/test/abstract/RaindexV6ArbOrderTaker.context.t.sol +++ b/test/abstract/RaindexV6ArbOrderTaker.context.t.sol @@ -3,7 +3,7 @@ pragma solidity =0.8.25; import {ChildRaindexV6ArbOrderTaker} from "../util/concrete/ChildRaindexV6ArbOrderTaker.sol"; -import {TaskV2, SignedContextV1, EvaluableV4} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +import {TaskV2, SignedContextV1, EvaluableV4} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {RaindexV6ExternalRealTest} from "../util/abstract/RaindexV6ExternalRealTest.sol"; import { TakeOrdersConfigV5, @@ -12,7 +12,7 @@ import { OrderConfigV4, OrderV4, IInterpreterV4 -} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {IERC20} from "@openzeppelin-contracts-5.7.0/token/ERC20/IERC20.sol"; import {IERC20Metadata} from "@openzeppelin-contracts-5.7.0/token/ERC20/extensions/IERC20Metadata.sol"; import {StateNamespace} from "rainlang-interface-0.2.13/src/interface/IInterpreterV4.sol"; diff --git a/test/abstract/RaindexV6ArbOrderTaker.finalizeDecimals.t.sol b/test/abstract/RaindexV6ArbOrderTaker.finalizeDecimals.t.sol index ba54686d00..379b07bd54 100644 --- a/test/abstract/RaindexV6ArbOrderTaker.finalizeDecimals.t.sol +++ b/test/abstract/RaindexV6ArbOrderTaker.finalizeDecimals.t.sol @@ -3,7 +3,7 @@ pragma solidity =0.8.25; import {ChildRaindexV6ArbOrderTaker} from "../util/concrete/ChildRaindexV6ArbOrderTaker.sol"; -import {TaskV2, SignedContextV1, EvaluableV4} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +import {TaskV2, SignedContextV1, EvaluableV4} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {RaindexV6ExternalRealTest} from "../util/abstract/RaindexV6ExternalRealTest.sol"; import { TakeOrdersConfigV5, @@ -12,7 +12,7 @@ import { OrderConfigV4, OrderV4, IInterpreterV4 -} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {IERC20} from "@openzeppelin-contracts-5.7.0/token/ERC20/IERC20.sol"; import {IERC20Metadata} from "@openzeppelin-contracts-5.7.0/token/ERC20/extensions/IERC20Metadata.sol"; import {LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; diff --git a/test/abstract/RaindexV6ArbOrderTaker.finalizeTaskArg.t.sol b/test/abstract/RaindexV6ArbOrderTaker.finalizeTaskArg.t.sol index 384680deb2..d84916d215 100644 --- a/test/abstract/RaindexV6ArbOrderTaker.finalizeTaskArg.t.sol +++ b/test/abstract/RaindexV6ArbOrderTaker.finalizeTaskArg.t.sol @@ -3,7 +3,7 @@ pragma solidity =0.8.25; import {ChildRaindexV6ArbOrderTaker} from "../util/concrete/ChildRaindexV6ArbOrderTaker.sol"; -import {TaskV2, SignedContextV1, EvaluableV4} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +import {TaskV2, SignedContextV1, EvaluableV4} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {RaindexV6ExternalRealTest} from "../util/abstract/RaindexV6ExternalRealTest.sol"; import { TakeOrdersConfigV5, @@ -12,7 +12,7 @@ import { OrderConfigV4, OrderV4, IInterpreterV4 -} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {IERC20} from "@openzeppelin-contracts-5.7.0/token/ERC20/IERC20.sol"; import {IERC20Metadata} from "@openzeppelin-contracts-5.7.0/token/ERC20/extensions/IERC20Metadata.sol"; import {LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; diff --git a/test/abstract/RaindexV6ArbOrderTaker.ierc165.t.sol b/test/abstract/RaindexV6ArbOrderTaker.ierc165.t.sol index 62ce39d8ff..81b6d6687a 100644 --- a/test/abstract/RaindexV6ArbOrderTaker.ierc165.t.sol +++ b/test/abstract/RaindexV6ArbOrderTaker.ierc165.t.sol @@ -4,22 +4,22 @@ pragma solidity =0.8.25; import {Test} from "forge-std-1.17.0/src/Test.sol"; import {IERC165} from "@openzeppelin-contracts-5.7.0/utils/introspection/IERC165.sol"; -import {IRaindexV6ArbOrderTaker} from "raindex-interface-0.1.8/src/interface/IRaindexV6ArbOrderTaker.sol"; -import {IRaindexV6OrderTaker} from "raindex-interface-0.1.8/src/interface/IRaindexV6OrderTaker.sol"; +import {IRaindexV7ArbOrderTaker} from "raindex-interface-0.1.10/src/interface/IRaindexV7ArbOrderTaker.sol"; +import {IRaindexV7OrderTaker} from "raindex-interface-0.1.10/src/interface/IRaindexV7OrderTaker.sol"; import {ChildRaindexV6ArbOrderTaker} from "../util/concrete/ChildRaindexV6ArbOrderTaker.sol"; contract RaindexV6ArbOrderTakerIERC165Test is Test { - /// Test that ERC165 and IRaindexV6ArbOrderTaker are supported interfaces + /// Test that ERC165 and IRaindexV7ArbOrderTaker are supported interfaces /// as per ERC165. function testRaindexV6ArbOrderTakerIERC165(bytes4 badInterfaceId) external { vm.assume(badInterfaceId != type(IERC165).interfaceId); - vm.assume(badInterfaceId != type(IRaindexV6ArbOrderTaker).interfaceId); - vm.assume(badInterfaceId != type(IRaindexV6OrderTaker).interfaceId); + vm.assume(badInterfaceId != type(IRaindexV7ArbOrderTaker).interfaceId); + vm.assume(badInterfaceId != type(IRaindexV7OrderTaker).interfaceId); ChildRaindexV6ArbOrderTaker arbOrderTaker = new ChildRaindexV6ArbOrderTaker(); assertTrue(arbOrderTaker.supportsInterface(type(IERC165).interfaceId)); - assertTrue(arbOrderTaker.supportsInterface(type(IRaindexV6ArbOrderTaker).interfaceId)); - assertTrue(arbOrderTaker.supportsInterface(type(IRaindexV6OrderTaker).interfaceId)); + assertTrue(arbOrderTaker.supportsInterface(type(IRaindexV7ArbOrderTaker).interfaceId)); + assertTrue(arbOrderTaker.supportsInterface(type(IRaindexV7OrderTaker).interfaceId)); assertFalse(arbOrderTaker.supportsInterface(badInterfaceId)); } } diff --git a/test/abstract/RaindexV6ArbOrderTaker.ioIndexSelection.t.sol b/test/abstract/RaindexV6ArbOrderTaker.ioIndexSelection.t.sol index 1de6457bb9..a8d6ef2f8b 100644 --- a/test/abstract/RaindexV6ArbOrderTaker.ioIndexSelection.t.sol +++ b/test/abstract/RaindexV6ArbOrderTaker.ioIndexSelection.t.sol @@ -7,7 +7,7 @@ import {IERC20} from "@openzeppelin-contracts-5.7.0/token/ERC20/IERC20.sol"; import {GenericPoolRaindexV6ArbOrderTaker} from "../../src/concrete/arb/GenericPoolRaindexV6ArbOrderTaker.sol"; import { - IRaindexV6, + IRaindexV7, TakeOrdersConfigV5, TakeOrderConfigV4, OrderV4, @@ -15,7 +15,7 @@ import { EvaluableV4, SignedContextV1, TaskV2 -} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {IInterpreterV4} from "rainlang-interface-0.2.13/src/interface/IInterpreterV4.sol"; import {IInterpreterStoreV3} from "rainlang-interface-0.2.13/src/interface/IInterpreterStoreV3.sol"; import {LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; @@ -95,7 +95,7 @@ contract RaindexV6ArbOrderTakerIoIndexSelectionTest is Test { abi.encodeCall(MockExchange.swap, (IERC20(address(outputToken)), IERC20(address(inputToken)), 80e18)); arb.arb5( - IRaindexV6(address(raindex)), + IRaindexV7(address(raindex)), TakeOrdersConfigV5({ minimumIO: LibDecimalFloat.packLossless(0, 0), maximumIO: LibDecimalFloat.packLossless(type(int224).max, 0), @@ -184,7 +184,7 @@ contract RaindexV6ArbOrderTakerIoIndexSelectionTest is Test { abi.encodeCall(MockExchange.swap, (IERC20(address(outputToken)), IERC20(address(inputToken)), 80e18)); arb.arb5( - IRaindexV6(address(raindex)), + IRaindexV7(address(raindex)), TakeOrdersConfigV5({ minimumIO: LibDecimalFloat.packLossless(0, 0), maximumIO: LibDecimalFloat.packLossless(type(int224).max, 0), diff --git a/test/abstract/RaindexV6ArbOrderTaker.noOrders.t.sol b/test/abstract/RaindexV6ArbOrderTaker.noOrders.t.sol index 44c9e1eddc..334b8eeaee 100644 --- a/test/abstract/RaindexV6ArbOrderTaker.noOrders.t.sol +++ b/test/abstract/RaindexV6ArbOrderTaker.noOrders.t.sol @@ -6,7 +6,7 @@ import {GenericPoolRaindexV6ArbOrderTakerTest} from "test/util/abstract/GenericP import {GenericPoolRaindexV6ArbOrderTaker} from "../../src/concrete/arb/GenericPoolRaindexV6ArbOrderTaker.sol"; import { - IRaindexV6, + IRaindexV7, EvaluableV4, TakeOrderConfigV4, TakeOrdersConfigV5, @@ -14,7 +14,7 @@ import { IInterpreterStoreV3, TaskV2, SignedContextV1 -} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; import { TEST_INTERPRETER_ADDRESS, @@ -26,7 +26,7 @@ contract RaindexV6ArbOrderTakerNoOrdersTest is GenericPoolRaindexV6ArbOrderTaker function testArb5NoOrders() external { TakeOrderConfigV4[] memory orders = new TakeOrderConfigV4[](0); - vm.expectRevert(abi.encodeWithSelector(IRaindexV6.NoOrders.selector)); + vm.expectRevert(abi.encodeWithSelector(IRaindexV7.NoOrders.selector)); GenericPoolRaindexV6ArbOrderTaker(iArb) .arb5( iRaindex, diff --git a/test/abstract/RaindexV6ArbOrderTaker.onTakeOrders2.t.sol b/test/abstract/RaindexV6ArbOrderTaker.onTakeOrders2.t.sol index 1266a8e896..2ed7abb079 100644 --- a/test/abstract/RaindexV6ArbOrderTaker.onTakeOrders2.t.sol +++ b/test/abstract/RaindexV6ArbOrderTaker.onTakeOrders2.t.sol @@ -7,7 +7,7 @@ import {IERC20} from "@openzeppelin-contracts-5.7.0/token/ERC20/IERC20.sol"; import {GenericPoolRaindexV6ArbOrderTaker} from "../../src/concrete/arb/GenericPoolRaindexV6ArbOrderTaker.sol"; import { - IRaindexV6, + IRaindexV7, TakeOrdersConfigV5, TakeOrderConfigV4, OrderV4, @@ -16,7 +16,7 @@ import { SignedContextV1, TaskV2, Float -} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {IInterpreterV4} from "rainlang-interface-0.2.13/src/interface/IInterpreterV4.sol"; import {IInterpreterStoreV3} from "rainlang-interface-0.2.13/src/interface/IInterpreterStoreV3.sol"; import {LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; @@ -73,7 +73,7 @@ contract RaindexV6ArbOrderTakerOnTakeOrders2Test is Test { ); arb.arb5( - IRaindexV6(address(raindex)), + IRaindexV7(address(raindex)), TakeOrdersConfigV5({ minimumIO: LibDecimalFloat.packLossless(100, 0), maximumIO: LibDecimalFloat.packLossless(type(int224).max, 0), diff --git a/test/abstract/RaindexV6ArbOrderTaker.onTakeOrders2Base.t.sol b/test/abstract/RaindexV6ArbOrderTaker.onTakeOrders2Base.t.sol index d3c3ca0866..673f23022b 100644 --- a/test/abstract/RaindexV6ArbOrderTaker.onTakeOrders2Base.t.sol +++ b/test/abstract/RaindexV6ArbOrderTaker.onTakeOrders2Base.t.sol @@ -6,7 +6,7 @@ import {Test} from "forge-std-1.17.0/src/Test.sol"; import {ChildRaindexV6ArbOrderTaker} from "test/util/concrete/ChildRaindexV6ArbOrderTaker.sol"; import {GenericPoolRaindexV6ArbOrderTaker} from "../../src/concrete/arb/GenericPoolRaindexV6ArbOrderTaker.sol"; -import {Float} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +import {Float} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {LibRainDeploy} from "rain-deploy-0.1.22/src/lib/LibRainDeploy.sol"; import {LibTOFUTokenDecimals} from "rain-tofu-erc20-decimals-0.1.4/src/lib/LibTOFUTokenDecimals.sol"; import {MockToken} from "test/util/concrete/MockToken.sol"; diff --git a/test/abstract/RaindexV6ArbOrderTaker.onTakeOrders2Direct.t.sol b/test/abstract/RaindexV6ArbOrderTaker.onTakeOrders2Direct.t.sol index be84b4623a..d876b2ff02 100644 --- a/test/abstract/RaindexV6ArbOrderTaker.onTakeOrders2Direct.t.sol +++ b/test/abstract/RaindexV6ArbOrderTaker.onTakeOrders2Direct.t.sol @@ -5,7 +5,7 @@ pragma solidity =0.8.25; import {Test} from "forge-std-1.17.0/src/Test.sol"; import {GenericPoolRaindexV6ArbOrderTaker} from "../../src/concrete/arb/GenericPoolRaindexV6ArbOrderTaker.sol"; -import {Float} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +import {Float} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {LibRainDeploy} from "rain-deploy-0.1.22/src/lib/LibRainDeploy.sol"; import {LibTOFUTokenDecimals} from "rain-tofu-erc20-decimals-0.1.4/src/lib/LibTOFUTokenDecimals.sol"; import {MockToken} from "test/util/concrete/MockToken.sol"; diff --git a/test/abstract/RaindexV6ArbOrderTaker.reentrancy.t.sol b/test/abstract/RaindexV6ArbOrderTaker.reentrancy.t.sol index f245ddd044..28b0906787 100644 --- a/test/abstract/RaindexV6ArbOrderTaker.reentrancy.t.sol +++ b/test/abstract/RaindexV6ArbOrderTaker.reentrancy.t.sol @@ -6,7 +6,7 @@ import {Test} from "forge-std-1.17.0/src/Test.sol"; import {GenericPoolRaindexV6ArbOrderTaker} from "../../src/concrete/arb/GenericPoolRaindexV6ArbOrderTaker.sol"; import { - IRaindexV6, + IRaindexV7, TakeOrdersConfigV5, TakeOrderConfigV4, OrderV4, @@ -14,7 +14,7 @@ import { EvaluableV4, SignedContextV1, TaskV2 -} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {IInterpreterV4} from "rainlang-interface-0.2.13/src/interface/IInterpreterV4.sol"; import {IInterpreterStoreV3} from "rainlang-interface-0.2.13/src/interface/IInterpreterStoreV3.sol"; import {LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; @@ -62,7 +62,7 @@ contract RaindexV6ArbOrderTakerReentrancyTest is Test { vm.expectRevert(abi.encodeWithSelector(bytes4(keccak256("ReentrancyGuardReentrantCall()")))); arb.arb5( - IRaindexV6(address(raindex)), + IRaindexV7(address(raindex)), TakeOrdersConfigV5({ minimumIO: LibDecimalFloat.packLossless(100, 0), maximumIO: LibDecimalFloat.packLossless(type(int224).max, 0), diff --git a/test/abstract/RaindexV6ArbTaskGated.checkTaskHashPassMatch.t.sol b/test/abstract/RaindexV6ArbTaskGated.checkTaskHashPassMatch.t.sol index c0304ceede..c18c1aa0c1 100644 --- a/test/abstract/RaindexV6ArbTaskGated.checkTaskHashPassMatch.t.sol +++ b/test/abstract/RaindexV6ArbTaskGated.checkTaskHashPassMatch.t.sol @@ -5,7 +5,7 @@ pragma solidity =0.8.25; import {Test} from "forge-std-1.17.0/src/Test.sol"; import {ChildRaindexV6ArbTaskGated} from "test/util/concrete/ChildRaindexV6ArbTaskGated.sol"; import {RaindexV6ArbConfig} from "../../src/abstract/RaindexV6ArbCommon.sol"; -import {TaskV2, EvaluableV4, SignedContextV1} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +import {TaskV2, EvaluableV4, SignedContextV1} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {IInterpreterV4} from "rainlang-interface-0.2.13/src/interface/IInterpreterV4.sol"; import {IInterpreterStoreV3} from "rainlang-interface-0.2.13/src/interface/IInterpreterStoreV3.sol"; import { diff --git a/test/abstract/RaindexV6ArbTaskGated.checkTaskHashPassZero.t.sol b/test/abstract/RaindexV6ArbTaskGated.checkTaskHashPassZero.t.sol index b22a56d57d..bb4601c1dd 100644 --- a/test/abstract/RaindexV6ArbTaskGated.checkTaskHashPassZero.t.sol +++ b/test/abstract/RaindexV6ArbTaskGated.checkTaskHashPassZero.t.sol @@ -5,7 +5,7 @@ pragma solidity =0.8.25; import {Test} from "forge-std-1.17.0/src/Test.sol"; import {ChildRaindexV6ArbTaskGated} from "test/util/concrete/ChildRaindexV6ArbTaskGated.sol"; import {RaindexV6ArbConfig} from "../../src/abstract/RaindexV6ArbCommon.sol"; -import {TaskV2, EvaluableV4, SignedContextV1} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +import {TaskV2, EvaluableV4, SignedContextV1} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {IInterpreterV4} from "rainlang-interface-0.2.13/src/interface/IInterpreterV4.sol"; import {IInterpreterStoreV3} from "rainlang-interface-0.2.13/src/interface/IInterpreterStoreV3.sol"; import { diff --git a/test/abstract/RaindexV6ArbTaskGated.checkTaskHashWrongTask.t.sol b/test/abstract/RaindexV6ArbTaskGated.checkTaskHashWrongTask.t.sol index 0c90d0c584..1a2380628b 100644 --- a/test/abstract/RaindexV6ArbTaskGated.checkTaskHashWrongTask.t.sol +++ b/test/abstract/RaindexV6ArbTaskGated.checkTaskHashWrongTask.t.sol @@ -5,7 +5,7 @@ pragma solidity =0.8.25; import {Test} from "forge-std-1.17.0/src/Test.sol"; import {ChildRaindexV6ArbTaskGated} from "test/util/concrete/ChildRaindexV6ArbTaskGated.sol"; import {RaindexV6ArbConfig, WrongTask} from "../../src/abstract/RaindexV6ArbCommon.sol"; -import {TaskV2, EvaluableV4, SignedContextV1} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +import {TaskV2, EvaluableV4, SignedContextV1} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {IInterpreterV4} from "rainlang-interface-0.2.13/src/interface/IInterpreterV4.sol"; import {IInterpreterStoreV3} from "rainlang-interface-0.2.13/src/interface/IInterpreterStoreV3.sol"; import { diff --git a/test/abstract/RaindexV6ArbTaskGated.construct.t.sol b/test/abstract/RaindexV6ArbTaskGated.construct.t.sol index a27065e17e..fb70c472c5 100644 --- a/test/abstract/RaindexV6ArbTaskGated.construct.t.sol +++ b/test/abstract/RaindexV6ArbTaskGated.construct.t.sol @@ -5,7 +5,7 @@ pragma solidity =0.8.25; import {Test} from "forge-std-1.17.0/src/Test.sol"; import {ChildRaindexV6ArbTaskGated} from "test/util/concrete/ChildRaindexV6ArbTaskGated.sol"; import {RaindexV6ArbConfig, RaindexV6ArbCommon} from "../../src/abstract/RaindexV6ArbCommon.sol"; -import {TaskV2, EvaluableV4, SignedContextV1} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +import {TaskV2, EvaluableV4, SignedContextV1} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {IInterpreterV4} from "rainlang-interface-0.2.13/src/interface/IInterpreterV4.sol"; import {IInterpreterStoreV3} from "rainlang-interface-0.2.13/src/interface/IInterpreterStoreV3.sol"; import { diff --git a/test/abstract/RaindexV6ArbTaskGated.iTaskHashBoundary.t.sol b/test/abstract/RaindexV6ArbTaskGated.iTaskHashBoundary.t.sol index 9229af81b4..878dd615fc 100644 --- a/test/abstract/RaindexV6ArbTaskGated.iTaskHashBoundary.t.sol +++ b/test/abstract/RaindexV6ArbTaskGated.iTaskHashBoundary.t.sol @@ -5,7 +5,7 @@ pragma solidity =0.8.25; import {Test} from "forge-std-1.17.0/src/Test.sol"; import {ChildRaindexV6ArbTaskGated} from "test/util/concrete/ChildRaindexV6ArbTaskGated.sol"; import {RaindexV6ArbConfig} from "../../src/abstract/RaindexV6ArbCommon.sol"; -import {TaskV2, EvaluableV4, SignedContextV1} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +import {TaskV2, EvaluableV4, SignedContextV1} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {IInterpreterV4} from "rainlang-interface-0.2.13/src/interface/IInterpreterV4.sol"; import {IInterpreterStoreV3} from "rainlang-interface-0.2.13/src/interface/IInterpreterStoreV3.sol"; import { diff --git a/test/abstract/RaindexV6ArbTaskGated.iTaskHashNonzero.t.sol b/test/abstract/RaindexV6ArbTaskGated.iTaskHashNonzero.t.sol index c030dae486..0d5afb2954 100644 --- a/test/abstract/RaindexV6ArbTaskGated.iTaskHashNonzero.t.sol +++ b/test/abstract/RaindexV6ArbTaskGated.iTaskHashNonzero.t.sol @@ -5,7 +5,7 @@ pragma solidity =0.8.25; import {Test} from "forge-std-1.17.0/src/Test.sol"; import {ChildRaindexV6ArbTaskGated} from "test/util/concrete/ChildRaindexV6ArbTaskGated.sol"; import {RaindexV6ArbConfig} from "../../src/abstract/RaindexV6ArbCommon.sol"; -import {TaskV2, EvaluableV4, SignedContextV1} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +import {TaskV2, EvaluableV4, SignedContextV1} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {IInterpreterV4} from "rainlang-interface-0.2.13/src/interface/IInterpreterV4.sol"; import {IInterpreterStoreV3} from "rainlang-interface-0.2.13/src/interface/IInterpreterStoreV3.sol"; import { diff --git a/test/abstract/RaindexV6ArbTaskGated.iTaskHashZero.t.sol b/test/abstract/RaindexV6ArbTaskGated.iTaskHashZero.t.sol index 4ed42105b4..8585920a24 100644 --- a/test/abstract/RaindexV6ArbTaskGated.iTaskHashZero.t.sol +++ b/test/abstract/RaindexV6ArbTaskGated.iTaskHashZero.t.sol @@ -5,7 +5,7 @@ pragma solidity =0.8.25; import {Test} from "forge-std-1.17.0/src/Test.sol"; import {ChildRaindexV6ArbTaskGated} from "test/util/concrete/ChildRaindexV6ArbTaskGated.sol"; import {RaindexV6ArbConfig} from "../../src/abstract/RaindexV6ArbCommon.sol"; -import {TaskV2, EvaluableV4, SignedContextV1} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +import {TaskV2, EvaluableV4, SignedContextV1} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {IInterpreterV4} from "rainlang-interface-0.2.13/src/interface/IInterpreterV4.sol"; import {IInterpreterStoreV3} from "rainlang-interface-0.2.13/src/interface/IInterpreterStoreV3.sol"; import { diff --git a/test/abstract/RaindexV6FlashBorrower.badLenderApproval.t.sol b/test/abstract/RaindexV6FlashBorrower.badLenderApproval.t.sol index 25327ccb1f..92205bd84d 100644 --- a/test/abstract/RaindexV6FlashBorrower.badLenderApproval.t.sol +++ b/test/abstract/RaindexV6FlashBorrower.badLenderApproval.t.sol @@ -8,7 +8,7 @@ import {IERC20} from "@openzeppelin-contracts-5.7.0/token/ERC20/IERC20.sol"; import {GenericPoolRaindexV6FlashBorrower} from "../../src/concrete/arb/GenericPoolRaindexV6FlashBorrower.sol"; import {BadLender} from "../../src/abstract/RaindexV6FlashBorrower.sol"; import { - IRaindexV6, + IRaindexV7, TakeOrdersConfigV5, TakeOrderConfigV4, OrderV4, @@ -16,7 +16,7 @@ import { EvaluableV4, SignedContextV1, TaskV2 -} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {IInterpreterV4} from "rainlang-interface-0.2.13/src/interface/IInterpreterV4.sol"; import {IInterpreterStoreV3} from "rainlang-interface-0.2.13/src/interface/IInterpreterStoreV3.sol"; import {LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; @@ -63,7 +63,7 @@ contract RaindexV6FlashBorrowerBadLenderApprovalTest is Test { // the deterministic raindex address. vm.expectRevert(abi.encodeWithSelector(BadLender.selector, address(malicious))); arb.arb4( - IRaindexV6(address(malicious)), + IRaindexV7(address(malicious)), TakeOrdersConfigV5({ minimumIO: LibDecimalFloat.packLossless(100, 0), maximumIO: LibDecimalFloat.packLossless(type(int224).max, 0), diff --git a/test/abstract/RaindexV6FlashBorrower.beforeArbOrder.t.sol b/test/abstract/RaindexV6FlashBorrower.beforeArbOrder.t.sol index d6ec9797ae..a0ef794ccc 100644 --- a/test/abstract/RaindexV6FlashBorrower.beforeArbOrder.t.sol +++ b/test/abstract/RaindexV6FlashBorrower.beforeArbOrder.t.sol @@ -6,13 +6,13 @@ import {Test} from "forge-std-1.17.0/src/Test.sol"; import {ChildGatedRaindexV6FlashBorrower} from "test/util/concrete/ChildGatedRaindexV6FlashBorrower.sol"; import {RaindexV6ArbConfig, WrongTask} from "../../src/abstract/RaindexV6ArbCommon.sol"; import { - IRaindexV6, + IRaindexV7, TakeOrdersConfigV5, TakeOrderConfigV4, TaskV2, EvaluableV4, SignedContextV1 -} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {IInterpreterV4} from "rainlang-interface-0.2.13/src/interface/IInterpreterV4.sol"; import {IInterpreterStoreV3} from "rainlang-interface-0.2.13/src/interface/IInterpreterStoreV3.sol"; import {LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; @@ -62,7 +62,7 @@ contract RaindexV6FlashBorrowerBeforeArbOrderTest is Test { TaskV2 memory wrongTask = _gatedTask(hex"02"); vm.expectRevert(abi.encodeWithSelector(WrongTask.selector)); - arb.arb4(IRaindexV6(address(0xdead)), _emptyOrdersConfig(), "", wrongTask); + arb.arb4(IRaindexV7(address(0xdead)), _emptyOrdersConfig(), "", wrongTask); } /// Control: with empty orders and a MATCHING task, the gate passes and the @@ -73,7 +73,7 @@ contract RaindexV6FlashBorrowerBeforeArbOrderTest is Test { TaskV2 memory configuredTask = _gatedTask(hex"01"); ChildGatedRaindexV6FlashBorrower arb = new ChildGatedRaindexV6FlashBorrower(RaindexV6ArbConfig(configuredTask)); - vm.expectRevert(abi.encodeWithSelector(IRaindexV6.NoOrders.selector)); - arb.arb4(IRaindexV6(address(0xdead)), _emptyOrdersConfig(), "", configuredTask); + vm.expectRevert(abi.encodeWithSelector(IRaindexV7.NoOrders.selector)); + arb.arb4(IRaindexV7(address(0xdead)), _emptyOrdersConfig(), "", configuredTask); } } diff --git a/test/abstract/RaindexV6FlashBorrower.finalizeDecimals.t.sol b/test/abstract/RaindexV6FlashBorrower.finalizeDecimals.t.sol index f91d3a04c9..30f812fe66 100644 --- a/test/abstract/RaindexV6FlashBorrower.finalizeDecimals.t.sol +++ b/test/abstract/RaindexV6FlashBorrower.finalizeDecimals.t.sol @@ -8,7 +8,7 @@ import {LeftoverFlashLendingMockRaindex} from "test/util/concrete/LeftoverFlashL import {MockToken} from "test/util/concrete/MockToken.sol"; import {LibRaindexDeploy} from "../../src/lib/deploy/LibRaindexDeploy.sol"; import { - IRaindexV6, + IRaindexV7, TakeOrdersConfigV5, TakeOrderConfigV4, OrderV4, @@ -17,7 +17,7 @@ import { SignedContextV1, TaskV2, IInterpreterV4 -} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {IInterpreterStoreV3} from "rainlang-interface-0.2.13/src/interface/IInterpreterStoreV3.sol"; import {LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; @@ -95,7 +95,7 @@ contract RaindexV6FlashBorrowerFinalizeDecimalsTest is RaindexV6ExternalRealTest }); arb.arb4( - IRaindexV6(address(raindex)), + IRaindexV7(address(raindex)), TakeOrdersConfigV5({ minimumIO: LibDecimalFloat.packLossless(1, 0), maximumIO: LibDecimalFloat.packLossless(type(int224).max, 0), diff --git a/test/abstract/RaindexV6FlashBorrower.flashLoanAmountLossless.t.sol b/test/abstract/RaindexV6FlashBorrower.flashLoanAmountLossless.t.sol index 6e035f81fc..801255b61d 100644 --- a/test/abstract/RaindexV6FlashBorrower.flashLoanAmountLossless.t.sol +++ b/test/abstract/RaindexV6FlashBorrower.flashLoanAmountLossless.t.sol @@ -7,7 +7,7 @@ import {IERC20} from "@openzeppelin-contracts-5.7.0/token/ERC20/IERC20.sol"; import {GenericPoolRaindexV6FlashBorrower} from "../../src/concrete/arb/GenericPoolRaindexV6FlashBorrower.sol"; import { - IRaindexV6, + IRaindexV7, TakeOrdersConfigV5, TakeOrderConfigV4, OrderV4, @@ -16,7 +16,7 @@ import { SignedContextV1, TaskV2, Float -} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {IInterpreterV4} from "rainlang-interface-0.2.13/src/interface/IInterpreterV4.sol"; import {IInterpreterStoreV3} from "rainlang-interface-0.2.13/src/interface/IInterpreterStoreV3.sol"; import {LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; @@ -51,7 +51,7 @@ contract RaindexV6FlashBorrowerFlashLoanAmountLosslessTest is Test { GenericPoolRaindexV6FlashBorrower arb = new GenericPoolRaindexV6FlashBorrower(); arb.arb4( - IRaindexV6(raindex), + IRaindexV7(raindex), TakeOrdersConfigV5({ minimumIO: minimumIO, maximumIO: LibDecimalFloat.packLossless(type(int224).max, 0), diff --git a/test/abstract/RaindexV6FlashBorrower.flashLoanAmountValue.t.sol b/test/abstract/RaindexV6FlashBorrower.flashLoanAmountValue.t.sol index e186eeb936..c5fc8ba539 100644 --- a/test/abstract/RaindexV6FlashBorrower.flashLoanAmountValue.t.sol +++ b/test/abstract/RaindexV6FlashBorrower.flashLoanAmountValue.t.sol @@ -7,7 +7,7 @@ import {IERC20} from "@openzeppelin-contracts-5.7.0/token/ERC20/IERC20.sol"; import {GenericPoolRaindexV6FlashBorrower} from "../../src/concrete/arb/GenericPoolRaindexV6FlashBorrower.sol"; import { - IRaindexV6, + IRaindexV7, TakeOrdersConfigV5, TakeOrderConfigV4, OrderV4, @@ -16,7 +16,7 @@ import { SignedContextV1, TaskV2, Float -} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {IInterpreterV4} from "rainlang-interface-0.2.13/src/interface/IInterpreterV4.sol"; import {IInterpreterStoreV3} from "rainlang-interface-0.2.13/src/interface/IInterpreterStoreV3.sol"; import {LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; @@ -88,7 +88,7 @@ contract RaindexV6FlashBorrowerFlashLoanAmountValueTest is Test { GenericPoolRaindexV6FlashBorrower arb = new GenericPoolRaindexV6FlashBorrower(); arb.arb4( - IRaindexV6(address(raindex)), + IRaindexV7(address(raindex)), TakeOrdersConfigV5({ minimumIO: LibDecimalFloat.packLossless(100, 0), maximumIO: LibDecimalFloat.packLossless(type(int224).max, 0), diff --git a/test/abstract/RaindexV6FlashBorrower.flashLoanFailed.t.sol b/test/abstract/RaindexV6FlashBorrower.flashLoanFailed.t.sol index 6475cf6fb2..986c22eff2 100644 --- a/test/abstract/RaindexV6FlashBorrower.flashLoanFailed.t.sol +++ b/test/abstract/RaindexV6FlashBorrower.flashLoanFailed.t.sol @@ -8,7 +8,7 @@ import {IERC20} from "@openzeppelin-contracts-5.7.0/token/ERC20/IERC20.sol"; import {GenericPoolRaindexV6FlashBorrower} from "../../src/concrete/arb/GenericPoolRaindexV6FlashBorrower.sol"; import {FlashLoanFailed} from "../../src/abstract/RaindexV6FlashBorrower.sol"; import { - IRaindexV6, + IRaindexV7, TakeOrdersConfigV5, TakeOrderConfigV4, OrderV4, @@ -17,7 +17,7 @@ import { SignedContextV1, TaskV2, Float -} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {IInterpreterV4} from "rainlang-interface-0.2.13/src/interface/IInterpreterV4.sol"; import {IInterpreterStoreV3} from "rainlang-interface-0.2.13/src/interface/IInterpreterStoreV3.sol"; import {LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; @@ -60,7 +60,7 @@ contract RaindexV6FlashBorrowerFlashLoanFailedTest is Test { vm.expectRevert(FlashLoanFailed.selector); arb.arb4( - IRaindexV6(LibRaindexDeploy.RAINDEX_DEPLOYED_ADDRESS), + IRaindexV7(LibRaindexDeploy.RAINDEX_DEPLOYED_ADDRESS), TakeOrdersConfigV5({ minimumIO: LibDecimalFloat.packLossless(100, 0), maximumIO: LibDecimalFloat.packLossless(type(int224).max, 0), diff --git a/test/abstract/RaindexV6FlashBorrower.inputIoIndexSelection.t.sol b/test/abstract/RaindexV6FlashBorrower.inputIoIndexSelection.t.sol index 1abc22d68f..a674ce4307 100644 --- a/test/abstract/RaindexV6FlashBorrower.inputIoIndexSelection.t.sol +++ b/test/abstract/RaindexV6FlashBorrower.inputIoIndexSelection.t.sol @@ -7,7 +7,7 @@ import {IERC20} from "@openzeppelin-contracts-5.7.0/token/ERC20/IERC20.sol"; import {GenericPoolRaindexV6FlashBorrower} from "../../src/concrete/arb/GenericPoolRaindexV6FlashBorrower.sol"; import { - IRaindexV6, + IRaindexV7, TakeOrdersConfigV5, TakeOrderConfigV4, OrderV4, @@ -15,7 +15,7 @@ import { EvaluableV4, SignedContextV1, TaskV2 -} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {IInterpreterV4} from "rainlang-interface-0.2.13/src/interface/IInterpreterV4.sol"; import {IInterpreterStoreV3} from "rainlang-interface-0.2.13/src/interface/IInterpreterStoreV3.sol"; import {LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; @@ -104,7 +104,7 @@ contract RaindexV6FlashBorrowerInputIoIndexSelectionTest is Test { function testArb4SelectsInputTokenByInputIoIndex() external { arb.arb4( - IRaindexV6(address(raindex)), + IRaindexV7(address(raindex)), TakeOrdersConfigV5({ minimumIO: LibDecimalFloat.packLossless(100, 0), maximumIO: LibDecimalFloat.packLossless(type(int224).max, 0), diff --git a/test/abstract/RaindexV6FlashBorrower.ioIsInput.t.sol b/test/abstract/RaindexV6FlashBorrower.ioIsInput.t.sol index 102fdbe0fa..3d0f949d63 100644 --- a/test/abstract/RaindexV6FlashBorrower.ioIsInput.t.sol +++ b/test/abstract/RaindexV6FlashBorrower.ioIsInput.t.sol @@ -7,7 +7,7 @@ import {ArbTest} from "test/util/abstract/ArbTest.sol"; import {GenericPoolRaindexV6FlashBorrower} from "../../src/concrete/arb/GenericPoolRaindexV6FlashBorrower.sol"; import {ArbRequiresInputIO} from "../../src/abstract/RaindexV6FlashBorrower.sol"; import { - IRaindexV6, + IRaindexV7, EvaluableV4, TakeOrderConfigV4, TakeOrdersConfigV5, @@ -15,7 +15,7 @@ import { IInterpreterStoreV3, TaskV2, SignedContextV1 -} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; import { TEST_INTERPRETER_ADDRESS, diff --git a/test/abstract/RaindexV6FlashBorrower.mixedDecimals.t.sol b/test/abstract/RaindexV6FlashBorrower.mixedDecimals.t.sol index 07a3243bdb..b6ba74113a 100644 --- a/test/abstract/RaindexV6FlashBorrower.mixedDecimals.t.sol +++ b/test/abstract/RaindexV6FlashBorrower.mixedDecimals.t.sol @@ -7,7 +7,7 @@ import {IERC20} from "@openzeppelin-contracts-5.7.0/token/ERC20/IERC20.sol"; import {GenericPoolRaindexV6FlashBorrower} from "../../src/concrete/arb/GenericPoolRaindexV6FlashBorrower.sol"; import { - IRaindexV6, + IRaindexV7, TakeOrdersConfigV5, TakeOrderConfigV4, OrderV4, @@ -16,7 +16,7 @@ import { SignedContextV1, TaskV2, Float -} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {IInterpreterV4} from "rainlang-interface-0.2.13/src/interface/IInterpreterV4.sol"; import {IInterpreterStoreV3} from "rainlang-interface-0.2.13/src/interface/IInterpreterStoreV3.sol"; import {LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; @@ -74,7 +74,7 @@ contract RaindexV6FlashBorrowerMixedDecimalsTest is Test { ); arb.arb4( - IRaindexV6(address(raindex)), + IRaindexV7(address(raindex)), TakeOrdersConfigV5({ minimumIO: LibDecimalFloat.packLossless(100, 0), maximumIO: LibDecimalFloat.packLossless(type(int224).max, 0), diff --git a/test/abstract/RaindexV6FlashBorrower.noOrders.t.sol b/test/abstract/RaindexV6FlashBorrower.noOrders.t.sol index e9fb305843..25331a58bd 100644 --- a/test/abstract/RaindexV6FlashBorrower.noOrders.t.sol +++ b/test/abstract/RaindexV6FlashBorrower.noOrders.t.sol @@ -6,7 +6,7 @@ import {ArbTest} from "test/util/abstract/ArbTest.sol"; import {GenericPoolRaindexV6FlashBorrower} from "../../src/concrete/arb/GenericPoolRaindexV6FlashBorrower.sol"; import { - IRaindexV6, + IRaindexV7, EvaluableV4, TakeOrderConfigV4, TakeOrdersConfigV5, @@ -14,7 +14,7 @@ import { IInterpreterStoreV3, TaskV2, SignedContextV1 -} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; import { TEST_INTERPRETER_ADDRESS, @@ -32,7 +32,7 @@ contract RaindexV6FlashBorrowerNoOrdersTest is ArbTest { function testArb4NoOrders() external { TakeOrderConfigV4[] memory orders = new TakeOrderConfigV4[](0); - vm.expectRevert(abi.encodeWithSelector(IRaindexV6.NoOrders.selector)); + vm.expectRevert(abi.encodeWithSelector(IRaindexV7.NoOrders.selector)); GenericPoolRaindexV6FlashBorrower(iArb) .arb4( iRaindex, diff --git a/test/abstract/RaindexV6FlashBorrower.orders0Selection.t.sol b/test/abstract/RaindexV6FlashBorrower.orders0Selection.t.sol index 9898ea69ca..0dabd0096e 100644 --- a/test/abstract/RaindexV6FlashBorrower.orders0Selection.t.sol +++ b/test/abstract/RaindexV6FlashBorrower.orders0Selection.t.sol @@ -7,7 +7,7 @@ import {IERC20} from "@openzeppelin-contracts-5.7.0/token/ERC20/IERC20.sol"; import {GenericPoolRaindexV6FlashBorrower} from "../../src/concrete/arb/GenericPoolRaindexV6FlashBorrower.sol"; import { - IRaindexV6, + IRaindexV7, TakeOrdersConfigV5, TakeOrderConfigV4, OrderV4, @@ -16,7 +16,7 @@ import { SignedContextV1, TaskV2, Float -} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {IInterpreterV4} from "rainlang-interface-0.2.13/src/interface/IInterpreterV4.sol"; import {IInterpreterStoreV3} from "rainlang-interface-0.2.13/src/interface/IInterpreterStoreV3.sol"; import {LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; @@ -90,7 +90,7 @@ contract RaindexV6FlashBorrowerOrders0SelectionTest is Test { ); arb.arb4( - IRaindexV6(raindex), + IRaindexV7(raindex), TakeOrdersConfigV5({ minimumIO: LibDecimalFloat.packLossless(100, 0), maximumIO: LibDecimalFloat.packLossless(type(int224).max, 0), diff --git a/test/abstract/RaindexV6FlashBorrower.realTokenTransfers.t.sol b/test/abstract/RaindexV6FlashBorrower.realTokenTransfers.t.sol index e51445e925..00fd1b9b5e 100644 --- a/test/abstract/RaindexV6FlashBorrower.realTokenTransfers.t.sol +++ b/test/abstract/RaindexV6FlashBorrower.realTokenTransfers.t.sol @@ -7,7 +7,7 @@ import {IERC20} from "@openzeppelin-contracts-5.7.0/token/ERC20/IERC20.sol"; import {GenericPoolRaindexV6FlashBorrower} from "../../src/concrete/arb/GenericPoolRaindexV6FlashBorrower.sol"; import { - IRaindexV6, + IRaindexV7, TakeOrdersConfigV5, TakeOrderConfigV4, OrderV4, @@ -16,7 +16,7 @@ import { SignedContextV1, TaskV2, Float -} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {IInterpreterV4} from "rainlang-interface-0.2.13/src/interface/IInterpreterV4.sol"; import {IInterpreterStoreV3} from "rainlang-interface-0.2.13/src/interface/IInterpreterStoreV3.sol"; import {LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; @@ -71,7 +71,7 @@ contract RaindexV6FlashBorrowerRealTokenTransfersTest is Test { ); arb.arb4( - IRaindexV6(address(raindex)), + IRaindexV7(address(raindex)), TakeOrdersConfigV5({ minimumIO: LibDecimalFloat.packLossless(100, 0), maximumIO: LibDecimalFloat.packLossless(type(int224).max, 0), diff --git a/test/abstract/RaindexV6FlashBorrower.reentrancy.t.sol b/test/abstract/RaindexV6FlashBorrower.reentrancy.t.sol index 79dea5806c..c8966037e8 100644 --- a/test/abstract/RaindexV6FlashBorrower.reentrancy.t.sol +++ b/test/abstract/RaindexV6FlashBorrower.reentrancy.t.sol @@ -6,7 +6,7 @@ import {Test} from "forge-std-1.17.0/src/Test.sol"; import {GenericPoolRaindexV6FlashBorrower} from "../../src/concrete/arb/GenericPoolRaindexV6FlashBorrower.sol"; import { - IRaindexV6, + IRaindexV7, TakeOrdersConfigV5, TakeOrderConfigV4, OrderV4, @@ -14,7 +14,7 @@ import { EvaluableV4, SignedContextV1, TaskV2 -} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {IInterpreterV4} from "rainlang-interface-0.2.13/src/interface/IInterpreterV4.sol"; import {IInterpreterStoreV3} from "rainlang-interface-0.2.13/src/interface/IInterpreterStoreV3.sol"; import {LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; @@ -45,7 +45,7 @@ contract RaindexV6FlashBorrowerReentrancyTest is Test { GenericPoolRaindexV6FlashBorrower arb = new GenericPoolRaindexV6FlashBorrower(); // Deploy the reentrant exchange that will call arb4 when invoked. - ReentrantExchange exchange = new ReentrantExchange(arb, IRaindexV6(LibRaindexDeploy.RAINDEX_DEPLOYED_ADDRESS)); + ReentrantExchange exchange = new ReentrantExchange(arb, IRaindexV7(LibRaindexDeploy.RAINDEX_DEPLOYED_ADDRESS)); IOV2[] memory validInputs = new IOV2[](1); validInputs[0] = IOV2(address(inputToken), bytes32(0)); @@ -68,7 +68,7 @@ contract RaindexV6FlashBorrowerReentrancyTest is Test { vm.expectRevert(abi.encodeWithSelector(bytes4(keccak256("ReentrancyGuardReentrantCall()")))); arb.arb4( - IRaindexV6(LibRaindexDeploy.RAINDEX_DEPLOYED_ADDRESS), + IRaindexV7(LibRaindexDeploy.RAINDEX_DEPLOYED_ADDRESS), TakeOrdersConfigV5({ minimumIO: LibDecimalFloat.packLossless(100, 0), maximumIO: LibDecimalFloat.packLossless(type(int224).max, 0), diff --git a/test/abstract/RaindexV6FlashLender.griefRecipient.t.sol b/test/abstract/RaindexV6FlashLender.griefRecipient.t.sol index b8cb190da0..e7cd44d76f 100644 --- a/test/abstract/RaindexV6FlashLender.griefRecipient.t.sol +++ b/test/abstract/RaindexV6FlashLender.griefRecipient.t.sol @@ -6,7 +6,7 @@ import {RaindexV6ExternalMockTest} from "test/util/abstract/RaindexV6ExternalMoc import { IERC3156FlashBorrower, ON_FLASH_LOAN_CALLBACK_SUCCESS -} from "raindex-interface-0.1.8/src/interface/ierc3156/IERC3156FlashBorrower.sol"; +} from "raindex-interface-0.1.10/src/interface/ierc3156/IERC3156FlashBorrower.sol"; import {IERC20} from "@openzeppelin-contracts-5.7.0/token/ERC20/IERC20.sol"; import {FlashLenderCallbackFailed} from "../../src/abstract/RaindexV6FlashLender.sol"; diff --git a/test/abstract/RaindexV6FlashLender.mockSuccess.t.sol b/test/abstract/RaindexV6FlashLender.mockSuccess.t.sol index 4dec0d673a..60c6445eb9 100644 --- a/test/abstract/RaindexV6FlashLender.mockSuccess.t.sol +++ b/test/abstract/RaindexV6FlashLender.mockSuccess.t.sol @@ -6,7 +6,7 @@ import {RaindexV6ExternalMockTest} from "test/util/abstract/RaindexV6ExternalMoc import { IERC3156FlashBorrower, ON_FLASH_LOAN_CALLBACK_SUCCESS -} from "raindex-interface-0.1.8/src/interface/ierc3156/IERC3156FlashBorrower.sol"; +} from "raindex-interface-0.1.10/src/interface/ierc3156/IERC3156FlashBorrower.sol"; import {IERC20} from "@openzeppelin-contracts-5.7.0/token/ERC20/IERC20.sol"; /// @title RaindexV6FlashLenderMockSuccessTest diff --git a/test/abstract/RaindexV6FlashLender.reentrant.t.sol b/test/abstract/RaindexV6FlashLender.reentrant.t.sol index f3dcd4e569..0b1b55e387 100644 --- a/test/abstract/RaindexV6FlashLender.reentrant.t.sol +++ b/test/abstract/RaindexV6FlashLender.reentrant.t.sol @@ -5,14 +5,14 @@ pragma solidity =0.8.25; import {RaindexV6ExternalRealTest} from "test/util/abstract/RaindexV6ExternalRealTest.sol"; import {Reenteroor} from "test/util/concrete/Reenteroor.sol"; import { - IRaindexV6, + IRaindexV7, OrderConfigV4, OrderV4, TakeOrdersConfigV5, ClearConfigV2, TaskV2 -} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; -import {IERC3156FlashBorrower} from "raindex-interface-0.1.8/src/interface/ierc3156/IERC3156FlashBorrower.sol"; +} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; +import {IERC3156FlashBorrower} from "raindex-interface-0.1.10/src/interface/ierc3156/IERC3156FlashBorrower.sol"; import {IERC20} from "@openzeppelin-contracts-5.7.0/token/ERC20/IERC20.sol"; import {LibTestAddOrder} from "test/util/lib/LibTestAddOrder.sol"; import {LibTestTakeOrder} from "test/util/lib/LibTestTakeOrder.sol"; @@ -53,7 +53,7 @@ contract RaindexV6FlashLenderReentrant is RaindexV6ExternalRealTest { Reenteroor borrower = new Reenteroor(); checkFlashLoanNotRevert( borrower, - abi.encodeWithSelector(IRaindexV6.vaultBalance2.selector, address(borrower), address(iToken0), vaultId), + abi.encodeWithSelector(IRaindexV7.vaultBalance2.selector, address(borrower), address(iToken0), vaultId), loanAmount ); } @@ -64,7 +64,7 @@ contract RaindexV6FlashLenderReentrant is RaindexV6ExternalRealTest { // Create a flash borrower. Reenteroor borrower = new Reenteroor(); checkFlashLoanNotRevert( - borrower, abi.encodeWithSelector(IRaindexV6.orderExists.selector, orderHash), loanAmount + borrower, abi.encodeWithSelector(IRaindexV7.orderExists.selector, orderHash), loanAmount ); } @@ -86,7 +86,7 @@ contract RaindexV6FlashLenderReentrant is RaindexV6ExternalRealTest { checkFlashLoanNotRevert( borrower, abi.encodeWithSelector( - IRaindexV6.deposit4.selector, address(iToken0), vaultId, depositAmount, new EvaluableV4[](0) + IRaindexV7.deposit4.selector, address(iToken0), vaultId, depositAmount, new EvaluableV4[](0) ), loanAmount ); @@ -110,7 +110,7 @@ contract RaindexV6FlashLenderReentrant is RaindexV6ExternalRealTest { checkFlashLoanNotRevert( borrower, abi.encodeWithSelector( - IRaindexV6.withdraw4.selector, address(iToken0), vaultId, withdrawAmount, new TaskV2[](0) + IRaindexV7.withdraw4.selector, address(iToken0), vaultId, withdrawAmount, new TaskV2[](0) ), loanAmount ); @@ -125,7 +125,7 @@ contract RaindexV6FlashLenderReentrant is RaindexV6ExternalRealTest { // Create a flash borrower. Reenteroor borrower = new Reenteroor(); checkFlashLoanNotRevert( - borrower, abi.encodeWithSelector(IRaindexV6.addOrder4.selector, config, new TaskV2[](0)), loanAmount + borrower, abi.encodeWithSelector(IRaindexV7.addOrder4.selector, config, new TaskV2[](0)), loanAmount ); } @@ -136,7 +136,7 @@ contract RaindexV6FlashLenderReentrant is RaindexV6ExternalRealTest { Reenteroor borrower = new Reenteroor(); order.owner = address(borrower); checkFlashLoanNotRevert( - borrower, abi.encodeWithSelector(IRaindexV6.removeOrder3.selector, order, new TaskV2[](0)), loanAmount + borrower, abi.encodeWithSelector(IRaindexV7.removeOrder3.selector, order, new TaskV2[](0)), loanAmount ); } @@ -158,7 +158,7 @@ contract RaindexV6FlashLenderReentrant is RaindexV6ExternalRealTest { // Create a flash borrower. Reenteroor borrower = new Reenteroor(); checkFlashLoanNotRevert( - borrower, abi.encodeWithSelector(IRaindexV6.takeOrders4.selector, takeOrdersConfig), loanAmount + borrower, abi.encodeWithSelector(IRaindexV7.takeOrders4.selector, takeOrdersConfig), loanAmount ); } @@ -219,7 +219,7 @@ contract RaindexV6FlashLenderReentrant is RaindexV6ExternalRealTest { checkFlashLoanNotRevert( borrower, abi.encodeWithSelector( - IRaindexV6.clear3.selector, + IRaindexV7.clear4.selector, aliceOrder, bobOrder, clearConfig, diff --git a/test/abstract/RaindexV6FlashLender.transfers.t.sol b/test/abstract/RaindexV6FlashLender.transfers.t.sol index 30f54a8f22..38530a95f6 100644 --- a/test/abstract/RaindexV6FlashLender.transfers.t.sol +++ b/test/abstract/RaindexV6FlashLender.transfers.t.sol @@ -5,7 +5,7 @@ pragma solidity =0.8.25; import {RaindexV6ExternalMockTest} from "test/util/abstract/RaindexV6ExternalMockTest.sol"; import {IERC20Errors} from "@openzeppelin-contracts-5.7.0/token/ERC20/ERC20.sol"; -import {IERC3156FlashBorrower} from "raindex-interface-0.1.8/src/interface/ierc3156/IERC3156FlashBorrower.sol"; +import {IERC3156FlashBorrower} from "raindex-interface-0.1.10/src/interface/ierc3156/IERC3156FlashBorrower.sol"; import {FlashLenderCallbackFailed} from "../../src/abstract/RaindexV6FlashLender.sol"; import {TKN} from "test/util/concrete/TKN.sol"; import {IPull} from "test/util/concrete/IPull.sol"; diff --git a/test/concrete/arb/GenericPoolRaindexV6ArbOrderTaker.reentrantCallback.t.sol b/test/concrete/arb/GenericPoolRaindexV6ArbOrderTaker.reentrantCallback.t.sol index 40cd3a7077..1388988eb4 100644 --- a/test/concrete/arb/GenericPoolRaindexV6ArbOrderTaker.reentrantCallback.t.sol +++ b/test/concrete/arb/GenericPoolRaindexV6ArbOrderTaker.reentrantCallback.t.sol @@ -18,7 +18,7 @@ import { EvaluableV4, TaskV2, TakeOrdersConfigV5 -} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {IInterpreterV4} from "rainlang-interface-0.2.13/src/interface/IInterpreterV4.sol"; import {IInterpreterStoreV3} from "rainlang-interface-0.2.13/src/interface/IInterpreterStoreV3.sol"; import {TEST_INTERPRETER_ADDRESS} from "rainlang-0.2.19/test/lib/deploy/LibTestInterpreterDeploy.sol"; diff --git a/test/concrete/arb/GenericPoolRaindexV6ArbOrderTaker.sender.t.sol b/test/concrete/arb/GenericPoolRaindexV6ArbOrderTaker.sender.t.sol index 4742829804..53f540e2c4 100644 --- a/test/concrete/arb/GenericPoolRaindexV6ArbOrderTaker.sender.t.sol +++ b/test/concrete/arb/GenericPoolRaindexV6ArbOrderTaker.sender.t.sol @@ -14,7 +14,7 @@ import { IInterpreterStoreV3, TaskV2, SignedContextV1 -} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; import { TEST_INTERPRETER_ADDRESS, diff --git a/test/concrete/arb/GenericPoolRaindexV6FlashBorrower.exchangeTokenSelection.t.sol b/test/concrete/arb/GenericPoolRaindexV6FlashBorrower.exchangeTokenSelection.t.sol index ae03fed68c..d1991110b3 100644 --- a/test/concrete/arb/GenericPoolRaindexV6FlashBorrower.exchangeTokenSelection.t.sol +++ b/test/concrete/arb/GenericPoolRaindexV6FlashBorrower.exchangeTokenSelection.t.sol @@ -7,7 +7,7 @@ import {IERC20} from "@openzeppelin-contracts-5.7.0/token/ERC20/IERC20.sol"; import {GenericPoolRaindexV6FlashBorrower} from "../../../src/concrete/arb/GenericPoolRaindexV6FlashBorrower.sol"; import { - IRaindexV6, + IRaindexV7, TakeOrdersConfigV5, TakeOrderConfigV4, OrderV4, @@ -15,7 +15,7 @@ import { EvaluableV4, SignedContextV1, TaskV2 -} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {IInterpreterV4} from "rainlang-interface-0.2.13/src/interface/IInterpreterV4.sol"; import {IInterpreterStoreV3} from "rainlang-interface-0.2.13/src/interface/IInterpreterStoreV3.sol"; import {LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; @@ -96,7 +96,7 @@ contract GenericPoolRaindexV6FlashBorrowerExchangeTokenSelectionTest is Test { orders[0] = singleIoOrder(address(inputToken), address(outputToken)); orders[1] = singleIoOrder(address(inputToken), address(decoyToken)); - arb.arb4(IRaindexV6(raindex), takeOrdersConfig(orders), exchangeData(), noopTask()); + arb.arb4(IRaindexV7(raindex), takeOrdersConfig(orders), exchangeData(), noopTask()); // The real output token was the one swapped through the exchange. assertEq(outputToken.balanceOf(address(exchange)), 100e18, "exchange pulled first order output"); @@ -128,7 +128,7 @@ contract GenericPoolRaindexV6FlashBorrowerExchangeTokenSelectionTest is Test { // inputIOIndex 0, outputIOIndex 1. orders[0] = TakeOrderConfigV4(order, 0, 1, new SignedContextV1[](0)); - arb.arb4(IRaindexV6(raindex), takeOrdersConfig(orders), exchangeData(), noopTask()); + arb.arb4(IRaindexV7(raindex), takeOrdersConfig(orders), exchangeData(), noopTask()); // validOutputs[1] (the real output) was swapped through the exchange. assertEq(outputToken.balanceOf(address(exchange)), 100e18, "exchange pulled outputIOIndex token"); diff --git a/test/concrete/arb/GenericPoolRaindexV6FlashBorrower.sender.t.sol b/test/concrete/arb/GenericPoolRaindexV6FlashBorrower.sender.t.sol index d5f6d8ec58..916cea1d54 100644 --- a/test/concrete/arb/GenericPoolRaindexV6FlashBorrower.sender.t.sol +++ b/test/concrete/arb/GenericPoolRaindexV6FlashBorrower.sender.t.sol @@ -14,7 +14,7 @@ import { IInterpreterStoreV3, TaskV2, SignedContextV1 -} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {LibDecimalFloat, Float} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; import { TEST_INTERPRETER_ADDRESS, diff --git a/test/concrete/arb/RouteProcessorRaindexV6ArbOrderTaker.lossyRounding.t.sol b/test/concrete/arb/RouteProcessorRaindexV6ArbOrderTaker.lossyRounding.t.sol index 71c6165653..2733bd2398 100644 --- a/test/concrete/arb/RouteProcessorRaindexV6ArbOrderTaker.lossyRounding.t.sol +++ b/test/concrete/arb/RouteProcessorRaindexV6ArbOrderTaker.lossyRounding.t.sol @@ -6,7 +6,7 @@ import {Test} from "forge-std-1.17.0/src/Test.sol"; import {IRouteProcessor} from "src/interface/IRouteProcessor.sol"; import {RouteProcessorRaindexV6ArbOrderTaker} from "../../../src/concrete/arb/RouteProcessorRaindexV6ArbOrderTaker.sol"; -import {Float} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +import {Float} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; import {LibRainDeploy} from "rain-deploy-0.1.22/src/lib/LibRainDeploy.sol"; import {LibTOFUTokenDecimals} from "rain-tofu-erc20-decimals-0.1.4/src/lib/LibTOFUTokenDecimals.sol"; diff --git a/test/concrete/arb/RouteProcessorRaindexV6ArbOrderTaker.noEthForward.t.sol b/test/concrete/arb/RouteProcessorRaindexV6ArbOrderTaker.noEthForward.t.sol index 083462a1e7..c2c872ede1 100644 --- a/test/concrete/arb/RouteProcessorRaindexV6ArbOrderTaker.noEthForward.t.sol +++ b/test/concrete/arb/RouteProcessorRaindexV6ArbOrderTaker.noEthForward.t.sol @@ -5,7 +5,7 @@ pragma solidity =0.8.25; import {Test} from "forge-std-1.17.0/src/Test.sol"; import {RouteProcessorRaindexV6ArbOrderTaker} from "../../../src/concrete/arb/RouteProcessorRaindexV6ArbOrderTaker.sol"; -import {Float} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +import {Float} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {LibRainDeploy} from "rain-deploy-0.1.22/src/lib/LibRainDeploy.sol"; import {LibTOFUTokenDecimals} from "rain-tofu-erc20-decimals-0.1.4/src/lib/LibTOFUTokenDecimals.sol"; import {LibRaindexDeploy} from "../../../src/lib/deploy/LibRaindexDeploy.sol"; diff --git a/test/concrete/arb/RouteProcessorRaindexV6ArbOrderTaker.nonStandardDecimals.t.sol b/test/concrete/arb/RouteProcessorRaindexV6ArbOrderTaker.nonStandardDecimals.t.sol index ba2cf70c55..8d0ad762c1 100644 --- a/test/concrete/arb/RouteProcessorRaindexV6ArbOrderTaker.nonStandardDecimals.t.sol +++ b/test/concrete/arb/RouteProcessorRaindexV6ArbOrderTaker.nonStandardDecimals.t.sol @@ -7,7 +7,7 @@ import {IERC20} from "@openzeppelin-contracts-5.7.0/token/ERC20/IERC20.sol"; import {RouteProcessorRaindexV6ArbOrderTaker} from "../../../src/concrete/arb/RouteProcessorRaindexV6ArbOrderTaker.sol"; import { - IRaindexV6, + IRaindexV7, TakeOrdersConfigV5, TakeOrderConfigV4, OrderV4, @@ -16,7 +16,7 @@ import { SignedContextV1, TaskV2, Float -} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {IInterpreterV4} from "rainlang-interface-0.2.13/src/interface/IInterpreterV4.sol"; import {IInterpreterStoreV3} from "rainlang-interface-0.2.13/src/interface/IInterpreterStoreV3.sol"; import {LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; @@ -81,7 +81,7 @@ contract RouteProcessorRaindexV6ArbOrderTakerNonStandardDecimalsTest is Test { bytes memory takeOrdersData = abi.encode(hex""); arb.arb5( - IRaindexV6(address(raindex)), + IRaindexV7(address(raindex)), TakeOrdersConfigV5({ minimumIO: LibDecimalFloat.packLossless(100, 0), maximumIO: LibDecimalFloat.packLossless(type(int224).max, 0), diff --git a/test/concrete/arb/RouteProcessorRaindexV6ArbOrderTaker.onTakeOrders2.t.sol b/test/concrete/arb/RouteProcessorRaindexV6ArbOrderTaker.onTakeOrders2.t.sol index 17dda4d5b1..3051ebd0e6 100644 --- a/test/concrete/arb/RouteProcessorRaindexV6ArbOrderTaker.onTakeOrders2.t.sol +++ b/test/concrete/arb/RouteProcessorRaindexV6ArbOrderTaker.onTakeOrders2.t.sol @@ -7,7 +7,7 @@ import {IERC20} from "@openzeppelin-contracts-5.7.0/token/ERC20/IERC20.sol"; import {RouteProcessorRaindexV6ArbOrderTaker} from "../../../src/concrete/arb/RouteProcessorRaindexV6ArbOrderTaker.sol"; import { - IRaindexV6, + IRaindexV7, TakeOrdersConfigV5, TakeOrderConfigV4, OrderV4, @@ -16,7 +16,7 @@ import { SignedContextV1, TaskV2, Float -} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {IInterpreterV4} from "rainlang-interface-0.2.13/src/interface/IInterpreterV4.sol"; import {IInterpreterStoreV3} from "rainlang-interface-0.2.13/src/interface/IInterpreterStoreV3.sol"; import {LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; @@ -74,7 +74,7 @@ contract RouteProcessorRaindexV6ArbOrderTakerOnTakeOrders2Test is Test { bytes memory takeOrdersData = abi.encode(hex""); arb.arb5( - IRaindexV6(address(raindex)), + IRaindexV7(address(raindex)), TakeOrdersConfigV5({ minimumIO: LibDecimalFloat.packLossless(100, 0), maximumIO: LibDecimalFloat.packLossless(type(int224).max, 0), diff --git a/test/concrete/arb/RouteProcessorRaindexV6ArbOrderTaker.onTakeOrders2Direct.t.sol b/test/concrete/arb/RouteProcessorRaindexV6ArbOrderTaker.onTakeOrders2Direct.t.sol index 398e4dd2ef..a5bd53070b 100644 --- a/test/concrete/arb/RouteProcessorRaindexV6ArbOrderTaker.onTakeOrders2Direct.t.sol +++ b/test/concrete/arb/RouteProcessorRaindexV6ArbOrderTaker.onTakeOrders2Direct.t.sol @@ -5,7 +5,7 @@ pragma solidity =0.8.25; import {Test} from "forge-std-1.17.0/src/Test.sol"; import {RouteProcessorRaindexV6ArbOrderTaker} from "../../../src/concrete/arb/RouteProcessorRaindexV6ArbOrderTaker.sol"; -import {Float} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +import {Float} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {LibRainDeploy} from "rain-deploy-0.1.22/src/lib/LibRainDeploy.sol"; import {LibTOFUTokenDecimals} from "rain-tofu-erc20-decimals-0.1.4/src/lib/LibTOFUTokenDecimals.sol"; import {LibRaindexDeploy} from "../../../src/lib/deploy/LibRaindexDeploy.sol"; diff --git a/test/concrete/arb/RouteProcessorRaindexV6ArbOrderTaker.onTakeOrders2Fuzz.t.sol b/test/concrete/arb/RouteProcessorRaindexV6ArbOrderTaker.onTakeOrders2Fuzz.t.sol index 352bef0f2b..0b7d20225e 100644 --- a/test/concrete/arb/RouteProcessorRaindexV6ArbOrderTaker.onTakeOrders2Fuzz.t.sol +++ b/test/concrete/arb/RouteProcessorRaindexV6ArbOrderTaker.onTakeOrders2Fuzz.t.sol @@ -5,7 +5,7 @@ pragma solidity =0.8.25; import {Test} from "forge-std-1.17.0/src/Test.sol"; import {IRouteProcessor} from "src/interface/IRouteProcessor.sol"; import {RouteProcessorRaindexV6ArbOrderTaker} from "../../../src/concrete/arb/RouteProcessorRaindexV6ArbOrderTaker.sol"; -import {Float} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +import {Float} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; import {LibRaindexDeploy} from "../../../src/lib/deploy/LibRaindexDeploy.sol"; import {MockToken} from "test/util/concrete/MockToken.sol"; diff --git a/test/concrete/arb/RouteProcessorRaindexV6ArbOrderTaker.sender.t.sol b/test/concrete/arb/RouteProcessorRaindexV6ArbOrderTaker.sender.t.sol index b1697c528c..a87be18ed9 100644 --- a/test/concrete/arb/RouteProcessorRaindexV6ArbOrderTaker.sender.t.sol +++ b/test/concrete/arb/RouteProcessorRaindexV6ArbOrderTaker.sender.t.sol @@ -14,7 +14,7 @@ import { IInterpreterStoreV3, TaskV2, SignedContextV1 -} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {RouteProcessorRaindexV6ArbOrderTaker} from "../../../src/concrete/arb/RouteProcessorRaindexV6ArbOrderTaker.sol"; import {LibDecimalFloat, Float} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; import { diff --git a/test/concrete/arb/RouteProcessorRaindexV6ArbOrderTaker.tofuDecimals.t.sol b/test/concrete/arb/RouteProcessorRaindexV6ArbOrderTaker.tofuDecimals.t.sol index 3601c45e3e..fe2d9dc5fa 100644 --- a/test/concrete/arb/RouteProcessorRaindexV6ArbOrderTaker.tofuDecimals.t.sol +++ b/test/concrete/arb/RouteProcessorRaindexV6ArbOrderTaker.tofuDecimals.t.sol @@ -5,7 +5,7 @@ pragma solidity =0.8.25; import {Test} from "forge-std-1.17.0/src/Test.sol"; import {RouteProcessorRaindexV6ArbOrderTaker} from "../../../src/concrete/arb/RouteProcessorRaindexV6ArbOrderTaker.sol"; -import {Float} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +import {Float} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {LibRainDeploy} from "rain-deploy-0.1.22/src/lib/LibRainDeploy.sol"; import {LibTOFUTokenDecimals} from "rain-tofu-erc20-decimals-0.1.4/src/lib/LibTOFUTokenDecimals.sol"; import {LibRaindexDeploy} from "../../../src/lib/deploy/LibRaindexDeploy.sol"; diff --git a/test/concrete/raindex/RaindexV6.addOrder.entask.t.sol b/test/concrete/raindex/RaindexV6.addOrder.entask.t.sol index 0e7dc7b02e..213d728a08 100644 --- a/test/concrete/raindex/RaindexV6.addOrder.entask.t.sol +++ b/test/concrete/raindex/RaindexV6.addOrder.entask.t.sol @@ -9,7 +9,7 @@ import { TaskV2, OrderV4, SignedContextV1 -} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {LibTestAddOrder} from "test/util/lib/LibTestAddOrder.sol"; import {LibOrder} from "../../../src/lib/LibOrder.sol"; diff --git a/test/concrete/raindex/RaindexV6.addOrder.mock.t.sol b/test/concrete/raindex/RaindexV6.addOrder.mock.t.sol index 9b937b9ae4..55cee07420 100644 --- a/test/concrete/raindex/RaindexV6.addOrder.mock.t.sol +++ b/test/concrete/raindex/RaindexV6.addOrder.mock.t.sol @@ -3,7 +3,7 @@ pragma solidity =0.8.25; import {RaindexV6ExternalMockTest} from "test/util/abstract/RaindexV6ExternalMockTest.sol"; -import {OrderConfigV4, OrderV4, IOV2, EvaluableV4, TaskV2} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +import {OrderConfigV4, OrderV4, IOV2, EvaluableV4, TaskV2} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {LibTestAddOrder} from "test/util/lib/LibTestAddOrder.sol"; import {NotRainMetaV1, META_MAGIC_NUMBER_V1} from "rain-metadata-0.1.43/src/interface/unstable/IMetaV1_2.sol"; import {LibMeta} from "rain-metadata-0.1.43/src/lib/LibMeta.sol"; diff --git a/test/concrete/raindex/RaindexV6.addOrder.nonce.t.sol b/test/concrete/raindex/RaindexV6.addOrder.nonce.t.sol index 994df7637e..f077d22859 100644 --- a/test/concrete/raindex/RaindexV6.addOrder.nonce.t.sol +++ b/test/concrete/raindex/RaindexV6.addOrder.nonce.t.sol @@ -3,7 +3,7 @@ pragma solidity =0.8.25; import {RaindexV6ExternalRealTest} from "test/util/abstract/RaindexV6ExternalRealTest.sol"; -import {OrderConfigV4, OrderV4, EvaluableV4, TaskV2} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +import {OrderConfigV4, OrderV4, EvaluableV4, TaskV2} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {LibTestAddOrder} from "test/util/lib/LibTestAddOrder.sol"; import {LibOrder} from "../../../src/lib/LibOrder.sol"; diff --git a/test/concrete/raindex/RaindexV6.addOrder.owner.t.sol b/test/concrete/raindex/RaindexV6.addOrder.owner.t.sol index 4cb7fcad18..c1f3212a71 100644 --- a/test/concrete/raindex/RaindexV6.addOrder.owner.t.sol +++ b/test/concrete/raindex/RaindexV6.addOrder.owner.t.sol @@ -3,7 +3,7 @@ pragma solidity =0.8.25; import {RaindexV6ExternalRealTest} from "test/util/abstract/RaindexV6ExternalRealTest.sol"; -import {OrderConfigV4, OrderV4, EvaluableV4, TaskV2} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +import {OrderConfigV4, OrderV4, EvaluableV4, TaskV2} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {LibTestAddOrder} from "test/util/lib/LibTestAddOrder.sol"; import {LibOrder} from "../../../src/lib/LibOrder.sol"; diff --git a/test/concrete/raindex/RaindexV6.addOrder.t.sol b/test/concrete/raindex/RaindexV6.addOrder.t.sol index 29035f7b24..5193ec828f 100644 --- a/test/concrete/raindex/RaindexV6.addOrder.t.sol +++ b/test/concrete/raindex/RaindexV6.addOrder.t.sol @@ -4,7 +4,7 @@ pragma solidity =0.8.25; import {RaindexV6ExternalRealTest} from "test/util/abstract/RaindexV6ExternalRealTest.sol"; import {LibTestAddOrder} from "test/util/lib/LibTestAddOrder.sol"; -import {OrderConfigV4, EvaluableV4, TaskV2} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +import {OrderConfigV4, EvaluableV4, TaskV2} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {IParserV2} from "rainlang-interface-0.2.13/src/interface/IParserV2.sol"; import {UnsupportedCalculateOutputs} from "../../../src/error/ErrRaindexV6.sol"; diff --git a/test/concrete/raindex/RaindexV6.calculateOrderIOHarness.t.sol b/test/concrete/raindex/RaindexV6.calculateOrderIOHarness.t.sol index c9e0b0ef3b..6f15b1b334 100644 --- a/test/concrete/raindex/RaindexV6.calculateOrderIOHarness.t.sol +++ b/test/concrete/raindex/RaindexV6.calculateOrderIOHarness.t.sol @@ -23,7 +23,7 @@ import { } from "src/lib/LibRaindex.sol"; import {Float, LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; import { - IRaindexV6, + IRaindexV7, OrderV4, OrderConfigV4, QuoteV2, @@ -31,7 +31,7 @@ import { EvaluableV4, SignedContextV1, TaskV2 -} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {IInterpreterV4, EvalV4, StackItem} from "rainlang-interface-0.2.13/src/interface/IInterpreterV4.sol"; import {IInterpreterStoreV3} from "rainlang-interface-0.2.13/src/interface/IInterpreterStoreV3.sol"; import {ITOFUTokenDecimals, TOFUOutcome} from "rain-tofu-erc20-decimals-0.1.4/src/interface/ITOFUTokenDecimals.sol"; @@ -464,7 +464,7 @@ contract RaindexV6CalculateOrderIOHarnessTest is Test { meta: "" }); vm.prank(order.owner); - IRaindexV6(address(harness)).addOrder4(config, new TaskV2[](0)); + IRaindexV7(address(harness)).addOrder4(config, new TaskV2[](0)); } /// A LIVE order quotes `(true, vault-capped outputMax, IORatio)`. The output @@ -479,7 +479,7 @@ contract RaindexV6CalculateOrderIOHarnessTest is Test { QuoteV2 memory quoteConfig = QuoteV2({order: order, inputIOIndex: 0, outputIOIndex: 0, signedContext: new SignedContextV1[](0)}); - (bool exists, Float outputMax, Float ioRatio) = IRaindexV6(address(harness)).quote2(quoteConfig); + (bool exists, Float outputMax, Float ioRatio) = IRaindexV7(address(harness)).quote2(quoteConfig); assertTrue(exists, "live order exists"); assertTrue(outputMax.eq(LibDecimalFloat.packLossless(9, 0)), "quote output max vault-capped to 9"); @@ -499,7 +499,7 @@ contract RaindexV6CalculateOrderIOHarnessTest is Test { QuoteV2 memory quoteConfig = QuoteV2({order: order, inputIOIndex: 0, outputIOIndex: 0, signedContext: new SignedContextV1[](0)}); - (bool exists, Float outputMax, Float ioRatio) = IRaindexV6(address(harness)).quote2(quoteConfig); + (bool exists, Float outputMax, Float ioRatio) = IRaindexV7(address(harness)).quote2(quoteConfig); assertFalse(exists, "dead order does not exist"); assertTrue(outputMax.isZero(), "dead order output max zero"); @@ -516,11 +516,11 @@ contract RaindexV6CalculateOrderIOHarnessTest is Test { _setStack(LibDecimalFloat.packLossless(3, 0), LibDecimalFloat.packLossless(50, 0)); _addOrder(order); vm.prank(order.owner); - IRaindexV6(address(harness)).removeOrder3(order, new TaskV2[](0)); + IRaindexV7(address(harness)).removeOrder3(order, new TaskV2[](0)); QuoteV2 memory quoteConfig = QuoteV2({order: order, inputIOIndex: 0, outputIOIndex: 0, signedContext: new SignedContextV1[](0)}); - (bool exists, Float outputMax, Float ioRatio) = IRaindexV6(address(harness)).quote2(quoteConfig); + (bool exists, Float outputMax, Float ioRatio) = IRaindexV7(address(harness)).quote2(quoteConfig); assertFalse(exists, "removed order does not exist"); assertTrue(outputMax.isZero(), "removed order output max zero"); @@ -554,7 +554,7 @@ contract RaindexV6CalculateOrderIOHarnessTest is Test { QuoteV2 memory quoteConfig = QuoteV2({order: order, inputIOIndex: 0, outputIOIndex: 0, signedContext: new SignedContextV1[](0)}); - vm.expectRevert(abi.encodeWithSelector(IRaindexV6.TokenSelfTrade.selector)); - IRaindexV6(address(harness)).quote2(quoteConfig); + vm.expectRevert(abi.encodeWithSelector(IRaindexV7.TokenSelfTrade.selector)); + IRaindexV7(address(harness)).quote2(quoteConfig); } } diff --git a/test/concrete/raindex/RaindexV6.clear.badStack.t.sol b/test/concrete/raindex/RaindexV6.clear.badStack.t.sol index fbe8140528..62d2c573bc 100644 --- a/test/concrete/raindex/RaindexV6.clear.badStack.t.sol +++ b/test/concrete/raindex/RaindexV6.clear.badStack.t.sol @@ -11,7 +11,7 @@ import { ClearConfigV2, SignedContextV1, TaskV2 -} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {UnsupportedCalculateOutputs} from "../../../src/error/ErrRaindexV6.sol"; import {IERC20Metadata} from "@openzeppelin-contracts-5.7.0/token/ERC20/extensions/IERC20Metadata.sol"; @@ -49,7 +49,7 @@ contract RaindexV6ClearOrderBadStackTest is RaindexV6ExternalRealTest { iRaindex.addOrder4(configBob, new TaskV2[](0)); vm.expectRevert(abi.encodeWithSelector(UnsupportedCalculateOutputs.selector, badStackHeight)); - iRaindex.clear3( + iRaindex.clear4( orderAlice, orderBob, ClearConfigV2(0, 0, 0, 0, 0, 0), new SignedContextV1[](0), new SignedContextV1[](0) ); } diff --git a/test/concrete/raindex/RaindexV6.clear.calculateStateChange.t.sol b/test/concrete/raindex/RaindexV6.clear.calculateStateChange.t.sol index 9655b04807..c59ecf1161 100644 --- a/test/concrete/raindex/RaindexV6.clear.calculateStateChange.t.sol +++ b/test/concrete/raindex/RaindexV6.clear.calculateStateChange.t.sol @@ -4,8 +4,8 @@ pragma solidity =0.8.25; import {Test} from "forge-std-1.17.0/src/Test.sol"; import {OrderIOCalculationV4} from "src/struct/OrderIOCalculationV4.sol"; -import {ClearStateChangeV2} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; -import {OrderV4} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +import {ClearStateChangeV2} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; +import {OrderV4} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {Float, LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; import {StateNamespace} from "rainlang-interface-0.2.13/src/interface/IInterpreterV4.sol"; import {IRaindexV6ClearStateChangeHarness} from "test/util/interface/IRaindexV6ClearStateChangeHarness.sol"; @@ -17,7 +17,7 @@ import {IRaindexV6ClearStateChangeHarness} from "test/util/interface/IRaindexV6C /// each order's OUTPUT is the smaller of its own max output and the /// counterparty-derived cap. The difference (output - counterparty input) is the /// bounty; a ratio mismatch that makes inputs exceed available outputs reverts -/// (NegativeBounty) at the clear3 layer. +/// (NegativeBounty) at the clear4 layer. contract RaindexV6ClearStateChangeTest is Test { using LibDecimalFloat for Float; diff --git a/test/concrete/raindex/RaindexV6.clear.context.t.sol b/test/concrete/raindex/RaindexV6.clear.context.t.sol index 535254c099..639834db66 100644 --- a/test/concrete/raindex/RaindexV6.clear.context.t.sol +++ b/test/concrete/raindex/RaindexV6.clear.context.t.sol @@ -12,7 +12,7 @@ import { SignedContextV1, IOV2, EvaluableV4 -} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {REVERTING_MOCK_BYTECODE} from "test/util/lib/LibTestConstants.sol"; import {IERC20} from "@openzeppelin-contracts-5.7.0/token/ERC20/IERC20.sol"; @@ -243,7 +243,7 @@ contract RaindexV6ClearOrderContextTest is RaindexV6ExternalRealTest { mockVault0Input(address(iToken0), alice, 3e12); } - iRaindex.clear3( + iRaindex.clear4( orderAlice, orderBob, ClearConfigV2(0, 0, 0, 0, 0, 0), new SignedContextV1[](0), new SignedContextV1[](0) ); } diff --git a/test/concrete/raindex/RaindexV6.clear.deadOrder.t.sol b/test/concrete/raindex/RaindexV6.clear.deadOrder.t.sol index 3dc4bc87ce..479109b5bd 100644 --- a/test/concrete/raindex/RaindexV6.clear.deadOrder.t.sol +++ b/test/concrete/raindex/RaindexV6.clear.deadOrder.t.sol @@ -7,15 +7,15 @@ import {RaindexV6ExternalRealTest} from "test/util/abstract/RaindexV6ExternalRea import {LibTestAddOrder} from "test/util/lib/LibTestAddOrder.sol"; import {LibTestTakeOrder} from "test/util/lib/LibTestTakeOrder.sol"; import {LibOrder} from "../../../src/lib/LibOrder.sol"; -import {OrderConfigV4, OrderV4, ClearConfigV2, TaskV2} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +import {OrderConfigV4, OrderV4, ClearConfigV2, TaskV2} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {SignedContextV1} from "rainlang-interface-0.2.13/src/interface/deprecated/v1/IInterpreterCallerV2.sol"; /// @title RaindexV6ClearDeadOrderTest -/// If either order passed to `clear3` is dead (never added, or removed) the +/// If either order passed to `clear4` is dead (never added, or removed) the /// clear is a no-op: it emits `OrderNotFound` for the dead order, returns /// without reverting (so a bulk Multicall clear is not aborted), and makes no /// vault state change. This is distinct from the take-orders dead path and was -/// previously untested for `clear3`. +/// previously untested for `clear4`. contract RaindexV6ClearDeadOrderTest is RaindexV6ExternalRealTest { using LibOrder for OrderV4; @@ -39,7 +39,7 @@ contract RaindexV6ClearDeadOrderTest is RaindexV6ExternalRealTest { } /// Alice's order is dead (never added). Bob's order is irrelevant because - /// the alice check comes first: clear3 emits OrderNotFound for alice's hash + /// the alice check comes first: clear4 emits OrderNotFound for alice's hash /// and returns, with no other logs and no revert. /// forge-config: default.fuzz.runs = 10 function testClearAliceDead( @@ -63,7 +63,7 @@ contract RaindexV6ClearDeadOrderTest is RaindexV6ExternalRealTest { vm.expectEmit(address(iRaindex)); emit OrderNotFound(address(this), alice, orderAlice.hash()); vm.recordLogs(); - iRaindex.clear3( + iRaindex.clear4( orderAlice, orderBob, ClearConfigV2(0, 0, 0, 0, 0, 0), new SignedContextV1[](0), new SignedContextV1[](0) ); @@ -78,7 +78,7 @@ contract RaindexV6ClearDeadOrderTest is RaindexV6ExternalRealTest { assertEq(orderHash, orderAlice.hash(), "hash"); } - /// Alice's order is live, Bob's order is dead (never added). clear3 passes + /// Alice's order is live, Bob's order is dead (never added). clear4 passes /// the alice liveness check and then emits OrderNotFound for bob's hash and /// returns. This pins that the SECOND (bob) dead-order check exists and uses /// bob's owner/hash, not alice's. @@ -107,7 +107,7 @@ contract RaindexV6ClearDeadOrderTest is RaindexV6ExternalRealTest { vm.expectEmit(address(iRaindex)); emit OrderNotFound(address(this), bob, orderBob.hash()); vm.recordLogs(); - iRaindex.clear3( + iRaindex.clear4( orderAlice, orderBob, ClearConfigV2(0, 0, 0, 0, 0, 0), new SignedContextV1[](0), new SignedContextV1[](0) ); diff --git a/test/concrete/raindex/RaindexV6.clear.freshDriver.t.sol b/test/concrete/raindex/RaindexV6.clear.freshDriver.t.sol index d8f5aabd79..8ce3d8822d 100644 --- a/test/concrete/raindex/RaindexV6.clear.freshDriver.t.sol +++ b/test/concrete/raindex/RaindexV6.clear.freshDriver.t.sol @@ -16,7 +16,7 @@ import { IInterpreterV4, IInterpreterStoreV3, TaskV2 -} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {Float, LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; import {LibRainDeploy} from "rain-deploy-0.1.22/src/lib/LibRainDeploy.sol"; import {LibTOFUTokenDecimals} from "rain-tofu-erc20-decimals-0.1.4/src/lib/LibTOFUTokenDecimals.sol"; @@ -39,12 +39,12 @@ import { } from "rain-math-float-deploy-0.1.7/src/generated/0_1_5/DecimalFloat.sol"; /// @title RaindexV6ClearFreshDriverTest -/// @notice Drives the FULL `clear3` against fresh-compiled RaindexV6 bytecode so +/// @notice Drives the FULL `clear4` against fresh-compiled RaindexV6 bytecode so /// source mutations to the bounty computation, the NegativeBounty guard, the /// record-vault ordering, the bounty crediting, ClearZeroAmount and AfterClearV2 /// are actually observable (the etched mock/real suites are blind to src /// mutations). Uses internal (non-zero) vaults so the IO legs are pure internal -/// balance changes with no token plumbing, isolating the clear3 accounting. +/// balance changes with no token plumbing, isolating the clear4 accounting. contract RaindexV6ClearFreshDriverTest is Test { using LibDecimalFloat for Float; using LibOrder for OrderV4; @@ -64,7 +64,7 @@ contract RaindexV6ClearFreshDriverTest is Test { bytes32 internal constant ALICE_BOUNTY_VAULT = bytes32(uint256(0xaab0)); bytes32 internal constant BOB_BOUNTY_VAULT = bytes32(uint256(0xbbb0)); - // Events mirrored from IRaindexV6 for expectEmit. + // Events mirrored from IRaindexV7 for expectEmit. event AfterClearV2(address sender, ClearStateChangeV2 clearStateChange); event ClearV3(address sender, OrderV4 alice, OrderV4 bob, ClearConfigV2 clearConfig); @@ -138,7 +138,7 @@ contract RaindexV6ClearFreshDriverTest is Test { function doClear(OrderV4 memory aliceOrder, OrderV4 memory bobOrder) internal { vm.prank(bountyBot); - raindex.clear3(aliceOrder, bobOrder, clearConfig(), new SignedContextV1[](0), new SignedContextV1[](0)); + raindex.clear4(aliceOrder, bobOrder, clearConfig(), new SignedContextV1[](0), new SignedContextV1[](0)); } // --------------------------------------------------------------------- @@ -232,7 +232,7 @@ contract RaindexV6ClearFreshDriverTest is Test { /// Both ratios > 1 so each side's required input exceeds the counterparty's /// output: aliceInput caps to bob.outputMax, but aliceOutput = input/ratio < - /// input, making aliceBounty = aliceOutput - bobInput negative. clear3 must + /// input, making aliceBounty = aliceOutput - bobInput negative. clear4 must /// revert NegativeBounty (the spread is unprofitable / would drain the dex). function testFreshClearNegativeBountyReverts() external { (OrderV4 memory aliceOrder, OrderV4 memory bobOrder) = @@ -240,7 +240,7 @@ contract RaindexV6ClearFreshDriverTest is Test { vm.prank(bountyBot); vm.expectRevert(NegativeBounty.selector); - raindex.clear3(aliceOrder, bobOrder, clearConfig(), new SignedContextV1[](0), new SignedContextV1[](0)); + raindex.clear4(aliceOrder, bobOrder, clearConfig(), new SignedContextV1[](0), new SignedContextV1[](0)); } /// ASYMMETRIC: ONLY alice's bounty is negative, bob's is exactly zero. @@ -257,7 +257,7 @@ contract RaindexV6ClearFreshDriverTest is Test { vm.prank(bountyBot); vm.expectRevert(NegativeBounty.selector); - raindex.clear3(aliceOrder, bobOrder, clearConfig(), new SignedContextV1[](0), new SignedContextV1[](0)); + raindex.clear4(aliceOrder, bobOrder, clearConfig(), new SignedContextV1[](0), new SignedContextV1[](0)); } /// ASYMMETRIC mirror: ONLY bob's bounty is negative, alice's is exactly zero. @@ -272,7 +272,7 @@ contract RaindexV6ClearFreshDriverTest is Test { vm.prank(bountyBot); vm.expectRevert(NegativeBounty.selector); - raindex.clear3(aliceOrder, bobOrder, clearConfig(), new SignedContextV1[](0), new SignedContextV1[](0)); + raindex.clear4(aliceOrder, bobOrder, clearConfig(), new SignedContextV1[](0), new SignedContextV1[](0)); } /// The NegativeBounty guard must run BEFORE any bounty vault is credited and @@ -285,7 +285,7 @@ contract RaindexV6ClearFreshDriverTest is Test { wireOrders(f(11, -1), f(1, 0), f(11, -1), f(1, 0), f(10, 0)); vm.prank(bountyBot); - try raindex.clear3(aliceOrder, bobOrder, clearConfig(), new SignedContextV1[](0), new SignedContextV1[](0)) { + try raindex.clear4(aliceOrder, bobOrder, clearConfig(), new SignedContextV1[](0), new SignedContextV1[](0)) { revert("clear should have reverted"); } catch {} @@ -307,7 +307,7 @@ contract RaindexV6ClearFreshDriverTest is Test { vm.prank(bountyBot); vm.expectRevert(ClearZeroAmount.selector); - raindex.clear3(aliceOrder, bobOrder, clearConfig(), new SignedContextV1[](0), new SignedContextV1[](0)); + raindex.clear4(aliceOrder, bobOrder, clearConfig(), new SignedContextV1[](0), new SignedContextV1[](0)); } function testFreshClearBothZeroOutputReverts() external { @@ -363,7 +363,7 @@ contract RaindexV6ClearFreshDriverTest is Test { vm.prank(bountyBot); vm.expectRevert(ClearZeroAmount.selector); - raindex.clear3(aliceOrder, bobOrder, clearConfig(), new SignedContextV1[](0), new SignedContextV1[](0)); + raindex.clear4(aliceOrder, bobOrder, clearConfig(), new SignedContextV1[](0), new SignedContextV1[](0)); assertEq(store.get(aliceNamespace, bytes32(uint256(1))), bytes32(0), "alice store unchanged"); } @@ -413,7 +413,7 @@ contract RaindexV6ClearFreshDriverTest is Test { vm.prank(bountyBot); vm.expectPartialRevert(ExponentUnderflow.selector); - raindex.clear3(aliceOrder, bobOrder, clearConfig(), new SignedContextV1[](0), new SignedContextV1[](0)); + raindex.clear4(aliceOrder, bobOrder, clearConfig(), new SignedContextV1[](0), new SignedContextV1[](0)); } function testFreshClearBobCappedOutputUnderflowReverts() external { @@ -422,7 +422,7 @@ contract RaindexV6ClearFreshDriverTest is Test { vm.prank(bountyBot); vm.expectPartialRevert(ExponentUnderflow.selector); - raindex.clear3(aliceOrder, bobOrder, clearConfig(), new SignedContextV1[](0), new SignedContextV1[](0)); + raindex.clear4(aliceOrder, bobOrder, clearConfig(), new SignedContextV1[](0), new SignedContextV1[](0)); } // --------------------------------------------------------------------- @@ -527,7 +527,7 @@ contract RaindexV6ClearFreshDriverTest is Test { // SameOwner is selector-checked from src; import not needed because we // use the raw 4-byte selector of the error in the src file. vm.expectRevert(bytes4(keccak256("SameOwner()"))); - raindex.clear3(aliceOrder, bobOrder, clearConfig(), new SignedContextV1[](0), new SignedContextV1[](0)); + raindex.clear4(aliceOrder, bobOrder, clearConfig(), new SignedContextV1[](0), new SignedContextV1[](0)); } /// TokenMismatch (leg 1 ONLY): alice's OUTPUT token must equal bob's INPUT @@ -544,7 +544,7 @@ contract RaindexV6ClearFreshDriverTest is Test { vm.prank(bountyBot); vm.expectRevert(bytes4(keccak256("TokenMismatch()"))); - raindex.clear3(aliceOrder, bobOrder, clearConfig(), new SignedContextV1[](0), new SignedContextV1[](0)); + raindex.clear4(aliceOrder, bobOrder, clearConfig(), new SignedContextV1[](0), new SignedContextV1[](0)); } /// TokenMismatch (leg 2): bob's OUTPUT token must equal alice's INPUT token. @@ -559,7 +559,7 @@ contract RaindexV6ClearFreshDriverTest is Test { vm.prank(bountyBot); vm.expectRevert(bytes4(keccak256("TokenMismatch()"))); - raindex.clear3(aliceOrder, bobOrder, clearConfig(), new SignedContextV1[](0), new SignedContextV1[](0)); + raindex.clear4(aliceOrder, bobOrder, clearConfig(), new SignedContextV1[](0), new SignedContextV1[](0)); } /// TokenSelfTrade: alice's input token == alice's output token reverts @@ -574,10 +574,10 @@ contract RaindexV6ClearFreshDriverTest is Test { vm.prank(bountyBot); vm.expectRevert(bytes4(keccak256("TokenSelfTrade()"))); - raindex.clear3(aliceOrder, bobOrder, clearConfig(), new SignedContextV1[](0), new SignedContextV1[](0)); + raindex.clear4(aliceOrder, bobOrder, clearConfig(), new SignedContextV1[](0), new SignedContextV1[](0)); } - /// Dead alice order (never made live): clear3 emits OrderNotFound for alice's + /// Dead alice order (never made live): clear4 emits OrderNotFound for alice's /// hash and RETURNS without reverting (best-effort bulk-clear semantics). /// Exactly one log, no ClearV3/AfterClearV2. Pins the first dead-order check /// (B17) AND that ClearV3 has not been emitted yet (B18 ordering). @@ -588,7 +588,7 @@ contract RaindexV6ClearFreshDriverTest is Test { vm.recordLogs(); vm.prank(bountyBot); - raindex.clear3(aliceOrder, bobOrder, clearConfig(), new SignedContextV1[](0), new SignedContextV1[](0)); + raindex.clear4(aliceOrder, bobOrder, clearConfig(), new SignedContextV1[](0), new SignedContextV1[](0)); Vm.Log[] memory logs = vm.getRecordedLogs(); assertEq(logs.length, 1, "only OrderNotFound emitted"); @@ -610,7 +610,7 @@ contract RaindexV6ClearFreshDriverTest is Test { vm.recordLogs(); vm.prank(bountyBot); - raindex.clear3(aliceOrder, bobOrder, clearConfig(), new SignedContextV1[](0), new SignedContextV1[](0)); + raindex.clear4(aliceOrder, bobOrder, clearConfig(), new SignedContextV1[](0), new SignedContextV1[](0)); Vm.Log[] memory logs = vm.getRecordedLogs(); assertEq(logs.length, 1, "only OrderNotFound emitted"); diff --git a/test/concrete/raindex/RaindexV6.clear.handleIO.revert.t.sol b/test/concrete/raindex/RaindexV6.clear.handleIO.revert.t.sol index 62f23ac912..bcfc895db1 100644 --- a/test/concrete/raindex/RaindexV6.clear.handleIO.revert.t.sol +++ b/test/concrete/raindex/RaindexV6.clear.handleIO.revert.t.sol @@ -13,7 +13,7 @@ import { SignedContextV1, TaskV2, Float -} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; import {LibTestTakeOrder} from "test/util/lib/LibTestTakeOrder.sol"; @@ -114,12 +114,12 @@ contract RaindexV6ClearHandleIORevertTest is RaindexV6ExternalRealTest { if (aliceErr.length > 0) { vm.expectRevert(aliceErr); } - iRaindex.clear3(aliceOrder, bobOrder, clearConfig, new SignedContextV1[](0), new SignedContextV1[](0)); + iRaindex.clear4(aliceOrder, bobOrder, clearConfig, new SignedContextV1[](0), new SignedContextV1[](0)); if (bobErr.length > 0) { vm.expectRevert(bobErr); } - iRaindex.clear3(bobOrder, aliceOrder, clearConfig, new SignedContextV1[](0), new SignedContextV1[](0)); + iRaindex.clear4(bobOrder, aliceOrder, clearConfig, new SignedContextV1[](0), new SignedContextV1[](0)); } function testClearOrderHandleIO0() external { diff --git a/test/concrete/raindex/RaindexV6.clear.mock.t.sol b/test/concrete/raindex/RaindexV6.clear.mock.t.sol index 8d340e2024..6b3c58b9ae 100644 --- a/test/concrete/raindex/RaindexV6.clear.mock.t.sol +++ b/test/concrete/raindex/RaindexV6.clear.mock.t.sol @@ -16,7 +16,7 @@ import { IInterpreterV4, TaskV2, Float -} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {LibTestAddOrder} from "test/util/lib/LibTestAddOrder.sol"; import {NotOrderOwner, NegativeBounty, ClearZeroAmount} from "../../../src/error/ErrRaindexV6.sol"; import {LibNamespace} from "rainlang-interface-0.2.13/src/lib/ns/LibNamespace.sol"; @@ -393,7 +393,7 @@ contract RaindexV6ClearTest is RaindexV6ExternalMockTest { if (clear.expectedError.length > 0) { vm.expectRevert(clear.expectedError); } - iRaindex.clear3(aliceOrder, bobOrder, configClear, new SignedContextV1[](0), new SignedContextV1[](0)); + iRaindex.clear4(aliceOrder, bobOrder, configClear, new SignedContextV1[](0), new SignedContextV1[](0)); } if (clear.expectedError.length == 0) { diff --git a/test/concrete/raindex/RaindexV6.clear.sameOwner.t.sol b/test/concrete/raindex/RaindexV6.clear.sameOwner.t.sol index 3d6104e1b3..bf6a2d6b94 100644 --- a/test/concrete/raindex/RaindexV6.clear.sameOwner.t.sol +++ b/test/concrete/raindex/RaindexV6.clear.sameOwner.t.sol @@ -5,7 +5,7 @@ pragma solidity =0.8.25; import {RaindexV6ExternalRealTest} from "test/util/abstract/RaindexV6ExternalRealTest.sol"; import {LibTestAddOrder} from "test/util/lib/LibTestAddOrder.sol"; import {LibTestTakeOrder} from "test/util/lib/LibTestTakeOrder.sol"; -import {OrderConfigV4, OrderV4, ClearConfigV2, TaskV2} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +import {OrderConfigV4, OrderV4, ClearConfigV2, TaskV2} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {SignedContextV1} from "rainlang-interface-0.2.13/src/interface/deprecated/v1/IInterpreterCallerV2.sol"; import {SameOwner} from "../../../src/error/ErrRaindexV6.sol"; @@ -36,7 +36,7 @@ contract RaindexV6ClearSameOwnerTest is RaindexV6ExternalRealTest { OrderV4 memory orderBob = LibTestTakeOrder.extractOrderFromLogs(vm.getRecordedLogs()); vm.expectRevert(abi.encodeWithSelector(SameOwner.selector)); - iRaindex.clear3( + iRaindex.clear4( orderAlice, orderBob, ClearConfigV2(0, 0, 0, 0, 0, 0), new SignedContextV1[](0), new SignedContextV1[](0) ); } diff --git a/test/concrete/raindex/RaindexV6.clear.sameToken.t.sol b/test/concrete/raindex/RaindexV6.clear.sameToken.t.sol index cb1bcd3bb6..d22ff22272 100644 --- a/test/concrete/raindex/RaindexV6.clear.sameToken.t.sol +++ b/test/concrete/raindex/RaindexV6.clear.sameToken.t.sol @@ -4,14 +4,14 @@ pragma solidity =0.8.25; import {RaindexV6ExternalRealTest} from "test/util/abstract/RaindexV6ExternalRealTest.sol"; import { - IRaindexV6, + IRaindexV7, OrderConfigV4, OrderV4, EvaluableV4, ClearConfigV2, SignedContextV1, TaskV2 -} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {LibTestAddOrder} from "test/util/lib/LibTestAddOrder.sol"; contract RaindexV6ClearSameTokenTest is RaindexV6ExternalRealTest { @@ -42,8 +42,8 @@ contract RaindexV6ClearSameTokenTest is RaindexV6ExternalRealTest { vm.prank(bob); iRaindex.addOrder4(configBob, new TaskV2[](0)); - vm.expectRevert(abi.encodeWithSelector(IRaindexV6.TokenSelfTrade.selector)); - iRaindex.clear3( + vm.expectRevert(abi.encodeWithSelector(IRaindexV7.TokenSelfTrade.selector)); + iRaindex.clear4( orderAlice, orderBob, ClearConfigV2(0, 0, 0, 0, 0, 0), new SignedContextV1[](0), new SignedContextV1[](0) ); } diff --git a/test/concrete/raindex/RaindexV6.clear.signedContextRouting.t.sol b/test/concrete/raindex/RaindexV6.clear.signedContextRouting.t.sol new file mode 100644 index 0000000000..93eee85509 --- /dev/null +++ b/test/concrete/raindex/RaindexV6.clear.signedContextRouting.t.sol @@ -0,0 +1,193 @@ +// SPDX-License-Identifier: LicenseRef-DCL-1.0 +// SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd +pragma solidity =0.8.25; + +import {RaindexV6ExternalRealTest} from "test/util/abstract/RaindexV6ExternalRealTest.sol"; +import { + OrderConfigV4, + OrderV4, + TaskV2, + ClearConfigV2, + SignedContextV1, + IOV2, + EvaluableV4 +} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; +import {IRaindexV6} from "raindex-interface-0.1.10/src/interface/deprecated/v6/IRaindexV6.sol"; +import {IERC20} from "@openzeppelin-contracts-5.7.0/token/ERC20/IERC20.sol"; +import {MessageHashUtils} from "@openzeppelin-contracts-5.7.0/utils/cryptography/MessageHashUtils.sol"; +import {Strings} from "@openzeppelin-contracts-5.7.0/utils/Strings.sol"; +import {LibDecimalFloat, Float} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; + +/// @title RaindexV6ClearSignedContextRoutingTest +/// @notice `clear4` evaluates alice's order with `aliceSignedContext` and bob's +/// with `bobSignedContext`, matching `quote2`/`takeOrders4`. Each order's +/// expression asserts the signer and signed content it sees, so routing is +/// pinned by signer and content rather than slot. Runs against fresh-compiled +/// RaindexV6 so source mutations are observable. +contract RaindexV6ClearSignedContextRoutingTest is RaindexV6ExternalRealTest { + using Strings for address; + using Strings for uint256; + using LibDecimalFloat for Float; + + bytes32 internal constant ALICE_IN = bytes32(uint256(0xa1)); + bytes32 internal constant ALICE_OUT = bytes32(uint256(0xa2)); + bytes32 internal constant BOB_IN = bytes32(uint256(0xb1)); + bytes32 internal constant BOB_OUT = bytes32(uint256(0xb2)); + + function setUp() external { + vm.etch(address(iRaindex), vm.getDeployedCode("RaindexV6.sol:RaindexV6")); + } + + function signedContext(uint256 pk, bytes32 content) internal pure returns (SignedContextV1[] memory) { + bytes32[] memory context = new bytes32[](1); + context[0] = content; + (uint8 v, bytes32 r, bytes32 s) = + vm.sign(pk, MessageHashUtils.toEthSignedMessageHash(keccak256(abi.encodePacked(context)))); + SignedContextV1[] memory signedContexts = new SignedContextV1[](1); + signedContexts[0] = + SignedContextV1({signer: vm.addr(pk), context: context, signature: abi.encodePacked(r, s, v)}); + return signedContexts; + } + + function expectingBytecode(string memory name, address expectedSigner, bytes32 expectedContent) + internal + view + returns (bytes memory) + { + return iParserV2.parse2( + bytes( + string.concat( + "using-words-from ", + address(iSubParser).toHexString(), + "\n:ensure(equal-to(signer<0>() ", + expectedSigner.toHexString(), + ") \"", + name, + " signer\"),\n:ensure(equal-to(signed-context<0 0>() ", + uint256(expectedContent).toHexString(), + ") \"", + name, + " signed context\"),\n_ _: 1 1;\n:;" + ) + ) + ); + } + + function addFundedOrder( + address owner, + address inputToken, + bytes32 inputVault, + address outputToken, + bytes32 outputVault, + bytes memory bytecode + ) internal returns (OrderV4 memory) { + IOV2[] memory inputs = new IOV2[](1); + inputs[0] = IOV2({token: inputToken, vaultId: inputVault}); + IOV2[] memory outputs = new IOV2[](1); + outputs[0] = IOV2({token: outputToken, vaultId: outputVault}); + OrderConfigV4 memory config = OrderConfigV4({ + evaluable: EvaluableV4({bytecode: bytecode, interpreter: iInterpreter, store: iStore}), + validInputs: inputs, + validOutputs: outputs, + nonce: 0, + secret: 0, + meta: "" + }); + + vm.mockCall( + outputToken, + abi.encodeWithSelector(IERC20.transferFrom.selector, owner, address(iRaindex)), + abi.encode(true) + ); + vm.startPrank(owner); + iRaindex.deposit4(outputToken, outputVault, LibDecimalFloat.packLossless(100, 0), new TaskV2[](0)); + iRaindex.addOrder4(config, new TaskV2[](0)); + vm.stopPrank(); + + return OrderV4(owner, config.evaluable, config.validInputs, config.validOutputs, config.nonce); + } + + function aliceOrderExpecting(uint256 signerPk, bytes32 content) internal returns (OrderV4 memory) { + bytes memory bytecode = expectingBytecode("alice", vm.addr(signerPk), content); + return addFundedOrder(makeAddr("alice"), address(iToken0), ALICE_IN, address(iToken1), ALICE_OUT, bytecode); + } + + function bobOrderExpecting(uint256 signerPk, bytes32 content) internal returns (OrderV4 memory) { + bytes memory bytecode = expectingBytecode("bob", vm.addr(signerPk), content); + return addFundedOrder(makeAddr("bob"), address(iToken1), BOB_IN, address(iToken0), BOB_OUT, bytecode); + } + + function orders(uint256 aliceSignerPk, bytes32 aliceContent, uint256 bobSignerPk, bytes32 bobContent) + internal + returns (OrderV4 memory, OrderV4 memory) + { + return (aliceOrderExpecting(aliceSignerPk, aliceContent), bobOrderExpecting(bobSignerPk, bobContent)); + } + + function boundPk(uint256 pk) internal pure returns (uint256) { + return bound(pk, 1, SECP256K1_ORDER - 1); + } + + /// forge-config: default.fuzz.runs = 32 + function testClearRoutesEachSignedContextToItsOwnOrder( + uint256 aliceSignerPk, + bytes32 aliceContent, + uint256 bobSignerPk, + bytes32 bobContent + ) external { + aliceSignerPk = boundPk(aliceSignerPk); + bobSignerPk = boundPk(bobSignerPk); + vm.assume(vm.addr(aliceSignerPk) != vm.addr(bobSignerPk)); + (OrderV4 memory aliceOrder, OrderV4 memory bobOrder) = + orders(aliceSignerPk, aliceContent, bobSignerPk, bobContent); + + iRaindex.clear4( + aliceOrder, + bobOrder, + ClearConfigV2(0, 0, 0, 0, bytes32(uint256(0xc1)), bytes32(uint256(0xc2))), + signedContext(aliceSignerPk, aliceContent), + signedContext(bobSignerPk, bobContent) + ); + + assertTrue(iRaindex.vaultBalance2(aliceOrder.owner, address(iToken0), ALICE_IN).gt(LibDecimalFloat.FLOAT_ZERO)); + assertTrue(iRaindex.vaultBalance2(bobOrder.owner, address(iToken1), BOB_IN).gt(LibDecimalFloat.FLOAT_ZERO)); + } + + /// forge-config: default.fuzz.runs = 32 + function testClearRevertsWhenSignedContextsAreSwapped( + uint256 aliceSignerPk, + bytes32 aliceContent, + uint256 bobSignerPk, + bytes32 bobContent + ) external { + aliceSignerPk = boundPk(aliceSignerPk); + bobSignerPk = boundPk(bobSignerPk); + vm.assume(vm.addr(aliceSignerPk) != vm.addr(bobSignerPk)); + (OrderV4 memory aliceOrder, OrderV4 memory bobOrder) = + orders(aliceSignerPk, aliceContent, bobSignerPk, bobContent); + ClearConfigV2 memory clearConfig = ClearConfigV2(0, 0, 0, 0, bytes32(uint256(0xc1)), bytes32(uint256(0xc2))); + SignedContextV1[] memory aliceSignedContext = signedContext(aliceSignerPk, aliceContent); + SignedContextV1[] memory bobSignedContext = signedContext(bobSignerPk, bobContent); + + vm.expectRevert("alice signer"); + iRaindex.clear4(aliceOrder, bobOrder, clearConfig, bobSignedContext, aliceSignedContext); + } + + function testClear3SelectorIsRemoved() external { + (bool success, bytes memory returnData) = address(iRaindex) + .call( + abi.encodeCall( + IRaindexV6.clear3, + ( + OrderV4(address(0), EvaluableV4(iInterpreter, iStore, ""), new IOV2[](0), new IOV2[](0), 0), + OrderV4(address(0), EvaluableV4(iInterpreter, iStore, ""), new IOV2[](0), new IOV2[](0), 0), + ClearConfigV2(0, 0, 0, 0, 0, 0), + new SignedContextV1[](0), + new SignedContextV1[](0) + ) + ) + ); + assertFalse(success); + assertEq(returnData.length, 0); + } +} diff --git a/test/concrete/raindex/RaindexV6.clear.zeroAmount.t.sol b/test/concrete/raindex/RaindexV6.clear.zeroAmount.t.sol index d1009baf1a..0a8d25e0e1 100644 --- a/test/concrete/raindex/RaindexV6.clear.zeroAmount.t.sol +++ b/test/concrete/raindex/RaindexV6.clear.zeroAmount.t.sol @@ -9,7 +9,7 @@ import { TaskV2, SignedContextV1, ClearConfigV2 -} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {LibTestAddOrder} from "test/util/lib/LibTestAddOrder.sol"; import {ClearZeroAmount} from "../../../src/error/ErrRaindexV6.sol"; @@ -46,7 +46,7 @@ contract RaindexV6ClearZeroAmountTest is RaindexV6ExternalRealTest { iRaindex.addOrder4(configBob, new TaskV2[](0)); vm.expectRevert(ClearZeroAmount.selector); - iRaindex.clear3( + iRaindex.clear4( orderAlice, orderBob, ClearConfigV2(0, 0, 0, 0, 0, 0), new SignedContextV1[](0), new SignedContextV1[](0) ); } diff --git a/test/concrete/raindex/RaindexV6.deposit.entask.t.sol b/test/concrete/raindex/RaindexV6.deposit.entask.t.sol index aba14b56e1..ee3bf61ae9 100644 --- a/test/concrete/raindex/RaindexV6.deposit.entask.t.sol +++ b/test/concrete/raindex/RaindexV6.deposit.entask.t.sol @@ -8,7 +8,7 @@ import { EvaluableV4, TaskV2, SignedContextV1 -} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {IERC20} from "@openzeppelin-contracts-5.7.0/token/ERC20/IERC20.sol"; import {IERC20Metadata} from "@openzeppelin-contracts-5.7.0/token/ERC20/extensions/IERC20Metadata.sol"; import {LibFormatDecimalFloat} from "rain-math-float-0.3.10/src/lib/format/LibFormatDecimalFloat.sol"; diff --git a/test/concrete/raindex/RaindexV6.deposit.t.sol b/test/concrete/raindex/RaindexV6.deposit.t.sol index 5385872f85..4c5d0d903e 100644 --- a/test/concrete/raindex/RaindexV6.deposit.t.sol +++ b/test/concrete/raindex/RaindexV6.deposit.t.sol @@ -5,7 +5,7 @@ pragma solidity =0.8.25; import {stdError} from "forge-std-1.17.0/src/Test.sol"; import {REVERTING_MOCK_BYTECODE, CONSOLE_ADDRESS} from "test/util/lib/LibTestConstants.sol"; import {RaindexV6ExternalMockTest} from "test/util/abstract/RaindexV6ExternalMockTest.sol"; -import {TaskV2, EvaluableV4, IRaindexV6} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +import {TaskV2, EvaluableV4, IRaindexV7} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {Reenteroor} from "test/util/concrete/Reenteroor.sol"; import {IERC20} from "@openzeppelin-contracts-5.7.0/token/ERC20/IERC20.sol"; import {LibDecimalFloat, Float} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; @@ -42,7 +42,7 @@ contract RaindexV6DepositTest is RaindexV6ExternalMockTest { vm.assume(vaultId != bytes32(0)); vm.prank(depositor); vm.expectRevert( - abi.encodeWithSelector(IRaindexV6.ZeroDepositAmount.selector, address(depositor), address(iToken0), vaultId) + abi.encodeWithSelector(IRaindexV7.ZeroDepositAmount.selector, address(depositor), address(iToken0), vaultId) ); iRaindex.deposit4(address(iToken0), vaultId, LibDecimalFloat.packLossless(0, 0), new TaskV2[](0)); } @@ -62,7 +62,7 @@ contract RaindexV6DepositTest is RaindexV6ExternalMockTest { assertTrue(amount.lt(Float.wrap(0))); vm.prank(depositor); vm.expectRevert( - abi.encodeWithSelector(IRaindexV6.ZeroDepositAmount.selector, address(depositor), address(iToken0), vaultId) + abi.encodeWithSelector(IRaindexV7.ZeroDepositAmount.selector, address(depositor), address(iToken0), vaultId) ); iRaindex.deposit4(address(iToken0), vaultId, amount, new TaskV2[](0)); } @@ -71,7 +71,7 @@ contract RaindexV6DepositTest is RaindexV6ExternalMockTest { function testDepositZeroVaultId(address depositor, address token, Float amount) external { vm.assume(amount.gt(Float.wrap(0))); vm.prank(depositor); - vm.expectRevert(abi.encodeWithSelector(IRaindexV6.ZeroVaultId.selector, address(depositor), address(token))); + vm.expectRevert(abi.encodeWithSelector(IRaindexV7.ZeroVaultId.selector, address(depositor), address(token))); iRaindex.deposit4(token, bytes32(0), amount, new TaskV2[](0)); } @@ -251,7 +251,7 @@ contract RaindexV6DepositTest is RaindexV6ExternalMockTest { address(reenteroor), abi.encodeWithSelector(IERC20Metadata.decimals.selector), abi.encode(uint8(18)) ); reenteroor.reenterWith( - abi.encodeWithSelector(IRaindexV6.deposit4.selector, reToken, reVaultId, reAmount, new TaskV2[](0)) + abi.encodeWithSelector(IRaindexV7.deposit4.selector, reToken, reVaultId, reAmount, new TaskV2[](0)) ); vm.expectRevert(abi.encodeWithSelector(ReentrancyGuard.ReentrancyGuardReentrantCall.selector)); iRaindex.deposit4(address(reenteroor), vaultId, amount, new TaskV2[](0)); diff --git a/test/concrete/raindex/RaindexV6.depositWithdrawHarness.t.sol b/test/concrete/raindex/RaindexV6.depositWithdrawHarness.t.sol index 0d84acd7c1..def58ea6e6 100644 --- a/test/concrete/raindex/RaindexV6.depositWithdrawHarness.t.sol +++ b/test/concrete/raindex/RaindexV6.depositWithdrawHarness.t.sol @@ -8,8 +8,8 @@ import {IERC20} from "@openzeppelin-contracts-5.7.0/token/ERC20/IERC20.sol"; import {MockToken} from "test/util/concrete/MockToken.sol"; import {LibRainDeploy} from "rain-deploy-0.1.22/src/lib/LibRainDeploy.sol"; import {LibTOFUTokenDecimals} from "rain-tofu-erc20-decimals-0.1.4/src/lib/LibTOFUTokenDecimals.sol"; -import {TaskV2, IRaindexV6} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; -import {IRaindexV6Stub} from "test/util/abstract/IRaindexV6Stub.sol"; +import {TaskV2, IRaindexV7} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; +import {IRaindexV7Stub} from "test/util/abstract/IRaindexV7Stub.sol"; import {IERC20Metadata} from "@openzeppelin-contracts-5.7.0/token/ERC20/extensions/IERC20Metadata.sol"; import {TOFUOutcome} from "rain-tofu-erc20-decimals-0.1.4/src/lib/LibTOFUTokenDecimals.sol"; import {ITOFUTokenDecimals} from "rain-tofu-erc20-decimals-0.1.4/src/interface/ITOFUTokenDecimals.sol"; @@ -22,10 +22,10 @@ import {ITOFUTokenDecimals} from "rain-tofu-erc20-decimals-0.1.4/src/interface/I /// - deposit crediting exactly the pulled amount, /// - the deposit/withdraw event amounts (Float and onchain uint256), /// - non-18-decimal token scaling end-to-end. -contract RaindexV6DepositWithdrawHarnessTest is Test, IRaindexV6Stub { +contract RaindexV6DepositWithdrawHarnessTest is Test, IRaindexV7Stub { using LibDecimalFloat for Float; - IRaindexV6 internal harness; + IRaindexV7 internal harness; bytes32 internal constant VAULT = bytes32(uint256(1)); function setUp() external { @@ -33,7 +33,7 @@ contract RaindexV6DepositWithdrawHarnessTest is Test, IRaindexV6Stub { LibRainDeploy.etchZoltuFactory(vm); LibRainDeploy.deployZoltu(LibTOFUTokenDecimals.TOFU_DECIMALS_EXPECTED_CREATION_CODE); - harness = IRaindexV6(payable(address(uint160(uint256(keccak256("deposit.withdraw.harness")))))); + harness = IRaindexV7(payable(address(uint160(uint256(keccak256("deposit.withdraw.harness")))))); vm.etch(address(harness), vm.getDeployedCode("RaindexV6.sol:RaindexV6")); } @@ -139,7 +139,7 @@ contract RaindexV6DepositWithdrawHarnessTest is Test, IRaindexV6Stub { sToken = new MockToken("Token", "TKN", 18); address alice = makeAddr("alice"); vm.prank(alice); - vm.expectRevert(abi.encodeWithSelector(IRaindexV6.ZeroDepositAmount.selector, alice, address(sToken), VAULT)); + vm.expectRevert(abi.encodeWithSelector(IRaindexV7.ZeroDepositAmount.selector, alice, address(sToken), VAULT)); harness.deposit4(address(sToken), VAULT, Float.wrap(0), new TaskV2[](0)); } @@ -150,7 +150,7 @@ contract RaindexV6DepositWithdrawHarnessTest is Test, IRaindexV6Stub { address alice = makeAddr("alice"); vm.prank(alice); vm.expectRevert( - abi.encodeWithSelector(IRaindexV6.ZeroWithdrawTargetAmount.selector, alice, address(sToken), VAULT) + abi.encodeWithSelector(IRaindexV7.ZeroWithdrawTargetAmount.selector, alice, address(sToken), VAULT) ); harness.withdraw4(address(sToken), VAULT, Float.wrap(0), new TaskV2[](0)); } diff --git a/test/concrete/raindex/RaindexV6.doPost.fresh.t.sol b/test/concrete/raindex/RaindexV6.doPost.fresh.t.sol index 7ef2f15cfc..05afdc7600 100644 --- a/test/concrete/raindex/RaindexV6.doPost.fresh.t.sol +++ b/test/concrete/raindex/RaindexV6.doPost.fresh.t.sol @@ -9,7 +9,7 @@ import { EvaluableV4, TaskV2, SignedContextV1 -} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {LibTestAddOrder} from "test/util/lib/LibTestAddOrder.sol"; import {LibOrder} from "../../../src/lib/LibOrder.sol"; diff --git a/test/concrete/raindex/RaindexV6.entask.t.sol b/test/concrete/raindex/RaindexV6.entask.t.sol index d5004c00a5..485b2cb0af 100644 --- a/test/concrete/raindex/RaindexV6.entask.t.sol +++ b/test/concrete/raindex/RaindexV6.entask.t.sol @@ -8,7 +8,7 @@ import { EvaluableV4, TaskV2, SignedContextV1 -} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; contract RaindexV6EnactTest is RaindexV6ExternalRealTest { function checkReentrancyRW() internal view { diff --git a/test/concrete/raindex/RaindexV6.errorSelector.t.sol b/test/concrete/raindex/RaindexV6.errorSelector.t.sol index adb6458991..fa0424823f 100644 --- a/test/concrete/raindex/RaindexV6.errorSelector.t.sol +++ b/test/concrete/raindex/RaindexV6.errorSelector.t.sol @@ -4,14 +4,14 @@ pragma solidity =0.8.25; import {Test} from "forge-std-1.17.0/src/Test.sol"; import { - IRaindexV6, + IRaindexV7, OrderV4, IOV2, EvaluableV4, ClearConfigV2, SignedContextV1, TaskV2 -} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {IInterpreterV4} from "rainlang-interface-0.2.13/src/interface/IInterpreterV4.sol"; import {IInterpreterStoreV3} from "rainlang-interface-0.2.13/src/interface/IInterpreterStoreV3.sol"; @@ -19,10 +19,10 @@ import {IInterpreterStoreV3} from "rainlang-interface-0.2.13/src/interface/IInte /// @notice Signature strings are the oracle for the revert data the deployed /// RaindexV6 artifact reverts with. contract RaindexV6ErrorSelectorTest is Test { - IRaindexV6 internal raindex; + IRaindexV7 internal raindex; function setUp() external { - raindex = IRaindexV6(deployCode("RaindexV6.sol:RaindexV6")); + raindex = IRaindexV7(deployCode("RaindexV6.sol:RaindexV6")); } function order(address owner, address inputToken, address outputToken) internal pure returns (OrderV4 memory) { @@ -40,7 +40,7 @@ contract RaindexV6ErrorSelectorTest is Test { } function clear(OrderV4 memory alice, OrderV4 memory bob) internal { - raindex.clear3( + raindex.clear4( alice, bob, ClearConfigV2(0, 0, 0, 0, bytes32(0), bytes32(0)), diff --git a/test/concrete/raindex/RaindexV6.multicall.t.sol b/test/concrete/raindex/RaindexV6.multicall.t.sol index 9c8e832b51..1942baf0e9 100644 --- a/test/concrete/raindex/RaindexV6.multicall.t.sol +++ b/test/concrete/raindex/RaindexV6.multicall.t.sol @@ -4,7 +4,7 @@ pragma solidity =0.8.25; import {IERC20} from "@openzeppelin-contracts-5.7.0/token/ERC20/IERC20.sol"; import {RaindexV6ExternalRealTest} from "test/util/abstract/RaindexV6ExternalRealTest.sol"; -import {IRaindexV6, TaskV2} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +import {IRaindexV7, TaskV2} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {Float, LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; /// `multicall` is inherited from OpenZeppelin and not declared on the Raindex @@ -41,9 +41,9 @@ contract RaindexV6MulticallTest is RaindexV6ExternalRealTest { bytes[] memory calls = new bytes[](2); calls[0] = - abi.encodeCall(IRaindexV6.deposit4, (address(iToken1), bytes32(uint256(0x01)), amount1, new TaskV2[](0))); + abi.encodeCall(IRaindexV7.deposit4, (address(iToken1), bytes32(uint256(0x01)), amount1, new TaskV2[](0))); calls[1] = - abi.encodeCall(IRaindexV6.deposit4, (address(iToken1), bytes32(uint256(0x02)), amount2, new TaskV2[](0))); + abi.encodeCall(IRaindexV7.deposit4, (address(iToken1), bytes32(uint256(0x02)), amount2, new TaskV2[](0))); vm.prank(iAlice); bytes[] memory results = IMulticall(address(iRaindex)).multicall(calls); @@ -79,9 +79,9 @@ contract RaindexV6MulticallTest is RaindexV6ExternalRealTest { bytes[] memory calls = new bytes[](2); calls[0] = - abi.encodeCall(IRaindexV6.deposit4, (address(iToken1), bytes32(uint256(0x01)), amount1, new TaskV2[](0))); + abi.encodeCall(IRaindexV7.deposit4, (address(iToken1), bytes32(uint256(0x01)), amount1, new TaskV2[](0))); calls[1] = - abi.encodeCall(IRaindexV6.deposit4, (address(iToken0), bytes32(uint256(0x02)), amount2, new TaskV2[](0))); + abi.encodeCall(IRaindexV7.deposit4, (address(iToken0), bytes32(uint256(0x02)), amount2, new TaskV2[](0))); vm.prank(iAlice); vm.expectRevert(); diff --git a/test/concrete/raindex/RaindexV6.orderMgmt.fresh.t.sol b/test/concrete/raindex/RaindexV6.orderMgmt.fresh.t.sol index 6f55a50e63..bd71857591 100644 --- a/test/concrete/raindex/RaindexV6.orderMgmt.fresh.t.sol +++ b/test/concrete/raindex/RaindexV6.orderMgmt.fresh.t.sol @@ -10,7 +10,7 @@ import { EvaluableV4, TaskV2, SignedContextV1 -} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {IMetaV1_2} from "rain-metadata-0.1.43/src/interface/unstable/IMetaV1_2.sol"; import {META_MAGIC_NUMBER_V1} from "rain-metadata-0.1.43/src/lib/LibMeta.sol"; import {LibTestAddOrder} from "test/util/lib/LibTestAddOrder.sol"; diff --git a/test/concrete/raindex/RaindexV6.quote.sameToken.t.sol b/test/concrete/raindex/RaindexV6.quote.sameToken.t.sol index 7c1bd635e8..5f9f6b6e41 100644 --- a/test/concrete/raindex/RaindexV6.quote.sameToken.t.sol +++ b/test/concrete/raindex/RaindexV6.quote.sameToken.t.sol @@ -4,14 +4,14 @@ pragma solidity =0.8.25; import {RaindexV6ExternalRealTest} from "test/util/abstract/RaindexV6ExternalRealTest.sol"; import { - IRaindexV6, + IRaindexV7, QuoteV2, OrderConfigV4, OrderV4, IOV2, SignedContextV1, TaskV2 -} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {Float} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; import {LibTestAddOrder} from "test/util/lib/LibTestAddOrder.sol"; @@ -42,7 +42,7 @@ contract RaindexV6QuoteSameTokenTest is RaindexV6ExternalRealTest { }), new TaskV2[](0) ); - vm.expectRevert(abi.encodeWithSelector(IRaindexV6.TokenSelfTrade.selector)); + vm.expectRevert(abi.encodeWithSelector(IRaindexV7.TokenSelfTrade.selector)); (bool success, Float maxOutput, Float ioRatio) = iRaindex.quote2(quoteConfig); (success, maxOutput, ioRatio); } @@ -88,7 +88,7 @@ contract RaindexV6QuoteSameTokenTest is RaindexV6ExternalRealTest { QuoteV2({order: order, inputIOIndex: 0, outputIOIndex: 1, signedContext: new SignedContextV1[](0)}); // validInputs[0] (tokenA) == validOutputs[1] (tokenA): self-trade. - vm.expectRevert(abi.encodeWithSelector(IRaindexV6.TokenSelfTrade.selector)); + vm.expectRevert(abi.encodeWithSelector(IRaindexV7.TokenSelfTrade.selector)); (bool success, Float maxOutput, Float ioRatio) = iRaindex.quote2(quoteConfig); (success, maxOutput, ioRatio); } diff --git a/test/concrete/raindex/RaindexV6.quote.t.sol b/test/concrete/raindex/RaindexV6.quote.t.sol index 07bda1922f..7a8badf80d 100644 --- a/test/concrete/raindex/RaindexV6.quote.t.sol +++ b/test/concrete/raindex/RaindexV6.quote.t.sol @@ -4,14 +4,14 @@ pragma solidity =0.8.25; import {RaindexV6ExternalRealTest, console2} from "test/util/abstract/RaindexV6ExternalRealTest.sol"; import { - IRaindexV6, + IRaindexV7, QuoteV2, OrderConfigV4, EvaluableV4, TaskV2, OrderV4, SignedContextV1 -} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {LibTestAddOrder} from "test/util/lib/LibTestAddOrder.sol"; import {IERC20} from "@openzeppelin-contracts-5.7.0/token/ERC20/IERC20.sol"; import {IERC20Metadata} from "@openzeppelin-contracts-5.7.0/token/ERC20/extensions/IERC20Metadata.sol"; diff --git a/test/concrete/raindex/RaindexV6.removeOrder.entask.t.sol b/test/concrete/raindex/RaindexV6.removeOrder.entask.t.sol index bee772f04b..32c6ac7712 100644 --- a/test/concrete/raindex/RaindexV6.removeOrder.entask.t.sol +++ b/test/concrete/raindex/RaindexV6.removeOrder.entask.t.sol @@ -9,7 +9,7 @@ import { OrderV4, TaskV2, SignedContextV1 -} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {LibTestAddOrder} from "test/util/lib/LibTestAddOrder.sol"; import {LibOrder} from "../../../src/lib/LibOrder.sol"; diff --git a/test/concrete/raindex/RaindexV6.removeOrder.mock.t.sol b/test/concrete/raindex/RaindexV6.removeOrder.mock.t.sol index 01a53260e4..e9c35d3a5c 100644 --- a/test/concrete/raindex/RaindexV6.removeOrder.mock.t.sol +++ b/test/concrete/raindex/RaindexV6.removeOrder.mock.t.sol @@ -3,7 +3,7 @@ pragma solidity =0.8.25; import {RaindexV6ExternalMockTest} from "test/util/abstract/RaindexV6ExternalMockTest.sol"; -import {OrderConfigV4, OrderV4, EvaluableV4, TaskV2} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +import {OrderConfigV4, OrderV4, EvaluableV4, TaskV2} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {LibTestAddOrder} from "test/util/lib/LibTestAddOrder.sol"; import {NotOrderOwner} from "../../../src/error/ErrRaindexV6.sol"; diff --git a/test/concrete/raindex/RaindexV6.removeOrder.owner.t.sol b/test/concrete/raindex/RaindexV6.removeOrder.owner.t.sol index 9daad237f0..99e4d08d95 100644 --- a/test/concrete/raindex/RaindexV6.removeOrder.owner.t.sol +++ b/test/concrete/raindex/RaindexV6.removeOrder.owner.t.sol @@ -3,7 +3,7 @@ pragma solidity =0.8.25; import {RaindexV6ExternalRealTest} from "test/util/abstract/RaindexV6ExternalRealTest.sol"; -import {OrderConfigV4, OrderV4, EvaluableV4, TaskV2} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +import {OrderConfigV4, OrderV4, EvaluableV4, TaskV2} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {LibTestAddOrder} from "test/util/lib/LibTestAddOrder.sol"; import {LibOrder} from "../../../src/lib/LibOrder.sol"; import {NotOrderOwner} from "../../../src/error/ErrRaindexV6.sol"; diff --git a/test/concrete/raindex/RaindexV6.takeOrder.badStack.t.sol b/test/concrete/raindex/RaindexV6.takeOrder.badStack.t.sol index b7e05dad3a..ea3a09064e 100644 --- a/test/concrete/raindex/RaindexV6.takeOrder.badStack.t.sol +++ b/test/concrete/raindex/RaindexV6.takeOrder.badStack.t.sol @@ -5,7 +5,12 @@ pragma solidity =0.8.25; import {RaindexV6ExternalRealTest} from "test/util/abstract/RaindexV6ExternalRealTest.sol"; import {LibTestAddOrder} from "test/util/lib/LibTestAddOrder.sol"; import {LibTestTakeOrder} from "test/util/lib/LibTestTakeOrder.sol"; -import {OrderConfigV4, OrderV4, TaskV2, TakeOrdersConfigV5} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +import { + OrderConfigV4, + OrderV4, + TaskV2, + TakeOrdersConfigV5 +} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {UnsupportedCalculateOutputs} from "../../../src/error/ErrRaindexV6.sol"; contract RaindexV6TakeOrderBadStackTest is RaindexV6ExternalRealTest { diff --git a/test/concrete/raindex/RaindexV6.takeOrder.batchEvalConsistency.t.sol b/test/concrete/raindex/RaindexV6.takeOrder.batchEvalConsistency.t.sol index d33e189845..3cccf3f30f 100644 --- a/test/concrete/raindex/RaindexV6.takeOrder.batchEvalConsistency.t.sol +++ b/test/concrete/raindex/RaindexV6.takeOrder.batchEvalConsistency.t.sol @@ -14,7 +14,7 @@ import { TakeOrdersConfigV5, SignedContextV1, TaskV2 -} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {Float, LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; /// @title RaindexV6TakeOrderBatchEvalConsistencyTest diff --git a/test/concrete/raindex/RaindexV6.takeOrder.batchStateAdversarial.t.sol b/test/concrete/raindex/RaindexV6.takeOrder.batchStateAdversarial.t.sol index cc3ff09f4c..c270ac700e 100644 --- a/test/concrete/raindex/RaindexV6.takeOrder.batchStateAdversarial.t.sol +++ b/test/concrete/raindex/RaindexV6.takeOrder.batchStateAdversarial.t.sol @@ -12,7 +12,7 @@ import { TakeOrdersConfigV5, SignedContextV1, TaskV2 -} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {Float, LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; /// @title RaindexV6TakeOrderBatchStateAdversarialTest diff --git a/test/concrete/raindex/RaindexV6.takeOrder.batchStateBypass.t.sol b/test/concrete/raindex/RaindexV6.takeOrder.batchStateBypass.t.sol index c45857e516..6e54c15c70 100644 --- a/test/concrete/raindex/RaindexV6.takeOrder.batchStateBypass.t.sol +++ b/test/concrete/raindex/RaindexV6.takeOrder.batchStateBypass.t.sol @@ -11,7 +11,7 @@ import { TakeOrdersConfigV5, SignedContextV1, TaskV2 -} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {Float, LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; /// @title RaindexV6TakeOrderBatchStateBypassTest diff --git a/test/concrete/raindex/RaindexV6.takeOrder.calculationsContext.t.sol b/test/concrete/raindex/RaindexV6.takeOrder.calculationsContext.t.sol index 4230cbecd3..e4c0ab3b29 100644 --- a/test/concrete/raindex/RaindexV6.takeOrder.calculationsContext.t.sol +++ b/test/concrete/raindex/RaindexV6.takeOrder.calculationsContext.t.sol @@ -4,7 +4,7 @@ pragma solidity =0.8.25; import {RaindexV6ExternalRealTest} from "test/util/abstract/RaindexV6ExternalRealTest.sol"; import {LibTestTakeOrder} from "test/util/lib/LibTestTakeOrder.sol"; -import {OrderV4, TakeOrdersConfigV5, IRaindexV6} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +import {OrderV4, TakeOrdersConfigV5, IRaindexV7} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {Float, LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; import {Strings} from "@openzeppelin-contracts-5.7.0/utils/Strings.sol"; import {LibOrder} from "../../../src/lib/LibOrder.sol"; @@ -51,7 +51,7 @@ contract RaindexV6TakeOrderCalculationsContextTest is RaindexV6ExternalRealTest // fill to zero, so the order is a zero-amount skip. vm.prank(bob); vm.expectEmit(true, true, true, true); - emit IRaindexV6.OrderZeroAmount(bob, alice, LibOrder.hash(order)); + emit IRaindexV7.OrderZeroAmount(bob, alice, LibOrder.hash(order)); (Float totalTakerInput, Float totalTakerOutput) = iRaindex.takeOrders4(config); assertTrue(totalTakerInput.isZero(), "totalTakerInput must be zero"); diff --git a/test/concrete/raindex/RaindexV6.takeOrder.exceedsMaxRatio.t.sol b/test/concrete/raindex/RaindexV6.takeOrder.exceedsMaxRatio.t.sol index 5ac50b7c2a..b8b772a5f0 100644 --- a/test/concrete/raindex/RaindexV6.takeOrder.exceedsMaxRatio.t.sol +++ b/test/concrete/raindex/RaindexV6.takeOrder.exceedsMaxRatio.t.sol @@ -5,7 +5,7 @@ pragma solidity =0.8.25; import {IERC20} from "@openzeppelin-contracts-5.7.0/token/ERC20/IERC20.sol"; import {RaindexV6ExternalRealTest} from "test/util/abstract/RaindexV6ExternalRealTest.sol"; import {LibTestTakeOrder} from "test/util/lib/LibTestTakeOrder.sol"; -import {OrderV4, TakeOrdersConfigV5, TaskV2, IRaindexV6} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +import {OrderV4, TakeOrdersConfigV5, TaskV2, IRaindexV7} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {Float, LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; import {LibOrder} from "../../../src/lib/LibOrder.sol"; @@ -46,7 +46,7 @@ contract RaindexV6TakeOrderExceedsMaxRatioTest is RaindexV6ExternalRealTest { vm.prank(bob); vm.expectEmit(true, true, true, true); - emit IRaindexV6.OrderExceedsMaxRatio(bob, alice, LibOrder.hash(order)); + emit IRaindexV7.OrderExceedsMaxRatio(bob, alice, LibOrder.hash(order)); (Float totalTakerInput, Float totalTakerOutput) = iRaindex.takeOrders4(takeConfig); assertTrue(totalTakerInput.isZero(), "totalTakerInput must be zero"); diff --git a/test/concrete/raindex/RaindexV6.takeOrder.freshMutation.t.sol b/test/concrete/raindex/RaindexV6.takeOrder.freshMutation.t.sol index 98382482e5..88adb7e2b9 100644 --- a/test/concrete/raindex/RaindexV6.takeOrder.freshMutation.t.sol +++ b/test/concrete/raindex/RaindexV6.takeOrder.freshMutation.t.sol @@ -12,8 +12,8 @@ import { TakeOrderConfigV4, TakeOrdersConfigV5, TaskV2, - IRaindexV6 -} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; + IRaindexV7 +} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {SignedContextV1} from "rainlang-interface-0.2.13/src/interface/deprecated/v1/IInterpreterCallerV2.sol"; import {Float, LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; import {LibOrder} from "../../../src/lib/LibOrder.sol"; @@ -224,7 +224,7 @@ contract RaindexV6TakeOrderFreshMutationTest is RaindexV6FreshTakeOrderTest { vm.prank(bob); vm.expectEmit(true, true, true, true); - emit IRaindexV6.OrderExceedsMaxRatio(bob, alice, LibOrder.hash(order)); + emit IRaindexV7.OrderExceedsMaxRatio(bob, alice, LibOrder.hash(order)); (Float totalTakerInput, Float totalTakerOutput) = iRaindex.takeOrders4(config); assertTrue(totalTakerInput.isZero(), "input zero"); assertTrue(totalTakerOutput.isZero(), "output zero"); @@ -265,7 +265,7 @@ contract RaindexV6TakeOrderFreshMutationTest is RaindexV6FreshTakeOrderTest { vm.prank(bob); vm.expectEmit(true, true, true, true); - emit IRaindexV6.OrderZeroAmount(bob, alice, LibOrder.hash(order)); + emit IRaindexV7.OrderZeroAmount(bob, alice, LibOrder.hash(order)); (Float totalTakerInput, Float totalTakerOutput) = iRaindex.takeOrders4(config); assertTrue(totalTakerInput.isZero(), "input zero"); assertTrue(totalTakerOutput.isZero(), "output zero"); @@ -310,7 +310,7 @@ contract RaindexV6TakeOrderFreshMutationTest is RaindexV6FreshTakeOrderTest { config.maximumIO = LibDecimalFloat.packLossless(5, 0); vm.prank(bob); - // selector for TokenSelfTrade() as declared on IRaindexV6. + // selector for TokenSelfTrade() as declared on IRaindexV7. vm.expectRevert(bytes4(keccak256("TokenSelfTrade()"))); iRaindex.takeOrders4(config); } @@ -328,7 +328,7 @@ contract RaindexV6TakeOrderFreshMutationTest is RaindexV6FreshTakeOrderTest { data: "" }); vm.prank(bob); - vm.expectRevert(IRaindexV6.NoOrders.selector); + vm.expectRevert(IRaindexV7.NoOrders.selector); iRaindex.takeOrders4(config); } @@ -345,7 +345,7 @@ contract RaindexV6TakeOrderFreshMutationTest is RaindexV6FreshTakeOrderTest { config.maximumIO = LibDecimalFloat.packLossless(0, 0); vm.prank(bob); - vm.expectRevert(IRaindexV6.ZeroMaximumIO.selector); + vm.expectRevert(IRaindexV7.ZeroMaximumIO.selector); iRaindex.takeOrders4(config); } @@ -362,7 +362,7 @@ contract RaindexV6TakeOrderFreshMutationTest is RaindexV6FreshTakeOrderTest { config.maximumIO = LibDecimalFloat.packLossless(-1, 0); vm.prank(bob); - vm.expectRevert(IRaindexV6.ZeroMaximumIO.selector); + vm.expectRevert(IRaindexV7.ZeroMaximumIO.selector); iRaindex.takeOrders4(config); } @@ -533,7 +533,7 @@ contract RaindexV6TakeOrderFreshMutationTest is RaindexV6FreshTakeOrderTest { TakeOrderConfigV4 memory expectedConfig = TakeOrderConfigV4(order, 0, 0, new SignedContextV1[](0)); vm.prank(bob); vm.expectEmit(address(iRaindex)); - emit IRaindexV6.TakeOrderV3( + emit IRaindexV7.TakeOrderV3( bob, expectedConfig, LibDecimalFloat.packLossless(3, 0), LibDecimalFloat.packLossless(6, 0) ); iRaindex.takeOrders4(config); diff --git a/test/concrete/raindex/RaindexV6.takeOrder.freshVaultZero.t.sol b/test/concrete/raindex/RaindexV6.takeOrder.freshVaultZero.t.sol index e80333725d..662f031abc 100644 --- a/test/concrete/raindex/RaindexV6.takeOrder.freshVaultZero.t.sol +++ b/test/concrete/raindex/RaindexV6.takeOrder.freshVaultZero.t.sol @@ -7,13 +7,13 @@ import {LibTestTakeOrder} from "test/util/lib/LibTestTakeOrder.sol"; import {MockToken} from "test/util/concrete/MockToken.sol"; import {Reenteroor} from "test/util/concrete/Reenteroor.sol"; import { - IRaindexV6, + IRaindexV7, OrderV4, TakeOrderConfigV4, TakeOrdersConfigV5, SignedContextV1, TaskV2 -} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {Float, LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; /// @title RaindexV6TakeOrderFreshVaultZeroTest @@ -147,7 +147,7 @@ contract RaindexV6TakeOrderFreshVaultZeroTest is RaindexV6FreshTakeOrderTest { config.data = hex"01"; // The callback re-enters takeOrders4; the nonReentrant guard reverts it. - taker.reenterWith(abi.encodeWithSelector(IRaindexV6.takeOrders4.selector, config)); + taker.reenterWith(abi.encodeWithSelector(IRaindexV7.takeOrders4.selector, config)); vm.expectRevert(abi.encodeWithSelector(bytes4(keccak256("ReentrancyGuardReentrantCall()")))); vm.prank(address(taker)); diff --git a/test/concrete/raindex/RaindexV6.takeOrder.handleIO.revert.t.sol b/test/concrete/raindex/RaindexV6.takeOrder.handleIO.revert.t.sol index 540d5b3dc8..c0fe65804f 100644 --- a/test/concrete/raindex/RaindexV6.takeOrder.handleIO.revert.t.sol +++ b/test/concrete/raindex/RaindexV6.takeOrder.handleIO.revert.t.sol @@ -12,7 +12,7 @@ import { TakeOrdersConfigV5, EvaluableV4, TaskV2 -} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {Float, LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; import {IERC20Metadata} from "@openzeppelin-contracts-5.7.0/token/ERC20/extensions/IERC20Metadata.sol"; import {LibTestTakeOrder} from "test/util/lib/LibTestTakeOrder.sol"; diff --git a/test/concrete/raindex/RaindexV6.takeOrder.maximumInput.t.sol b/test/concrete/raindex/RaindexV6.takeOrder.maximumInput.t.sol index 9767e486af..93a34592f5 100644 --- a/test/concrete/raindex/RaindexV6.takeOrder.maximumInput.t.sol +++ b/test/concrete/raindex/RaindexV6.takeOrder.maximumInput.t.sol @@ -12,8 +12,8 @@ import { EvaluableV4, OrderConfigV4, TaskV2, - IRaindexV6 -} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; + IRaindexV7 +} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {SignedContextV1} from "rainlang-interface-0.2.13/src/interface/deprecated/v1/IInterpreterCallerV2.sol"; import {LibTestTakeOrder} from "test/util/lib/LibTestTakeOrder.sol"; @@ -43,7 +43,7 @@ contract RaindexV6TakeOrderMaximumInputTest is RaindexV6ExternalRealTest { orders: orders, data: "" }); - vm.expectRevert(IRaindexV6.ZeroMaximumIO.selector); + vm.expectRevert(IRaindexV7.ZeroMaximumIO.selector); (Float totalTakerInput, Float totalTakerOutput) = iRaindex.takeOrders4(config); (totalTakerInput, totalTakerOutput); } diff --git a/test/concrete/raindex/RaindexV6.takeOrder.maximumOutput.t.sol b/test/concrete/raindex/RaindexV6.takeOrder.maximumOutput.t.sol index f23bcecf55..562cb10a76 100644 --- a/test/concrete/raindex/RaindexV6.takeOrder.maximumOutput.t.sol +++ b/test/concrete/raindex/RaindexV6.takeOrder.maximumOutput.t.sol @@ -9,12 +9,12 @@ import { TakeOrderConfigV4, TakeOrdersConfigV5, SignedContextV1, - IRaindexV6, + IRaindexV7, OrderConfigV4, IOV2, EvaluableV4, TaskV2 -} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {LibTestTakeOrder} from "test/util/lib/LibTestTakeOrder.sol"; import {LibDecimalFloat, Float} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; @@ -39,7 +39,7 @@ contract RaindexV6TakeOrderMaximumOutputTest is RaindexV6ExternalRealTest { IOIsInput: false, data: "" }); - vm.expectRevert(IRaindexV6.ZeroMaximumIO.selector); + vm.expectRevert(IRaindexV7.ZeroMaximumIO.selector); (Float totalTakerInput, Float totalTakerOutput) = iRaindex.takeOrders4(config); (totalTakerInput, totalTakerOutput); } diff --git a/test/concrete/raindex/RaindexV6.takeOrder.minimumIO.t.sol b/test/concrete/raindex/RaindexV6.takeOrder.minimumIO.t.sol index 2e9bcc3b06..cb1fae9e69 100644 --- a/test/concrete/raindex/RaindexV6.takeOrder.minimumIO.t.sol +++ b/test/concrete/raindex/RaindexV6.takeOrder.minimumIO.t.sol @@ -5,7 +5,7 @@ pragma solidity =0.8.25; import {IERC20} from "@openzeppelin-contracts-5.7.0/token/ERC20/IERC20.sol"; import {RaindexV6ExternalRealTest} from "test/util/abstract/RaindexV6ExternalRealTest.sol"; import {LibTestTakeOrder} from "test/util/lib/LibTestTakeOrder.sol"; -import {OrderV4, TakeOrdersConfigV5, TaskV2} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +import {OrderV4, TakeOrdersConfigV5, TaskV2} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {Float, LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; import {MinimumIO} from "../../../src/error/ErrRaindexV6.sol"; diff --git a/test/concrete/raindex/RaindexV6.takeOrder.minimumIOOutput.t.sol b/test/concrete/raindex/RaindexV6.takeOrder.minimumIOOutput.t.sol index 52735d5970..64ef93ca56 100644 --- a/test/concrete/raindex/RaindexV6.takeOrder.minimumIOOutput.t.sol +++ b/test/concrete/raindex/RaindexV6.takeOrder.minimumIOOutput.t.sol @@ -5,7 +5,7 @@ pragma solidity =0.8.25; import {IERC20} from "@openzeppelin-contracts-5.7.0/token/ERC20/IERC20.sol"; import {RaindexV6ExternalRealTest} from "test/util/abstract/RaindexV6ExternalRealTest.sol"; import {LibTestTakeOrder} from "test/util/lib/LibTestTakeOrder.sol"; -import {OrderV4, TakeOrdersConfigV5, TaskV2} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +import {OrderV4, TakeOrdersConfigV5, TaskV2} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {Float, LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; import {MinimumIO} from "../../../src/error/ErrRaindexV6.sol"; diff --git a/test/concrete/raindex/RaindexV6.takeOrder.noop.t.sol b/test/concrete/raindex/RaindexV6.takeOrder.noop.t.sol index 951157ce80..8967dc8cd5 100644 --- a/test/concrete/raindex/RaindexV6.takeOrder.noop.t.sol +++ b/test/concrete/raindex/RaindexV6.takeOrder.noop.t.sol @@ -12,7 +12,7 @@ import { TakeOrdersConfigV5, TakeOrderConfigV4, SignedContextV1 -} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {Float, LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; import {IERC20Metadata} from "@openzeppelin-contracts-5.7.0/token/ERC20/extensions/IERC20Metadata.sol"; diff --git a/test/concrete/raindex/RaindexV6.takeOrder.precision.t.sol b/test/concrete/raindex/RaindexV6.takeOrder.precision.t.sol index fd4683c5df..93661ca832 100644 --- a/test/concrete/raindex/RaindexV6.takeOrder.precision.t.sol +++ b/test/concrete/raindex/RaindexV6.takeOrder.precision.t.sol @@ -12,7 +12,7 @@ import { OrderConfigV4, EvaluableV4, TaskV2 -} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {Float, LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; import {IERC20Metadata} from "@openzeppelin-contracts-5.7.0/token/ERC20/extensions/IERC20Metadata.sol"; import {LibTestTakeOrder} from "test/util/lib/LibTestTakeOrder.sol"; diff --git a/test/concrete/raindex/RaindexV6.takeOrder.sameToken.t.sol b/test/concrete/raindex/RaindexV6.takeOrder.sameToken.t.sol index 4ff96e4187..637af8bee2 100644 --- a/test/concrete/raindex/RaindexV6.takeOrder.sameToken.t.sol +++ b/test/concrete/raindex/RaindexV6.takeOrder.sameToken.t.sol @@ -4,14 +4,14 @@ pragma solidity =0.8.25; import {RaindexV6ExternalRealTest} from "test/util/abstract/RaindexV6ExternalRealTest.sol"; import { - IRaindexV6, + IRaindexV7, OrderConfigV4, OrderV4, TaskV2, TakeOrderConfigV4, SignedContextV1, TakeOrdersConfigV5 -} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {LibTestAddOrder} from "test/util/lib/LibTestAddOrder.sol"; import {Float, LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; @@ -42,7 +42,7 @@ contract RaindexV6TakeOrderSameTokenTest is RaindexV6ExternalRealTest { data: "" }); - vm.expectRevert(abi.encodeWithSelector(IRaindexV6.TokenSelfTrade.selector)); + vm.expectRevert(abi.encodeWithSelector(IRaindexV7.TokenSelfTrade.selector)); iRaindex.takeOrders4(takeOrdersConfig); } } diff --git a/test/concrete/raindex/RaindexV6.takeOrder.takenFlag.t.sol b/test/concrete/raindex/RaindexV6.takeOrder.takenFlag.t.sol index c60f0c36d7..d6d723a477 100644 --- a/test/concrete/raindex/RaindexV6.takeOrder.takenFlag.t.sol +++ b/test/concrete/raindex/RaindexV6.takeOrder.takenFlag.t.sol @@ -5,7 +5,7 @@ pragma solidity =0.8.25; import {IERC20} from "@openzeppelin-contracts-5.7.0/token/ERC20/IERC20.sol"; import {RaindexV6ExternalRealTest} from "test/util/abstract/RaindexV6ExternalRealTest.sol"; import {LibTestTakeOrder} from "test/util/lib/LibTestTakeOrder.sol"; -import {OrderV4, TakeOrdersConfigV5, TaskV2, IRaindexV6} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +import {OrderV4, TakeOrdersConfigV5, TaskV2, IRaindexV7} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {Float, LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; import {LibOrder} from "../../../src/lib/LibOrder.sol"; import {RecordingOrderTaker} from "test/util/concrete/RecordingOrderTaker.sol"; @@ -55,7 +55,7 @@ contract RaindexV6TakeOrderTakenFlagTest is RaindexV6ExternalRealTest { vm.prank(bob); vm.expectEmit(true, true, true, true); - emit IRaindexV6.OrderZeroAmount(bob, alice, LibOrder.hash(order)); + emit IRaindexV7.OrderZeroAmount(bob, alice, LibOrder.hash(order)); (Float totalTakerInput, Float totalTakerOutput) = iRaindex.takeOrders4(config); assertTrue(totalTakerInput.isZero(), "totalTakerInput must be zero"); @@ -72,7 +72,7 @@ contract RaindexV6TakeOrderTakenFlagTest is RaindexV6ExternalRealTest { vm.prank(bob); vm.expectEmit(true, true, true, true); - emit IRaindexV6.OrderZeroAmount(bob, alice, LibOrder.hash(order)); + emit IRaindexV7.OrderZeroAmount(bob, alice, LibOrder.hash(order)); (Float totalTakerInput, Float totalTakerOutput) = iRaindex.takeOrders4(config); assertTrue(totalTakerInput.isZero(), "totalTakerInput must be zero"); @@ -87,7 +87,7 @@ contract RaindexV6TakeOrderTakenFlagTest is RaindexV6ExternalRealTest { vm.prank(bob); vm.expectEmit(true, true, true, true); - emit IRaindexV6.OrderZeroAmount(bob, alice, LibOrder.hash(order)); + emit IRaindexV7.OrderZeroAmount(bob, alice, LibOrder.hash(order)); (Float totalTakerInput, Float totalTakerOutput) = iRaindex.takeOrders4(config); assertTrue(totalTakerInput.isZero(), "totalTakerInput must be zero"); diff --git a/test/concrete/raindex/RaindexV6.takeOrder.tokenMismatch.t.sol b/test/concrete/raindex/RaindexV6.takeOrder.tokenMismatch.t.sol index f9bdb01e3c..50edd9e3ef 100644 --- a/test/concrete/raindex/RaindexV6.takeOrder.tokenMismatch.t.sol +++ b/test/concrete/raindex/RaindexV6.takeOrder.tokenMismatch.t.sol @@ -10,7 +10,7 @@ import { TakeOrdersConfigV5, EvaluableV4, SignedContextV1 -} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {TokenMismatch} from "../../../src/error/ErrRaindexV6.sol"; import {Float, LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; diff --git a/test/concrete/raindex/RaindexV6.takeOrder.vaultZeroInput.t.sol b/test/concrete/raindex/RaindexV6.takeOrder.vaultZeroInput.t.sol index c5c14f1937..a749667a31 100644 --- a/test/concrete/raindex/RaindexV6.takeOrder.vaultZeroInput.t.sol +++ b/test/concrete/raindex/RaindexV6.takeOrder.vaultZeroInput.t.sol @@ -8,14 +8,14 @@ import {LibTestTakeOrder} from "test/util/lib/LibTestTakeOrder.sol"; import {MockToken} from "test/util/concrete/MockToken.sol"; import {Reenteroor} from "test/util/concrete/Reenteroor.sol"; import { - IRaindexV6, + IRaindexV7, OrderV4, TakeOrderConfigV4, TakeOrdersConfigV5, ClearConfigV2, SignedContextV1, TaskV2 -} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {Float, LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; import {NegativeBounty} from "../../../src/error/ErrRaindexV6.sol"; @@ -24,7 +24,7 @@ import {NegativeBounty} from "../../../src/error/ErrRaindexV6.sol"; /// transfer to the owner (`increaseVaultBalance` -> `pushTokens`) rather than an /// internal vault credit. The orderbook must pull every incoming token before it /// pushes that input out: `takeOrders4` defers vault-0 input pushes until after -/// the taker payment is pulled, and `clear3` pulls both orders' outputs before +/// the taker payment is pulled, and `clear4` pulls both orders' outputs before /// pushing either input. These tests use real `MockToken` ERC20s with zero /// ambient orderbook balance, so a vault-0 input is fully funded by the /// counterparty alone. @@ -90,7 +90,7 @@ contract RaindexV6TakeOrderVaultZeroInputTest is RaindexV6ExternalRealTest { assertEq(token1.balanceOf(address(iRaindex)), 9e18, "unfilled token1 stays in the owner's output vault"); } - /// `clear3`: Alice's INPUT is `token0` at vault 0, funded by Bob's `token0` + /// `clear4`: Alice's INPUT is `token0` at vault 0, funded by Bob's `token0` /// vault-0 OUTPUT. Both orders' outputs are pulled before either input is /// pushed, so Alice's vault-0 input is funded by Bob's output with no ambient /// balance needed. @@ -115,7 +115,7 @@ contract RaindexV6TakeOrderVaultZeroInputTest is RaindexV6ExternalRealTest { assertEq(token0.balanceOf(address(iRaindex)), 0, "orderbook starts with zero ambient token0"); - iRaindex.clear3( + iRaindex.clear4( aliceOrder, bobOrder, ClearConfigV2(0, 0, 0, 0, 0, 0), new SignedContextV1[](0), new SignedContextV1[](0) ); @@ -254,7 +254,7 @@ contract RaindexV6TakeOrderVaultZeroInputTest is RaindexV6ExternalRealTest { ); } - /// Same pool safety for `clear3`'s vault-0 input push: Alice's vault-0 token0 + /// Same pool safety for `clear4`'s vault-0 input push: Alice's vault-0 token0 /// input is funded entirely by Bob's token0 output, so a third party's pooled /// token0 is untouched. A vault-0 push that exceeded what Bob supplied would /// drain the pool. @@ -277,7 +277,7 @@ contract RaindexV6TakeOrderVaultZeroInputTest is RaindexV6ExternalRealTest { assertEq(token0.balanceOf(address(iRaindex)), 50e18, "orderbook holds only carol's pool pre-clear"); - iRaindex.clear3( + iRaindex.clear4( aliceOrder, bobOrder, ClearConfigV2(0, 0, 0, 0, 0, 0), new SignedContextV1[](0), new SignedContextV1[](0) ); @@ -484,14 +484,14 @@ contract RaindexV6TakeOrderVaultZeroInputTest is RaindexV6ExternalRealTest { // The taker's callback re-enters takeOrders4 (its config is irrelevant: // the nonReentrant guard reverts at function entry). - taker.reenterWith(abi.encodeWithSelector(IRaindexV6.takeOrders4.selector, config)); + taker.reenterWith(abi.encodeWithSelector(IRaindexV7.takeOrders4.selector, config)); vm.expectRevert(abi.encodeWithSelector(bytes4(keccak256("ReentrancyGuardReentrantCall()")))); vm.prank(address(taker)); iRaindex.takeOrders4(config); } - /// `clear3` where BOTH orders take their input via vault 0, so the orderbook + /// `clear4` where BOTH orders take their input via vault 0, so the orderbook /// must accrue and flush two distinct vault-0 slots. Alice's token0 input and /// Bob's token1 input are each pushed to their wallet, funded entirely by the /// counterparty's output (Bob's deposited token0 funds Alice; Alice's @@ -516,7 +516,7 @@ contract RaindexV6TakeOrderVaultZeroInputTest is RaindexV6ExternalRealTest { assertEq(token0.balanceOf(address(iRaindex)), 51e18, "pool (50) + bob's deposited output (1)"); - iRaindex.clear3( + iRaindex.clear4( aliceOrder, bobOrder, ClearConfigV2(0, 0, 0, 0, 0, 0), new SignedContextV1[](0), new SignedContextV1[](0) ); @@ -616,7 +616,7 @@ contract RaindexV6TakeOrderVaultZeroInputTest is RaindexV6ExternalRealTest { ); } - /// A clear3 bounty with bountyVaultId == 0 is pushed straight to the clearer's + /// A clear4 bounty with bountyVaultId == 0 is pushed straight to the clearer's /// wallet (increaseVaultBalance's vault-0 branch), not an internal vault. With /// a spread — alice outputs 1 token1 wanting 1 token0, bob outputs up to 2 /// token0 wanting 0.5 token1 — the match gives bob a bounty of @@ -644,7 +644,7 @@ contract RaindexV6TakeOrderVaultZeroInputTest is RaindexV6ExternalRealTest { assertEq(token0.balanceOf(address(this)), 0, "clearer starts with no token0"); // 6th ClearConfig arg (bobBountyVaultId) = 0 -> bob's bounty -> clearer wallet. - iRaindex.clear3( + iRaindex.clear4( aliceOrder, bobOrder, ClearConfigV2(0, 0, 0, 0, 0, 0), new SignedContextV1[](0), new SignedContextV1[](0) ); @@ -677,7 +677,7 @@ contract RaindexV6TakeOrderVaultZeroInputTest is RaindexV6ExternalRealTest { iRaindex.vaultBalance2(owner, address(token0), bytes32(0)); } - /// A `clear3` whose orders cross into a negative bounty reverts with the + /// A `clear4` whose orders cross into a negative bounty reverts with the /// explicit `NegativeBounty` before any vault is settled. Both orders take /// and give via vault 0 against an orderbook with zero ambient balance, so /// the only funds that could settle a vault-0 input are the capped outputs @@ -711,7 +711,7 @@ contract RaindexV6TakeOrderVaultZeroInputTest is RaindexV6ExternalRealTest { assertEq(token1.balanceOf(address(iRaindex)), 0, "orderbook starts with zero ambient token1"); vm.expectRevert(NegativeBounty.selector); - iRaindex.clear3( + iRaindex.clear4( aliceOrder, bobOrder, ClearConfigV2(0, 0, 0, 0, 0, 0), new SignedContextV1[](0), new SignedContextV1[](0) ); } diff --git a/test/concrete/raindex/RaindexV6.takeOrder.zeroAmount.t.sol b/test/concrete/raindex/RaindexV6.takeOrder.zeroAmount.t.sol index 8578999a40..48e9daa9ba 100644 --- a/test/concrete/raindex/RaindexV6.takeOrder.zeroAmount.t.sol +++ b/test/concrete/raindex/RaindexV6.takeOrder.zeroAmount.t.sol @@ -6,7 +6,7 @@ import {Vm} from "forge-std-1.17.0/src/Test.sol"; import {IERC20} from "@openzeppelin-contracts-5.7.0/token/ERC20/IERC20.sol"; import {RaindexV6ExternalRealTest} from "test/util/abstract/RaindexV6ExternalRealTest.sol"; import {LibTestTakeOrder} from "test/util/lib/LibTestTakeOrder.sol"; -import {OrderV4, TakeOrdersConfigV5, TaskV2} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +import {OrderV4, TakeOrdersConfigV5, TaskV2} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {Float, LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; import {LibOrder} from "../../../src/lib/LibOrder.sol"; diff --git a/test/concrete/raindex/RaindexV6.takeOrder.zeroMaxOOBIndex.t.sol b/test/concrete/raindex/RaindexV6.takeOrder.zeroMaxOOBIndex.t.sol index 7fba4c6f6c..325b42c814 100644 --- a/test/concrete/raindex/RaindexV6.takeOrder.zeroMaxOOBIndex.t.sol +++ b/test/concrete/raindex/RaindexV6.takeOrder.zeroMaxOOBIndex.t.sol @@ -8,8 +8,8 @@ import { OrderV4, TakeOrderConfigV4, TakeOrdersConfigV5, - IRaindexV6 -} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; + IRaindexV7 +} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {SignedContextV1} from "rainlang-interface-0.2.13/src/interface/deprecated/v1/IInterpreterCallerV2.sol"; import {Float, LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; @@ -48,7 +48,7 @@ contract RaindexV6TakeOrderZeroMaxOOBIndexTest is RaindexV6ExternalRealTest { }); vm.prank(bob); - vm.expectRevert(IRaindexV6.ZeroMaximumIO.selector); + vm.expectRevert(IRaindexV7.ZeroMaximumIO.selector); iRaindex.takeOrders4(config); } } diff --git a/test/concrete/raindex/RaindexV6.takeOrder.zeroRatio.t.sol b/test/concrete/raindex/RaindexV6.takeOrder.zeroRatio.t.sol index ec6ba96016..1421c521ab 100644 --- a/test/concrete/raindex/RaindexV6.takeOrder.zeroRatio.t.sol +++ b/test/concrete/raindex/RaindexV6.takeOrder.zeroRatio.t.sol @@ -10,8 +10,8 @@ import { TakeOrderConfigV4, TakeOrdersConfigV5, TaskV2, - IRaindexV6 -} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; + IRaindexV7 +} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {SignedContextV1} from "rainlang-interface-0.2.13/src/interface/deprecated/v1/IInterpreterCallerV2.sol"; import {Float, LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; import {LibOrder} from "../../../src/lib/LibOrder.sol"; @@ -111,7 +111,7 @@ contract RaindexV6TakeOrderZeroRatioTest is RaindexV6ExternalRealTest { vm.expectCall(address(iToken0), abi.encodeWithSelector(IERC20.transferFrom.selector), 0); vm.prank(bob); vm.expectEmit(true, true, true, true); - emit IRaindexV6.TakeOrderV3(bob, config.orders[0], _f(outputMax), LibDecimalFloat.FLOAT_ZERO); + emit IRaindexV7.TakeOrderV3(bob, config.orders[0], _f(outputMax), LibDecimalFloat.FLOAT_ZERO); (Float totalTakerInput, Float totalTakerOutput) = iRaindex.takeOrders4(config); assertTrue(totalTakerInput.eq(_f(outputMax)), "taker input"); @@ -223,7 +223,7 @@ contract RaindexV6TakeOrderZeroRatioTest is RaindexV6ExternalRealTest { vm.prank(bob); vm.expectEmit(true, true, true, true); - emit IRaindexV6.OrderZeroAmount(bob, alice, LibOrder.hash(order)); + emit IRaindexV7.OrderZeroAmount(bob, alice, LibOrder.hash(order)); (Float totalTakerInput, Float totalTakerOutput) = iRaindex.takeOrders4(config); assertTrue(totalTakerInput.isZero(), "taker input"); diff --git a/test/concrete/raindex/RaindexV6.vaultBalance.t.sol b/test/concrete/raindex/RaindexV6.vaultBalance.t.sol index 9cb56aecfb..a660f6be5c 100644 --- a/test/concrete/raindex/RaindexV6.vaultBalance.t.sol +++ b/test/concrete/raindex/RaindexV6.vaultBalance.t.sol @@ -4,7 +4,7 @@ pragma solidity =0.8.25; import {RaindexV6ExternalMockTest} from "test/util/abstract/RaindexV6ExternalMockTest.sol"; import {LibDecimalFloat, Float} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; -import {IRaindexV6} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +import {IRaindexV7} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; /// @title RaindexV6VaultBalanceTest /// Tests the basic functionality of reading from the vault balance. diff --git a/test/concrete/raindex/RaindexV6.vaultBalanceVault0.t.sol b/test/concrete/raindex/RaindexV6.vaultBalanceVault0.t.sol index bd3ec2715a..1b058724fe 100644 --- a/test/concrete/raindex/RaindexV6.vaultBalanceVault0.t.sol +++ b/test/concrete/raindex/RaindexV6.vaultBalanceVault0.t.sol @@ -6,7 +6,7 @@ import {RaindexV6ExternalMockTest} from "test/util/abstract/RaindexV6ExternalMoc import {IERC20} from "@openzeppelin-contracts-5.7.0/token/ERC20/IERC20.sol"; import {IERC20Metadata} from "@openzeppelin-contracts-5.7.0/token/ERC20/extensions/IERC20Metadata.sol"; import {LibDecimalFloat, Float} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; -import {TaskV2} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +import {TaskV2} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {TOFUOutcome} from "rain-tofu-erc20-decimals-0.1.4/src/lib/LibTOFUTokenDecimals.sol"; import {ITOFUTokenDecimals} from "rain-tofu-erc20-decimals-0.1.4/src/interface/ITOFUTokenDecimals.sol"; diff --git a/test/concrete/raindex/RaindexV6.withdraw.entask.t.sol b/test/concrete/raindex/RaindexV6.withdraw.entask.t.sol index 51972f2a5e..50cfa6a57d 100644 --- a/test/concrete/raindex/RaindexV6.withdraw.entask.t.sol +++ b/test/concrete/raindex/RaindexV6.withdraw.entask.t.sol @@ -8,7 +8,7 @@ import { EvaluableV4, TaskV2, SignedContextV1 -} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {IERC20} from "@openzeppelin-contracts-5.7.0/token/ERC20/IERC20.sol"; import {IERC20Metadata} from "@openzeppelin-contracts-5.7.0/token/ERC20/extensions/IERC20Metadata.sol"; diff --git a/test/concrete/raindex/RaindexV6.withdraw.t.sol b/test/concrete/raindex/RaindexV6.withdraw.t.sol index 0f8a91ce42..7c68254f09 100644 --- a/test/concrete/raindex/RaindexV6.withdraw.t.sol +++ b/test/concrete/raindex/RaindexV6.withdraw.t.sol @@ -8,7 +8,7 @@ import {Math} from "@openzeppelin-contracts-5.7.0/utils/math/Math.sol"; import {RaindexV6ExternalMockTest, REVERTING_MOCK_BYTECODE} from "test/util/abstract/RaindexV6ExternalMockTest.sol"; import {Reenteroor, IERC20} from "test/util/concrete/Reenteroor.sol"; -import {TaskV2, IRaindexV6} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +import {TaskV2, IRaindexV7} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {IERC20Metadata} from "@openzeppelin-contracts-5.7.0/token/ERC20/extensions/IERC20Metadata.sol"; import {Float, LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; @@ -31,7 +31,7 @@ contract RaindexV6WithdrawTest is RaindexV6ExternalMockTest { /// Withdrawing vault ID zero is an error. function testWithdrawZeroVaultId(address alice, address token) external { vm.prank(alice); - vm.expectRevert(abi.encodeWithSelector(IRaindexV6.ZeroVaultId.selector, alice, token)); + vm.expectRevert(abi.encodeWithSelector(IRaindexV7.ZeroVaultId.selector, alice, token)); iRaindex.withdraw4(token, bytes32(0), Float.wrap(0), new TaskV2[](0)); } diff --git a/test/lib/LibOrder.t.sol b/test/lib/LibOrder.t.sol index db9f47ab64..c1fef99621 100644 --- a/test/lib/LibOrder.t.sol +++ b/test/lib/LibOrder.t.sol @@ -6,7 +6,7 @@ import {Test} from "forge-std-1.17.0/src/Test.sol"; import {LibOrder, OrderV4} from "../../src/lib/LibOrder.sol"; import {EvaluableV4} from "rainlang-interface-0.2.13/src/interface/IInterpreterCallerV4.sol"; -import {IOV2} from "raindex-interface-0.1.8/src/interface/deprecated/v5/IOrderBookV5.sol"; +import {IOV2} from "raindex-interface-0.1.10/src/interface/deprecated/v5/IOrderBookV5.sol"; /// @title LibOrderTest /// Exercises the LibOrder library. diff --git a/test/lib/LibRaindex.doPost.t.sol b/test/lib/LibRaindex.doPost.t.sol index 6e419cb931..4181406f7d 100644 --- a/test/lib/LibRaindex.doPost.t.sol +++ b/test/lib/LibRaindex.doPost.t.sol @@ -4,7 +4,7 @@ pragma solidity =0.8.25; import {Test} from "forge-std-1.17.0/src/Test.sol"; import {LibRaindexDoPostHarness} from "test/util/concrete/LibRaindexDoPostHarness.sol"; -import {TaskV2} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +import {TaskV2} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {IInterpreterV4, StackItem} from "rainlang-interface-0.2.13/src/interface/IInterpreterV4.sol"; import {IInterpreterStoreV3} from "rainlang-interface-0.2.13/src/interface/IInterpreterStoreV3.sol"; import {StateNamespace} from "rainlang-interface-0.2.13/src/interface/deprecated/v2/IInterpreterStoreV2.sol"; diff --git a/test/lib/LibRaindexArb.finalizeArbTaskContext.t.sol b/test/lib/LibRaindexArb.finalizeArbTaskContext.t.sol index 849a85f685..6ba86792aa 100644 --- a/test/lib/LibRaindexArb.finalizeArbTaskContext.t.sol +++ b/test/lib/LibRaindexArb.finalizeArbTaskContext.t.sol @@ -3,7 +3,7 @@ pragma solidity =0.8.25; import {Test} from "forge-std-1.17.0/src/Test.sol"; -import {EvaluableV4, SignedContextV1, TaskV2} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +import {EvaluableV4, SignedContextV1, TaskV2} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {IInterpreterV4} from "rainlang-interface-0.2.13/src/interface/IInterpreterV4.sol"; import {IInterpreterStoreV3} from "rainlang-interface-0.2.13/src/interface/IInterpreterStoreV3.sol"; import {IParserV2} from "rainlang-interface-0.2.13/src/interface/IParserV2.sol"; diff --git a/test/util/abstract/IRaindexV6Stub.sol b/test/util/abstract/IRaindexV7Stub.sol similarity index 75% rename from test/util/abstract/IRaindexV6Stub.sol rename to test/util/abstract/IRaindexV7Stub.sol index 1055a83406..61522cf3ee 100644 --- a/test/util/abstract/IRaindexV6Stub.sol +++ b/test/util/abstract/IRaindexV7Stub.sol @@ -3,7 +3,7 @@ pragma solidity =0.8.25; import { - IRaindexV6, + IRaindexV7, OrderConfigV4, OrderV4, ClearConfigV2, @@ -13,38 +13,38 @@ import { TaskV2, QuoteV2, Float -} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; -import {IERC3156FlashLender} from "raindex-interface-0.1.8/src/interface/ierc3156/IERC3156FlashLender.sol"; -import {IERC3156FlashBorrower} from "raindex-interface-0.1.8/src/interface/ierc3156/IERC3156FlashBorrower.sol"; +} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; +import {IERC3156FlashLender} from "raindex-interface-0.1.10/src/interface/ierc3156/IERC3156FlashLender.sol"; +import {IERC3156FlashBorrower} from "raindex-interface-0.1.10/src/interface/ierc3156/IERC3156FlashBorrower.sol"; -abstract contract IRaindexV6Stub is IRaindexV6 { - /// @inheritdoc IRaindexV6 +abstract contract IRaindexV7Stub is IRaindexV7 { + /// @inheritdoc IRaindexV7 function entask2(TaskV2[] calldata) external pure { revert("eval"); } - /// @inheritdoc IRaindexV6 + /// @inheritdoc IRaindexV7 function quote2(QuoteV2 calldata) external pure returns (bool, Float, Float) { revert("quote"); } - /// @inheritdoc IRaindexV6 + /// @inheritdoc IRaindexV7 function addOrder4(OrderConfigV4 calldata, TaskV2[] calldata) external pure returns (bool) { revert("addOrder"); } - /// @inheritdoc IRaindexV6 + /// @inheritdoc IRaindexV7 function orderExists(bytes32) external pure returns (bool) { revert("orderExists"); } - /// @inheritdoc IRaindexV6 + /// @inheritdoc IRaindexV7 function removeOrder3(OrderV4 calldata, TaskV2[] calldata) external pure returns (bool) { revert("removeOrder"); } - /// @inheritdoc IRaindexV6 - function clear3( + /// @inheritdoc IRaindexV7 + function clear4( OrderV4 memory, OrderV4 memory, ClearConfigV2 calldata, @@ -54,22 +54,22 @@ abstract contract IRaindexV6Stub is IRaindexV6 { revert("clear"); } - /// @inheritdoc IRaindexV6 + /// @inheritdoc IRaindexV7 function deposit4(address, bytes32, Float, TaskV2[] calldata) external pure { revert("deposit"); } - /// @inheritdoc IRaindexV6 + /// @inheritdoc IRaindexV7 function takeOrders4(TakeOrdersConfigV5 calldata) external pure returns (Float, Float) { revert("takeOrders"); } - /// @inheritdoc IRaindexV6 + /// @inheritdoc IRaindexV7 function vaultBalance2(address, address, bytes32) external pure returns (Float) { revert("vaultBalance"); } - /// @inheritdoc IRaindexV6 + /// @inheritdoc IRaindexV7 function withdraw4(address, bytes32, Float, TaskV2[] calldata) external pure { revert("withdraw"); } diff --git a/test/util/abstract/MockRaindexBase.sol b/test/util/abstract/MockRaindexBase.sol index 43286f590d..9247940a8c 100644 --- a/test/util/abstract/MockRaindexBase.sol +++ b/test/util/abstract/MockRaindexBase.sol @@ -5,7 +5,7 @@ pragma solidity =0.8.25; import {IERC20} from "@openzeppelin-contracts-5.7.0/token/ERC20/IERC20.sol"; import {SafeERC20} from "@openzeppelin-contracts-5.7.0/token/ERC20/utils/SafeERC20.sol"; import { - IRaindexV6, + IRaindexV7, TakeOrdersConfigV5, OrderConfigV4, ClearConfigV2, @@ -14,12 +14,12 @@ import { TaskV2, QuoteV2, Float -} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; -import {IERC3156FlashBorrower} from "raindex-interface-0.1.8/src/interface/ierc3156/IERC3156FlashBorrower.sol"; +} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; +import {IERC3156FlashBorrower} from "raindex-interface-0.1.10/src/interface/ierc3156/IERC3156FlashBorrower.sol"; -/// @dev Base for mock raindex contracts that stub all IRaindexV6 functions. +/// @dev Base for mock raindex contracts that stub all IRaindexV7 functions. /// Inheritors override flashLoan and/or takeOrders4 with real token transfers. -abstract contract MockRaindexBase is IRaindexV6 { +abstract contract MockRaindexBase is IRaindexV7 { using SafeERC20 for IERC20; function flashLoan(IERC3156FlashBorrower, address, uint256, bytes calldata) external virtual returns (bool) { @@ -44,7 +44,7 @@ abstract contract MockRaindexBase is IRaindexV6 { return false; } - function clear3( + function clear4( OrderV4 memory, OrderV4 memory, ClearConfigV2 calldata, diff --git a/test/util/abstract/RaindexV6ExternalMockTest.sol b/test/util/abstract/RaindexV6ExternalMockTest.sol index b84770c70d..f6e83730c4 100644 --- a/test/util/abstract/RaindexV6ExternalMockTest.sol +++ b/test/util/abstract/RaindexV6ExternalMockTest.sol @@ -7,11 +7,11 @@ import {Test} from "forge-std-1.17.0/src/Test.sol"; import {IMetaV1_2} from "rain-metadata-0.1.43/src/lib/LibMeta.sol"; import {REVERTING_MOCK_BYTECODE} from "test/util/lib/LibTestConstants.sol"; -import {IRaindexV6Stub} from "test/util/abstract/IRaindexV6Stub.sol"; +import {IRaindexV7Stub} from "test/util/abstract/IRaindexV7Stub.sol"; import {LibTestAddOrder} from "test/util/lib/LibTestAddOrder.sol"; import {IInterpreterV4} from "rainlang-interface-0.2.13/src/interface/IInterpreterV4.sol"; import {IInterpreterStoreV3} from "rainlang-interface-0.2.13/src/interface/IInterpreterStoreV3.sol"; -import {IRaindexV6, OrderConfigV4, OrderV4, TaskV2} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +import {IRaindexV7, OrderConfigV4, OrderV4, TaskV2} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {IERC20} from "@openzeppelin-contracts-5.7.0/token/ERC20/IERC20.sol"; import {LibOrder} from "../../../src/lib/LibOrder.sol"; import {LibRaindexDeploy} from "../../../src/lib/deploy/LibRaindexDeploy.sol"; @@ -31,11 +31,11 @@ import {LibRainDeploy} from "rain-deploy-0.1.22/src/lib/LibRainDeploy.sol"; /// - Deploys a mockable deployer contract for a DISpair. /// /// Inherits from Test so that it can be used as a base contract for other tests. -/// Implements IRaindexV6 so that it has access to all the relevant events. -abstract contract RaindexV6ExternalMockTest is Test, IMetaV1_2, IRaindexV6Stub { +/// Implements IRaindexV7 so that it has access to all the relevant events. +abstract contract RaindexV6ExternalMockTest is Test, IMetaV1_2, IRaindexV7Stub { IInterpreterV4 immutable iInterpreter; IInterpreterStoreV3 immutable iStore; - IRaindexV6 immutable iRaindex; + IRaindexV7 immutable iRaindex; IERC20 immutable iToken0; IERC20 immutable iToken1; @@ -50,7 +50,7 @@ abstract contract RaindexV6ExternalMockTest is Test, IMetaV1_2, IRaindexV6Stub { iStore = IInterpreterStoreV3(address(uint160(uint256(keccak256("store.rain.test"))))); vm.etch(address(iStore), REVERTING_MOCK_BYTECODE); LibEtchRaindex.etchRaindex(vm); - iRaindex = IRaindexV6(LibRaindexDeploy.RAINDEX_DEPLOYED_ADDRESS); + iRaindex = IRaindexV7(LibRaindexDeploy.RAINDEX_DEPLOYED_ADDRESS); iToken0 = IERC20(address(uint160(uint256(keccak256("token0.rain.test"))))); vm.etch(address(iToken0), REVERTING_MOCK_BYTECODE); diff --git a/test/util/abstract/RaindexV6ExternalRealTest.sol b/test/util/abstract/RaindexV6ExternalRealTest.sol index bd45aae5f1..4cc5ec452d 100644 --- a/test/util/abstract/RaindexV6ExternalRealTest.sol +++ b/test/util/abstract/RaindexV6ExternalRealTest.sol @@ -4,16 +4,16 @@ pragma solidity =0.8.25; import {Test, Vm, console2} from "forge-std-1.17.0/src/Test.sol"; import {REVERTING_MOCK_BYTECODE} from "test/util/lib/LibTestConstants.sol"; -import {IRaindexV6Stub} from "test/util/abstract/IRaindexV6Stub.sol"; +import {IRaindexV7Stub} from "test/util/abstract/IRaindexV7Stub.sol"; import {IInterpreterStoreV3} from "rainlang-interface-0.2.13/src/interface/IInterpreterStoreV3.sol"; import {IParserV2} from "rainlang-interface-0.2.13/src/interface/IParserV2.sol"; import { - IRaindexV6, + IRaindexV7, IInterpreterV4, TaskV2, EvaluableV4, SignedContextV1 -} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {IERC20} from "@openzeppelin-contracts-5.7.0/token/ERC20/IERC20.sol"; import {RaindexV6SubParser} from "../../../src/concrete/parser/RaindexV6SubParser.sol"; import {IERC20Metadata} from "@openzeppelin-contracts-5.7.0/token/ERC20/extensions/IERC20Metadata.sol"; @@ -33,11 +33,11 @@ import { import {LibRaindexDeploy} from "../../../src/lib/deploy/LibRaindexDeploy.sol"; import {LibEtchRaindex} from "test/util/lib/LibEtchRaindex.sol"; -abstract contract RaindexV6ExternalRealTest is Test, IRaindexV6Stub { +abstract contract RaindexV6ExternalRealTest is Test, IRaindexV7Stub { IInterpreterV4 internal immutable iInterpreter; IInterpreterStoreV3 internal immutable iStore; IParserV2 internal immutable iParserV2; - IRaindexV6 internal immutable iRaindex; + IRaindexV7 internal immutable iRaindex; IERC20 internal immutable iToken0; IERC20 internal immutable iToken1; RaindexV6SubParser internal immutable iSubParser; @@ -54,7 +54,7 @@ abstract contract RaindexV6ExternalRealTest is Test, IRaindexV6Stub { iStore = IInterpreterStoreV3(TEST_STORE_ADDRESS); iParserV2 = IParserV2(TEST_EXPRESSION_DEPLOYER_ADDRESS); - iRaindex = IRaindexV6(LibRaindexDeploy.RAINDEX_DEPLOYED_ADDRESS); + iRaindex = IRaindexV7(LibRaindexDeploy.RAINDEX_DEPLOYED_ADDRESS); iToken0 = IERC20(address(uint160(uint256(keccak256("token0.rain.test"))))); vm.etch(address(iToken0), REVERTING_MOCK_BYTECODE); diff --git a/test/util/concrete/Alice.sol b/test/util/concrete/Alice.sol index 23e25a9c1b..b6e1a5a6f8 100644 --- a/test/util/concrete/Alice.sol +++ b/test/util/concrete/Alice.sol @@ -6,7 +6,7 @@ import {IERC20} from "@openzeppelin-contracts-5.7.0/token/ERC20/IERC20.sol"; import { IERC3156FlashBorrower, ON_FLASH_LOAN_CALLBACK_SUCCESS -} from "raindex-interface-0.1.8/src/interface/ierc3156/IERC3156FlashBorrower.sol"; +} from "raindex-interface-0.1.10/src/interface/ierc3156/IERC3156FlashBorrower.sol"; import {IPull} from "test/util/concrete/IPull.sol"; /// Alice has some daisy contract pull tokens from her. diff --git a/test/util/concrete/ChildGatedRaindexV6ArbOrderTaker.sol b/test/util/concrete/ChildGatedRaindexV6ArbOrderTaker.sol index bf3a52025d..9de2f4ca65 100644 --- a/test/util/concrete/ChildGatedRaindexV6ArbOrderTaker.sol +++ b/test/util/concrete/ChildGatedRaindexV6ArbOrderTaker.sol @@ -4,7 +4,7 @@ pragma solidity =0.8.25; import {RaindexV6ArbOrderTaker} from "../../../src/abstract/RaindexV6ArbOrderTaker.sol"; import {RaindexV6ArbTaskGated, RaindexV6ArbConfig} from "../../../src/abstract/RaindexV6ArbTaskGated.sol"; -import {TaskV2} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +import {TaskV2} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; /// @dev A task-gated arb order taker: combines the `arb5` entrypoint from /// `RaindexV6ArbOrderTaker` with the task-hash gating mixin diff --git a/test/util/concrete/ChildGatedRaindexV6FlashBorrower.sol b/test/util/concrete/ChildGatedRaindexV6FlashBorrower.sol index 9ca3413c1d..543b07a42a 100644 --- a/test/util/concrete/ChildGatedRaindexV6FlashBorrower.sol +++ b/test/util/concrete/ChildGatedRaindexV6FlashBorrower.sol @@ -4,7 +4,7 @@ pragma solidity =0.8.25; import {RaindexV6FlashBorrower} from "../../../src/abstract/RaindexV6FlashBorrower.sol"; import {RaindexV6ArbTaskGated, RaindexV6ArbConfig} from "../../../src/abstract/RaindexV6ArbTaskGated.sol"; -import {TaskV2} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +import {TaskV2} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; /// @dev A task-gated flash borrower arb: combines the `arb4` entrypoint from /// `RaindexV6FlashBorrower` with the task-hash gating mixin diff --git a/test/util/concrete/ChildRaindexV6ArbTaskGated.sol b/test/util/concrete/ChildRaindexV6ArbTaskGated.sol index 746abab41c..7f0884cd06 100644 --- a/test/util/concrete/ChildRaindexV6ArbTaskGated.sol +++ b/test/util/concrete/ChildRaindexV6ArbTaskGated.sol @@ -3,7 +3,7 @@ pragma solidity =0.8.25; import {RaindexV6ArbTaskGated, RaindexV6ArbConfig} from "../../../src/abstract/RaindexV6ArbTaskGated.sol"; -import {TaskV2} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +import {TaskV2} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; /// @dev We need a contract that is deployable in order to test the abstract /// base contract. Exposes `_checkTaskHash` as an external function. diff --git a/test/util/concrete/FlashLendingMockRaindex.sol b/test/util/concrete/FlashLendingMockRaindex.sol index 5762e17d2c..6e51274466 100644 --- a/test/util/concrete/FlashLendingMockRaindex.sol +++ b/test/util/concrete/FlashLendingMockRaindex.sol @@ -7,7 +7,7 @@ import { IOV2, OrderV4, SignedContextV1, - IRaindexV6, + IRaindexV7, TakeOrdersConfigV5, OrderConfigV4, ClearConfigV2, @@ -15,10 +15,10 @@ import { TaskV2, QuoteV2, Float -} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; -import {IERC3156FlashBorrower} from "raindex-interface-0.1.8/src/interface/ierc3156/IERC3156FlashBorrower.sol"; +} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; +import {IERC3156FlashBorrower} from "raindex-interface-0.1.10/src/interface/ierc3156/IERC3156FlashBorrower.sol"; -contract FlashLendingMockRaindex is IRaindexV6 { +contract FlashLendingMockRaindex is IRaindexV7 { function flashLoan(IERC3156FlashBorrower receiver, address token, uint256 amount, bytes calldata data) external returns (bool) @@ -29,15 +29,15 @@ contract FlashLendingMockRaindex is IRaindexV6 { function entask2(TaskV2[] calldata) external pure {} - /// @inheritdoc IRaindexV6 + /// @inheritdoc IRaindexV7 function quote2(QuoteV2 calldata) external pure returns (bool, Float, Float) { revert("quote"); } - /// @inheritdoc IRaindexV6 + /// @inheritdoc IRaindexV7 function takeOrders4(TakeOrdersConfigV5 calldata) external pure returns (Float, Float) {} - /// @inheritdoc IRaindexV6 + /// @inheritdoc IRaindexV7 function addOrder4(OrderConfigV4 calldata, TaskV2[] calldata) external pure returns (bool) { return false; } @@ -46,8 +46,8 @@ contract FlashLendingMockRaindex is IRaindexV6 { return false; } - /// @inheritdoc IRaindexV6 - function clear3( + /// @inheritdoc IRaindexV7 + function clear4( OrderV4 memory, OrderV4 memory, ClearConfigV2 calldata, diff --git a/test/util/concrete/LeftoverFlashLendingMockRaindex.sol b/test/util/concrete/LeftoverFlashLendingMockRaindex.sol index 9e0aeb0a37..3cc4799b8f 100644 --- a/test/util/concrete/LeftoverFlashLendingMockRaindex.sol +++ b/test/util/concrete/LeftoverFlashLendingMockRaindex.sol @@ -7,7 +7,7 @@ import {SafeERC20} from "@openzeppelin-contracts-5.7.0/token/ERC20/utils/SafeERC import { IERC3156FlashBorrower, ON_FLASH_LOAN_CALLBACK_SUCCESS -} from "raindex-interface-0.1.8/src/interface/ierc3156/IERC3156FlashBorrower.sol"; +} from "raindex-interface-0.1.10/src/interface/ierc3156/IERC3156FlashBorrower.sol"; import {MockRaindexBase} from "test/util/abstract/MockRaindexBase.sol"; /// @dev Mock raindex whose `flashLoan` performs a real net-neutral ERC3156 diff --git a/test/util/concrete/LibRaindexArbFinalizeHarness.sol b/test/util/concrete/LibRaindexArbFinalizeHarness.sol index 52feb990d8..f52aede1b9 100644 --- a/test/util/concrete/LibRaindexArbFinalizeHarness.sol +++ b/test/util/concrete/LibRaindexArbFinalizeHarness.sol @@ -3,7 +3,7 @@ pragma solidity =0.8.25; import {LibRaindexArb} from "src/lib/LibRaindexArb.sol"; -import {TaskV2, SignedContextV1, EvaluableV4} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +import {TaskV2, SignedContextV1, EvaluableV4} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {IInterpreterV4} from "rainlang-interface-0.2.13/src/interface/IInterpreterV4.sol"; import {IInterpreterStoreV3} from "rainlang-interface-0.2.13/src/interface/IInterpreterStoreV3.sol"; diff --git a/test/util/concrete/LibRaindexDoPostHarness.sol b/test/util/concrete/LibRaindexDoPostHarness.sol index 622493f73f..53ae10c83c 100644 --- a/test/util/concrete/LibRaindexDoPostHarness.sol +++ b/test/util/concrete/LibRaindexDoPostHarness.sol @@ -3,7 +3,7 @@ pragma solidity =0.8.25; import {LibRaindex} from "src/lib/LibRaindex.sol"; -import {TaskV2} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +import {TaskV2} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; /// @dev Exposes the internal `LibRaindex.doPost` for direct testing. contract LibRaindexDoPostHarness { diff --git a/test/util/concrete/MaliciousRaindex.sol b/test/util/concrete/MaliciousRaindex.sol index 17f435af79..59ecdcdaf0 100644 --- a/test/util/concrete/MaliciousRaindex.sol +++ b/test/util/concrete/MaliciousRaindex.sol @@ -3,7 +3,7 @@ pragma solidity =0.8.25; import {IERC20} from "@openzeppelin-contracts-5.7.0/token/ERC20/IERC20.sol"; -import {IERC3156FlashBorrower} from "raindex-interface-0.1.8/src/interface/ierc3156/IERC3156FlashBorrower.sol"; +import {IERC3156FlashBorrower} from "raindex-interface-0.1.10/src/interface/ierc3156/IERC3156FlashBorrower.sol"; import {MockRaindexBase} from "test/util/abstract/MockRaindexBase.sol"; /// @dev Malicious raindex that records the token allowances it has from the diff --git a/test/util/concrete/RaindexV6CalculateOrderIOHarness.sol b/test/util/concrete/RaindexV6CalculateOrderIOHarness.sol index 64b2bc5bef..03a020e238 100644 --- a/test/util/concrete/RaindexV6CalculateOrderIOHarness.sol +++ b/test/util/concrete/RaindexV6CalculateOrderIOHarness.sol @@ -6,7 +6,7 @@ import {RaindexV6} from "src/concrete/raindex/RaindexV6.sol"; import {IRaindexV6CalculateOrderIOHarness} from "test/util/interface/IRaindexV6CalculateOrderIOHarness.sol"; import {OrderIOCalculationV4} from "src/struct/OrderIOCalculationV4.sol"; import {Float} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; -import {OrderV4, SignedContextV1} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +import {OrderV4, SignedContextV1} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {TOFUOutcome} from "rain-tofu-erc20-decimals-0.1.4/src/interface/ITOFUTokenDecimals.sol"; import {LibTOFUTokenDecimals} from "rain-tofu-erc20-decimals-0.1.4/src/lib/LibTOFUTokenDecimals.sol"; diff --git a/test/util/concrete/RaindexV6ClearDriverHarness.sol b/test/util/concrete/RaindexV6ClearDriverHarness.sol index 826774cd45..734d32caf6 100644 --- a/test/util/concrete/RaindexV6ClearDriverHarness.sol +++ b/test/util/concrete/RaindexV6ClearDriverHarness.sol @@ -7,7 +7,7 @@ import {IRaindexV6ClearDriverHarness} from "test/util/interface/IRaindexV6ClearD import {Float} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; /// @dev RaindexV6 subclass that exposes order-liveness and vault seeding so a -/// full `clear3` can be driven against fresh-compiled source bytecode. +/// full `clear4` can be driven against fresh-compiled source bytecode. contract RaindexV6ClearDriverHarness is RaindexV6, IRaindexV6ClearDriverHarness { function setOrderLive(bytes32 orderHash) external { sOrders[orderHash] = 1; diff --git a/test/util/concrete/RaindexV6ClearStateChangeHarness.sol b/test/util/concrete/RaindexV6ClearStateChangeHarness.sol index 1fdb0d6251..c395d958e9 100644 --- a/test/util/concrete/RaindexV6ClearStateChangeHarness.sol +++ b/test/util/concrete/RaindexV6ClearStateChangeHarness.sol @@ -5,7 +5,7 @@ pragma solidity =0.8.25; import {RaindexV6} from "src/concrete/raindex/RaindexV6.sol"; import {IRaindexV6ClearStateChangeHarness} from "test/util/interface/IRaindexV6ClearStateChangeHarness.sol"; import {OrderIOCalculationV4} from "src/struct/OrderIOCalculationV4.sol"; -import {ClearStateChangeV2} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +import {ClearStateChangeV2} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {Float} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; /// @dev Exposes RaindexV6's internal pure clear-state-change math so it can be diff --git a/test/util/concrete/RealisticFlashLendingMockRaindex.sol b/test/util/concrete/RealisticFlashLendingMockRaindex.sol index 877152986c..717098d742 100644 --- a/test/util/concrete/RealisticFlashLendingMockRaindex.sol +++ b/test/util/concrete/RealisticFlashLendingMockRaindex.sol @@ -4,11 +4,11 @@ pragma solidity =0.8.25; import {IERC20} from "@openzeppelin-contracts-5.7.0/token/ERC20/IERC20.sol"; import {SafeERC20} from "@openzeppelin-contracts-5.7.0/token/ERC20/utils/SafeERC20.sol"; -import {TakeOrdersConfigV5, Float} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +import {TakeOrdersConfigV5, Float} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import { IERC3156FlashBorrower, ON_FLASH_LOAN_CALLBACK_SUCCESS -} from "raindex-interface-0.1.8/src/interface/ierc3156/IERC3156FlashBorrower.sol"; +} from "raindex-interface-0.1.10/src/interface/ierc3156/IERC3156FlashBorrower.sol"; import {MockRaindexBase} from "test/util/abstract/MockRaindexBase.sol"; /// @dev Mock raindex with real ERC3156 flash loan transfers and real diff --git a/test/util/concrete/RealisticOrderTakerMockRaindex.sol b/test/util/concrete/RealisticOrderTakerMockRaindex.sol index 593e3757a2..31e38b7d13 100644 --- a/test/util/concrete/RealisticOrderTakerMockRaindex.sol +++ b/test/util/concrete/RealisticOrderTakerMockRaindex.sol @@ -4,8 +4,8 @@ pragma solidity =0.8.25; import {IERC20} from "@openzeppelin-contracts-5.7.0/token/ERC20/IERC20.sol"; import {SafeERC20} from "@openzeppelin-contracts-5.7.0/token/ERC20/utils/SafeERC20.sol"; -import {TakeOrdersConfigV5, Float} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; -import {IRaindexV6OrderTaker} from "raindex-interface-0.1.8/src/interface/IRaindexV6OrderTaker.sol"; +import {TakeOrdersConfigV5, Float} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; +import {IRaindexV7OrderTaker} from "raindex-interface-0.1.10/src/interface/IRaindexV7OrderTaker.sol"; import {MockRaindexBase} from "test/util/abstract/MockRaindexBase.sol"; /// @dev Mock raindex with real takeOrders4 transfers and onTakeOrders2 @@ -30,7 +30,7 @@ contract RealisticOrderTakerMockRaindex is MockRaindexBase { IERC20(ordersOutputToken).safeTransfer(msg.sender, outputAmount); // Callback: taker swaps received tokens for the tokens the Raindex will pull. - IRaindexV6OrderTaker(msg.sender) + IRaindexV7OrderTaker(msg.sender) .onTakeOrders2(ordersOutputToken, ordersInputToken, Float.wrap(0), Float.wrap(0), config.data); // Pull iPullAmount of inputToken from taker. diff --git a/test/util/concrete/RecordingFlashLendingMockRaindex.sol b/test/util/concrete/RecordingFlashLendingMockRaindex.sol index bd2fed52f4..53af249674 100644 --- a/test/util/concrete/RecordingFlashLendingMockRaindex.sol +++ b/test/util/concrete/RecordingFlashLendingMockRaindex.sol @@ -4,11 +4,11 @@ pragma solidity =0.8.25; import {IERC20} from "@openzeppelin-contracts-5.7.0/token/ERC20/IERC20.sol"; import {SafeERC20} from "@openzeppelin-contracts-5.7.0/token/ERC20/utils/SafeERC20.sol"; -import {TakeOrdersConfigV5, Float} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +import {TakeOrdersConfigV5, Float} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import { IERC3156FlashBorrower, ON_FLASH_LOAN_CALLBACK_SUCCESS -} from "raindex-interface-0.1.8/src/interface/ierc3156/IERC3156FlashBorrower.sol"; +} from "raindex-interface-0.1.10/src/interface/ierc3156/IERC3156FlashBorrower.sol"; import {MockRaindexBase} from "test/util/abstract/MockRaindexBase.sol"; /// @dev Mock raindex identical to `RealisticFlashLendingMockRaindex` (real diff --git a/test/util/concrete/RecordingOrderTaker.sol b/test/util/concrete/RecordingOrderTaker.sol index 9a12da04b5..86a783b46b 100644 --- a/test/util/concrete/RecordingOrderTaker.sol +++ b/test/util/concrete/RecordingOrderTaker.sol @@ -2,17 +2,17 @@ // SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd pragma solidity =0.8.25; -import {TakeOrdersConfigV5, IRaindexV6} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; -import {IRaindexV6OrderTaker} from "raindex-interface-0.1.8/src/interface/IRaindexV6OrderTaker.sol"; +import {TakeOrdersConfigV5, IRaindexV7} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; +import {IRaindexV7OrderTaker} from "raindex-interface-0.1.10/src/interface/IRaindexV7OrderTaker.sol"; import {Float} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; /// Records whether `onTakeOrders2` was invoked, so a test can assert the /// callback fires only when at least one order was actually taken. -contract RecordingOrderTaker is IRaindexV6OrderTaker { +contract RecordingOrderTaker is IRaindexV7OrderTaker { bool public called; - IRaindexV6 internal immutable iRaindex; + IRaindexV7 internal immutable iRaindex; - constructor(IRaindexV6 raindex) { + constructor(IRaindexV7 raindex) { iRaindex = raindex; } diff --git a/test/util/concrete/RecordingTaker.sol b/test/util/concrete/RecordingTaker.sol index 72e58591aa..90cdcb4273 100644 --- a/test/util/concrete/RecordingTaker.sol +++ b/test/util/concrete/RecordingTaker.sol @@ -2,23 +2,23 @@ // SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd pragma solidity =0.8.25; -import {TakeOrdersConfigV5, IRaindexV6} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; -import {IRaindexV6OrderTaker} from "raindex-interface-0.1.8/src/interface/IRaindexV6OrderTaker.sol"; +import {TakeOrdersConfigV5, IRaindexV7} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; +import {IRaindexV7OrderTaker} from "raindex-interface-0.1.10/src/interface/IRaindexV7OrderTaker.sol"; import {Float} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; /// Records onTakeOrders2 invocation + the args it was called with so a test can /// assert the callback fires only when something was taken and with the right /// token/amount arguments. -contract RecordingTaker is IRaindexV6OrderTaker { +contract RecordingTaker is IRaindexV7OrderTaker { uint256 public calls; address public lastOutputToken; address public lastInputToken; Float public lastTakerInput; Float public lastTakerOutput; bytes public lastData; - IRaindexV6 internal immutable iRaindex; + IRaindexV7 internal immutable iRaindex; - constructor(IRaindexV6 raindex) { + constructor(IRaindexV7 raindex) { iRaindex = raindex; } diff --git a/test/util/concrete/Reenteroor.sol b/test/util/concrete/Reenteroor.sol index c1431b03e0..3ffa82b5f9 100644 --- a/test/util/concrete/Reenteroor.sol +++ b/test/util/concrete/Reenteroor.sol @@ -6,7 +6,7 @@ import {Address} from "@openzeppelin-contracts-5.7.0/utils/Address.sol"; import { IERC3156FlashBorrower, ON_FLASH_LOAN_CALLBACK_SUCCESS -} from "raindex-interface-0.1.8/src/interface/ierc3156/IERC3156FlashBorrower.sol"; +} from "raindex-interface-0.1.10/src/interface/ierc3156/IERC3156FlashBorrower.sol"; import {IERC20} from "@openzeppelin-contracts-5.7.0/token/ERC20/IERC20.sol"; /// @title Reenteroor diff --git a/test/util/concrete/ReentrantExchange.sol b/test/util/concrete/ReentrantExchange.sol index 1de5ea05c4..bf659e9d0d 100644 --- a/test/util/concrete/ReentrantExchange.sol +++ b/test/util/concrete/ReentrantExchange.sol @@ -4,7 +4,7 @@ pragma solidity =0.8.25; import {GenericPoolRaindexV6FlashBorrower} from "../../../src/concrete/arb/GenericPoolRaindexV6FlashBorrower.sol"; import { - IRaindexV6, + IRaindexV7, TakeOrdersConfigV5, TakeOrderConfigV4, OrderV4, @@ -12,7 +12,7 @@ import { EvaluableV4, SignedContextV1, TaskV2 -} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {IInterpreterV4} from "rainlang-interface-0.2.13/src/interface/IInterpreterV4.sol"; import {IInterpreterStoreV3} from "rainlang-interface-0.2.13/src/interface/IInterpreterStoreV3.sol"; import {LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; @@ -20,9 +20,9 @@ import {LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.so /// @dev Exchange that re-enters arb4 when called during _exchange. contract ReentrantExchange { GenericPoolRaindexV6FlashBorrower internal immutable iArb; - IRaindexV6 internal immutable iRaindex; + IRaindexV7 internal immutable iRaindex; - constructor(GenericPoolRaindexV6FlashBorrower arb, IRaindexV6 raindex) { + constructor(GenericPoolRaindexV6FlashBorrower arb, IRaindexV7 raindex) { iArb = arb; iRaindex = raindex; } diff --git a/test/util/concrete/ReentrantMockRaindex.sol b/test/util/concrete/ReentrantMockRaindex.sol index 1d0800a873..d919619fe3 100644 --- a/test/util/concrete/ReentrantMockRaindex.sol +++ b/test/util/concrete/ReentrantMockRaindex.sol @@ -6,13 +6,13 @@ import {IERC20} from "@openzeppelin-contracts-5.7.0/token/ERC20/IERC20.sol"; import {SafeERC20} from "@openzeppelin-contracts-5.7.0/token/ERC20/utils/SafeERC20.sol"; import {GenericPoolRaindexV6ArbOrderTaker} from "../../../src/concrete/arb/GenericPoolRaindexV6ArbOrderTaker.sol"; import { - IRaindexV6, + IRaindexV7, TakeOrdersConfigV5, TaskV2, EvaluableV4, SignedContextV1, Float -} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {IInterpreterV4} from "rainlang-interface-0.2.13/src/interface/IInterpreterV4.sol"; import {IInterpreterStoreV3} from "rainlang-interface-0.2.13/src/interface/IInterpreterStoreV3.sol"; import {MockRaindexBase} from "test/util/abstract/MockRaindexBase.sol"; @@ -35,7 +35,7 @@ contract ReentrantMockRaindex is MockRaindexBase { // Re-enter arb5 from the Raindex callback. GenericPoolRaindexV6ArbOrderTaker(payable(msg.sender)) .arb5( - IRaindexV6(address(this)), + IRaindexV7(address(this)), config, TaskV2({ evaluable: EvaluableV4(IInterpreterV4(address(0)), IInterpreterStoreV3(address(0)), hex""), diff --git a/test/util/interface/IRaindexV6CalculateOrderIOHarness.sol b/test/util/interface/IRaindexV6CalculateOrderIOHarness.sol index ee5f281750..9849939d55 100644 --- a/test/util/interface/IRaindexV6CalculateOrderIOHarness.sol +++ b/test/util/interface/IRaindexV6CalculateOrderIOHarness.sol @@ -2,11 +2,11 @@ // SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd pragma solidity ^0.8.25; -import {IRaindexV6, OrderV4, SignedContextV1, Float} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +import {IRaindexV7, OrderV4, SignedContextV1, Float} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {TOFUOutcome} from "rain-tofu-erc20-decimals-0.1.4/src/interface/ITOFUTokenDecimals.sol"; import {OrderIOCalculationV4} from "src/struct/OrderIOCalculationV4.sol"; -interface IRaindexV6CalculateOrderIOHarness is IRaindexV6 { +interface IRaindexV6CalculateOrderIOHarness is IRaindexV7 { function exposedCalculateOrderIO( OrderV4 memory order, uint256 inputIOIndex, diff --git a/test/util/interface/IRaindexV6ClearDriverHarness.sol b/test/util/interface/IRaindexV6ClearDriverHarness.sol index 1f01c030ab..3f0416e90a 100644 --- a/test/util/interface/IRaindexV6ClearDriverHarness.sol +++ b/test/util/interface/IRaindexV6ClearDriverHarness.sol @@ -2,9 +2,9 @@ // SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd pragma solidity ^0.8.25; -import {IRaindexV6, Float} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +import {IRaindexV7, Float} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; -interface IRaindexV6ClearDriverHarness is IRaindexV6 { +interface IRaindexV6ClearDriverHarness is IRaindexV7 { function setOrderLive(bytes32 orderHash) external; function seedVault(address owner, address token, bytes32 vaultId, Float amount) external; diff --git a/test/util/interface/IRaindexV6ClearStateChangeHarness.sol b/test/util/interface/IRaindexV6ClearStateChangeHarness.sol index 82b9ecb0b6..33d05bc366 100644 --- a/test/util/interface/IRaindexV6ClearStateChangeHarness.sol +++ b/test/util/interface/IRaindexV6ClearStateChangeHarness.sol @@ -2,10 +2,10 @@ // SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd pragma solidity ^0.8.25; -import {IRaindexV6, ClearStateChangeV2, Float} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +import {IRaindexV7, ClearStateChangeV2, Float} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {OrderIOCalculationV4} from "src/struct/OrderIOCalculationV4.sol"; -interface IRaindexV6ClearStateChangeHarness is IRaindexV6 { +interface IRaindexV6ClearStateChangeHarness is IRaindexV7 { function exposedCalculateClearStateChange( OrderIOCalculationV4 memory aliceOrderIOCalculation, OrderIOCalculationV4 memory bobOrderIOCalculation diff --git a/test/util/interface/IRaindexV6VaultBalanceHarness.sol b/test/util/interface/IRaindexV6VaultBalanceHarness.sol index 3bf7e5e7f1..625709adaf 100644 --- a/test/util/interface/IRaindexV6VaultBalanceHarness.sol +++ b/test/util/interface/IRaindexV6VaultBalanceHarness.sol @@ -2,9 +2,9 @@ // SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd pragma solidity ^0.8.25; -import {IRaindexV6, Float} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +import {IRaindexV7, Float} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; -interface IRaindexV6VaultBalanceHarness is IRaindexV6 { +interface IRaindexV6VaultBalanceHarness is IRaindexV7 { function exposedIncrease(address owner, address token, bytes32 vaultId, Float amount) external returns (Float, Float); diff --git a/test/util/lib/LibTestAddOrder.sol b/test/util/lib/LibTestAddOrder.sol index cc69536485..849185ca67 100644 --- a/test/util/lib/LibTestAddOrder.sol +++ b/test/util/lib/LibTestAddOrder.sol @@ -4,7 +4,7 @@ pragma solidity ^0.8.19; import {META_MAGIC_NUMBER_V1} from "rain-metadata-0.1.43/src/lib/LibMeta.sol"; import {LibOrder} from "../../../src/lib/LibOrder.sol"; -import {OrderConfigV4, OrderV4, IOV2} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +import {OrderConfigV4, OrderV4, IOV2} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {IInterpreterV4, SourceIndexV2} from "rainlang-interface-0.2.13/src/interface/IInterpreterV4.sol"; import {IInterpreterStoreV3} from "rainlang-interface-0.2.13/src/interface/IInterpreterStoreV3.sol"; import {EvaluableV4} from "rainlang-interface-0.2.13/src/interface/IInterpreterCallerV4.sol"; diff --git a/test/util/lib/LibTestArb.sol b/test/util/lib/LibTestArb.sol index 7243f685c7..e9f577a63c 100644 --- a/test/util/lib/LibTestArb.sol +++ b/test/util/lib/LibTestArb.sol @@ -5,7 +5,7 @@ pragma solidity ^0.8.19; import {Vm} from "forge-std-1.17.0/src/Vm.sol"; import {IERC20} from "@openzeppelin-contracts-5.7.0/token/ERC20/IERC20.sol"; import { - IRaindexV6, + IRaindexV7, TakeOrdersConfigV5, TakeOrderConfigV4, OrderV4, @@ -13,7 +13,7 @@ import { EvaluableV4, SignedContextV1, TaskV2 -} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {IInterpreterV4} from "rainlang-interface-0.2.13/src/interface/IInterpreterV4.sol"; import {IInterpreterStoreV3} from "rainlang-interface-0.2.13/src/interface/IInterpreterStoreV3.sol"; import {LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; @@ -43,7 +43,7 @@ struct OrderTakerSetup { GenericPoolRaindexV6ArbOrderTaker arb; MockToken inputToken; MockToken outputToken; - IRaindexV6 raindex; + IRaindexV7 raindex; TakeOrdersConfigV5 takeOrdersConfig; } @@ -135,7 +135,7 @@ library LibTestArb { }); } - arb.arb5{value: ethValue}(IRaindexV6(address(raindex)), takeOrdersConfig, task); + arb.arb5{value: ethValue}(IRaindexV7(address(raindex)), takeOrdersConfig, task); return ArbResult({ @@ -205,7 +205,7 @@ library LibTestArb { arb: arb, inputToken: inputToken, outputToken: outputToken, - raindex: IRaindexV6(address(raindex)), + raindex: IRaindexV7(address(raindex)), takeOrdersConfig: takeOrdersConfig }); } diff --git a/test/util/lib/LibTestFlashBorrowerArb.sol b/test/util/lib/LibTestFlashBorrowerArb.sol index 8cec3a47a9..42c042c165 100644 --- a/test/util/lib/LibTestFlashBorrowerArb.sol +++ b/test/util/lib/LibTestFlashBorrowerArb.sol @@ -5,14 +5,14 @@ pragma solidity ^0.8.19; import {Vm} from "forge-std-1.17.0/src/Vm.sol"; import {IERC20} from "@openzeppelin-contracts-5.7.0/token/ERC20/IERC20.sol"; import { - IRaindexV6, + IRaindexV7, TakeOrdersConfigV5, TakeOrderConfigV4, OrderV4, IOV2, EvaluableV4, SignedContextV1 -} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {IInterpreterV4} from "rainlang-interface-0.2.13/src/interface/IInterpreterV4.sol"; import {IInterpreterStoreV3} from "rainlang-interface-0.2.13/src/interface/IInterpreterStoreV3.sol"; import {LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; @@ -33,7 +33,7 @@ struct FlashBorrowerSetup { GenericPoolRaindexV6FlashBorrower arb; MockToken inputToken; MockToken outputToken; - IRaindexV6 raindex; + IRaindexV7 raindex; TakeOrdersConfigV5 takeOrdersConfig; bytes exchangeData; } @@ -57,7 +57,7 @@ library LibTestFlashBorrowerArb { RealisticFlashLendingMockRaindex mockRaindex = new RealisticFlashLendingMockRaindex(); vm.etch(LibRaindexDeploy.RAINDEX_DEPLOYED_ADDRESS, address(mockRaindex).code); - IRaindexV6 raindex = IRaindexV6(LibRaindexDeploy.RAINDEX_DEPLOYED_ADDRESS); + IRaindexV7 raindex = IRaindexV7(LibRaindexDeploy.RAINDEX_DEPLOYED_ADDRESS); outputToken.mint(address(raindex), 10 * amount); inputToken.mint(exchange, amount); diff --git a/test/util/lib/LibTestTakeOrder.sol b/test/util/lib/LibTestTakeOrder.sol index d7661fc491..fa6255344c 100644 --- a/test/util/lib/LibTestTakeOrder.sol +++ b/test/util/lib/LibTestTakeOrder.sol @@ -11,8 +11,8 @@ import { EvaluableV4, OrderConfigV4, TaskV2, - IRaindexV6 -} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; + IRaindexV7 +} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {IInterpreterV4} from "rainlang-interface-0.2.13/src/interface/IInterpreterV4.sol"; import {IInterpreterStoreV3} from "rainlang-interface-0.2.13/src/interface/IInterpreterStoreV3.sol"; import {IParserV2} from "rainlang-interface-0.2.13/src/interface/IParserV2.sol"; @@ -45,7 +45,7 @@ library LibTestTakeOrder { bytes32 outputVaultId ) internal returns (OrderV4 memory) { IParserV2 parser = IParserV2(TEST_EXPRESSION_DEPLOYER_ADDRESS); - IRaindexV6 raindex = IRaindexV6(LibRaindexDeploy.RAINDEX_DEPLOYED_ADDRESS); + IRaindexV7 raindex = IRaindexV7(LibRaindexDeploy.RAINDEX_DEPLOYED_ADDRESS); bytes memory bytecode = parser.parse2(expression); IOV2[] memory inputs = new IOV2[](1); From 1a703c25951dd78c1eee889307829e97b483ce15 Mon Sep 17 00:00:00 2001 From: David Meister Date: Mon, 26 Oct 2026 13:32:05 +0000 Subject: [PATCH 02/15] Pin raindex.interface#79 SignedContextV2 head and rainlang.interface#134 merge rainlang 0.2.19 still imports rainlang-interface-0.2.13, so that release is kept alongside under its own Soldeer name and remapped. Co-Authored-By: Claude Opus 5.5 --- foundry.toml | 7 +++++-- remappings.txt | 3 ++- soldeer.lock | 8 +++++++- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/foundry.toml b/foundry.toml index 9b2b779b88..55dbf9d516 100644 --- a/foundry.toml +++ b/foundry.toml @@ -78,10 +78,13 @@ rainlang = "0.2.19" # rainlanguage/rain.interpreter.interface was renamed to # rainlanguage/rainlang.interface; its Soldeer registry name moved from # `rain-interpreter-interface` (0.1.x) to `rainlang-interface` (0.2.x). -rainlang-interface = "0.2.13" +rainlang-interface = { version = "0.2.14", git = "https://github.com/rainlanguage/rainlang.interface.git", rev = "f665f7fcbeade38f525853c94d61570080e07621" } +# `rainlang` 0.2.19 imports `rainlang-interface-0.2.13/`; flat resolution keeps +# that version alongside until `rainlang` republishes against 0.2.14. +rainlang-interface-rainlang = { version = "0.2.13", url = "https://soldeer-revisions.s3.amazonaws.com/rainlang-interface/0_2_13_11-10-2026_17:54:59_rainlang.zip" } # rainlanguage/rain.raindex.interface was renamed to # rainlanguage/raindex.interface; Soldeer registry name follows. -raindex-interface = { version = "0.1.10", git = "https://github.com/rainlanguage/raindex.interface.git", rev = "b8b58723c50ab950e18d9126fb608d6f20924602" } +raindex-interface = { version = "0.1.10", git = "https://github.com/rainlanguage/raindex.interface.git", rev = "cee2eff1ed714d3c2238d845ea5ecdfb432ee1c1" } rain-metadata = "0.1.43" # The MetaBoard split out of `rain.metadata` into its own deploy repo. The # deploy pin lives there now; `rain-metadata` keeps the interfaces and libs. diff --git a/remappings.txt b/remappings.txt index 5801e4f202..21d6b43c07 100644 --- a/remappings.txt +++ b/remappings.txt @@ -19,4 +19,5 @@ rain-tofu-erc20-decimals-0.1.4/=dependencies/rain-tofu-erc20-decimals-0.1.4/ rain-tofu-erc20-decimals-deploy-0.1.3/=dependencies/rain-tofu-erc20-decimals-deploy-0.1.3/ raindex-interface-0.1.10/=dependencies/raindex-interface-0.1.10/ rainlang-0.2.19/=dependencies/rainlang-0.2.19/ -rainlang-interface-0.2.13/=dependencies/rainlang-interface-0.2.13/ +rainlang-interface-0.2.13/=dependencies/rainlang-interface-rainlang-0.2.13/ +rainlang-interface-0.2.14/=dependencies/rainlang-interface-0.2.14/ diff --git a/soldeer.lock b/soldeer.lock index f81d8f2261..848c07b5dd 100644 --- a/soldeer.lock +++ b/soldeer.lock @@ -135,7 +135,7 @@ integrity = "a2832c32c4a13a592c4c66072be5dca8b956e535467d8ce3cb6c51e9b4d5fc89" name = "raindex-interface" version = "0.1.10" git = "https://github.com/rainlanguage/raindex.interface.git" -rev = "b8b58723c50ab950e18d9126fb608d6f20924602" +rev = "cee2eff1ed714d3c2238d845ea5ecdfb432ee1c1" [[dependencies]] name = "rainlang" @@ -146,6 +146,12 @@ integrity = "b7e5e97ea63d89649f5cb4d82f630a22fc6a3cd1b529ce1deda61f7b22a3325a" [[dependencies]] name = "rainlang-interface" +version = "0.2.14" +git = "https://github.com/rainlanguage/rainlang.interface.git" +rev = "f665f7fcbeade38f525853c94d61570080e07621" + +[[dependencies]] +name = "rainlang-interface-rainlang" version = "0.2.13" url = "https://soldeer-revisions.s3.amazonaws.com/rainlang-interface/0_2_13_11-10-2026_17:54:59_rainlang.zip" checksum = "8128d2d63ee9c0d83e0ec6f9a5501bdd6da5f21ce3b3374cde2e08eaa4ef1800" From e0156f824729022ff6d23ce75aa2a7df456f6998 Mon Sep 17 00:00:00 2001 From: David Meister Date: Mon, 26 Oct 2026 13:43:13 +0000 Subject: [PATCH 03/15] WIP: SignedContextV2 migration (does not build yet) Co-Authored-By: Claude Opus 5.5 --- script/Build.sol | 2 +- src/abstract/RaindexV6ArbCommon.sol | 6 +- src/abstract/RaindexV6ArbOrderTaker.sol | 12 +- src/abstract/RaindexV6ArbTaskGated.sol | 4 +- src/abstract/RaindexV6FlashBorrower.sol | 20 +- .../arb/GenericPoolRaindexV6FlashBorrower.sol | 4 +- src/concrete/parser/RaindexV6SubParser.sol | 20 +- src/concrete/raindex/RaindexV6.sol | 56 +++--- src/constant/OrderEntrypoints.sol | 2 +- src/lib/LibRaindex.sol | 35 ++-- src/lib/LibRaindexArb.sol | 6 +- src/lib/LibRaindexSubParser.sol | 34 +++- src/struct/OrderIOCalculationV4.sol | 2 +- src/struct/TakeOrdersIO.sol | 2 +- .../RaindexV6ArbOrderTaker.badRaindex.t.sol | 22 +-- ...aindexV6ArbOrderTaker.beforeArbOrder.t.sol | 38 ++-- .../RaindexV6ArbOrderTaker.context.t.sol | 24 +-- ...ndexV6ArbOrderTaker.finalizeDecimals.t.sol | 22 +-- ...indexV6ArbOrderTaker.finalizeTaskArg.t.sol | 32 +-- ...ndexV6ArbOrderTaker.ioIndexSelection.t.sol | 44 ++--- .../RaindexV6ArbOrderTaker.noOrders.t.sol | 20 +- ...RaindexV6ArbOrderTaker.onTakeOrders2.t.sol | 28 +-- .../RaindexV6ArbOrderTaker.reentrancy.t.sol | 30 +-- ...6ArbTaskGated.checkTaskHashPassMatch.t.sol | 10 +- ...V6ArbTaskGated.checkTaskHashPassZero.t.sol | 14 +- ...6ArbTaskGated.checkTaskHashWrongTask.t.sol | 14 +- .../RaindexV6ArbTaskGated.construct.t.sol | 10 +- ...ndexV6ArbTaskGated.iTaskHashBoundary.t.sol | 16 +- ...indexV6ArbTaskGated.iTaskHashNonzero.t.sol | 10 +- .../RaindexV6ArbTaskGated.iTaskHashZero.t.sol | 10 +- .../RaindexV6FlashBorrower.badRaindex.t.sol | 12 +- ...aindexV6FlashBorrower.beforeArbOrder.t.sol | 38 ++-- ...ndexV6FlashBorrower.finalizeDecimals.t.sol | 28 +-- ...lashBorrower.flashLoanAmountLossless.t.sol | 32 +-- ...V6FlashBorrower.flashLoanAmountValue.t.sol | 32 +-- ...indexV6FlashBorrower.flashLoanFailed.t.sol | 26 +-- ...6FlashBorrower.inputIoIndexSelection.t.sol | 38 ++-- .../RaindexV6FlashBorrower.ioIsInput.t.sol | 20 +- ...RaindexV6FlashBorrower.mixedDecimals.t.sol | 28 +-- .../RaindexV6FlashBorrower.noOrders.t.sol | 20 +- ...ndexV6FlashBorrower.orders0Selection.t.sol | 32 +-- .../RaindexV6FlashBorrower.payable.t.sol | 8 +- ...exV6FlashBorrower.realTokenTransfers.t.sol | 26 +-- .../RaindexV6FlashBorrower.reentrancy.t.sol | 28 +-- .../RaindexV6FlashLender.reentrant.t.sol | 36 ++-- ...indexV6ArbOrderTaker.approvalRevoked.t.sol | 6 +- ...aindexV6ArbOrderTaker.exchangeRevert.t.sol | 4 +- ...ArbOrderTaker.raindexApprovalRevoked.t.sol | 12 +- ...dexV6ArbOrderTaker.reentrantCallback.t.sol | 18 +- ...ricPoolRaindexV6ArbOrderTaker.sender.t.sol | 18 +- ...olRaindexV6ArbOrderTaker.zeroAddress.t.sol | 6 +- ...indexV6FlashBorrower.approvalRevoked.t.sol | 6 +- ...lRaindexV6FlashBorrower.ethForwarded.t.sol | 4 +- ...aindexV6FlashBorrower.exchangeRevert.t.sol | 4 +- ...FlashBorrower.exchangeTokenSelection.t.sol | 36 ++-- ...FlashBorrower.raindexApprovalRevoked.t.sol | 12 +- ...ricPoolRaindexV6FlashBorrower.sender.t.sol | 18 +- ...olRaindexV6FlashBorrower.zeroAddress.t.sol | 4 +- ...xV6ArbOrderTaker.nonStandardDecimals.t.sol | 28 +-- ...RaindexV6ArbOrderTaker.onTakeOrders2.t.sol | 28 +-- ...dexV6ArbOrderTaker.onTakeOrders2Fuzz.t.sol | 2 +- ...ocessorRaindexV6ArbOrderTaker.sender.t.sol | 18 +- .../parser/RaindexV6SubParser.ierc165.t.sol | 2 +- ...dexV6SubParser.operandHandlersWiring.t.sol | 93 ++++----- .../parser/RaindexV6SubParser.pointers.t.sol | 2 +- .../parser/RaindexV6SubParser.routing.t.sol | 30 +-- ...bParser.routingTokenDecimalsAndMasks.t.sol | 18 +- .../RaindexV6SubParser.signerDomains.t.sol | 75 +++++++ ...RaindexV6SubParser.wordParsersWiring.t.sol | 53 ++--- .../raindex/RaindexV6.addOrder.entask.t.sol | 12 +- .../raindex/RaindexV6.addOrder.mock.t.sol | 14 +- .../raindex/RaindexV6.addOrder.nonce.t.sol | 14 +- .../raindex/RaindexV6.addOrder.owner.t.sol | 10 +- .../concrete/raindex/RaindexV6.addOrder.t.sol | 22 +-- .../RaindexV6.calculateOrderIOHarness.t.sol | 84 ++++---- .../raindex/RaindexV6.clear.badStack.t.sol | 10 +- ...RaindexV6.clear.calculateStateChange.t.sol | 2 +- .../raindex/RaindexV6.clear.context.t.sol | 12 +- .../raindex/RaindexV6.clear.deadOrder.t.sol | 10 +- .../raindex/RaindexV6.clear.freshDriver.t.sol | 42 ++-- .../RaindexV6.clear.handleIO.revert.t.sol | 12 +- .../raindex/RaindexV6.clear.mock.t.sol | 14 +- .../raindex/RaindexV6.clear.sameOwner.t.sol | 10 +- .../raindex/RaindexV6.clear.sameToken.t.sol | 10 +- ...RaindexV6.clear.signedContextRouting.t.sol | 153 +++++++------- .../raindex/RaindexV6.clear.zeroAmount.t.sol | 10 +- .../raindex/RaindexV6.deposit.entask.t.sol | 14 +- test/concrete/raindex/RaindexV6.deposit.t.sol | 34 ++-- .../RaindexV6.depositWithdrawHarness.t.sol | 38 ++-- .../raindex/RaindexV6.doPost.fresh.t.sol | 52 ++--- test/concrete/raindex/RaindexV6.entask.t.sol | 10 +- .../raindex/RaindexV6.errorSelector.t.sol | 14 +- .../raindex/RaindexV6.multicall.t.sol | 12 +- .../raindex/RaindexV6.orderMgmt.fresh.t.sol | 114 +++++------ .../RaindexV6.postTaskSignedContext.t.sol | 97 ++++----- .../raindex/RaindexV6.quote.sameToken.t.sol | 24 +-- test/concrete/raindex/RaindexV6.quote.t.sol | 22 +-- .../RaindexV6.removeOrder.entask.t.sol | 20 +- .../raindex/RaindexV6.removeOrder.mock.t.sol | 22 +-- .../raindex/RaindexV6.removeOrder.owner.t.sol | 34 ++-- .../RaindexV6.takeOrder.badStack.t.sol | 10 +- ...dexV6.takeOrder.batchEvalConsistency.t.sol | 32 +-- ...exV6.takeOrder.batchStateAdversarial.t.sol | 44 ++--- ...RaindexV6.takeOrder.batchStateBypass.t.sol | 50 ++--- ...ndexV6.takeOrder.calculationsContext.t.sol | 6 +- .../RaindexV6.takeOrder.dirtyFreeMemory.t.sol | 24 +-- .../RaindexV6.takeOrder.exceedsMaxRatio.t.sol | 10 +- .../RaindexV6.takeOrder.freshMutation.t.sol | 186 +++++++++--------- .../RaindexV6.takeOrder.freshVaultZero.t.sol | 38 ++-- .../RaindexV6.takeOrder.handleIO.revert.t.sol | 18 +- .../RaindexV6.takeOrder.maximumInput.t.sol | 34 ++-- .../RaindexV6.takeOrder.maximumOutput.t.sol | 36 ++-- .../RaindexV6.takeOrder.minimumIO.t.sol | 10 +- .../RaindexV6.takeOrder.minimumIOOutput.t.sol | 14 +- .../raindex/RaindexV6.takeOrder.noop.t.sol | 46 ++--- .../RaindexV6.takeOrder.precision.t.sol | 14 +- .../RaindexV6.takeOrder.sameToken.t.sol | 20 +- .../RaindexV6.takeOrder.takenFlag.t.sol | 22 +-- .../RaindexV6.takeOrder.tokenMismatch.t.sol | 26 +-- .../RaindexV6.takeOrder.vaultZeroInput.t.sol | 80 ++++---- .../RaindexV6.takeOrder.zeroAmount.t.sol | 12 +- .../RaindexV6.takeOrder.zeroMaxOOBIndex.t.sol | 16 +- .../RaindexV6.takeOrder.zeroRatio.t.sol | 56 +++--- .../RaindexV6.vaultBalanceVault0.t.sol | 4 +- .../raindex/RaindexV6.withdraw.entask.t.sol | 22 +-- .../concrete/raindex/RaindexV6.withdraw.t.sol | 26 +-- test/lib/LibOrder.t.sol | 2 +- test/lib/LibRaindex.doPost.t.sol | 32 +-- .../LibRaindexArb.finalizeArbGasExtreme.t.sol | 2 +- .../LibRaindexArb.finalizeArbNativeGas.t.sol | 2 +- ...LibRaindexArb.finalizeArbTaskContext.t.sol | 16 +- ...ndexArb.finalizeArbTaskSignedContext.t.sol | 52 ++--- test/util/abstract/ArbTest.sol | 10 +- test/util/abstract/IRaindexV7Stub.sol | 26 +-- test/util/abstract/MockRaindexBase.sol | 28 +-- .../abstract/RaindexV6ExternalMockTest.sol | 16 +- .../abstract/RaindexV6ExternalRealTest.sol | 14 +- test/util/concrete/CalcInterpreter.sol | 4 +- .../ChildGatedRaindexV6ArbOrderTaker.sol | 8 +- .../ChildGatedRaindexV6FlashBorrower.sol | 8 +- .../concrete/ChildRaindexV6ArbTaskGated.sol | 4 +- test/util/concrete/FixedStackInterpreter.sol | 2 +- .../util/concrete/FlashLendingMockRaindex.sol | 28 +-- .../LeftoverFlashLendingMockRaindex.sol | 2 +- .../concrete/LibRaindexArbFinalizeHarness.sol | 10 +- .../util/concrete/LibRaindexDoPostHarness.sol | 4 +- test/util/concrete/MockInterpreter.sol | 4 +- .../util/concrete/NoExchangeFlashBorrower.sol | 2 +- .../RaindexV6CalculateOrderIOHarness.sol | 4 +- .../RealisticFlashLendingMockRaindex.sol | 6 +- .../RealisticOrderTakerMockRaindex.sol | 6 +- .../RecordingFlashLendingMockRaindex.sol | 6 +- test/util/concrete/RecordingOrderTaker.sol | 6 +- test/util/concrete/RecordingTaker.sol | 6 +- test/util/concrete/ReentrantExchange.sol | 28 +-- test/util/concrete/ReentrantMockRaindex.sol | 22 +-- .../concrete/ReentrantOnTakeOrdersStore.sol | 2 +- .../LibRaindexSubParserContextFixture.sol | 10 +- .../IRaindexV6CalculateOrderIOHarness.sol | 4 +- test/util/lib/LibTestAddOrder.sol | 8 +- test/util/lib/LibTestArb.sol | 52 ++--- test/util/lib/LibTestFlashBorrowerArb.sol | 22 +-- test/util/lib/LibTestSignedContext.sol | 23 +++ test/util/lib/LibTestTakeOrder.sol | 32 +-- 164 files changed, 1976 insertions(+), 1791 deletions(-) create mode 100644 test/concrete/parser/RaindexV6SubParser.signerDomains.t.sol create mode 100644 test/util/lib/LibTestSignedContext.sol diff --git a/script/Build.sol b/script/Build.sol index 86fb084588..a8919be767 100644 --- a/script/Build.sol +++ b/script/Build.sol @@ -7,7 +7,7 @@ import {LibRainDeploySnapshot} from "rain-deploy-0.1.22/src/lib/LibRainDeploySna import {LibRainDeploy} from "rain-deploy-0.1.22/src/lib/LibRainDeploy.sol"; import {LibCodeGen} from "rain-sol-codegen-0.1.39/src/lib/LibCodeGen.sol"; import {LibFs} from "rain-sol-codegen-0.1.39/src/lib/LibFs.sol"; -import {LibGenParseMeta} from "rainlang-interface-0.2.13/src/lib/codegen/LibGenParseMeta.sol"; +import {LibGenParseMeta} from "rainlang-interface-0.2.14/src/lib/codegen/LibGenParseMeta.sol"; import {DeployCandidate} from "../src/abstract/RainDeploySuitesBase.sol"; import {RaindexDeploySuites} from "../src/abstract/RaindexDeploySuites.sol"; import {RaindexV6SubParser} from "../src/concrete/parser/RaindexV6SubParser.sol"; diff --git a/src/abstract/RaindexV6ArbCommon.sol b/src/abstract/RaindexV6ArbCommon.sol index 95c96054ad..0a4ffeb980 100644 --- a/src/abstract/RaindexV6ArbCommon.sol +++ b/src/abstract/RaindexV6ArbCommon.sol @@ -2,11 +2,11 @@ // SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd pragma solidity ^0.8.19; -import {TaskV2} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; +import {TaskV3} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; /// @param task The task to run as post for each arb. struct RaindexV6ArbConfig { - TaskV2 task; + TaskV3 task; } /// Thrown when the task does not match the expected hash. @@ -33,5 +33,5 @@ abstract contract RaindexV6ArbCommon { /// @dev Hook called at the start of every arb. Base implementation is a /// no-op. Overridden by `RaindexV6ArbTaskGated` to validate the task /// hash. - function _beforeArb(TaskV2 memory task) internal virtual {} + function _beforeArb(TaskV3 memory task) internal virtual {} } diff --git a/src/abstract/RaindexV6ArbOrderTaker.sol b/src/abstract/RaindexV6ArbOrderTaker.sol index 7cefa0474c..9ff4c4c7de 100644 --- a/src/abstract/RaindexV6ArbOrderTaker.sol +++ b/src/abstract/RaindexV6ArbOrderTaker.sol @@ -6,8 +6,8 @@ import {ERC165, IERC165} from "@openzeppelin-contracts-5.7.0/utils/introspection import {ReentrancyGuard} from "@openzeppelin-contracts-5.7.0/utils/ReentrancyGuard.sol"; import {IERC20, SafeERC20} from "@openzeppelin-contracts-5.7.0/token/ERC20/utils/SafeERC20.sol"; import {IRaindexV7} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; -import {IRaindexV7ArbOrderTaker, TaskV2} from "raindex-interface-0.1.10/src/interface/IRaindexV7ArbOrderTaker.sol"; -import {TakeOrdersConfigV5, Float} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; +import {IRaindexV7ArbOrderTaker, TaskV3} from "raindex-interface-0.1.10/src/interface/IRaindexV7ArbOrderTaker.sol"; +import {TakeOrdersConfigV6, Float} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {RaindexV6ArbCommon, BadRaindex} from "./RaindexV6ArbCommon.sol"; import {LibRaindexArb} from "../lib/LibRaindexArb.sol"; import {LibRaindexDeploy} from "../lib/deploy/LibRaindexDeploy.sol"; @@ -40,7 +40,7 @@ abstract contract RaindexV6ArbOrderTaker is } /// @inheritdoc IRaindexV7ArbOrderTaker - function arb5(IRaindexV7 raindex, TakeOrdersConfigV5 calldata takeOrders, TaskV2 calldata task) + function arb6(IRaindexV7 raindex, TakeOrdersConfigV6 calldata takeOrders, TaskV3 calldata task) external payable nonReentrant @@ -61,7 +61,7 @@ abstract contract RaindexV6ArbOrderTaker is IERC20(ordersInputToken).forceApprove(address(raindex), type(uint256).max); //slither-disable-next-line unused-return - raindex.takeOrders4(takeOrders); + raindex.takeOrders5(takeOrders); IERC20(ordersInputToken).forceApprove(address(raindex), 0); LibRaindexArb.finalizeArb( @@ -74,10 +74,10 @@ abstract contract RaindexV6ArbOrderTaker is } /// @inheritdoc IRaindexV7OrderTaker - /// @dev While `arb5` is in flight only the trusted raindex may call this; + /// @dev While `arb6` is in flight only the trusted raindex may call this; /// any other caller reverts with `UnexpectedOnTakeOrdersCaller`. During an /// arb the contract holds the caller's `msg.value` and tokens, and - /// `takeOrders4` runs order-owner-chosen code (e.g. the order's store) that + /// `takeOrders5` runs order-owner-chosen code (e.g. the order's store) that /// could otherwise re-enter here and direct that value. /// /// Outside an arb it is a permissionless no-op: the contract holds no value diff --git a/src/abstract/RaindexV6ArbTaskGated.sol b/src/abstract/RaindexV6ArbTaskGated.sol index aca4709b47..239eb499ab 100644 --- a/src/abstract/RaindexV6ArbTaskGated.sol +++ b/src/abstract/RaindexV6ArbTaskGated.sol @@ -3,7 +3,7 @@ pragma solidity ^0.8.19; import {RaindexV6ArbCommon, RaindexV6ArbConfig, WrongTask} from "./RaindexV6ArbCommon.sol"; -import {TaskV2} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; +import {TaskV3} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; /// @title RaindexV6ArbTaskGated /// @notice Mixin that adds task-hash gating to arb contracts. Stores a task @@ -26,7 +26,7 @@ abstract contract RaindexV6ArbTaskGated is RaindexV6ArbCommon { /// match the hash of the provided task. Passes through if no task was /// configured at construction. //slither-disable-next-line dead-code - function _checkTaskHash(TaskV2 memory task) internal pure { + function _checkTaskHash(TaskV3 memory task) internal pure { if (iTaskHash != bytes32(0) && iTaskHash != keccak256(abi.encode(task))) { revert WrongTask(); } diff --git a/src/abstract/RaindexV6FlashBorrower.sol b/src/abstract/RaindexV6FlashBorrower.sol index 1ef012920a..690256f708 100644 --- a/src/abstract/RaindexV6FlashBorrower.sol +++ b/src/abstract/RaindexV6FlashBorrower.sol @@ -9,7 +9,7 @@ import {ReentrancyGuard} from "@openzeppelin-contracts-5.7.0/utils/ReentrancyGua import { ON_FLASH_LOAN_CALLBACK_SUCCESS } from "raindex-interface-0.1.10/src/interface/ierc3156/IERC3156FlashBorrower.sol"; -import {IRaindexV7, TakeOrdersConfigV5, TaskV2} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; +import {IRaindexV7, TakeOrdersConfigV6, TaskV3} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {IERC3156FlashBorrower} from "raindex-interface-0.1.10/src/interface/ierc3156/IERC3156FlashBorrower.sol"; import {RaindexV6ArbCommon, BadRaindex} from "./RaindexV6ArbCommon.sol"; import {LibRaindexArb} from "../lib/LibRaindexArb.sol"; @@ -29,7 +29,7 @@ error BadLender(address badLender); /// Thrown when the flash loan fails somehow. error FlashLoanFailed(); -/// Thrown when `arb4` is called with `IOIsInput == false`. The flash-loan amount +/// Thrown when `arb5` is called with `IOIsInput == false`. The flash-loan amount /// is the order output the taker receives, which `minimumIO` expresses only when /// it is the taker input (`IOIsInput == true`). error ArbRequiresInputIO(); @@ -83,7 +83,7 @@ abstract contract RaindexV6FlashBorrower is IERC3156FlashBorrower, ReentrancyGua /// @param takeOrders As per `arb`. /// @param exchangeData As per `arb`. //slither-disable-next-line dead-code - function _exchange(TakeOrdersConfigV5 memory takeOrders, bytes memory exchangeData) internal virtual {} + function _exchange(TakeOrdersConfigV6 memory takeOrders, bytes memory exchangeData) internal virtual {} /// @inheritdoc IERC3156FlashBorrower function onFlashLoan(address initiator, address, uint256, uint256, bytes calldata data) external returns (bytes32) { @@ -96,8 +96,8 @@ abstract contract RaindexV6FlashBorrower is IERC3156FlashBorrower, ReentrancyGua revert BadInitiator(initiator); } - (TakeOrdersConfigV5 memory takeOrders, bytes memory exchangeData) = - abi.decode(data, (TakeOrdersConfigV5, bytes)); + (TakeOrdersConfigV6 memory takeOrders, bytes memory exchangeData) = + abi.decode(data, (TakeOrdersConfigV6, bytes)); // Dispatch the `_exchange` hook to ensure we have the correct asset // type and amount to fill the orders. @@ -109,7 +109,7 @@ abstract contract RaindexV6FlashBorrower is IERC3156FlashBorrower, ReentrancyGua // the flash loan itself will take back what it needs, and we simply // keep anything left over according to active balances. //slither-disable-next-line unused-return - IRaindexV7(msg.sender).takeOrders4(takeOrders); + IRaindexV7(msg.sender).takeOrders5(takeOrders); return ON_FLASH_LOAN_CALLBACK_SUCCESS; } @@ -127,18 +127,18 @@ abstract contract RaindexV6FlashBorrower is IERC3156FlashBorrower, ReentrancyGua /// @param raindex The `Raindex` contract to take orders from and flash /// loan against. MUST be the deterministic deployment, else reverts /// `BadRaindex`. - /// @param takeOrders As per `IRaindexV7.takeOrders4`. + /// @param takeOrders As per `IRaindexV7.takeOrders5`. /// @param exchangeData Arbitrary bytes that will be passed to `_exchange` /// after the flash loan is taken. The inheriting contract is responsible /// for decoding this data and defining how it controls interactions with /// the external liquidity. For example, `GenericPoolRaindexV6FlashBorrower` /// uses this data as a literal encoded external call. /// @param task The task to evaluate after the arb completes. - function arb4( + function arb5( IRaindexV7 raindex, - TakeOrdersConfigV5 calldata takeOrders, + TakeOrdersConfigV6 calldata takeOrders, bytes calldata exchangeData, - TaskV2 calldata task + TaskV3 calldata task ) external payable nonReentrant { _beforeArb(task); // Mimic what Raindex would do anyway if called with zero orders. diff --git a/src/concrete/arb/GenericPoolRaindexV6FlashBorrower.sol b/src/concrete/arb/GenericPoolRaindexV6FlashBorrower.sol index 9b4652818a..fbc2b4042a 100644 --- a/src/concrete/arb/GenericPoolRaindexV6FlashBorrower.sol +++ b/src/concrete/arb/GenericPoolRaindexV6FlashBorrower.sol @@ -2,7 +2,7 @@ // SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd pragma solidity =0.8.25; -import {RaindexV6FlashBorrower, TakeOrdersConfigV5} from "../../abstract/RaindexV6FlashBorrower.sol"; +import {RaindexV6FlashBorrower, TakeOrdersConfigV6} from "../../abstract/RaindexV6FlashBorrower.sol"; import {LibGenericPoolExchange} from "../../lib/LibGenericPoolExchange.sol"; /// @title GenericPoolRaindexV6FlashBorrower @@ -22,7 +22,7 @@ contract GenericPoolRaindexV6FlashBorrower is RaindexV6FlashBorrower { /// @inheritdoc RaindexV6FlashBorrower /// @dev Decodes `exchangeData` as `(spender, pool, encodedFunctionCall)` /// and routes the swap through the specified pool via `LibGenericPoolExchange`. - function _exchange(TakeOrdersConfigV5 memory takeOrders, bytes memory exchangeData) internal virtual override { + function _exchange(TakeOrdersConfigV6 memory takeOrders, bytes memory exchangeData) internal virtual override { address borrowedToken = takeOrders.orders[0].order.validOutputs[takeOrders.orders[0].outputIOIndex].token; LibGenericPoolExchange.exchange(borrowedToken, exchangeData); } diff --git a/src/concrete/parser/RaindexV6SubParser.sol b/src/concrete/parser/RaindexV6SubParser.sol index 9c532e8ecc..c00fe11018 100644 --- a/src/concrete/parser/RaindexV6SubParser.sol +++ b/src/concrete/parser/RaindexV6SubParser.sol @@ -35,7 +35,7 @@ import { CONTEXT_BASE_ROW_SENDER, CONTEXT_BASE_ROW_CALLING_CONTRACT, CONTEXT_BASE_ROWS -} from "rainlang-interface-0.2.13/src/lib/caller/LibContext.sol"; +} from "rainlang-interface-0.2.14/src/lib/caller/LibContext.sol"; import { CONTEXT_COLUMNS_EXTENDED, CONTEXT_VAULT_OUTPUTS_COLUMN, @@ -60,7 +60,10 @@ import { CONTEXT_SIGNED_CONTEXT_START_ROWS, CONTEXT_SIGNED_CONTEXT_SIGNERS_COLUMN, CONTEXT_SIGNED_CONTEXT_SIGNERS_ROW, - CONTEXT_SIGNED_CONTEXT_SIGNERS_ROWS + CONTEXT_SIGNED_CONTEXT_SIGNERS_ROWS, + CONTEXT_SIGNED_CONTEXT_DOMAINS_COLUMN, + CONTEXT_SIGNED_CONTEXT_DOMAINS_ROW, + CONTEXT_SIGNED_CONTEXT_DOMAINS_ROWS } from "../../lib/LibRaindex.sol"; import { DESCRIBED_BY_META_HASH, @@ -145,6 +148,10 @@ contract RaindexV6SubParser is BaseRainlangSubParser { new function(bytes32[] memory) internal pure returns (OperandV2)[](CONTEXT_SIGNED_CONTEXT_SIGNERS_ROWS); contextSignersHandlers[CONTEXT_SIGNED_CONTEXT_SIGNERS_ROW] = LibParseOperand.handleOperandSingleFullNoDefault; + function(bytes32[] memory) internal pure returns (OperandV2)[] memory contextSignerDomainsHandlers = + new function(bytes32[] memory) internal pure returns (OperandV2)[](CONTEXT_SIGNED_CONTEXT_DOMAINS_ROWS); + contextSignerDomainsHandlers[CONTEXT_SIGNED_CONTEXT_DOMAINS_ROW] = LibParseOperand.handleOperandSingleFullNoDefault; + function(bytes32[] memory) internal pure returns (OperandV2)[] memory contextSignedContextHandlers = new function(bytes32[] memory) internal pure returns (OperandV2)[](CONTEXT_SIGNED_CONTEXT_START_ROWS); contextSignedContextHandlers[CONTEXT_SIGNED_CONTEXT_START_ROW] = @@ -156,6 +163,7 @@ contract RaindexV6SubParser is BaseRainlangSubParser { handlers[CONTEXT_VAULT_INPUTS_COLUMN] = contextVaultInputsHandlers; handlers[CONTEXT_VAULT_OUTPUTS_COLUMN] = contextVaultOutputsHandlers; handlers[CONTEXT_SIGNED_CONTEXT_SIGNERS_COLUMN] = contextSignersHandlers; + handlers[CONTEXT_SIGNED_CONTEXT_DOMAINS_COLUMN] = contextSignerDomainsHandlers; handlers[CONTEXT_SIGNED_CONTEXT_START_COLUMN] = contextSignedContextHandlers; function(bytes32[] memory) internal pure returns (OperandV2)[] memory contextDepositContextHandlers = @@ -252,6 +260,13 @@ contract RaindexV6SubParser is BaseRainlangSubParser { view returns (bool, bytes memory, bytes32[] memory)[](CONTEXT_SIGNED_CONTEXT_SIGNERS_ROWS); contextSignersParsers[CONTEXT_SIGNED_CONTEXT_SIGNERS_ROW] = LibRaindexSubParser.subParserSigners; + function(uint256, uint256, OperandV2) internal view returns (bool, bytes memory, bytes32[] memory)[] memory + contextSignerDomainsParsers = + new function(uint256, uint256, OperandV2) + internal + view returns (bool, bytes memory, bytes32[] memory)[](CONTEXT_SIGNED_CONTEXT_DOMAINS_ROWS); + contextSignerDomainsParsers[CONTEXT_SIGNED_CONTEXT_DOMAINS_ROW] = LibRaindexSubParser.subParserSignerDomains; + function(uint256, uint256, OperandV2) internal view returns (bool, bytes memory, bytes32[] memory)[] memory contextSignedContextParsers = new function(uint256, uint256, OperandV2) @@ -265,6 +280,7 @@ contract RaindexV6SubParser is BaseRainlangSubParser { parsers[CONTEXT_VAULT_INPUTS_COLUMN] = contextVaultInputsParsers; parsers[CONTEXT_VAULT_OUTPUTS_COLUMN] = contextVaultOutputsParsers; parsers[CONTEXT_SIGNED_CONTEXT_SIGNERS_COLUMN] = contextSignersParsers; + parsers[CONTEXT_SIGNED_CONTEXT_DOMAINS_COLUMN] = contextSignerDomainsParsers; parsers[CONTEXT_SIGNED_CONTEXT_START_COLUMN] = contextSignedContextParsers; // Deposits diff --git a/src/concrete/raindex/RaindexV6.sol b/src/concrete/raindex/RaindexV6.sol index acffbbff4e..8585be2bd0 100644 --- a/src/concrete/raindex/RaindexV6.sol +++ b/src/concrete/raindex/RaindexV6.sol @@ -9,8 +9,8 @@ import {SafeERC20} from "@openzeppelin-contracts-5.7.0/token/ERC20/utils/SafeERC import {ReentrancyGuard} from "@openzeppelin-contracts-5.7.0/utils/ReentrancyGuard.sol"; import {IERC20Metadata} from "@openzeppelin-contracts-5.7.0/token/ERC20/extensions/IERC20Metadata.sol"; -import {LibContext} from "rainlang-interface-0.2.13/src/lib/caller/LibContext.sol"; -import {LibBytecode} from "rainlang-interface-0.2.13/src/lib/bytecode/LibBytecode.sol"; +import {LibContext} from "rainlang-interface-0.2.14/src/lib/caller/LibContext.sol"; +import {LibBytecode} from "rainlang-interface-0.2.14/src/lib/bytecode/LibBytecode.sol"; import {LibInterpreterStateDataContract} from "rainlang-0.2.19/src/lib/state/LibInterpreterStateDataContract.sol"; import { SourceIndexV2, @@ -18,11 +18,11 @@ import { IInterpreterV4, StackItem, EvalV4 -} from "rainlang-interface-0.2.13/src/interface/IInterpreterV4.sol"; +} from "rainlang-interface-0.2.14/src/interface/IInterpreterV4.sol"; import {LibUint256Array} from "rain-solmem-0.1.28/src/lib/LibUint256Array.sol"; import {LibUint256Matrix} from "rain-solmem-0.1.28/src/lib/LibUint256Matrix.sol"; -import {IInterpreterStoreV3} from "rainlang-interface-0.2.13/src/interface/IInterpreterStoreV3.sol"; -import {LibNamespace} from "rainlang-interface-0.2.13/src/lib/ns/LibNamespace.sol"; +import {IInterpreterStoreV3} from "rainlang-interface-0.2.14/src/interface/IInterpreterStoreV3.sol"; +import {LibNamespace} from "rainlang-interface-0.2.14/src/lib/ns/LibNamespace.sol"; import {LibMeta} from "rain-metadata-0.1.43/src/lib/LibMeta.sol"; import {IMetaV1_2} from "rain-metadata-0.1.43/src/interface/unstable/IMetaV1_2.sol"; import {LibRaindex} from "../../lib/LibRaindex.sol"; @@ -34,16 +34,16 @@ import { IRaindexV7, OrderV4, OrderConfigV4, - TakeOrderConfigV4, - TakeOrdersConfigV5, + TakeOrderConfigV5, + TakeOrdersConfigV6, ClearConfigV2, ClearStateChangeV2, - SignedContextV1, + SignedContextV2, //forge-lint: disable-next-line(unused-import) EvaluableV4, - TaskV2, - QuoteV2, + TaskV3, + QuoteV3, Float, IOV2 } from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; @@ -150,12 +150,12 @@ contract RaindexV6 is IRaindexV7, IMetaV1_2, ReentrancyGuard, Multicall, Raindex } /// @inheritdoc IRaindexV7 - function entask2(TaskV2[] calldata post) external nonReentrant { + function entask3(TaskV3[] calldata post) external nonReentrant { LibRaindex.doPost(new bytes32[][](0), post); } /// @inheritdoc IRaindexV7 - function deposit4(address token, bytes32 vaultId, Float depositAmount, TaskV2[] calldata post) + function deposit5(address token, bytes32 vaultId, Float depositAmount, TaskV3[] calldata post) external nonReentrant nonZeroVaultId(msg.sender, token, vaultId) @@ -190,7 +190,7 @@ contract RaindexV6 is IRaindexV7, IMetaV1_2, ReentrancyGuard, Multicall, Raindex } /// @inheritdoc IRaindexV7 - function withdraw4(address token, bytes32 vaultId, Float targetAmount, TaskV2[] calldata post) + function withdraw5(address token, bytes32 vaultId, Float targetAmount, TaskV3[] calldata post) external nonReentrant nonZeroVaultId(msg.sender, token, vaultId) @@ -229,7 +229,7 @@ contract RaindexV6 is IRaindexV7, IMetaV1_2, ReentrancyGuard, Multicall, Raindex } /// @inheritdoc IRaindexV7 - function addOrder4(OrderConfigV4 calldata orderConfig, TaskV2[] calldata post) + function addOrder5(OrderConfigV4 calldata orderConfig, TaskV3[] calldata post) external nonReentrant returns (bool) @@ -285,7 +285,7 @@ contract RaindexV6 is IRaindexV7, IMetaV1_2, ReentrancyGuard, Multicall, Raindex } /// @inheritdoc IRaindexV7 - function removeOrder3(OrderV4 calldata order, TaskV2[] calldata post) + function removeOrder4(OrderV4 calldata order, TaskV3[] calldata post) external nonReentrant returns (bool stateChanged) @@ -303,9 +303,9 @@ contract RaindexV6 is IRaindexV7, IMetaV1_2, ReentrancyGuard, Multicall, Raindex } } - /// @dev Runs the post tasks for an order mutation (`addOrder4` / `removeOrder3`) + /// @dev Runs the post tasks for an order mutation (`addOrder5` / `removeOrder4`) /// with a context of the order hash and the caller. - function _doOrderPost(bytes32 orderHash, TaskV2[] calldata post) internal { + function _doOrderPost(bytes32 orderHash, TaskV3[] calldata post) internal { LibRaindex.doPost( LibBytes32Matrix.matrixFrom(LibBytes32Array.arrayFrom(orderHash, bytes32(uint256(uint160(msg.sender))))), post @@ -321,11 +321,11 @@ contract RaindexV6 is IRaindexV7, IMetaV1_2, ReentrancyGuard, Multicall, Raindex } /// @inheritdoc IRaindexV7 - function quote2(QuoteV2 calldata quoteConfig) external view returns (bool, Float, Float) { + function quote3(QuoteV3 calldata quoteConfig) external view returns (bool, Float, Float) { bytes32 orderHash = quoteConfig.order.hash(); if (sOrders[orderHash] != ORDER_LIVE) { - // false is quote2's "no live order" result, not a constant condition. + // false is quote3's "no live order" result, not a constant condition. // forge-lint: disable-next-line(boolean-cst) return (false, LibDecimalFloat.FLOAT_ZERO, LibDecimalFloat.FLOAT_ZERO); } @@ -340,7 +340,7 @@ contract RaindexV6 is IRaindexV7, IMetaV1_2, ReentrancyGuard, Multicall, Raindex quoteConfig.signedContext, new bytes32[](0) ); - // true is quote2's "order is live" result required by IRaindexV7. + // true is quote3's "order is live" result required by IRaindexV7. // forge-lint: disable-next-line(boolean-cst) return (true, orderIOCalculation.outputMax, orderIOCalculation.IORatio); } @@ -349,7 +349,7 @@ contract RaindexV6 is IRaindexV7, IMetaV1_2, ReentrancyGuard, Multicall, Raindex // Most of the cyclomatic complexity here is due to the error handling within // the loop. The actual logic is fairly linear. //slither-disable-next-line cyclomatic-complexity - function takeOrders4(TakeOrdersConfigV5 calldata config) + function takeOrders5(TakeOrdersConfigV6 calldata config) external nonReentrant returns (Float totalTakerInput, Float totalTakerOutput) @@ -365,7 +365,7 @@ contract RaindexV6 is IRaindexV7, IMetaV1_2, ReentrancyGuard, Multicall, Raindex revert ZeroMaximumIO(); } - TakeOrderConfigV4 memory takeOrderConfig; + TakeOrderConfigV5 memory takeOrderConfig; OrderV4 memory order; TakeOrdersIO memory io = TakeOrdersIO({ inputToken: config.orders[0].order.validInputs[config.orders[0].inputIOIndex].token, @@ -488,7 +488,7 @@ contract RaindexV6 is IRaindexV7, IMetaV1_2, ReentrancyGuard, Multicall, Raindex // before it is pushed to the owner. recordVaultOutput(takerInput, orderIOCalculation); recordVaultInput(takerOutput, orderIOCalculation); - emit TakeOrderV3(msg.sender, takeOrderConfig, takerInput, takerOutput); + emit TakeOrderV4(msg.sender, takeOrderConfig, takerInput, takerOutput); // Add the pointer to the order IO calculation to the array // of order IO calculations to handle. This is @@ -572,8 +572,8 @@ contract RaindexV6 is IRaindexV7, IMetaV1_2, ReentrancyGuard, Multicall, Raindex OrderV4 memory aliceOrder, OrderV4 memory bobOrder, ClearConfigV2 calldata clearConfig, - SignedContextV1[] memory aliceSignedContext, - SignedContextV1[] memory bobSignedContext + SignedContextV2[] memory aliceSignedContext, + SignedContextV2[] memory bobSignedContext ) external nonReentrant { { if (aliceOrder.owner == bobOrder.owner) { @@ -629,7 +629,7 @@ contract RaindexV6 is IRaindexV7, IMetaV1_2, ReentrancyGuard, Multicall, Raindex new bytes32[](0) ); - // Each side must be one `takeOrders4` would take. Given this, each + // Each side must be one `takeOrders5` would take. Given this, each // computed output is positive or the Float math reverts. if ( !aliceOrderIOCalculation.outputMax.gt(LibDecimalFloat.FLOAT_ZERO) @@ -705,7 +705,7 @@ contract RaindexV6 is IRaindexV7, IMetaV1_2, ReentrancyGuard, Multicall, Raindex uint256 inputIOIndex, uint256 outputIOIndex, address counterparty, - SignedContextV1[] memory signedContext, + SignedContextV2[] memory signedContext, bytes32[] memory stateOverlay ) internal view returns (OrderIOCalculationV4 memory) { unchecked { @@ -757,7 +757,7 @@ contract RaindexV6 is IRaindexV7, IMetaV1_2, ReentrancyGuard, Multicall, Raindex ); } - context = LibContext.build(callingContext, signedContext); + context = LibContext.buildV2(callingContext, signedContext); } // The state changes produced here are handled in recordVaultOutput diff --git a/src/constant/OrderEntrypoints.sol b/src/constant/OrderEntrypoints.sol index 8daa82089f..a0665089e8 100644 --- a/src/constant/OrderEntrypoints.sol +++ b/src/constant/OrderEntrypoints.sol @@ -2,7 +2,7 @@ // SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd pragma solidity ^0.8.25; -import {SourceIndexV2} from "rainlang-interface-0.2.13/src/interface/IInterpreterV4.sol"; +import {SourceIndexV2} from "rainlang-interface-0.2.14/src/interface/IInterpreterV4.sol"; /// @dev Entrypoint to a calculate the amount and ratio of an order. SourceIndexV2 constant CALCULATE_ORDER_ENTRYPOINT = SourceIndexV2.wrap(0); diff --git a/src/lib/LibRaindex.sol b/src/lib/LibRaindex.sol index 95b4b72daa..c50d57ae92 100644 --- a/src/lib/LibRaindex.sol +++ b/src/lib/LibRaindex.sol @@ -2,15 +2,15 @@ // SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd pragma solidity ^0.8.19; -import {TaskV2} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; +import {TaskV3} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import { SourceIndexV2, StateNamespace, StackItem, EvalV4 -} from "rainlang-interface-0.2.13/src/interface/IInterpreterV4.sol"; -import {LibNamespace, FullyQualifiedNamespace} from "rainlang-interface-0.2.13/src/lib/ns/LibNamespace.sol"; -import {LibContext} from "rainlang-interface-0.2.13/src/lib/caller/LibContext.sol"; +} from "rainlang-interface-0.2.14/src/interface/IInterpreterV4.sol"; +import {LibNamespace, FullyQualifiedNamespace} from "rainlang-interface-0.2.14/src/lib/ns/LibNamespace.sol"; +import {LibContext} from "rainlang-interface-0.2.14/src/lib/caller/LibContext.sol"; /// @dev Raindex context is actually fairly complex. The calling context column /// is populated before calculate order, but the remaining columns are only @@ -24,8 +24,9 @@ uint256 constant CALLING_CONTEXT_COLUMNS = 4; uint256 constant CONTEXT_COLUMNS = CALLING_CONTEXT_COLUMNS + 1; /// @dev Total number of context columns including extensions: base columns -/// plus 2 for signers and signed context start, 1 for deposit, 1 for withdraw. -uint256 constant CONTEXT_COLUMNS_EXTENDED = CONTEXT_COLUMNS + 2 + 1 + 1; +/// plus 3 for signers, signer domains and signed context start, 1 for deposit, +/// 1 for withdraw. +uint256 constant CONTEXT_COLUMNS_EXTENDED = CONTEXT_COLUMNS + 3 + 1 + 1; /// @dev Contextual data available to both calculate order and handle IO. The /// order hash, order owner and order counterparty. IMPORTANT NOTE that the @@ -95,26 +96,34 @@ uint256 constant CONTEXT_SIGNED_CONTEXT_SIGNERS_COLUMN = 5; uint256 constant CONTEXT_SIGNED_CONTEXT_SIGNERS_ROWS = 1; uint256 constant CONTEXT_SIGNED_CONTEXT_SIGNERS_ROW = 0; -/// @dev Signed context data columns start after the signers column. Each +/// @dev Signed context EIP-712 domain separators occupy their own column after +/// the signers column. Row i is the domain separator signed context i was +/// signed under, chosen by its signer. +uint256 constant CONTEXT_SIGNED_CONTEXT_DOMAINS_COLUMN = CONTEXT_SIGNED_CONTEXT_SIGNERS_COLUMN + 1; +uint256 constant CONTEXT_SIGNED_CONTEXT_DOMAINS_ROWS = 1; +uint256 constant CONTEXT_SIGNED_CONTEXT_DOMAINS_ROW = 0; + +/// @dev Signed context data columns start after the domains column. Each /// signer's data is a separate column at this offset + signer index. -uint256 constant CONTEXT_SIGNED_CONTEXT_START_COLUMN = 6; +uint256 constant CONTEXT_SIGNED_CONTEXT_START_COLUMN = CONTEXT_SIGNED_CONTEXT_DOMAINS_COLUMN + 1; uint256 constant CONTEXT_SIGNED_CONTEXT_START_ROWS = 1; uint256 constant CONTEXT_SIGNED_CONTEXT_START_ROW = 0; library LibRaindex { /// @dev Evaluates each task in `post` against `context` padded with empty - /// columns to `CALLING_CONTEXT_COLUMNS`, so the signers and signed context - /// columns are at `CONTEXT_SIGNED_CONTEXT_SIGNERS_COLUMN` and + /// columns to `CALLING_CONTEXT_COLUMNS`, so the signers, domains and signed + /// context columns are at `CONTEXT_SIGNED_CONTEXT_SIGNERS_COLUMN`, + /// `CONTEXT_SIGNED_CONTEXT_DOMAINS_COLUMN` and /// `CONTEXT_SIGNED_CONTEXT_START_COLUMN` as in order evaluation. Tasks with /// empty bytecode are skipped. - function doPost(bytes32[][] memory context, TaskV2[] memory post) internal { + function doPost(bytes32[][] memory context, TaskV3[] memory post) internal { bytes32[][] memory callingContext = new bytes32[][](CALLING_CONTEXT_COLUMNS); for (uint256 i = 0; i < context.length; ++i) { callingContext[i] = context[i]; } StateNamespace namespace = StateNamespace.wrap(uint256(uint160(msg.sender))); FullyQualifiedNamespace qualifiedNamespace = LibNamespace.qualifyNamespace(namespace, address(this)); - TaskV2 memory task; + TaskV3 memory task; StackItem[] memory emptyStack = new StackItem[](0); bytes32[] memory emptyStateOverlay = new bytes32[](0); for (uint256 i = 0; i < post.length; ++i) { @@ -128,7 +137,7 @@ library LibRaindex { namespace: qualifiedNamespace, bytecode: task.evaluable.bytecode, sourceIndex: SourceIndexV2.wrap(0), - context: LibContext.build(callingContext, task.signedContext), + context: LibContext.buildV2(callingContext, task.signedContext), inputs: emptyStack, stateOverlay: emptyStateOverlay }) diff --git a/src/lib/LibRaindexArb.sol b/src/lib/LibRaindexArb.sol index fcf2522289..3a8ad1270c 100644 --- a/src/lib/LibRaindexArb.sol +++ b/src/lib/LibRaindexArb.sol @@ -2,7 +2,7 @@ // SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd pragma solidity ^0.8.19; -import {TaskV2} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; +import {TaskV3} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {IERC20} from "@openzeppelin-contracts-5.7.0/token/ERC20/IERC20.sol"; import {LibRaindex} from "./LibRaindex.sol"; import {Address} from "@openzeppelin-contracts-5.7.0/utils/Address.sol"; @@ -21,7 +21,7 @@ library LibRaindexArb { /// so for fee-on-transfer tokens they can exceed the amount actually /// received by `msg.sender`. function finalizeArb( - TaskV2 memory task, + TaskV3 memory task, address ordersInputToken, uint8 inputDecimals, address ordersOutputToken, @@ -74,7 +74,7 @@ library LibRaindexArb { context[0] = col; - TaskV2[] memory post = new TaskV2[](1); + TaskV3[] memory post = new TaskV3[](1); post[0] = task; LibRaindex.doPost(context, post); } diff --git a/src/lib/LibRaindexSubParser.sol b/src/lib/LibRaindexSubParser.sol index b99cdc1a74..8158ece727 100644 --- a/src/lib/LibRaindexSubParser.sol +++ b/src/lib/LibRaindexSubParser.sol @@ -2,7 +2,8 @@ // SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd pragma solidity ^0.8.19; -import {AuthoringMetaV2, OperandV2} from "rainlang-interface-0.2.13/src/interface/ISubParserV4.sol"; +import {AuthoringMetaV2} from "rainlang-interface-0.2.14/src/interface/ISubParserV4.sol"; +import {OperandV2} from "rainlang-0.2.19/src/lib/parse/LibParse.sol"; import {LibUint256Matrix} from "rain-solmem-0.1.28/src/lib/LibUint256Matrix.sol"; import {LibSubParse} from "rainlang-0.2.19/src/lib/parse/LibSubParse.sol"; import { @@ -10,7 +11,7 @@ import { CONTEXT_BASE_ROW_SENDER, CONTEXT_BASE_ROW_CALLING_CONTRACT, CONTEXT_BASE_ROWS -} from "rainlang-interface-0.2.13/src/lib/caller/LibContext.sol"; +} from "rainlang-interface-0.2.14/src/lib/caller/LibContext.sol"; import { CONTEXT_COLUMNS, CONTEXT_COLUMNS_EXTENDED, @@ -34,6 +35,9 @@ import { CONTEXT_SIGNED_CONTEXT_SIGNERS_COLUMN, CONTEXT_SIGNED_CONTEXT_SIGNERS_ROW, CONTEXT_SIGNED_CONTEXT_SIGNERS_ROWS, + CONTEXT_SIGNED_CONTEXT_DOMAINS_COLUMN, + CONTEXT_SIGNED_CONTEXT_DOMAINS_ROW, + CONTEXT_SIGNED_CONTEXT_DOMAINS_ROWS, CONTEXT_SIGNED_CONTEXT_START_COLUMN, CONTEXT_SIGNED_CONTEXT_START_ROW, CONTEXT_SIGNED_CONTEXT_START_ROWS, @@ -287,6 +291,17 @@ library LibRaindexSubParser { return LibSubParse.subParserContext(CONTEXT_SIGNED_CONTEXT_SIGNERS_COLUMN, uint256(OperandV2.unwrap(operand))); } + /// @dev Maps the "signer-domain" word to the signed context domains column. + /// Uses the operand to select the row. + function subParserSignerDomains(uint256, uint256, OperandV2 operand) + internal + pure + returns (bool, bytes memory, bytes32[] memory) + { + //slither-disable-next-line unused-return + return LibSubParse.subParserContext(CONTEXT_SIGNED_CONTEXT_DOMAINS_COLUMN, uint256(OperandV2.unwrap(operand))); + } + /// @dev Maps the "deposit-token" word to the calling context column. function subParserDepositToken(uint256, uint256, OperandV2) internal @@ -432,8 +447,9 @@ library LibRaindexSubParser { /// @dev Builds the complete authoring metadata for all raindex context /// words. Returns ABI-encoded `AuthoringMetaV2[]` covering every context - /// column (base, calling, calculations, vault IO, signers, signed context, - /// deposit, withdraw). The inner arrays are flattened before encoding. + /// column (base, calling, calculations, vault IO, signers, signer domains, + /// signed context, deposit, withdraw). The inner arrays are flattened + /// before encoding. //slither-disable-next-line dead-code function authoringMetaV2() internal pure returns (bytes memory) { AuthoringMetaV2[][] memory meta = new AuthoringMetaV2[][](CONTEXT_COLUMNS_EXTENDED); @@ -564,6 +580,15 @@ library LibRaindexSubParser { "The addresses of the signers of the signed context. The indexes of the signers matches the column they signed in the signed context grid." ); + AuthoringMetaV2[] memory contextSignerDomainsMeta = new AuthoringMetaV2[](CONTEXT_SIGNED_CONTEXT_DOMAINS_ROWS); + contextSignerDomainsMeta[CONTEXT_SIGNED_CONTEXT_DOMAINS_ROW] = AuthoringMetaV2( + // string literal "signer-domain" is less than 32 bytes, so this + // conversion is safe. + // forge-lint: disable-next-line(unsafe-typecast) + bytes32("signer-domain"), + "The EIP-712 domain separators the signed contexts were signed under. The indexes of the domains match the signers. The signer chooses the domain, so the expression author must pin each signer's domain." + ); + AuthoringMetaV2[] memory contextSignedMeta = new AuthoringMetaV2[](CONTEXT_SIGNED_CONTEXT_START_ROWS); contextSignedMeta[CONTEXT_SIGNED_CONTEXT_START_ROW] = AuthoringMetaV2( // string literal "signed-context" is less than 32 bytes, so this @@ -579,6 +604,7 @@ library LibRaindexSubParser { meta[CONTEXT_VAULT_INPUTS_COLUMN] = contextVaultInputsMeta; meta[CONTEXT_VAULT_OUTPUTS_COLUMN] = contextVaultOutputsMeta; meta[CONTEXT_SIGNED_CONTEXT_SIGNERS_COLUMN] = contextSignersMeta; + meta[CONTEXT_SIGNED_CONTEXT_DOMAINS_COLUMN] = contextSignerDomainsMeta; meta[CONTEXT_SIGNED_CONTEXT_START_COLUMN] = contextSignedMeta; AuthoringMetaV2[] memory depositMeta = new AuthoringMetaV2[](DEPOSIT_WORDS_LENGTH); diff --git a/src/struct/OrderIOCalculationV4.sol b/src/struct/OrderIOCalculationV4.sol index c63c985acc..08ea313b15 100644 --- a/src/struct/OrderIOCalculationV4.sol +++ b/src/struct/OrderIOCalculationV4.sol @@ -3,7 +3,7 @@ pragma solidity ^0.8.25; import {OrderV4, Float} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; -import {StateNamespace} from "rainlang-interface-0.2.13/src/interface/IInterpreterV4.sol"; +import {StateNamespace} from "rainlang-interface-0.2.14/src/interface/IInterpreterV4.sol"; /// All information resulting from an order calculation that allows for vault IO /// to be calculated and applied, then the handle IO entrypoint to be dispatched. diff --git a/src/struct/TakeOrdersIO.sol b/src/struct/TakeOrdersIO.sol index 4030d875ae..d28d518a94 100644 --- a/src/struct/TakeOrdersIO.sol +++ b/src/struct/TakeOrdersIO.sol @@ -4,7 +4,7 @@ pragma solidity ^0.8.25; import {Float} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; -/// The input and output tokens shared by every order in a `takeOrders4` batch, +/// The input and output tokens shared by every order in a `takeOrders5` batch, /// and the taker IO still remaining to fill as the batch is processed. /// @param inputToken The input token every order in the batch must use. /// @param outputToken The output token every order in the batch must use. diff --git a/test/abstract/RaindexV6ArbOrderTaker.badRaindex.t.sol b/test/abstract/RaindexV6ArbOrderTaker.badRaindex.t.sol index 5299ec2990..15f97fe87b 100644 --- a/test/abstract/RaindexV6ArbOrderTaker.badRaindex.t.sol +++ b/test/abstract/RaindexV6ArbOrderTaker.badRaindex.t.sol @@ -11,12 +11,12 @@ import { IRaindexV7, OrderV4, EvaluableV4, - TakeOrderConfigV4, - TakeOrdersConfigV5, + TakeOrderConfigV5, + TakeOrdersConfigV6, IInterpreterV4, IInterpreterStoreV3, - TaskV2, - SignedContextV1 + TaskV3, + SignedContextV2 } from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; import { @@ -25,11 +25,11 @@ import { } from "rainlang-0.2.19/test/lib/deploy/LibTestInterpreterDeploy.sol"; contract RaindexV6ArbOrderTakerBadRaindexTest is GenericPoolRaindexV6ArbOrderTakerTest { - /// arb5 MUST revert BadRaindex when `raindex` is not the trusted deterministic + /// arb6 MUST revert BadRaindex when `raindex` is not the trusted deterministic /// deployment, before any token approval is granted. A caller-supplied /// untrusted `raindex` would otherwise receive an unlimited approval and could /// drain the arb; the guard rejects it up front (the take-orders path is never - /// reached). The non-revert control is exercised by every other arb5 test, + /// reached). The non-revert control is exercised by every other arb6 test, /// which calls the etched raindex at RAINDEX_DEPLOYED_ADDRESS. function testArb5RevertsUntrustedRaindex(address badRaindex) external { vm.assume(badRaindex != LibRaindexDeploy.RAINDEX_DEPLOYED_ADDRESS); @@ -37,13 +37,13 @@ contract RaindexV6ArbOrderTakerBadRaindexTest is GenericPoolRaindexV6ArbOrderTak // A single valid order so the NoOrders guard passes and execution reaches // the raindex-trust check. OrderV4 memory order; - TakeOrderConfigV4[] memory orders = buildTakeOrderConfig(order, 0, 0); + TakeOrderConfigV5[] memory orders = buildTakeOrderConfig(order, 0, 0); vm.expectRevert(abi.encodeWithSelector(BadRaindex.selector, badRaindex)); GenericPoolRaindexV6ArbOrderTaker(iArb) - .arb5( + .arb6( IRaindexV7(badRaindex), - TakeOrdersConfigV5({ + TakeOrdersConfigV6({ minimumIO: LibDecimalFloat.packLossless(0, 0), maximumIO: LibDecimalFloat.packLossless(type(int224).max, 0), maximumIORatio: LibDecimalFloat.packLossless(type(int224).max, 0), @@ -51,11 +51,11 @@ contract RaindexV6ArbOrderTakerBadRaindexTest is GenericPoolRaindexV6ArbOrderTak orders: orders, data: abi.encode(iRefundoor, iRefundoor, "") }), - TaskV2({ + TaskV3({ evaluable: EvaluableV4( IInterpreterV4(TEST_INTERPRETER_ADDRESS), IInterpreterStoreV3(TEST_STORE_ADDRESS), "" ), - signedContext: new SignedContextV1[](0) + signedContext: new SignedContextV2[](0) }) ); } diff --git a/test/abstract/RaindexV6ArbOrderTaker.beforeArbOrder.t.sol b/test/abstract/RaindexV6ArbOrderTaker.beforeArbOrder.t.sol index 2b999fad0e..f415c1ad1b 100644 --- a/test/abstract/RaindexV6ArbOrderTaker.beforeArbOrder.t.sol +++ b/test/abstract/RaindexV6ArbOrderTaker.beforeArbOrder.t.sol @@ -7,14 +7,14 @@ import {ChildGatedRaindexV6ArbOrderTaker} from "test/util/concrete/ChildGatedRai import {RaindexV6ArbConfig, WrongTask} from "../../src/abstract/RaindexV6ArbCommon.sol"; import { IRaindexV7, - TakeOrdersConfigV5, - TakeOrderConfigV4, - TaskV2, + TakeOrdersConfigV6, + TakeOrderConfigV5, + TaskV3, EvaluableV4, - SignedContextV1 + SignedContextV2 } from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; -import {IInterpreterV4} from "rainlang-interface-0.2.13/src/interface/IInterpreterV4.sol"; -import {IInterpreterStoreV3} from "rainlang-interface-0.2.13/src/interface/IInterpreterStoreV3.sol"; +import {IInterpreterV4} from "rainlang-interface-0.2.14/src/interface/IInterpreterV4.sol"; +import {IInterpreterStoreV3} from "rainlang-interface-0.2.14/src/interface/IInterpreterStoreV3.sol"; import {LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; import { TEST_INTERPRETER_ADDRESS, @@ -22,19 +22,19 @@ import { } from "rainlang-0.2.19/test/lib/deploy/LibTestInterpreterDeploy.sol"; /// @title RaindexV6ArbOrderTakerBeforeArbOrderTest -/// @notice Pins the ORDERING of `arb5`: `_beforeArb(task)` is called BEFORE the +/// @notice Pins the ORDERING of `arb6`: `_beforeArb(task)` is called BEFORE the /// zero-orders check. On a task-gated arb, supplying empty orders together with /// a task that does NOT match the configured hash MUST revert `WrongTask` (the /// gate runs first), NOT `NoOrders`. If `_beforeArb` were moved below the /// `orders.length == 0` check, the empty-orders path would revert `NoOrders` /// before the gate ran, so the discriminator is the SELECTOR of the revert. contract RaindexV6ArbOrderTakerBeforeArbOrderTest is Test { - function _gatedTask(bytes memory bytecode) internal pure returns (TaskV2 memory) { - return TaskV2({ + function _gatedTask(bytes memory bytecode) internal pure returns (TaskV3 memory) { + return TaskV3({ evaluable: EvaluableV4( IInterpreterV4(TEST_INTERPRETER_ADDRESS), IInterpreterStoreV3(TEST_STORE_ADDRESS), bytecode ), - signedContext: new SignedContextV1[](0) + signedContext: new SignedContextV2[](0) }); } @@ -42,14 +42,14 @@ contract RaindexV6ArbOrderTakerBeforeArbOrderTest is Test { /// (it ran before the zero-orders check). function testBeforeArbRunsBeforeZeroOrdersCheck() external { // Configure the gate with a nonzero-bytecode task so iTaskHash != 0. - TaskV2 memory configuredTask = _gatedTask(hex"01"); + TaskV3 memory configuredTask = _gatedTask(hex"01"); ChildGatedRaindexV6ArbOrderTaker arb = new ChildGatedRaindexV6ArbOrderTaker(RaindexV6ArbConfig(configuredTask)); // A DIFFERENT runtime task so the hash will not match -> gate reverts. - TaskV2 memory wrongTask = _gatedTask(hex"02"); + TaskV3 memory wrongTask = _gatedTask(hex"02"); - TakeOrderConfigV4[] memory orders = new TakeOrderConfigV4[](0); - TakeOrdersConfigV5 memory takeOrdersConfig = TakeOrdersConfigV5({ + TakeOrderConfigV5[] memory orders = new TakeOrderConfigV5[](0); + TakeOrdersConfigV6 memory takeOrdersConfig = TakeOrdersConfigV6({ minimumIO: LibDecimalFloat.packLossless(0, 0), maximumIO: LibDecimalFloat.packLossless(type(int224).max, 0), maximumIORatio: LibDecimalFloat.packLossless(type(int224).max, 0), @@ -59,7 +59,7 @@ contract RaindexV6ArbOrderTakerBeforeArbOrderTest is Test { }); vm.expectRevert(abi.encodeWithSelector(WrongTask.selector)); - arb.arb5(IRaindexV7(address(0xdead)), takeOrdersConfig, wrongTask); + arb.arb6(IRaindexV7(address(0xdead)), takeOrdersConfig, wrongTask); } /// Control: with empty orders and a MATCHING task, the gate passes and the @@ -67,11 +67,11 @@ contract RaindexV6ArbOrderTakerBeforeArbOrderTest is Test { /// is the gate firing (not an unconditional revert), and that an /// empty-orders call still reverts NoOrders once the gate is satisfied. function testGatePassesThenNoOrders() external { - TaskV2 memory configuredTask = _gatedTask(hex"01"); + TaskV3 memory configuredTask = _gatedTask(hex"01"); ChildGatedRaindexV6ArbOrderTaker arb = new ChildGatedRaindexV6ArbOrderTaker(RaindexV6ArbConfig(configuredTask)); - TakeOrderConfigV4[] memory orders = new TakeOrderConfigV4[](0); - TakeOrdersConfigV5 memory takeOrdersConfig = TakeOrdersConfigV5({ + TakeOrderConfigV5[] memory orders = new TakeOrderConfigV5[](0); + TakeOrdersConfigV6 memory takeOrdersConfig = TakeOrdersConfigV6({ minimumIO: LibDecimalFloat.packLossless(0, 0), maximumIO: LibDecimalFloat.packLossless(type(int224).max, 0), maximumIORatio: LibDecimalFloat.packLossless(type(int224).max, 0), @@ -81,6 +81,6 @@ contract RaindexV6ArbOrderTakerBeforeArbOrderTest is Test { }); vm.expectRevert(abi.encodeWithSelector(IRaindexV7.NoOrders.selector)); - arb.arb5(IRaindexV7(address(0xdead)), takeOrdersConfig, configuredTask); + arb.arb6(IRaindexV7(address(0xdead)), takeOrdersConfig, configuredTask); } } diff --git a/test/abstract/RaindexV6ArbOrderTaker.context.t.sol b/test/abstract/RaindexV6ArbOrderTaker.context.t.sol index 2987d52e68..3dba0a9431 100644 --- a/test/abstract/RaindexV6ArbOrderTaker.context.t.sol +++ b/test/abstract/RaindexV6ArbOrderTaker.context.t.sol @@ -3,11 +3,11 @@ pragma solidity =0.8.25; import {ChildRaindexV6ArbOrderTaker} from "../util/concrete/ChildRaindexV6ArbOrderTaker.sol"; -import {TaskV2, SignedContextV1, EvaluableV4} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; +import {TaskV3, SignedContextV2, EvaluableV4} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {RaindexV6ExternalRealTest} from "../util/abstract/RaindexV6ExternalRealTest.sol"; import { - TakeOrdersConfigV5, - TakeOrderConfigV4, + TakeOrdersConfigV6, + TakeOrderConfigV5, IOV2, OrderConfigV4, OrderV4, @@ -15,8 +15,8 @@ import { } from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {IERC20} from "@openzeppelin-contracts-5.7.0/token/ERC20/IERC20.sol"; import {IERC20Metadata} from "@openzeppelin-contracts-5.7.0/token/ERC20/extensions/IERC20Metadata.sol"; -import {StateNamespace} from "rainlang-interface-0.2.13/src/interface/IInterpreterV4.sol"; -import {LibNamespace} from "rainlang-interface-0.2.13/src/lib/ns/LibNamespace.sol"; +import {StateNamespace} from "rainlang-interface-0.2.14/src/interface/IInterpreterV4.sol"; +import {LibNamespace} from "rainlang-interface-0.2.14/src/lib/ns/LibNamespace.sol"; import {LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; contract RaindexV6ArbOrderTakerContextTest is RaindexV6ExternalRealTest { @@ -50,13 +50,13 @@ contract RaindexV6ArbOrderTakerContextTest is RaindexV6ExternalRealTest { nonce: aliceOrderConfig.nonce }); - TakeOrderConfigV4 memory aliceTakeOrderConfig = TakeOrderConfigV4({ - order: aliceOrder, inputIOIndex: 0, outputIOIndex: 0, signedContext: new SignedContextV1[](0) + TakeOrderConfigV5 memory aliceTakeOrderConfig = TakeOrderConfigV5({ + order: aliceOrder, inputIOIndex: 0, outputIOIndex: 0, signedContext: new SignedContextV2[](0) }); - TakeOrderConfigV4[] memory orders = new TakeOrderConfigV4[](1); + TakeOrderConfigV5[] memory orders = new TakeOrderConfigV5[](1); orders[0] = aliceTakeOrderConfig; - TakeOrdersConfigV5 memory takeOrdersConfig = TakeOrdersConfigV5({ + TakeOrdersConfigV6 memory takeOrdersConfig = TakeOrdersConfigV6({ minimumIO: LibDecimalFloat.packLossless(0, 0), maximumIO: LibDecimalFloat.packLossless(type(int224).max, 0), maximumIORatio: LibDecimalFloat.packLossless(type(int224).max, 0), @@ -65,7 +65,7 @@ contract RaindexV6ArbOrderTakerContextTest is RaindexV6ExternalRealTest { data: "" }); - TaskV2 memory task = TaskV2({ + TaskV3 memory task = TaskV3({ evaluable: EvaluableV4({ interpreter: iInterpreter, store: iStore, @@ -79,7 +79,7 @@ contract RaindexV6ArbOrderTakerContextTest is RaindexV6ExternalRealTest { ) ) }), - signedContext: new SignedContextV1[](0) + signedContext: new SignedContextV2[](0) }); vm.mockCall(address(iToken0), abi.encodeWithSelector(IERC20.approve.selector), abi.encode(true)); @@ -102,6 +102,6 @@ contract RaindexV6ArbOrderTakerContextTest is RaindexV6ExternalRealTest { // 5e18 is 5 eth as wei is 18 decimals. vm.deal(address(arbOrderTaker), 5e18); vm.prank(bob); - arbOrderTaker.arb5(iRaindex, takeOrdersConfig, task); + arbOrderTaker.arb6(iRaindex, takeOrdersConfig, task); } } diff --git a/test/abstract/RaindexV6ArbOrderTaker.finalizeDecimals.t.sol b/test/abstract/RaindexV6ArbOrderTaker.finalizeDecimals.t.sol index 379b07bd54..f1076e2d0d 100644 --- a/test/abstract/RaindexV6ArbOrderTaker.finalizeDecimals.t.sol +++ b/test/abstract/RaindexV6ArbOrderTaker.finalizeDecimals.t.sol @@ -3,11 +3,11 @@ pragma solidity =0.8.25; import {ChildRaindexV6ArbOrderTaker} from "../util/concrete/ChildRaindexV6ArbOrderTaker.sol"; -import {TaskV2, SignedContextV1, EvaluableV4} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; +import {TaskV3, SignedContextV2, EvaluableV4} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {RaindexV6ExternalRealTest} from "../util/abstract/RaindexV6ExternalRealTest.sol"; import { - TakeOrdersConfigV5, - TakeOrderConfigV4, + TakeOrdersConfigV6, + TakeOrderConfigV5, IOV2, OrderConfigV4, OrderV4, @@ -17,7 +17,7 @@ import {IERC20} from "@openzeppelin-contracts-5.7.0/token/ERC20/IERC20.sol"; import {IERC20Metadata} from "@openzeppelin-contracts-5.7.0/token/ERC20/extensions/IERC20Metadata.sol"; import {LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; -/// @dev Discriminates that `arb5` passes the input token's OWN decimals and the +/// @dev Discriminates that `arb6` passes the input token's OWN decimals and the /// output token's OWN decimals to `finalizeArb` in the correct positions. The /// pre-existing `context` test uses equal decimals (12/12) for both tokens, so a /// mutation that swaps input-decimals for output-decimals (or vice versa) @@ -57,13 +57,13 @@ contract RaindexV6ArbOrderTakerFinalizeDecimalsTest is RaindexV6ExternalRealTest nonce: aliceOrderConfig.nonce }); - TakeOrderConfigV4 memory aliceTakeOrderConfig = TakeOrderConfigV4({ - order: aliceOrder, inputIOIndex: 0, outputIOIndex: 0, signedContext: new SignedContextV1[](0) + TakeOrderConfigV5 memory aliceTakeOrderConfig = TakeOrderConfigV5({ + order: aliceOrder, inputIOIndex: 0, outputIOIndex: 0, signedContext: new SignedContextV2[](0) }); - TakeOrderConfigV4[] memory orders = new TakeOrderConfigV4[](1); + TakeOrderConfigV5[] memory orders = new TakeOrderConfigV5[](1); orders[0] = aliceTakeOrderConfig; - TakeOrdersConfigV5 memory takeOrdersConfig = TakeOrdersConfigV5({ + TakeOrdersConfigV6 memory takeOrdersConfig = TakeOrdersConfigV6({ minimumIO: LibDecimalFloat.packLossless(0, 0), maximumIO: LibDecimalFloat.packLossless(type(int224).max, 0), maximumIORatio: LibDecimalFloat.packLossless(type(int224).max, 0), @@ -74,7 +74,7 @@ contract RaindexV6ArbOrderTakerFinalizeDecimalsTest is RaindexV6ExternalRealTest // Assert that the post-arb context column scaled each swept token balance // by its OWN token decimals: input float == 3, output float == 4, gas == 5. - TaskV2 memory task = TaskV2({ + TaskV3 memory task = TaskV3({ evaluable: EvaluableV4({ interpreter: iInterpreter, store: iStore, @@ -88,7 +88,7 @@ contract RaindexV6ArbOrderTakerFinalizeDecimalsTest is RaindexV6ExternalRealTest ) ) }), - signedContext: new SignedContextV1[](0) + signedContext: new SignedContextV2[](0) }); vm.mockCall(address(iToken0), abi.encodeWithSelector(IERC20.approve.selector), abi.encode(true)); @@ -109,6 +109,6 @@ contract RaindexV6ArbOrderTakerFinalizeDecimalsTest is RaindexV6ExternalRealTest // 5e18 is 5 eth as wei is 18 decimals. vm.deal(address(arbOrderTaker), 5e18); vm.prank(bob); - arbOrderTaker.arb5(iRaindex, takeOrdersConfig, task); + arbOrderTaker.arb6(iRaindex, takeOrdersConfig, task); } } diff --git a/test/abstract/RaindexV6ArbOrderTaker.finalizeTaskArg.t.sol b/test/abstract/RaindexV6ArbOrderTaker.finalizeTaskArg.t.sol index d84916d215..6dbf595fbf 100644 --- a/test/abstract/RaindexV6ArbOrderTaker.finalizeTaskArg.t.sol +++ b/test/abstract/RaindexV6ArbOrderTaker.finalizeTaskArg.t.sol @@ -3,11 +3,11 @@ pragma solidity =0.8.25; import {ChildRaindexV6ArbOrderTaker} from "../util/concrete/ChildRaindexV6ArbOrderTaker.sol"; -import {TaskV2, SignedContextV1, EvaluableV4} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; +import {TaskV3, SignedContextV2, EvaluableV4} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {RaindexV6ExternalRealTest} from "../util/abstract/RaindexV6ExternalRealTest.sol"; import { - TakeOrdersConfigV5, - TakeOrderConfigV4, + TakeOrdersConfigV6, + TakeOrderConfigV5, IOV2, OrderConfigV4, OrderV4, @@ -18,13 +18,13 @@ import {IERC20Metadata} from "@openzeppelin-contracts-5.7.0/token/ERC20/extensio import {LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; /// @title RaindexV6ArbOrderTakerFinalizeTaskArgTest -/// @notice Proves that arb5 forwards the CALLER's `task` (the arb5 `task` -/// parameter) into `finalizeArb`, not a default/empty TaskV2. The context -/// tests only ASSERT context values via the task's `ensure()` — but if arb5 +/// @notice Proves that arb6 forwards the CALLER's `task` (the arb6 `task` +/// parameter) into `finalizeArb`, not a default/empty TaskV3. The context +/// tests only ASSERT context values via the task's `ensure()` — but if arb6 /// passed an empty task to finalizeArb, those `ensure()` checks would silently /// not run and the context tests would still pass. This test pins the forward /// itself: the supplied task UNCONDITIONALLY reverts when its expression runs, -/// so a correct arb5 (forwarding the real task) MUST revert. Replacing the +/// so a correct arb6 (forwarding the real task) MUST revert. Replacing the /// forwarded task with a default/empty one makes the call SUCCEED, killing the /// mutant. contract RaindexV6ArbOrderTakerFinalizeTaskArgTest is RaindexV6ExternalRealTest { @@ -45,12 +45,12 @@ contract RaindexV6ArbOrderTakerFinalizeTaskArgTest is RaindexV6ExternalRealTest nonce: 0 }); - TakeOrderConfigV4[] memory orders = new TakeOrderConfigV4[](1); - orders[0] = TakeOrderConfigV4({ - order: order, inputIOIndex: 0, outputIOIndex: 0, signedContext: new SignedContextV1[](0) + TakeOrderConfigV5[] memory orders = new TakeOrderConfigV5[](1); + orders[0] = TakeOrderConfigV5({ + order: order, inputIOIndex: 0, outputIOIndex: 0, signedContext: new SignedContextV2[](0) }); - TakeOrdersConfigV5 memory takeOrdersConfig = TakeOrdersConfigV5({ + TakeOrdersConfigV6 memory takeOrdersConfig = TakeOrdersConfigV6({ minimumIO: LibDecimalFloat.packLossless(0, 0), maximumIO: LibDecimalFloat.packLossless(type(int224).max, 0), maximumIORatio: LibDecimalFloat.packLossless(type(int224).max, 0), @@ -59,17 +59,17 @@ contract RaindexV6ArbOrderTakerFinalizeTaskArgTest is RaindexV6ExternalRealTest data: "" }); - // A task whose body unconditionally reverts when it runs. If arb5 + // A task whose body unconditionally reverts when it runs. If arb6 // forwards this task into finalizeArb (correct), the call reverts with - // "task-arg-forwarded". If arb5 passes a default/empty task instead, the + // "task-arg-forwarded". If arb6 passes a default/empty task instead, the // body never runs and the call succeeds. - TaskV2 memory task = TaskV2({ + TaskV3 memory task = TaskV3({ evaluable: EvaluableV4({ interpreter: iInterpreter, store: iStore, bytecode: iParserV2.parse2(bytes(":ensure(0 \"task-arg-forwarded\");")) }), - signedContext: new SignedContextV1[](0) + signedContext: new SignedContextV2[](0) }); vm.mockCall(address(iToken0), abi.encodeWithSelector(IERC20.approve.selector), abi.encode(true)); @@ -87,6 +87,6 @@ contract RaindexV6ArbOrderTakerFinalizeTaskArgTest is RaindexV6ExternalRealTest vm.prank(bob); vm.expectRevert(bytes("task-arg-forwarded")); - arbOrderTaker.arb5(iRaindex, takeOrdersConfig, task); + arbOrderTaker.arb6(iRaindex, takeOrdersConfig, task); } } diff --git a/test/abstract/RaindexV6ArbOrderTaker.ioIndexSelection.t.sol b/test/abstract/RaindexV6ArbOrderTaker.ioIndexSelection.t.sol index a8d6ef2f8b..a29d1e1498 100644 --- a/test/abstract/RaindexV6ArbOrderTaker.ioIndexSelection.t.sol +++ b/test/abstract/RaindexV6ArbOrderTaker.ioIndexSelection.t.sol @@ -8,16 +8,16 @@ import {IERC20} from "@openzeppelin-contracts-5.7.0/token/ERC20/IERC20.sol"; import {GenericPoolRaindexV6ArbOrderTaker} from "../../src/concrete/arb/GenericPoolRaindexV6ArbOrderTaker.sol"; import { IRaindexV7, - TakeOrdersConfigV5, - TakeOrderConfigV4, + TakeOrdersConfigV6, + TakeOrderConfigV5, OrderV4, IOV2, EvaluableV4, - SignedContextV1, - TaskV2 + SignedContextV2, + TaskV3 } from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; -import {IInterpreterV4} from "rainlang-interface-0.2.13/src/interface/IInterpreterV4.sol"; -import {IInterpreterStoreV3} from "rainlang-interface-0.2.13/src/interface/IInterpreterStoreV3.sol"; +import {IInterpreterV4} from "rainlang-interface-0.2.14/src/interface/IInterpreterV4.sol"; +import {IInterpreterStoreV3} from "rainlang-interface-0.2.14/src/interface/IInterpreterStoreV3.sol"; import {LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; import {LibRainDeploy} from "rain-deploy-0.1.22/src/lib/LibRainDeploy.sol"; import {LibTOFUTokenDecimals} from "rain-tofu-erc20-decimals-0.1.4/src/lib/LibTOFUTokenDecimals.sol"; @@ -26,24 +26,24 @@ import {MockToken} from "test/util/concrete/MockToken.sol"; import {MockExchange} from "test/util/concrete/MockExchange.sol"; import {RealisticOrderTakerMockRaindex} from "test/util/concrete/RealisticOrderTakerMockRaindex.sol"; -/// arb5 reads the order's input token from `validInputs[inputIOIndex]` and the +/// arb6 reads the order's input token from `validInputs[inputIOIndex]` and the /// output token from `validOutputs[outputIOIndex]`. A single order with two IOs /// per side (index 0 = decoy, index 1 = real) and indices set to 1 must run the /// full cycle on the index-1 tokens. /// /// The scenario leaves BOTH a real-input leftover (raindex pulls less than the /// swap produced) and a real-output leftover (the exchange swaps less than the -/// raindex sent), so finalize must sweep both real tokens. If arb5 read the +/// raindex sent), so finalize must sweep both real tokens. If arb6 read the /// decoy input (index 0) the raindex's pull reverts on a missing allowance; if -/// arb5 read the decoy output (index 0) finalize sweeps the zero-balance decoy +/// arb6 read the decoy output (index 0) finalize sweeps the zero-balance decoy /// and strands the real-output leftover in the arb. contract RaindexV6ArbOrderTakerIoIndexSelectionTest is Test { receive() external payable {} - function noopTask() internal pure returns (TaskV2 memory) { - return TaskV2({ + function noopTask() internal pure returns (TaskV3 memory) { + return TaskV3({ evaluable: EvaluableV4(IInterpreterV4(address(0)), IInterpreterStoreV3(address(0)), hex""), - signedContext: new SignedContextV1[](0) + signedContext: new SignedContextV2[](0) }); } @@ -57,7 +57,7 @@ contract RaindexV6ArbOrderTakerIoIndexSelectionTest is Test { MockToken decoyInput = new MockToken("DecoyIn", "DIN", 18); MockToken decoyOutput = new MockToken("DecoyOut", "DOUT", 18); - // Raindex sends 100e18 output and pulls 80e18 input. arb5 only trusts the + // Raindex sends 100e18 output and pulls 80e18 input. arb6 only trusts the // canonical raindex deployment, so etch the mock's runtime code // (immutables included) at that address. vm.etch(LibRaindexDeploy.RAINDEX_DEPLOYED_ADDRESS, address(new RealisticOrderTakerMockRaindex(80e18)).code); @@ -87,16 +87,16 @@ contract RaindexV6ArbOrderTakerIoIndexSelectionTest is Test { nonce: bytes32(0) }); - TakeOrderConfigV4[] memory orders = new TakeOrderConfigV4[](1); + TakeOrderConfigV5[] memory orders = new TakeOrderConfigV5[](1); // inputIOIndex 1, outputIOIndex 1: the REAL tokens. - orders[0] = TakeOrderConfigV4(order, 1, 1, new SignedContextV1[](0)); + orders[0] = TakeOrderConfigV5(order, 1, 1, new SignedContextV2[](0)); bytes memory exchangeData = abi.encodeCall(MockExchange.swap, (IERC20(address(outputToken)), IERC20(address(inputToken)), 80e18)); - arb.arb5( + arb.arb6( IRaindexV7(address(raindex)), - TakeOrdersConfigV5({ + TakeOrdersConfigV6({ minimumIO: LibDecimalFloat.packLossless(0, 0), maximumIO: LibDecimalFloat.packLossless(type(int224).max, 0), maximumIORatio: LibDecimalFloat.packLossless(type(int224).max, 0), @@ -125,7 +125,7 @@ contract RaindexV6ArbOrderTakerIoIndexSelectionTest is Test { assertEq(decoyOutput.balanceOf(address(this)), 0, "no decoy output swept"); } - /// arb5 reads the input token from `validInputs[inputIOIndex]` and the output + /// arb6 reads the input token from `validInputs[inputIOIndex]` and the output /// token from `validOutputs[outputIOIndex]` using the side-SPECIFIC index. /// The sibling test sets both indices to 1, so reading the input via /// `outputIOIndex` (or the output via `inputIOIndex`) selects the same slot @@ -175,17 +175,17 @@ contract RaindexV6ArbOrderTakerIoIndexSelectionTest is Test { nonce: bytes32(0) }); - TakeOrderConfigV4[] memory orders = new TakeOrderConfigV4[](1); + TakeOrderConfigV5[] memory orders = new TakeOrderConfigV5[](1); // inputIOIndex 1 (real input at validInputs[1]); outputIOIndex 0 (real // output at validOutputs[0]). - orders[0] = TakeOrderConfigV4(order, 1, 0, new SignedContextV1[](0)); + orders[0] = TakeOrderConfigV5(order, 1, 0, new SignedContextV2[](0)); bytes memory exchangeData = abi.encodeCall(MockExchange.swap, (IERC20(address(outputToken)), IERC20(address(inputToken)), 80e18)); - arb.arb5( + arb.arb6( IRaindexV7(address(raindex)), - TakeOrdersConfigV5({ + TakeOrdersConfigV6({ minimumIO: LibDecimalFloat.packLossless(0, 0), maximumIO: LibDecimalFloat.packLossless(type(int224).max, 0), maximumIORatio: LibDecimalFloat.packLossless(type(int224).max, 0), diff --git a/test/abstract/RaindexV6ArbOrderTaker.noOrders.t.sol b/test/abstract/RaindexV6ArbOrderTaker.noOrders.t.sol index 334b8eeaee..7e65ec691e 100644 --- a/test/abstract/RaindexV6ArbOrderTaker.noOrders.t.sol +++ b/test/abstract/RaindexV6ArbOrderTaker.noOrders.t.sol @@ -8,12 +8,12 @@ import {GenericPoolRaindexV6ArbOrderTaker} from "../../src/concrete/arb/GenericP import { IRaindexV7, EvaluableV4, - TakeOrderConfigV4, - TakeOrdersConfigV5, + TakeOrderConfigV5, + TakeOrdersConfigV6, IInterpreterV4, IInterpreterStoreV3, - TaskV2, - SignedContextV1 + TaskV3, + SignedContextV2 } from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; import { @@ -22,15 +22,15 @@ import { } from "rainlang-0.2.19/test/lib/deploy/LibTestInterpreterDeploy.sol"; contract RaindexV6ArbOrderTakerNoOrdersTest is GenericPoolRaindexV6ArbOrderTakerTest { - /// arb5 MUST revert with NoOrders when given an empty orders array. + /// arb6 MUST revert with NoOrders when given an empty orders array. function testArb5NoOrders() external { - TakeOrderConfigV4[] memory orders = new TakeOrderConfigV4[](0); + TakeOrderConfigV5[] memory orders = new TakeOrderConfigV5[](0); vm.expectRevert(abi.encodeWithSelector(IRaindexV7.NoOrders.selector)); GenericPoolRaindexV6ArbOrderTaker(iArb) - .arb5( + .arb6( iRaindex, - TakeOrdersConfigV5({ + TakeOrdersConfigV6({ minimumIO: LibDecimalFloat.packLossless(0, 0), maximumIO: LibDecimalFloat.packLossless(type(int224).max, 0), maximumIORatio: LibDecimalFloat.packLossless(type(int224).max, 0), @@ -38,11 +38,11 @@ contract RaindexV6ArbOrderTakerNoOrdersTest is GenericPoolRaindexV6ArbOrderTaker orders: orders, data: abi.encode(iRefundoor, iRefundoor, "") }), - TaskV2({ + TaskV3({ evaluable: EvaluableV4( IInterpreterV4(TEST_INTERPRETER_ADDRESS), IInterpreterStoreV3(TEST_STORE_ADDRESS), "" ), - signedContext: new SignedContextV1[](0) + signedContext: new SignedContextV2[](0) }) ); } diff --git a/test/abstract/RaindexV6ArbOrderTaker.onTakeOrders2.t.sol b/test/abstract/RaindexV6ArbOrderTaker.onTakeOrders2.t.sol index 2ed7abb079..0e9143326b 100644 --- a/test/abstract/RaindexV6ArbOrderTaker.onTakeOrders2.t.sol +++ b/test/abstract/RaindexV6ArbOrderTaker.onTakeOrders2.t.sol @@ -8,17 +8,17 @@ import {IERC20} from "@openzeppelin-contracts-5.7.0/token/ERC20/IERC20.sol"; import {GenericPoolRaindexV6ArbOrderTaker} from "../../src/concrete/arb/GenericPoolRaindexV6ArbOrderTaker.sol"; import { IRaindexV7, - TakeOrdersConfigV5, - TakeOrderConfigV4, + TakeOrdersConfigV6, + TakeOrderConfigV5, OrderV4, IOV2, EvaluableV4, - SignedContextV1, - TaskV2, + SignedContextV2, + TaskV3, Float } from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; -import {IInterpreterV4} from "rainlang-interface-0.2.13/src/interface/IInterpreterV4.sol"; -import {IInterpreterStoreV3} from "rainlang-interface-0.2.13/src/interface/IInterpreterStoreV3.sol"; +import {IInterpreterV4} from "rainlang-interface-0.2.14/src/interface/IInterpreterV4.sol"; +import {IInterpreterStoreV3} from "rainlang-interface-0.2.14/src/interface/IInterpreterStoreV3.sol"; import {LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; import {LibRainDeploy} from "rain-deploy-0.1.22/src/lib/LibRainDeploy.sol"; import {LibRaindexDeploy} from "../../src/lib/deploy/LibRaindexDeploy.sol"; @@ -28,7 +28,7 @@ import {MockExchange} from "test/util/concrete/MockExchange.sol"; import {RealisticOrderTakerMockRaindex} from "test/util/concrete/RealisticOrderTakerMockRaindex.sol"; contract RaindexV6ArbOrderTakerOnTakeOrders2Test is Test { - /// arb5 completes a full order-taker cycle with real ERC20 transfers: + /// arb6 completes a full order-taker cycle with real ERC20 transfers: /// takeOrders, onTakeOrders2 callback with exchange, and finalize. function testArb5RealTokenTransfers() external { LibRainDeploy.etchZoltuFactory(vm); @@ -37,7 +37,7 @@ contract RaindexV6ArbOrderTakerOnTakeOrders2Test is Test { MockToken inputToken = new MockToken("Input", "IN", 18); MockToken outputToken = new MockToken("Output", "OUT", 18); - // arb5 only trusts the canonical raindex deployment, so etch the mock's + // arb6 only trusts the canonical raindex deployment, so etch the mock's // runtime code (immutables included) at that address. RealisticOrderTakerMockRaindex mockRaindex = new RealisticOrderTakerMockRaindex(100e18); vm.etch(LibRaindexDeploy.RAINDEX_DEPLOYED_ADDRESS, address(mockRaindex).code); @@ -63,8 +63,8 @@ contract RaindexV6ArbOrderTakerOnTakeOrders2Test is Test { nonce: bytes32(0) }); - TakeOrderConfigV4[] memory orders = new TakeOrderConfigV4[](1); - orders[0] = TakeOrderConfigV4(order, 0, 0, new SignedContextV1[](0)); + TakeOrderConfigV5[] memory orders = new TakeOrderConfigV5[](1); + orders[0] = TakeOrderConfigV5(order, 0, 0, new SignedContextV2[](0)); bytes memory takeOrdersData = abi.encode( address(exchange), @@ -72,9 +72,9 @@ contract RaindexV6ArbOrderTakerOnTakeOrders2Test is Test { abi.encodeCall(MockExchange.swap, (IERC20(address(outputToken)), IERC20(address(inputToken)), 100e18)) ); - arb.arb5( + arb.arb6( IRaindexV7(address(raindex)), - TakeOrdersConfigV5({ + TakeOrdersConfigV6({ minimumIO: LibDecimalFloat.packLossless(100, 0), maximumIO: LibDecimalFloat.packLossless(type(int224).max, 0), maximumIORatio: LibDecimalFloat.packLossless(type(int224).max, 0), @@ -82,9 +82,9 @@ contract RaindexV6ArbOrderTakerOnTakeOrders2Test is Test { orders: orders, data: takeOrdersData }), - TaskV2({ + TaskV3({ evaluable: EvaluableV4(IInterpreterV4(address(0)), IInterpreterStoreV3(address(0)), hex""), - signedContext: new SignedContextV1[](0) + signedContext: new SignedContextV2[](0) }) ); diff --git a/test/abstract/RaindexV6ArbOrderTaker.reentrancy.t.sol b/test/abstract/RaindexV6ArbOrderTaker.reentrancy.t.sol index 28b0906787..e1c607f17b 100644 --- a/test/abstract/RaindexV6ArbOrderTaker.reentrancy.t.sol +++ b/test/abstract/RaindexV6ArbOrderTaker.reentrancy.t.sol @@ -7,16 +7,16 @@ import {Test} from "forge-std-1.17.0/src/Test.sol"; import {GenericPoolRaindexV6ArbOrderTaker} from "../../src/concrete/arb/GenericPoolRaindexV6ArbOrderTaker.sol"; import { IRaindexV7, - TakeOrdersConfigV5, - TakeOrderConfigV4, + TakeOrdersConfigV6, + TakeOrderConfigV5, OrderV4, IOV2, EvaluableV4, - SignedContextV1, - TaskV2 + SignedContextV2, + TaskV3 } from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; -import {IInterpreterV4} from "rainlang-interface-0.2.13/src/interface/IInterpreterV4.sol"; -import {IInterpreterStoreV3} from "rainlang-interface-0.2.13/src/interface/IInterpreterStoreV3.sol"; +import {IInterpreterV4} from "rainlang-interface-0.2.14/src/interface/IInterpreterV4.sol"; +import {IInterpreterStoreV3} from "rainlang-interface-0.2.14/src/interface/IInterpreterStoreV3.sol"; import {LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; import {LibRainDeploy} from "rain-deploy-0.1.22/src/lib/LibRainDeploy.sol"; import {LibRaindexDeploy} from "../../src/lib/deploy/LibRaindexDeploy.sol"; @@ -25,7 +25,7 @@ import {MockToken} from "test/util/concrete/MockToken.sol"; import {ReentrantMockRaindex} from "test/util/concrete/ReentrantMockRaindex.sol"; contract RaindexV6ArbOrderTakerReentrancyTest is Test { - /// arb5 MUST revert when re-entered via the takeOrders4 callback. + /// arb6 MUST revert when re-entered via the takeOrders5 callback. function testArb5Reentrancy() external { LibRainDeploy.etchZoltuFactory(vm); LibRainDeploy.deployZoltu(LibTOFUTokenDecimals.TOFU_DECIMALS_EXPECTED_CREATION_CODE); @@ -33,9 +33,9 @@ contract RaindexV6ArbOrderTakerReentrancyTest is Test { MockToken inputToken = new MockToken("Input", "IN", 18); MockToken outputToken = new MockToken("Output", "OUT", 18); - // arb5 only trusts the canonical raindex deployment, so etch the mock's + // arb6 only trusts the canonical raindex deployment, so etch the mock's // code at that address. The mock re-enters from its own address, so the - // re-entrant arb5 call also targets the trusted raindex and reaches the + // re-entrant arb6 call also targets the trusted raindex and reaches the // reentrancy guard rather than the trust guard. ReentrantMockRaindex mockRaindex = new ReentrantMockRaindex(); vm.etch(LibRaindexDeploy.RAINDEX_DEPLOYED_ADDRESS, address(mockRaindex).code); @@ -57,13 +57,13 @@ contract RaindexV6ArbOrderTakerReentrancyTest is Test { nonce: bytes32(0) }); - TakeOrderConfigV4[] memory orders = new TakeOrderConfigV4[](1); - orders[0] = TakeOrderConfigV4(order, 0, 0, new SignedContextV1[](0)); + TakeOrderConfigV5[] memory orders = new TakeOrderConfigV5[](1); + orders[0] = TakeOrderConfigV5(order, 0, 0, new SignedContextV2[](0)); vm.expectRevert(abi.encodeWithSelector(bytes4(keccak256("ReentrancyGuardReentrantCall()")))); - arb.arb5( + arb.arb6( IRaindexV7(address(raindex)), - TakeOrdersConfigV5({ + TakeOrdersConfigV6({ minimumIO: LibDecimalFloat.packLossless(100, 0), maximumIO: LibDecimalFloat.packLossless(type(int224).max, 0), maximumIORatio: LibDecimalFloat.packLossless(type(int224).max, 0), @@ -71,9 +71,9 @@ contract RaindexV6ArbOrderTakerReentrancyTest is Test { orders: orders, data: "" }), - TaskV2({ + TaskV3({ evaluable: EvaluableV4(IInterpreterV4(address(0)), IInterpreterStoreV3(address(0)), hex""), - signedContext: new SignedContextV1[](0) + signedContext: new SignedContextV2[](0) }) ); } diff --git a/test/abstract/RaindexV6ArbTaskGated.checkTaskHashPassMatch.t.sol b/test/abstract/RaindexV6ArbTaskGated.checkTaskHashPassMatch.t.sol index c18c1aa0c1..1af4a8ecb9 100644 --- a/test/abstract/RaindexV6ArbTaskGated.checkTaskHashPassMatch.t.sol +++ b/test/abstract/RaindexV6ArbTaskGated.checkTaskHashPassMatch.t.sol @@ -5,9 +5,9 @@ pragma solidity =0.8.25; import {Test} from "forge-std-1.17.0/src/Test.sol"; import {ChildRaindexV6ArbTaskGated} from "test/util/concrete/ChildRaindexV6ArbTaskGated.sol"; import {RaindexV6ArbConfig} from "../../src/abstract/RaindexV6ArbCommon.sol"; -import {TaskV2, EvaluableV4, SignedContextV1} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; -import {IInterpreterV4} from "rainlang-interface-0.2.13/src/interface/IInterpreterV4.sol"; -import {IInterpreterStoreV3} from "rainlang-interface-0.2.13/src/interface/IInterpreterStoreV3.sol"; +import {TaskV3, EvaluableV4, SignedContextV2} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; +import {IInterpreterV4} from "rainlang-interface-0.2.14/src/interface/IInterpreterV4.sol"; +import {IInterpreterStoreV3} from "rainlang-interface-0.2.14/src/interface/IInterpreterStoreV3.sol"; import { TEST_INTERPRETER_ADDRESS, TEST_STORE_ADDRESS @@ -18,9 +18,9 @@ contract RaindexV6ArbTaskGatedCheckTaskHashPassMatchTest is Test { function testCheckTaskHashPassesWhenMatch(bytes memory bytecode) external { vm.assume(bytecode.length > 0); - TaskV2 memory task = TaskV2( + TaskV3 memory task = TaskV3( EvaluableV4(IInterpreterV4(TEST_INTERPRETER_ADDRESS), IInterpreterStoreV3(TEST_STORE_ADDRESS), bytecode), - new SignedContextV1[](0) + new SignedContextV2[](0) ); ChildRaindexV6ArbTaskGated child = new ChildRaindexV6ArbTaskGated(RaindexV6ArbConfig(task)); diff --git a/test/abstract/RaindexV6ArbTaskGated.checkTaskHashPassZero.t.sol b/test/abstract/RaindexV6ArbTaskGated.checkTaskHashPassZero.t.sol index bb4601c1dd..e3d1f69428 100644 --- a/test/abstract/RaindexV6ArbTaskGated.checkTaskHashPassZero.t.sol +++ b/test/abstract/RaindexV6ArbTaskGated.checkTaskHashPassZero.t.sol @@ -5,9 +5,9 @@ pragma solidity =0.8.25; import {Test} from "forge-std-1.17.0/src/Test.sol"; import {ChildRaindexV6ArbTaskGated} from "test/util/concrete/ChildRaindexV6ArbTaskGated.sol"; import {RaindexV6ArbConfig} from "../../src/abstract/RaindexV6ArbCommon.sol"; -import {TaskV2, EvaluableV4, SignedContextV1} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; -import {IInterpreterV4} from "rainlang-interface-0.2.13/src/interface/IInterpreterV4.sol"; -import {IInterpreterStoreV3} from "rainlang-interface-0.2.13/src/interface/IInterpreterStoreV3.sol"; +import {TaskV3, EvaluableV4, SignedContextV2} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; +import {IInterpreterV4} from "rainlang-interface-0.2.14/src/interface/IInterpreterV4.sol"; +import {IInterpreterStoreV3} from "rainlang-interface-0.2.14/src/interface/IInterpreterStoreV3.sol"; import { TEST_INTERPRETER_ADDRESS, TEST_STORE_ADDRESS @@ -18,18 +18,18 @@ import { contract RaindexV6ArbTaskGatedCheckTaskHashPassZeroTest is Test { function testCheckTaskHashPassesWhenZero(bytes memory runtimeBytecode) external { // Construct with empty bytecode so iTaskHash == 0. - TaskV2 memory constructTask = TaskV2( + TaskV3 memory constructTask = TaskV3( EvaluableV4(IInterpreterV4(TEST_INTERPRETER_ADDRESS), IInterpreterStoreV3(TEST_STORE_ADDRESS), ""), - new SignedContextV1[](0) + new SignedContextV2[](0) ); ChildRaindexV6ArbTaskGated child = new ChildRaindexV6ArbTaskGated(RaindexV6ArbConfig(constructTask)); // Any runtime task should pass. - TaskV2 memory runtimeTask = TaskV2( + TaskV3 memory runtimeTask = TaskV3( EvaluableV4( IInterpreterV4(TEST_INTERPRETER_ADDRESS), IInterpreterStoreV3(TEST_STORE_ADDRESS), runtimeBytecode ), - new SignedContextV1[](0) + new SignedContextV2[](0) ); child.checkTaskHash(runtimeTask); } diff --git a/test/abstract/RaindexV6ArbTaskGated.checkTaskHashWrongTask.t.sol b/test/abstract/RaindexV6ArbTaskGated.checkTaskHashWrongTask.t.sol index 1a2380628b..0b94fb9708 100644 --- a/test/abstract/RaindexV6ArbTaskGated.checkTaskHashWrongTask.t.sol +++ b/test/abstract/RaindexV6ArbTaskGated.checkTaskHashWrongTask.t.sol @@ -5,9 +5,9 @@ pragma solidity =0.8.25; import {Test} from "forge-std-1.17.0/src/Test.sol"; import {ChildRaindexV6ArbTaskGated} from "test/util/concrete/ChildRaindexV6ArbTaskGated.sol"; import {RaindexV6ArbConfig, WrongTask} from "../../src/abstract/RaindexV6ArbCommon.sol"; -import {TaskV2, EvaluableV4, SignedContextV1} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; -import {IInterpreterV4} from "rainlang-interface-0.2.13/src/interface/IInterpreterV4.sol"; -import {IInterpreterStoreV3} from "rainlang-interface-0.2.13/src/interface/IInterpreterStoreV3.sol"; +import {TaskV3, EvaluableV4, SignedContextV2} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; +import {IInterpreterV4} from "rainlang-interface-0.2.14/src/interface/IInterpreterV4.sol"; +import {IInterpreterStoreV3} from "rainlang-interface-0.2.14/src/interface/IInterpreterStoreV3.sol"; import { TEST_INTERPRETER_ADDRESS, TEST_STORE_ADDRESS @@ -20,17 +20,17 @@ contract RaindexV6ArbTaskGatedCheckTaskHashWrongTaskTest is Test { vm.assume(constructBytecode.length > 0); vm.assume(runtimeBytecode.length > 0); - TaskV2 memory constructTask = TaskV2( + TaskV3 memory constructTask = TaskV3( EvaluableV4( IInterpreterV4(TEST_INTERPRETER_ADDRESS), IInterpreterStoreV3(TEST_STORE_ADDRESS), constructBytecode ), - new SignedContextV1[](0) + new SignedContextV2[](0) ); - TaskV2 memory runtimeTask = TaskV2( + TaskV3 memory runtimeTask = TaskV3( EvaluableV4( IInterpreterV4(TEST_INTERPRETER_ADDRESS), IInterpreterStoreV3(TEST_STORE_ADDRESS), runtimeBytecode ), - new SignedContextV1[](0) + new SignedContextV2[](0) ); // Only revert when the tasks are actually different. diff --git a/test/abstract/RaindexV6ArbTaskGated.construct.t.sol b/test/abstract/RaindexV6ArbTaskGated.construct.t.sol index fb70c472c5..39153712cb 100644 --- a/test/abstract/RaindexV6ArbTaskGated.construct.t.sol +++ b/test/abstract/RaindexV6ArbTaskGated.construct.t.sol @@ -5,9 +5,9 @@ pragma solidity =0.8.25; import {Test} from "forge-std-1.17.0/src/Test.sol"; import {ChildRaindexV6ArbTaskGated} from "test/util/concrete/ChildRaindexV6ArbTaskGated.sol"; import {RaindexV6ArbConfig, RaindexV6ArbCommon} from "../../src/abstract/RaindexV6ArbCommon.sol"; -import {TaskV2, EvaluableV4, SignedContextV1} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; -import {IInterpreterV4} from "rainlang-interface-0.2.13/src/interface/IInterpreterV4.sol"; -import {IInterpreterStoreV3} from "rainlang-interface-0.2.13/src/interface/IInterpreterStoreV3.sol"; +import {TaskV3, EvaluableV4, SignedContextV2} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; +import {IInterpreterV4} from "rainlang-interface-0.2.14/src/interface/IInterpreterV4.sol"; +import {IInterpreterStoreV3} from "rainlang-interface-0.2.14/src/interface/IInterpreterStoreV3.sol"; import { TEST_INTERPRETER_ADDRESS, TEST_STORE_ADDRESS @@ -16,9 +16,9 @@ import { /// Construction MUST emit the Construct event with the sender and config. contract RaindexV6ArbTaskGatedConstructTest is Test { function testConstructEmitsEvent(bytes memory bytecode) external { - TaskV2 memory task = TaskV2( + TaskV3 memory task = TaskV3( EvaluableV4(IInterpreterV4(TEST_INTERPRETER_ADDRESS), IInterpreterStoreV3(TEST_STORE_ADDRESS), bytecode), - new SignedContextV1[](0) + new SignedContextV2[](0) ); RaindexV6ArbConfig memory config = RaindexV6ArbConfig(task); diff --git a/test/abstract/RaindexV6ArbTaskGated.iTaskHashBoundary.t.sol b/test/abstract/RaindexV6ArbTaskGated.iTaskHashBoundary.t.sol index 878dd615fc..16c5ddbc58 100644 --- a/test/abstract/RaindexV6ArbTaskGated.iTaskHashBoundary.t.sol +++ b/test/abstract/RaindexV6ArbTaskGated.iTaskHashBoundary.t.sol @@ -5,9 +5,9 @@ pragma solidity =0.8.25; import {Test} from "forge-std-1.17.0/src/Test.sol"; import {ChildRaindexV6ArbTaskGated} from "test/util/concrete/ChildRaindexV6ArbTaskGated.sol"; import {RaindexV6ArbConfig} from "../../src/abstract/RaindexV6ArbCommon.sol"; -import {TaskV2, EvaluableV4, SignedContextV1} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; -import {IInterpreterV4} from "rainlang-interface-0.2.13/src/interface/IInterpreterV4.sol"; -import {IInterpreterStoreV3} from "rainlang-interface-0.2.13/src/interface/IInterpreterStoreV3.sol"; +import {TaskV3, EvaluableV4, SignedContextV2} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; +import {IInterpreterV4} from "rainlang-interface-0.2.14/src/interface/IInterpreterV4.sol"; +import {IInterpreterStoreV3} from "rainlang-interface-0.2.14/src/interface/IInterpreterStoreV3.sol"; import { TEST_INTERPRETER_ADDRESS, TEST_STORE_ADDRESS @@ -19,16 +19,16 @@ import { /// This pins the comparator to `!= 0` (i.e. `>= 1`); an off-by-one mutation /// such as `> 1` would wrongly leave a one-byte task ungated. contract RaindexV6ArbTaskGatedITaskHashBoundaryTest is Test { - function buildTask(bytes memory bytecode) internal pure returns (TaskV2 memory) { - return TaskV2( + function buildTask(bytes memory bytecode) internal pure returns (TaskV3 memory) { + return TaskV3( EvaluableV4(IInterpreterV4(TEST_INTERPRETER_ADDRESS), IInterpreterStoreV3(TEST_STORE_ADDRESS), bytecode), - new SignedContextV1[](0) + new SignedContextV2[](0) ); } /// Zero-length bytecode: hash stays exactly zero. function testITaskHashBoundaryZeroLength() external { - TaskV2 memory task = buildTask(""); + TaskV3 memory task = buildTask(""); ChildRaindexV6ArbTaskGated child = new ChildRaindexV6ArbTaskGated(RaindexV6ArbConfig(task)); assertEq(child.iTaskHash(), bytes32(0), "empty bytecode must leave iTaskHash zero"); } @@ -36,7 +36,7 @@ contract RaindexV6ArbTaskGatedITaskHashBoundaryTest is Test { /// One-byte bytecode is over the boundary: hash is the keccak of the task /// and is necessarily nonzero. function testITaskHashBoundaryOneByteLength() external { - TaskV2 memory task = buildTask(hex"01"); + TaskV3 memory task = buildTask(hex"01"); ChildRaindexV6ArbTaskGated child = new ChildRaindexV6ArbTaskGated(RaindexV6ArbConfig(task)); bytes32 expected = keccak256(abi.encode(task)); assertEq(child.iTaskHash(), expected, "one byte of bytecode must store the keccak task hash"); diff --git a/test/abstract/RaindexV6ArbTaskGated.iTaskHashNonzero.t.sol b/test/abstract/RaindexV6ArbTaskGated.iTaskHashNonzero.t.sol index 0d5afb2954..b89e85423c 100644 --- a/test/abstract/RaindexV6ArbTaskGated.iTaskHashNonzero.t.sol +++ b/test/abstract/RaindexV6ArbTaskGated.iTaskHashNonzero.t.sol @@ -5,9 +5,9 @@ pragma solidity =0.8.25; import {Test} from "forge-std-1.17.0/src/Test.sol"; import {ChildRaindexV6ArbTaskGated} from "test/util/concrete/ChildRaindexV6ArbTaskGated.sol"; import {RaindexV6ArbConfig} from "../../src/abstract/RaindexV6ArbCommon.sol"; -import {TaskV2, EvaluableV4, SignedContextV1} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; -import {IInterpreterV4} from "rainlang-interface-0.2.13/src/interface/IInterpreterV4.sol"; -import {IInterpreterStoreV3} from "rainlang-interface-0.2.13/src/interface/IInterpreterStoreV3.sol"; +import {TaskV3, EvaluableV4, SignedContextV2} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; +import {IInterpreterV4} from "rainlang-interface-0.2.14/src/interface/IInterpreterV4.sol"; +import {IInterpreterStoreV3} from "rainlang-interface-0.2.14/src/interface/IInterpreterStoreV3.sol"; import { TEST_INTERPRETER_ADDRESS, TEST_STORE_ADDRESS @@ -19,9 +19,9 @@ contract RaindexV6ArbTaskGatedITaskHashNonzeroTest is Test { function testITaskHashNonzeroBytecode(bytes memory bytecode) external { vm.assume(bytecode.length > 0); - TaskV2 memory task = TaskV2( + TaskV3 memory task = TaskV3( EvaluableV4(IInterpreterV4(TEST_INTERPRETER_ADDRESS), IInterpreterStoreV3(TEST_STORE_ADDRESS), bytecode), - new SignedContextV1[](0) + new SignedContextV2[](0) ); ChildRaindexV6ArbTaskGated child = new ChildRaindexV6ArbTaskGated(RaindexV6ArbConfig(task)); assertEq(child.iTaskHash(), keccak256(abi.encode(task))); diff --git a/test/abstract/RaindexV6ArbTaskGated.iTaskHashZero.t.sol b/test/abstract/RaindexV6ArbTaskGated.iTaskHashZero.t.sol index 8585920a24..1413538276 100644 --- a/test/abstract/RaindexV6ArbTaskGated.iTaskHashZero.t.sol +++ b/test/abstract/RaindexV6ArbTaskGated.iTaskHashZero.t.sol @@ -5,9 +5,9 @@ pragma solidity =0.8.25; import {Test} from "forge-std-1.17.0/src/Test.sol"; import {ChildRaindexV6ArbTaskGated} from "test/util/concrete/ChildRaindexV6ArbTaskGated.sol"; import {RaindexV6ArbConfig} from "../../src/abstract/RaindexV6ArbCommon.sol"; -import {TaskV2, EvaluableV4, SignedContextV1} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; -import {IInterpreterV4} from "rainlang-interface-0.2.13/src/interface/IInterpreterV4.sol"; -import {IInterpreterStoreV3} from "rainlang-interface-0.2.13/src/interface/IInterpreterStoreV3.sol"; +import {TaskV3, EvaluableV4, SignedContextV2} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; +import {IInterpreterV4} from "rainlang-interface-0.2.14/src/interface/IInterpreterV4.sol"; +import {IInterpreterStoreV3} from "rainlang-interface-0.2.14/src/interface/IInterpreterStoreV3.sol"; import { TEST_INTERPRETER_ADDRESS, TEST_STORE_ADDRESS @@ -16,9 +16,9 @@ import { /// When constructed with empty bytecode the task hash MUST be zero. contract RaindexV6ArbTaskGatedITaskHashZeroTest is Test { function testITaskHashZeroEmptyBytecode() external { - TaskV2 memory task = TaskV2( + TaskV3 memory task = TaskV3( EvaluableV4(IInterpreterV4(TEST_INTERPRETER_ADDRESS), IInterpreterStoreV3(TEST_STORE_ADDRESS), ""), - new SignedContextV1[](0) + new SignedContextV2[](0) ); ChildRaindexV6ArbTaskGated child = new ChildRaindexV6ArbTaskGated(RaindexV6ArbConfig(task)); assertEq(child.iTaskHash(), bytes32(0)); diff --git a/test/abstract/RaindexV6FlashBorrower.badRaindex.t.sol b/test/abstract/RaindexV6FlashBorrower.badRaindex.t.sol index 0653b22de4..4e4076234a 100644 --- a/test/abstract/RaindexV6FlashBorrower.badRaindex.t.sol +++ b/test/abstract/RaindexV6FlashBorrower.badRaindex.t.sol @@ -3,8 +3,8 @@ pragma solidity =0.8.25; import {Test} from "forge-std-1.17.0/src/Test.sol"; -import {IERC3156FlashLender} from "raindex-interface-0.1.8/src/interface/ierc3156/IERC3156FlashLender.sol"; -import {IRaindexV6} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +import {IERC3156FlashLender} from "raindex-interface-0.1.10/src/interface/ierc3156/IERC3156FlashLender.sol"; +import {IRaindexV7} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {BadRaindex} from "../../src/abstract/RaindexV6ArbCommon.sol"; import {LibRaindexDeploy} from "../../src/lib/deploy/LibRaindexDeploy.sol"; import {LibTestFlashBorrowerArb, FlashBorrowerSetup} from "test/util/lib/LibTestFlashBorrowerArb.sol"; @@ -12,7 +12,7 @@ import {LibTestArb} from "test/util/lib/LibTestArb.sol"; import {MockExchange} from "test/util/concrete/MockExchange.sol"; contract RaindexV6FlashBorrowerBadRaindexTest is Test { - /// arb4 reverts BadRaindex for any raindex other than the deterministic + /// arb5 reverts BadRaindex for any raindex other than the deterministic /// deployment, even a funded working lender, before calling it. function testArb4RevertsUntrustedRaindex(address badRaindex) external { vm.assume(badRaindex != LibRaindexDeploy.RAINDEX_DEPLOYED_ADDRESS); @@ -29,15 +29,15 @@ contract RaindexV6FlashBorrowerBadRaindexTest is Test { vm.expectCall(badRaindex, abi.encodeWithSelector(IERC3156FlashLender.flashLoan.selector), 0); vm.expectRevert(abi.encodeWithSelector(BadRaindex.selector, badRaindex)); - setup.arb.arb4(IRaindexV6(badRaindex), setup.takeOrdersConfig, setup.exchangeData, LibTestArb.noopTask()); + setup.arb.arb5(IRaindexV7(badRaindex), setup.takeOrdersConfig, setup.exchangeData, LibTestArb.noopTask()); } - /// arb4 reverts BadRaindex for the zero address. + /// arb5 reverts BadRaindex for the zero address. function testArb4RevertsZeroRaindex() external { MockExchange exchange = new MockExchange(); FlashBorrowerSetup memory setup = LibTestFlashBorrowerArb.setup(vm, address(exchange), 100e18); vm.expectRevert(abi.encodeWithSelector(BadRaindex.selector, address(0))); - setup.arb.arb4(IRaindexV6(address(0)), setup.takeOrdersConfig, setup.exchangeData, LibTestArb.noopTask()); + setup.arb.arb5(IRaindexV7(address(0)), setup.takeOrdersConfig, setup.exchangeData, LibTestArb.noopTask()); } } diff --git a/test/abstract/RaindexV6FlashBorrower.beforeArbOrder.t.sol b/test/abstract/RaindexV6FlashBorrower.beforeArbOrder.t.sol index a0ef794ccc..fa46a93443 100644 --- a/test/abstract/RaindexV6FlashBorrower.beforeArbOrder.t.sol +++ b/test/abstract/RaindexV6FlashBorrower.beforeArbOrder.t.sol @@ -7,14 +7,14 @@ import {ChildGatedRaindexV6FlashBorrower} from "test/util/concrete/ChildGatedRai import {RaindexV6ArbConfig, WrongTask} from "../../src/abstract/RaindexV6ArbCommon.sol"; import { IRaindexV7, - TakeOrdersConfigV5, - TakeOrderConfigV4, - TaskV2, + TakeOrdersConfigV6, + TakeOrderConfigV5, + TaskV3, EvaluableV4, - SignedContextV1 + SignedContextV2 } from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; -import {IInterpreterV4} from "rainlang-interface-0.2.13/src/interface/IInterpreterV4.sol"; -import {IInterpreterStoreV3} from "rainlang-interface-0.2.13/src/interface/IInterpreterStoreV3.sol"; +import {IInterpreterV4} from "rainlang-interface-0.2.14/src/interface/IInterpreterV4.sol"; +import {IInterpreterStoreV3} from "rainlang-interface-0.2.14/src/interface/IInterpreterStoreV3.sol"; import {LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; import { TEST_INTERPRETER_ADDRESS, @@ -22,26 +22,26 @@ import { } from "rainlang-0.2.19/test/lib/deploy/LibTestInterpreterDeploy.sol"; /// @title RaindexV6FlashBorrowerBeforeArbOrderTest -/// @notice Pins the ORDERING of `arb4`: `_beforeArb(task)` is called BEFORE the +/// @notice Pins the ORDERING of `arb5`: `_beforeArb(task)` is called BEFORE the /// zero-orders check. On a task-gated arb, supplying empty orders together with /// a task that does NOT match the configured hash MUST revert `WrongTask` (the /// gate runs first), NOT `NoOrders`. If `_beforeArb` were moved below the /// `orders.length == 0` check, the empty-orders path would revert `NoOrders` /// before the gate ran, so the discriminator is the SELECTOR of the revert. -/// This is the arb4 (flash borrower) analog of the arb5 ordering test. +/// This is the arb5 (flash borrower) analog of the arb6 ordering test. contract RaindexV6FlashBorrowerBeforeArbOrderTest is Test { - function _gatedTask(bytes memory bytecode) internal pure returns (TaskV2 memory) { - return TaskV2({ + function _gatedTask(bytes memory bytecode) internal pure returns (TaskV3 memory) { + return TaskV3({ evaluable: EvaluableV4( IInterpreterV4(TEST_INTERPRETER_ADDRESS), IInterpreterStoreV3(TEST_STORE_ADDRESS), bytecode ), - signedContext: new SignedContextV1[](0) + signedContext: new SignedContextV2[](0) }); } - function _emptyOrdersConfig() internal pure returns (TakeOrdersConfigV5 memory) { - TakeOrderConfigV4[] memory orders = new TakeOrderConfigV4[](0); - return TakeOrdersConfigV5({ + function _emptyOrdersConfig() internal pure returns (TakeOrdersConfigV6 memory) { + TakeOrderConfigV5[] memory orders = new TakeOrderConfigV5[](0); + return TakeOrdersConfigV6({ minimumIO: LibDecimalFloat.packLossless(0, 0), maximumIO: LibDecimalFloat.packLossless(type(int224).max, 0), maximumIORatio: LibDecimalFloat.packLossless(type(int224).max, 0), @@ -55,14 +55,14 @@ contract RaindexV6FlashBorrowerBeforeArbOrderTest is Test { /// (it ran before the zero-orders check). function testBeforeArbRunsBeforeZeroOrdersCheck() external { // Configure the gate with a nonzero-bytecode task so iTaskHash != 0. - TaskV2 memory configuredTask = _gatedTask(hex"01"); + TaskV3 memory configuredTask = _gatedTask(hex"01"); ChildGatedRaindexV6FlashBorrower arb = new ChildGatedRaindexV6FlashBorrower(RaindexV6ArbConfig(configuredTask)); // A DIFFERENT runtime task so the hash will not match -> gate reverts. - TaskV2 memory wrongTask = _gatedTask(hex"02"); + TaskV3 memory wrongTask = _gatedTask(hex"02"); vm.expectRevert(abi.encodeWithSelector(WrongTask.selector)); - arb.arb4(IRaindexV7(address(0xdead)), _emptyOrdersConfig(), "", wrongTask); + arb.arb5(IRaindexV7(address(0xdead)), _emptyOrdersConfig(), "", wrongTask); } /// Control: with empty orders and a MATCHING task, the gate passes and the @@ -70,10 +70,10 @@ contract RaindexV6FlashBorrowerBeforeArbOrderTest is Test { /// is the gate firing (not an unconditional revert), and that an /// empty-orders call still reverts NoOrders once the gate is satisfied. function testGatePassesThenNoOrders() external { - TaskV2 memory configuredTask = _gatedTask(hex"01"); + TaskV3 memory configuredTask = _gatedTask(hex"01"); ChildGatedRaindexV6FlashBorrower arb = new ChildGatedRaindexV6FlashBorrower(RaindexV6ArbConfig(configuredTask)); vm.expectRevert(abi.encodeWithSelector(IRaindexV7.NoOrders.selector)); - arb.arb4(IRaindexV7(address(0xdead)), _emptyOrdersConfig(), "", configuredTask); + arb.arb5(IRaindexV7(address(0xdead)), _emptyOrdersConfig(), "", configuredTask); } } diff --git a/test/abstract/RaindexV6FlashBorrower.finalizeDecimals.t.sol b/test/abstract/RaindexV6FlashBorrower.finalizeDecimals.t.sol index 30f812fe66..dc58364b8a 100644 --- a/test/abstract/RaindexV6FlashBorrower.finalizeDecimals.t.sol +++ b/test/abstract/RaindexV6FlashBorrower.finalizeDecimals.t.sol @@ -9,19 +9,19 @@ import {MockToken} from "test/util/concrete/MockToken.sol"; import {LibRaindexDeploy} from "../../src/lib/deploy/LibRaindexDeploy.sol"; import { IRaindexV7, - TakeOrdersConfigV5, - TakeOrderConfigV4, + TakeOrdersConfigV6, + TakeOrderConfigV5, OrderV4, IOV2, EvaluableV4, - SignedContextV1, - TaskV2, + SignedContextV2, + TaskV3, IInterpreterV4 } from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; -import {IInterpreterStoreV3} from "rainlang-interface-0.2.13/src/interface/IInterpreterStoreV3.sol"; +import {IInterpreterStoreV3} from "rainlang-interface-0.2.14/src/interface/IInterpreterStoreV3.sol"; import {LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; -/// @dev Discriminates that `arb4` passes the INPUT token's OWN decimals and the +/// @dev Discriminates that `arb5` passes the INPUT token's OWN decimals and the /// OUTPUT token's OWN decimals to `finalizeArb` in the correct positions. The /// pre-existing `mixedDecimals` / `realTokenTransfers` tests leave the arb with /// a zero leftover balance and supply an EMPTY post-arb task, so a mutation that @@ -30,7 +30,7 @@ import {LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.so /// /// Here the input token is 6-decimal and the output token is 9-decimal, the arb /// is pre-funded with a deterministic leftover of each token (3e6 input, 4e9 -/// output) that the mock raindex's no-op `takeOrders4` leaves untouched, and a +/// output) that the mock raindex's no-op `takeOrders5` leaves untouched, and a /// REAL post-arb task asserts the swept context floats. context<1 0>() == 3 and /// context<1 1>() == 4 hold ONLY when each leftover is scaled by its OWN /// decimals (3e6 / 1e6 == 3; 4e9 / 1e9 == 4). Swapping input-decimals for @@ -51,7 +51,7 @@ contract RaindexV6FlashBorrowerFinalizeDecimalsTest is RaindexV6ExternalRealTest NoExchangeFlashBorrower arb = new NoExchangeFlashBorrower(); // Pre-fund the arb with the exact leftovers we will assert on. The no-op - // takeOrders4 leaves these untouched; the flash loan of the output token + // takeOrders5 leaves these untouched; the flash loan of the output token // is net-neutral so the 4e9 output leftover survives. inputToken.mint(address(arb), 3e6); outputToken.mint(address(arb), 4e9); @@ -73,12 +73,12 @@ contract RaindexV6FlashBorrowerFinalizeDecimalsTest is RaindexV6ExternalRealTest nonce: bytes32(0) }); - TakeOrderConfigV4[] memory orders = new TakeOrderConfigV4[](1); - orders[0] = TakeOrderConfigV4(order, 0, 0, new SignedContextV1[](0)); + TakeOrderConfigV5[] memory orders = new TakeOrderConfigV5[](1); + orders[0] = TakeOrderConfigV5(order, 0, 0, new SignedContextV2[](0)); // Real post-arb task: assert each swept leftover was scaled by its OWN // decimals. context<1 0>() is the input float, context<1 1>() the output. - TaskV2 memory task = TaskV2({ + TaskV3 memory task = TaskV3({ evaluable: EvaluableV4({ interpreter: iInterpreter, store: iStore, @@ -91,12 +91,12 @@ contract RaindexV6FlashBorrowerFinalizeDecimalsTest is RaindexV6ExternalRealTest ) ) }), - signedContext: new SignedContextV1[](0) + signedContext: new SignedContextV2[](0) }); - arb.arb4( + arb.arb5( IRaindexV7(address(raindex)), - TakeOrdersConfigV5({ + TakeOrdersConfigV6({ minimumIO: LibDecimalFloat.packLossless(1, 0), maximumIO: LibDecimalFloat.packLossless(type(int224).max, 0), maximumIORatio: LibDecimalFloat.packLossless(type(int224).max, 0), diff --git a/test/abstract/RaindexV6FlashBorrower.flashLoanAmountLossless.t.sol b/test/abstract/RaindexV6FlashBorrower.flashLoanAmountLossless.t.sol index 801255b61d..589349212c 100644 --- a/test/abstract/RaindexV6FlashBorrower.flashLoanAmountLossless.t.sol +++ b/test/abstract/RaindexV6FlashBorrower.flashLoanAmountLossless.t.sol @@ -8,17 +8,17 @@ import {IERC20} from "@openzeppelin-contracts-5.7.0/token/ERC20/IERC20.sol"; import {GenericPoolRaindexV6FlashBorrower} from "../../src/concrete/arb/GenericPoolRaindexV6FlashBorrower.sol"; import { IRaindexV7, - TakeOrdersConfigV5, - TakeOrderConfigV4, + TakeOrdersConfigV6, + TakeOrderConfigV5, OrderV4, IOV2, EvaluableV4, - SignedContextV1, - TaskV2, + SignedContextV2, + TaskV3, Float } from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; -import {IInterpreterV4} from "rainlang-interface-0.2.13/src/interface/IInterpreterV4.sol"; -import {IInterpreterStoreV3} from "rainlang-interface-0.2.13/src/interface/IInterpreterStoreV3.sol"; +import {IInterpreterV4} from "rainlang-interface-0.2.14/src/interface/IInterpreterV4.sol"; +import {IInterpreterStoreV3} from "rainlang-interface-0.2.14/src/interface/IInterpreterStoreV3.sol"; import {LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; import {LossyConversionFromFloat} from "rain-math-float-0.3.10/src/error/ErrDecimalFloat.sol"; import {LibRainDeploy} from "rain-deploy-0.1.22/src/lib/LibRainDeploy.sol"; @@ -29,9 +29,9 @@ import {MockExchange} from "test/util/concrete/MockExchange.sol"; import {RealisticFlashLendingMockRaindex} from "test/util/concrete/RealisticFlashLendingMockRaindex.sol"; contract RaindexV6FlashBorrowerFlashLoanAmountLosslessTest is Test { - /// Build a full arb4 setup matching the realistic mock pattern but with a + /// Build a full arb5 setup matching the realistic mock pattern but with a /// caller-supplied `minimumIO` (a `Float`) so the test can exercise the - /// lossless-conversion guard in arb4's `flashLoanAmount` computation. + /// lossless-conversion guard in arb5's `flashLoanAmount` computation. function callArb4(Float minimumIO) internal { LibRainDeploy.etchZoltuFactory(vm); LibRainDeploy.deployZoltu(LibTOFUTokenDecimals.TOFU_DECIMALS_EXPECTED_CREATION_CODE); @@ -50,9 +50,9 @@ contract RaindexV6FlashBorrowerFlashLoanAmountLosslessTest is Test { GenericPoolRaindexV6FlashBorrower arb = new GenericPoolRaindexV6FlashBorrower(); - arb.arb4( + arb.arb5( IRaindexV7(raindex), - TakeOrdersConfigV5({ + TakeOrdersConfigV6({ minimumIO: minimumIO, maximumIO: LibDecimalFloat.packLossless(type(int224).max, 0), maximumIORatio: LibDecimalFloat.packLossless(type(int224).max, 0), @@ -65,9 +65,9 @@ contract RaindexV6FlashBorrowerFlashLoanAmountLosslessTest is Test { address(exchange), abi.encodeCall(MockExchange.swap, (IERC20(address(outputToken)), IERC20(address(inputToken)), 100e6)) ), - TaskV2({ + TaskV3({ evaluable: EvaluableV4(IInterpreterV4(address(0)), IInterpreterStoreV3(address(0)), hex""), - signedContext: new SignedContextV1[](0) + signedContext: new SignedContextV2[](0) }) ); } @@ -76,7 +76,7 @@ contract RaindexV6FlashBorrowerFlashLoanAmountLosslessTest is Test { function buildSingleOrder(address inputToken, address outputToken) internal pure - returns (TakeOrderConfigV4[] memory orders) + returns (TakeOrderConfigV5[] memory orders) { IOV2[] memory validInputs = new IOV2[](1); validInputs[0] = IOV2(inputToken, bytes32(0)); @@ -91,11 +91,11 @@ contract RaindexV6FlashBorrowerFlashLoanAmountLosslessTest is Test { nonce: bytes32(0) }); - orders = new TakeOrderConfigV4[](1); - orders[0] = TakeOrderConfigV4(order, 0, 0, new SignedContextV1[](0)); + orders = new TakeOrderConfigV5[](1); + orders[0] = TakeOrderConfigV5(order, 0, 0, new SignedContextV2[](0)); } - /// arb4 computes the flash loan amount with `toFixedDecimalLossless`: a + /// arb5 computes the flash loan amount with `toFixedDecimalLossless`: a /// `minimumIO` that cannot be represented exactly at the output token's /// decimals MUST revert `LossyConversionFromFloat` rather than silently /// truncating to a smaller loan. minimumIO = 1e-7 at 6 output decimals: diff --git a/test/abstract/RaindexV6FlashBorrower.flashLoanAmountValue.t.sol b/test/abstract/RaindexV6FlashBorrower.flashLoanAmountValue.t.sol index c5fc8ba539..2f2222d063 100644 --- a/test/abstract/RaindexV6FlashBorrower.flashLoanAmountValue.t.sol +++ b/test/abstract/RaindexV6FlashBorrower.flashLoanAmountValue.t.sol @@ -8,17 +8,17 @@ import {IERC20} from "@openzeppelin-contracts-5.7.0/token/ERC20/IERC20.sol"; import {GenericPoolRaindexV6FlashBorrower} from "../../src/concrete/arb/GenericPoolRaindexV6FlashBorrower.sol"; import { IRaindexV7, - TakeOrdersConfigV5, - TakeOrderConfigV4, + TakeOrdersConfigV6, + TakeOrderConfigV5, OrderV4, IOV2, EvaluableV4, - SignedContextV1, - TaskV2, + SignedContextV2, + TaskV3, Float } from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; -import {IInterpreterV4} from "rainlang-interface-0.2.13/src/interface/IInterpreterV4.sol"; -import {IInterpreterStoreV3} from "rainlang-interface-0.2.13/src/interface/IInterpreterStoreV3.sol"; +import {IInterpreterV4} from "rainlang-interface-0.2.14/src/interface/IInterpreterV4.sol"; +import {IInterpreterStoreV3} from "rainlang-interface-0.2.14/src/interface/IInterpreterStoreV3.sol"; import {LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; import {LibRainDeploy} from "rain-deploy-0.1.22/src/lib/LibRainDeploy.sol"; import {LibTOFUTokenDecimals} from "rain-tofu-erc20-decimals-0.1.4/src/lib/LibTOFUTokenDecimals.sol"; @@ -27,7 +27,7 @@ import {MockToken} from "test/util/concrete/MockToken.sol"; import {MockExchange} from "test/util/concrete/MockExchange.sol"; import {RecordingFlashLendingMockRaindex} from "test/util/concrete/RecordingFlashLendingMockRaindex.sol"; -/// arb4 borrows exactly `minimumIO` worth of the order's OUTPUT token, expressed +/// arb5 borrows exactly `minimumIO` worth of the order's OUTPUT token, expressed /// in that token's base units. The full arb cycle closes regardless of small /// perturbations to the borrowed amount (the leftover-output accounting absorbs /// them), so this pins the exact recorded `flashLoan(token, amount)` arguments @@ -36,7 +36,7 @@ contract RaindexV6FlashBorrowerFlashLoanAmountValueTest is Test { function buildSingleOrder(address inputToken, address outputToken) internal pure - returns (TakeOrderConfigV4[] memory orders) + returns (TakeOrderConfigV5[] memory orders) { IOV2[] memory validInputs = new IOV2[](1); validInputs[0] = IOV2(inputToken, bytes32(0)); @@ -51,18 +51,18 @@ contract RaindexV6FlashBorrowerFlashLoanAmountValueTest is Test { nonce: bytes32(0) }); - orders = new TakeOrderConfigV4[](1); - orders[0] = TakeOrderConfigV4(order, 0, 0, new SignedContextV1[](0)); + orders = new TakeOrderConfigV5[](1); + orders[0] = TakeOrderConfigV5(order, 0, 0, new SignedContextV2[](0)); } - function noopTask() internal pure returns (TaskV2 memory) { - return TaskV2({ + function noopTask() internal pure returns (TaskV3 memory) { + return TaskV3({ evaluable: EvaluableV4(IInterpreterV4(address(0)), IInterpreterStoreV3(address(0)), hex""), - signedContext: new SignedContextV1[](0) + signedContext: new SignedContextV2[](0) }); } - /// minimumIO = 100 whole tokens against a 6-decimal output token. arb4 MUST + /// minimumIO = 100 whole tokens against a 6-decimal output token. arb5 MUST /// request a flash loan of exactly 100e6 base units of the output token. An /// off-by-one (or any other) perturbation to the computed amount records a /// different value here even though the arb cycle still completes. @@ -87,9 +87,9 @@ contract RaindexV6FlashBorrowerFlashLoanAmountValueTest is Test { GenericPoolRaindexV6FlashBorrower arb = new GenericPoolRaindexV6FlashBorrower(); - arb.arb4( + arb.arb5( IRaindexV7(address(raindex)), - TakeOrdersConfigV5({ + TakeOrdersConfigV6({ minimumIO: LibDecimalFloat.packLossless(100, 0), maximumIO: LibDecimalFloat.packLossless(type(int224).max, 0), maximumIORatio: LibDecimalFloat.packLossless(type(int224).max, 0), diff --git a/test/abstract/RaindexV6FlashBorrower.flashLoanFailed.t.sol b/test/abstract/RaindexV6FlashBorrower.flashLoanFailed.t.sol index 986c22eff2..8be5756729 100644 --- a/test/abstract/RaindexV6FlashBorrower.flashLoanFailed.t.sol +++ b/test/abstract/RaindexV6FlashBorrower.flashLoanFailed.t.sol @@ -9,17 +9,17 @@ import {GenericPoolRaindexV6FlashBorrower} from "../../src/concrete/arb/GenericP import {FlashLoanFailed} from "../../src/abstract/RaindexV6FlashBorrower.sol"; import { IRaindexV7, - TakeOrdersConfigV5, - TakeOrderConfigV4, + TakeOrdersConfigV6, + TakeOrderConfigV5, OrderV4, IOV2, EvaluableV4, - SignedContextV1, - TaskV2, + SignedContextV2, + TaskV3, Float } from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; -import {IInterpreterV4} from "rainlang-interface-0.2.13/src/interface/IInterpreterV4.sol"; -import {IInterpreterStoreV3} from "rainlang-interface-0.2.13/src/interface/IInterpreterStoreV3.sol"; +import {IInterpreterV4} from "rainlang-interface-0.2.14/src/interface/IInterpreterV4.sol"; +import {IInterpreterStoreV3} from "rainlang-interface-0.2.14/src/interface/IInterpreterStoreV3.sol"; import {LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; import {LibRainDeploy} from "rain-deploy-0.1.22/src/lib/LibRainDeploy.sol"; import {LibTOFUTokenDecimals} from "rain-tofu-erc20-decimals-0.1.4/src/lib/LibTOFUTokenDecimals.sol"; @@ -28,7 +28,7 @@ import {MockToken} from "test/util/concrete/MockToken.sol"; import {FalseFlashLoanMockRaindex} from "test/util/concrete/FalseFlashLoanMockRaindex.sol"; contract RaindexV6FlashBorrowerFlashLoanFailedTest is Test { - /// arb4 reverts with FlashLoanFailed when the raindex's flashLoan + /// arb5 reverts with FlashLoanFailed when the raindex's flashLoan /// returns false. function testFlashLoanFailed() external { LibRainDeploy.etchZoltuFactory(vm); @@ -55,13 +55,13 @@ contract RaindexV6FlashBorrowerFlashLoanFailedTest is Test { nonce: bytes32(0) }); - TakeOrderConfigV4[] memory orders = new TakeOrderConfigV4[](1); - orders[0] = TakeOrderConfigV4(order, 0, 0, new SignedContextV1[](0)); + TakeOrderConfigV5[] memory orders = new TakeOrderConfigV5[](1); + orders[0] = TakeOrderConfigV5(order, 0, 0, new SignedContextV2[](0)); vm.expectRevert(FlashLoanFailed.selector); - arb.arb4( + arb.arb5( IRaindexV7(LibRaindexDeploy.RAINDEX_DEPLOYED_ADDRESS), - TakeOrdersConfigV5({ + TakeOrdersConfigV6({ minimumIO: LibDecimalFloat.packLossless(100, 0), maximumIO: LibDecimalFloat.packLossless(type(int224).max, 0), maximumIORatio: LibDecimalFloat.packLossless(type(int224).max, 0), @@ -70,9 +70,9 @@ contract RaindexV6FlashBorrowerFlashLoanFailedTest is Test { data: "" }), "", - TaskV2({ + TaskV3({ evaluable: EvaluableV4(IInterpreterV4(address(0)), IInterpreterStoreV3(address(0)), hex""), - signedContext: new SignedContextV1[](0) + signedContext: new SignedContextV2[](0) }) ); } diff --git a/test/abstract/RaindexV6FlashBorrower.inputIoIndexSelection.t.sol b/test/abstract/RaindexV6FlashBorrower.inputIoIndexSelection.t.sol index a674ce4307..f1130b8ef0 100644 --- a/test/abstract/RaindexV6FlashBorrower.inputIoIndexSelection.t.sol +++ b/test/abstract/RaindexV6FlashBorrower.inputIoIndexSelection.t.sol @@ -8,16 +8,16 @@ import {IERC20} from "@openzeppelin-contracts-5.7.0/token/ERC20/IERC20.sol"; import {GenericPoolRaindexV6FlashBorrower} from "../../src/concrete/arb/GenericPoolRaindexV6FlashBorrower.sol"; import { IRaindexV7, - TakeOrdersConfigV5, - TakeOrderConfigV4, + TakeOrdersConfigV6, + TakeOrderConfigV5, OrderV4, IOV2, EvaluableV4, - SignedContextV1, - TaskV2 + SignedContextV2, + TaskV3 } from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; -import {IInterpreterV4} from "rainlang-interface-0.2.13/src/interface/IInterpreterV4.sol"; -import {IInterpreterStoreV3} from "rainlang-interface-0.2.13/src/interface/IInterpreterStoreV3.sol"; +import {IInterpreterV4} from "rainlang-interface-0.2.14/src/interface/IInterpreterV4.sol"; +import {IInterpreterStoreV3} from "rainlang-interface-0.2.14/src/interface/IInterpreterStoreV3.sol"; import {LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; import {LibRainDeploy} from "rain-deploy-0.1.22/src/lib/LibRainDeploy.sol"; import {LibTOFUTokenDecimals} from "rain-tofu-erc20-decimals-0.1.4/src/lib/LibTOFUTokenDecimals.sol"; @@ -26,17 +26,17 @@ import {MockToken} from "test/util/concrete/MockToken.sol"; import {MockExchange} from "test/util/concrete/MockExchange.sol"; import {RealisticFlashLendingMockRaindex} from "test/util/concrete/RealisticFlashLendingMockRaindex.sol"; -/// arb4 reads `ordersInputToken` from `validInputs[inputIOIndex]` using the -/// INPUT-side index specifically. The existing arb4 tests all set +/// arb5 reads `ordersInputToken` from `validInputs[inputIOIndex]` using the +/// INPUT-side index specifically. The existing arb5 tests all set /// `inputIOIndex == outputIOIndex` (0/0), so reading the input token via /// `outputIOIndex` instead selects the same slot and is indistinguishable. Here /// the indices are DISTINCT (inputIOIndex 1, outputIOIndex 0): the real input /// sits at validInputs[1] and the real output at validOutputs[0], with a decoy /// input at validInputs[0]. /// -/// arb4 grants the raindex a max allowance on `ordersInputToken` before the -/// flash loan, and the raindex's `takeOrders4` pulls the real input -/// (validInputs[inputIOIndex]) from the arb. If arb4 read the input token via +/// arb5 grants the raindex a max allowance on `ordersInputToken` before the +/// flash loan, and the raindex's `takeOrders5` pulls the real input +/// (validInputs[inputIOIndex]) from the arb. If arb5 read the input token via /// `outputIOIndex` it would approve the decoy input instead, so the raindex's /// pull of the real input reverts on a zero allowance and the whole arb reverts. contract RaindexV6FlashBorrowerInputIoIndexSelectionTest is Test { @@ -66,16 +66,16 @@ contract RaindexV6FlashBorrowerInputIoIndexSelectionTest is Test { arb = new GenericPoolRaindexV6FlashBorrower(); } - function noopTask() internal pure returns (TaskV2 memory) { - return TaskV2({ + function noopTask() internal pure returns (TaskV3 memory) { + return TaskV3({ evaluable: EvaluableV4(IInterpreterV4(address(0)), IInterpreterStoreV3(address(0)), hex""), - signedContext: new SignedContextV1[](0) + signedContext: new SignedContextV2[](0) }); } /// Real input at validInputs[1], real output at validOutputs[0]: the two /// sides use DIFFERENT indices (inputIOIndex 1, outputIOIndex 0). - function buildOrders() internal view returns (TakeOrderConfigV4[] memory orders) { + function buildOrders() internal view returns (TakeOrderConfigV5[] memory orders) { IOV2[] memory validInputs = new IOV2[](2); validInputs[0] = IOV2(address(decoyInput), bytes32(0)); validInputs[1] = IOV2(address(inputToken), bytes32(0)); @@ -90,8 +90,8 @@ contract RaindexV6FlashBorrowerInputIoIndexSelectionTest is Test { nonce: bytes32(0) }); - orders = new TakeOrderConfigV4[](1); - orders[0] = TakeOrderConfigV4(order, 1, 0, new SignedContextV1[](0)); + orders = new TakeOrderConfigV5[](1); + orders[0] = TakeOrderConfigV5(order, 1, 0, new SignedContextV2[](0)); } function exchangeData() internal view returns (bytes memory) { @@ -103,9 +103,9 @@ contract RaindexV6FlashBorrowerInputIoIndexSelectionTest is Test { } function testArb4SelectsInputTokenByInputIoIndex() external { - arb.arb4( + arb.arb5( IRaindexV7(address(raindex)), - TakeOrdersConfigV5({ + TakeOrdersConfigV6({ minimumIO: LibDecimalFloat.packLossless(100, 0), maximumIO: LibDecimalFloat.packLossless(type(int224).max, 0), maximumIORatio: LibDecimalFloat.packLossless(type(int224).max, 0), diff --git a/test/abstract/RaindexV6FlashBorrower.ioIsInput.t.sol b/test/abstract/RaindexV6FlashBorrower.ioIsInput.t.sol index 3d0f949d63..2c20a72f54 100644 --- a/test/abstract/RaindexV6FlashBorrower.ioIsInput.t.sol +++ b/test/abstract/RaindexV6FlashBorrower.ioIsInput.t.sol @@ -9,12 +9,12 @@ import {ArbRequiresInputIO} from "../../src/abstract/RaindexV6FlashBorrower.sol" import { IRaindexV7, EvaluableV4, - TakeOrderConfigV4, - TakeOrdersConfigV5, + TakeOrderConfigV5, + TakeOrdersConfigV6, IInterpreterV4, IInterpreterStoreV3, - TaskV2, - SignedContextV1 + TaskV3, + SignedContextV2 } from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; import { @@ -29,19 +29,19 @@ contract RaindexV6FlashBorrowerIOIsInputTest is ArbTest { constructor() ArbTest() {} - /// arb4 derives the flash-loan amount from `minimumIO` as the order output the + /// arb5 derives the flash-loan amount from `minimumIO` as the order output the /// taker receives, which only matches when `minimumIO` is the taker input. It /// MUST revert with `ArbRequiresInputIO` when `IOIsInput == false`, before any /// flash loan is taken. The single order is never inspected (the guard reverts /// first), so a default entry suffices. function testArb4RevertsWhenIOIsInputFalse() external { - TakeOrderConfigV4[] memory orders = new TakeOrderConfigV4[](1); + TakeOrderConfigV5[] memory orders = new TakeOrderConfigV5[](1); vm.expectRevert(abi.encodeWithSelector(ArbRequiresInputIO.selector)); GenericPoolRaindexV6FlashBorrower(iArb) - .arb4( + .arb5( iRaindex, - TakeOrdersConfigV5({ + TakeOrdersConfigV6({ minimumIO: LibDecimalFloat.packLossless(0, 0), maximumIO: LibDecimalFloat.packLossless(type(int224).max, 0), maximumIORatio: LibDecimalFloat.packLossless(type(int224).max, 0), @@ -50,11 +50,11 @@ contract RaindexV6FlashBorrowerIOIsInputTest is ArbTest { data: "" }), "", - TaskV2({ + TaskV3({ evaluable: EvaluableV4( IInterpreterV4(TEST_INTERPRETER_ADDRESS), IInterpreterStoreV3(TEST_STORE_ADDRESS), "" ), - signedContext: new SignedContextV1[](0) + signedContext: new SignedContextV2[](0) }) ); } diff --git a/test/abstract/RaindexV6FlashBorrower.mixedDecimals.t.sol b/test/abstract/RaindexV6FlashBorrower.mixedDecimals.t.sol index b6ba74113a..87adc6ca28 100644 --- a/test/abstract/RaindexV6FlashBorrower.mixedDecimals.t.sol +++ b/test/abstract/RaindexV6FlashBorrower.mixedDecimals.t.sol @@ -8,17 +8,17 @@ import {IERC20} from "@openzeppelin-contracts-5.7.0/token/ERC20/IERC20.sol"; import {GenericPoolRaindexV6FlashBorrower} from "../../src/concrete/arb/GenericPoolRaindexV6FlashBorrower.sol"; import { IRaindexV7, - TakeOrdersConfigV5, - TakeOrderConfigV4, + TakeOrdersConfigV6, + TakeOrderConfigV5, OrderV4, IOV2, EvaluableV4, - SignedContextV1, - TaskV2, + SignedContextV2, + TaskV3, Float } from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; -import {IInterpreterV4} from "rainlang-interface-0.2.13/src/interface/IInterpreterV4.sol"; -import {IInterpreterStoreV3} from "rainlang-interface-0.2.13/src/interface/IInterpreterStoreV3.sol"; +import {IInterpreterV4} from "rainlang-interface-0.2.14/src/interface/IInterpreterV4.sol"; +import {IInterpreterStoreV3} from "rainlang-interface-0.2.14/src/interface/IInterpreterStoreV3.sol"; import {LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; import {LibRainDeploy} from "rain-deploy-0.1.22/src/lib/LibRainDeploy.sol"; import {LibTOFUTokenDecimals} from "rain-tofu-erc20-decimals-0.1.4/src/lib/LibTOFUTokenDecimals.sol"; @@ -28,7 +28,7 @@ import {MockExchange} from "test/util/concrete/MockExchange.sol"; import {RealisticFlashLendingMockRaindex} from "test/util/concrete/RealisticFlashLendingMockRaindex.sol"; contract RaindexV6FlashBorrowerMixedDecimalsTest is Test { - /// arb4 with mixed-decimal tokens: 6-decimal output (USDT-like) and + /// arb5 with mixed-decimal tokens: 6-decimal output (USDT-like) and /// 18-decimal input (DAI-like). The flash loan amount must use /// outputDecimals, not inputDecimals. function testArb4MixedDecimals() external { @@ -44,7 +44,7 @@ contract RaindexV6FlashBorrowerMixedDecimalsTest is Test { RealisticFlashLendingMockRaindex(LibRaindexDeploy.RAINDEX_DEPLOYED_ADDRESS); MockExchange exchange = new MockExchange(); - // Raindex needs outputToken for both the flash loan and takeOrders4. + // Raindex needs outputToken for both the flash loan and takeOrders5. outputToken.mint(address(raindex), 1000e6); // Exchange has 100e6 of inputToken for the swap. inputToken.mint(address(exchange), 100e6); @@ -64,8 +64,8 @@ contract RaindexV6FlashBorrowerMixedDecimalsTest is Test { nonce: bytes32(0) }); - TakeOrderConfigV4[] memory orders = new TakeOrderConfigV4[](1); - orders[0] = TakeOrderConfigV4(order, 0, 0, new SignedContextV1[](0)); + TakeOrderConfigV5[] memory orders = new TakeOrderConfigV5[](1); + orders[0] = TakeOrderConfigV5(order, 0, 0, new SignedContextV2[](0)); bytes memory exchangeData = abi.encode( address(exchange), @@ -73,9 +73,9 @@ contract RaindexV6FlashBorrowerMixedDecimalsTest is Test { abi.encodeCall(MockExchange.swap, (IERC20(address(outputToken)), IERC20(address(inputToken)), 100e6)) ); - arb.arb4( + arb.arb5( IRaindexV7(address(raindex)), - TakeOrdersConfigV5({ + TakeOrdersConfigV6({ minimumIO: LibDecimalFloat.packLossless(100, 0), maximumIO: LibDecimalFloat.packLossless(type(int224).max, 0), maximumIORatio: LibDecimalFloat.packLossless(type(int224).max, 0), @@ -84,9 +84,9 @@ contract RaindexV6FlashBorrowerMixedDecimalsTest is Test { data: "" }), exchangeData, - TaskV2({ + TaskV3({ evaluable: EvaluableV4(IInterpreterV4(address(0)), IInterpreterStoreV3(address(0)), hex""), - signedContext: new SignedContextV1[](0) + signedContext: new SignedContextV2[](0) }) ); } diff --git a/test/abstract/RaindexV6FlashBorrower.noOrders.t.sol b/test/abstract/RaindexV6FlashBorrower.noOrders.t.sol index 25331a58bd..f16f5f002e 100644 --- a/test/abstract/RaindexV6FlashBorrower.noOrders.t.sol +++ b/test/abstract/RaindexV6FlashBorrower.noOrders.t.sol @@ -8,12 +8,12 @@ import {GenericPoolRaindexV6FlashBorrower} from "../../src/concrete/arb/GenericP import { IRaindexV7, EvaluableV4, - TakeOrderConfigV4, - TakeOrdersConfigV5, + TakeOrderConfigV5, + TakeOrdersConfigV6, IInterpreterV4, IInterpreterStoreV3, - TaskV2, - SignedContextV1 + TaskV3, + SignedContextV2 } from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; import { @@ -28,15 +28,15 @@ contract RaindexV6FlashBorrowerNoOrdersTest is ArbTest { constructor() ArbTest() {} - /// arb4 MUST revert with NoOrders when given an empty orders array. + /// arb5 MUST revert with NoOrders when given an empty orders array. function testArb4NoOrders() external { - TakeOrderConfigV4[] memory orders = new TakeOrderConfigV4[](0); + TakeOrderConfigV5[] memory orders = new TakeOrderConfigV5[](0); vm.expectRevert(abi.encodeWithSelector(IRaindexV7.NoOrders.selector)); GenericPoolRaindexV6FlashBorrower(iArb) - .arb4( + .arb5( iRaindex, - TakeOrdersConfigV5({ + TakeOrdersConfigV6({ minimumIO: LibDecimalFloat.packLossless(0, 0), maximumIO: LibDecimalFloat.packLossless(type(int224).max, 0), maximumIORatio: LibDecimalFloat.packLossless(type(int224).max, 0), @@ -45,11 +45,11 @@ contract RaindexV6FlashBorrowerNoOrdersTest is ArbTest { data: "" }), "", - TaskV2({ + TaskV3({ evaluable: EvaluableV4( IInterpreterV4(TEST_INTERPRETER_ADDRESS), IInterpreterStoreV3(TEST_STORE_ADDRESS), "" ), - signedContext: new SignedContextV1[](0) + signedContext: new SignedContextV2[](0) }) ); } diff --git a/test/abstract/RaindexV6FlashBorrower.orders0Selection.t.sol b/test/abstract/RaindexV6FlashBorrower.orders0Selection.t.sol index 0dabd0096e..60b5ff9d66 100644 --- a/test/abstract/RaindexV6FlashBorrower.orders0Selection.t.sol +++ b/test/abstract/RaindexV6FlashBorrower.orders0Selection.t.sol @@ -8,17 +8,17 @@ import {IERC20} from "@openzeppelin-contracts-5.7.0/token/ERC20/IERC20.sol"; import {GenericPoolRaindexV6FlashBorrower} from "../../src/concrete/arb/GenericPoolRaindexV6FlashBorrower.sol"; import { IRaindexV7, - TakeOrdersConfigV5, - TakeOrderConfigV4, + TakeOrdersConfigV6, + TakeOrderConfigV5, OrderV4, IOV2, EvaluableV4, - SignedContextV1, - TaskV2, + SignedContextV2, + TaskV3, Float } from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; -import {IInterpreterV4} from "rainlang-interface-0.2.13/src/interface/IInterpreterV4.sol"; -import {IInterpreterStoreV3} from "rainlang-interface-0.2.13/src/interface/IInterpreterStoreV3.sol"; +import {IInterpreterV4} from "rainlang-interface-0.2.14/src/interface/IInterpreterV4.sol"; +import {IInterpreterStoreV3} from "rainlang-interface-0.2.14/src/interface/IInterpreterStoreV3.sol"; import {LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; import {LibRainDeploy} from "rain-deploy-0.1.22/src/lib/LibRainDeploy.sol"; import {LibTOFUTokenDecimals} from "rain-tofu-erc20-decimals-0.1.4/src/lib/LibTOFUTokenDecimals.sol"; @@ -73,25 +73,25 @@ contract RaindexV6FlashBorrowerOrders0SelectionTest is Test { }); } - /// arb4 reads `ordersOutputToken`/`ordersInputToken` from `orders[0]` + /// arb5 reads `ordersOutputToken`/`ordersInputToken` from `orders[0]` /// specifically (the FIRST order), NOT a later order. With a two-order /// config whose SECOND order references tokens neither the raindex nor the /// exchange holds, the full arb cycle still completes using ONLY the FIRST /// order's tokens (outputToken loaned/repaid, inputToken swapped in and /// handed to raindex), and the second order's decoy tokens are never - /// touched. If arb4 read `orders[1]` instead it would try to flash-loan the + /// touched. If arb5 read `orders[1]` instead it would try to flash-loan the /// decoy output token (raindex holds none) and revert. function testArb4SelectsFirstOrderTokens() external { - TakeOrderConfigV4[] memory orders = new TakeOrderConfigV4[](2); + TakeOrderConfigV5[] memory orders = new TakeOrderConfigV5[](2); orders[0] = - TakeOrderConfigV4(buildOrder(address(inputToken), address(outputToken)), 0, 0, new SignedContextV1[](0)); - orders[1] = TakeOrderConfigV4( - buildOrder(address(decoyInputToken), address(decoyOutputToken)), 0, 0, new SignedContextV1[](0) + TakeOrderConfigV5(buildOrder(address(inputToken), address(outputToken)), 0, 0, new SignedContextV2[](0)); + orders[1] = TakeOrderConfigV5( + buildOrder(address(decoyInputToken), address(decoyOutputToken)), 0, 0, new SignedContextV2[](0) ); - arb.arb4( + arb.arb5( IRaindexV7(raindex), - TakeOrdersConfigV5({ + TakeOrdersConfigV6({ minimumIO: LibDecimalFloat.packLossless(100, 0), maximumIO: LibDecimalFloat.packLossless(type(int224).max, 0), maximumIORatio: LibDecimalFloat.packLossless(type(int224).max, 0), @@ -104,9 +104,9 @@ contract RaindexV6FlashBorrowerOrders0SelectionTest is Test { address(exchange), abi.encodeCall(MockExchange.swap, (IERC20(address(outputToken)), IERC20(address(inputToken)), 100e18)) ), - TaskV2({ + TaskV3({ evaluable: EvaluableV4(IInterpreterV4(address(0)), IInterpreterStoreV3(address(0)), hex""), - signedContext: new SignedContextV1[](0) + signedContext: new SignedContextV2[](0) }) ); diff --git a/test/abstract/RaindexV6FlashBorrower.payable.t.sol b/test/abstract/RaindexV6FlashBorrower.payable.t.sol index 9abafc49d6..8f1a77f593 100644 --- a/test/abstract/RaindexV6FlashBorrower.payable.t.sol +++ b/test/abstract/RaindexV6FlashBorrower.payable.t.sol @@ -7,7 +7,7 @@ import {LibTestFlashBorrowerArb, FlashBorrowerSetup} from "test/util/lib/LibTest import {LibTestArb} from "test/util/lib/LibTestArb.sol"; import {AllowanceCheckingExchange} from "test/util/concrete/AllowanceCheckingExchange.sol"; -/// arb4 is `payable`: it MUST accept native ETH sent as `msg.value` with the +/// arb5 is `payable`: it MUST accept native ETH sent as `msg.value` with the /// call (the value is later forwarded into `_exchange` and swept out by /// `finalizeArb`). This distinguishes `payable` runtime acceptance from the /// pre-funded (`vm.deal`) ETH path covered by the ethForwarded test, which @@ -19,17 +19,17 @@ contract RaindexV6FlashBorrowerPayableTest is Test { AllowanceCheckingExchange exchange = new AllowanceCheckingExchange(); FlashBorrowerSetup memory setup = LibTestFlashBorrowerArb.setup(vm, address(exchange), 100e18); - // Fund this test contract so it can send ETH as msg.value with arb4. + // Fund this test contract so it can send ETH as msg.value with arb5. vm.deal(address(this), 1 ether); uint256 senderBalanceBefore = address(this).balance; // The arb contract starts with no ETH; all ETH arrives via msg.value. assertEq(address(setup.arb).balance, 0, "arb starts empty"); - // Send 1 ether AS msg.value with the arb4 call. If arb4 were not + // Send 1 ether AS msg.value with the arb5 call. If arb5 were not // payable (or rejected nonzero msg.value) this call would revert and // the test would fail before reaching any assertion. - setup.arb.arb4{value: 1 ether}(setup.raindex, setup.takeOrdersConfig, setup.exchangeData, LibTestArb.noopTask()); + setup.arb.arb5{value: 1 ether}(setup.raindex, setup.takeOrdersConfig, setup.exchangeData, LibTestArb.noopTask()); // The msg.value ETH was forwarded into the exchange during _exchange. assertEq(exchange.lastEthReceived(), 1 ether, "exchange received msg.value ETH"); diff --git a/test/abstract/RaindexV6FlashBorrower.realTokenTransfers.t.sol b/test/abstract/RaindexV6FlashBorrower.realTokenTransfers.t.sol index 00fd1b9b5e..a6757b2f7b 100644 --- a/test/abstract/RaindexV6FlashBorrower.realTokenTransfers.t.sol +++ b/test/abstract/RaindexV6FlashBorrower.realTokenTransfers.t.sol @@ -8,17 +8,17 @@ import {IERC20} from "@openzeppelin-contracts-5.7.0/token/ERC20/IERC20.sol"; import {GenericPoolRaindexV6FlashBorrower} from "../../src/concrete/arb/GenericPoolRaindexV6FlashBorrower.sol"; import { IRaindexV7, - TakeOrdersConfigV5, - TakeOrderConfigV4, + TakeOrdersConfigV6, + TakeOrderConfigV5, OrderV4, IOV2, EvaluableV4, - SignedContextV1, - TaskV2, + SignedContextV2, + TaskV3, Float } from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; -import {IInterpreterV4} from "rainlang-interface-0.2.13/src/interface/IInterpreterV4.sol"; -import {IInterpreterStoreV3} from "rainlang-interface-0.2.13/src/interface/IInterpreterStoreV3.sol"; +import {IInterpreterV4} from "rainlang-interface-0.2.14/src/interface/IInterpreterV4.sol"; +import {IInterpreterStoreV3} from "rainlang-interface-0.2.14/src/interface/IInterpreterStoreV3.sol"; import {LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; import {LibRainDeploy} from "rain-deploy-0.1.22/src/lib/LibRainDeploy.sol"; import {LibTOFUTokenDecimals} from "rain-tofu-erc20-decimals-0.1.4/src/lib/LibTOFUTokenDecimals.sol"; @@ -28,7 +28,7 @@ import {MockExchange} from "test/util/concrete/MockExchange.sol"; import {RealisticFlashLendingMockRaindex} from "test/util/concrete/RealisticFlashLendingMockRaindex.sol"; contract RaindexV6FlashBorrowerRealTokenTransfersTest is Test { - /// arb4 completes a full flash loan cycle with real ERC20 transfers: + /// arb5 completes a full flash loan cycle with real ERC20 transfers: /// flash loan, exchange, take orders, repayment, and finalize. function testArb4RealTokenTransfers() external { LibRainDeploy.etchZoltuFactory(vm); @@ -61,8 +61,8 @@ contract RaindexV6FlashBorrowerRealTokenTransfersTest is Test { nonce: bytes32(0) }); - TakeOrderConfigV4[] memory orders = new TakeOrderConfigV4[](1); - orders[0] = TakeOrderConfigV4(order, 0, 0, new SignedContextV1[](0)); + TakeOrderConfigV5[] memory orders = new TakeOrderConfigV5[](1); + orders[0] = TakeOrderConfigV5(order, 0, 0, new SignedContextV2[](0)); bytes memory exchangeData = abi.encode( address(exchange), @@ -70,9 +70,9 @@ contract RaindexV6FlashBorrowerRealTokenTransfersTest is Test { abi.encodeCall(MockExchange.swap, (IERC20(address(outputToken)), IERC20(address(inputToken)), 100e18)) ); - arb.arb4( + arb.arb5( IRaindexV7(address(raindex)), - TakeOrdersConfigV5({ + TakeOrdersConfigV6({ minimumIO: LibDecimalFloat.packLossless(100, 0), maximumIO: LibDecimalFloat.packLossless(type(int224).max, 0), maximumIORatio: LibDecimalFloat.packLossless(type(int224).max, 0), @@ -81,9 +81,9 @@ contract RaindexV6FlashBorrowerRealTokenTransfersTest is Test { data: "" }), exchangeData, - TaskV2({ + TaskV3({ evaluable: EvaluableV4(IInterpreterV4(address(0)), IInterpreterStoreV3(address(0)), hex""), - signedContext: new SignedContextV1[](0) + signedContext: new SignedContextV2[](0) }) ); diff --git a/test/abstract/RaindexV6FlashBorrower.reentrancy.t.sol b/test/abstract/RaindexV6FlashBorrower.reentrancy.t.sol index c8966037e8..caccc4306f 100644 --- a/test/abstract/RaindexV6FlashBorrower.reentrancy.t.sol +++ b/test/abstract/RaindexV6FlashBorrower.reentrancy.t.sol @@ -7,16 +7,16 @@ import {Test} from "forge-std-1.17.0/src/Test.sol"; import {GenericPoolRaindexV6FlashBorrower} from "../../src/concrete/arb/GenericPoolRaindexV6FlashBorrower.sol"; import { IRaindexV7, - TakeOrdersConfigV5, - TakeOrderConfigV4, + TakeOrdersConfigV6, + TakeOrderConfigV5, OrderV4, IOV2, EvaluableV4, - SignedContextV1, - TaskV2 + SignedContextV2, + TaskV3 } from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; -import {IInterpreterV4} from "rainlang-interface-0.2.13/src/interface/IInterpreterV4.sol"; -import {IInterpreterStoreV3} from "rainlang-interface-0.2.13/src/interface/IInterpreterStoreV3.sol"; +import {IInterpreterV4} from "rainlang-interface-0.2.14/src/interface/IInterpreterV4.sol"; +import {IInterpreterStoreV3} from "rainlang-interface-0.2.14/src/interface/IInterpreterStoreV3.sol"; import {LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; import {LibRainDeploy} from "rain-deploy-0.1.22/src/lib/LibRainDeploy.sol"; import {LibTOFUTokenDecimals} from "rain-tofu-erc20-decimals-0.1.4/src/lib/LibTOFUTokenDecimals.sol"; @@ -26,7 +26,7 @@ import {FlashLendingMockRaindex} from "test/util/concrete/FlashLendingMockRainde import {ReentrantExchange} from "test/util/concrete/ReentrantExchange.sol"; contract RaindexV6FlashBorrowerReentrancyTest is Test { - /// arb4 MUST revert when re-entered via the pool call in _exchange. + /// arb5 MUST revert when re-entered via the pool call in _exchange. function testArb4Reentrancy() external { LibRainDeploy.etchZoltuFactory(vm); LibRainDeploy.deployZoltu(LibTOFUTokenDecimals.TOFU_DECIMALS_EXPECTED_CREATION_CODE); @@ -44,7 +44,7 @@ contract RaindexV6FlashBorrowerReentrancyTest is Test { GenericPoolRaindexV6FlashBorrower arb = new GenericPoolRaindexV6FlashBorrower(); - // Deploy the reentrant exchange that will call arb4 when invoked. + // Deploy the reentrant exchange that will call arb5 when invoked. ReentrantExchange exchange = new ReentrantExchange(arb, IRaindexV7(LibRaindexDeploy.RAINDEX_DEPLOYED_ADDRESS)); IOV2[] memory validInputs = new IOV2[](1); @@ -60,16 +60,16 @@ contract RaindexV6FlashBorrowerReentrancyTest is Test { nonce: bytes32(0) }); - TakeOrderConfigV4[] memory orders = new TakeOrderConfigV4[](1); - orders[0] = TakeOrderConfigV4(order, 0, 0, new SignedContextV1[](0)); + TakeOrderConfigV5[] memory orders = new TakeOrderConfigV5[](1); + orders[0] = TakeOrderConfigV5(order, 0, 0, new SignedContextV2[](0)); // exchangeData: spender=exchange, pool=exchange, callData=empty (triggers fallback). bytes memory exchangeData = abi.encode(address(exchange), address(exchange), hex""); vm.expectRevert(abi.encodeWithSelector(bytes4(keccak256("ReentrancyGuardReentrantCall()")))); - arb.arb4( + arb.arb5( IRaindexV7(LibRaindexDeploy.RAINDEX_DEPLOYED_ADDRESS), - TakeOrdersConfigV5({ + TakeOrdersConfigV6({ minimumIO: LibDecimalFloat.packLossless(100, 0), maximumIO: LibDecimalFloat.packLossless(type(int224).max, 0), maximumIORatio: LibDecimalFloat.packLossless(type(int224).max, 0), @@ -78,9 +78,9 @@ contract RaindexV6FlashBorrowerReentrancyTest is Test { data: "" }), exchangeData, - TaskV2({ + TaskV3({ evaluable: EvaluableV4(IInterpreterV4(address(0)), IInterpreterStoreV3(address(0)), hex""), - signedContext: new SignedContextV1[](0) + signedContext: new SignedContextV2[](0) }) ); } diff --git a/test/abstract/RaindexV6FlashLender.reentrant.t.sol b/test/abstract/RaindexV6FlashLender.reentrant.t.sol index 0b1b55e387..1b170cd74b 100644 --- a/test/abstract/RaindexV6FlashLender.reentrant.t.sol +++ b/test/abstract/RaindexV6FlashLender.reentrant.t.sol @@ -8,15 +8,15 @@ import { IRaindexV7, OrderConfigV4, OrderV4, - TakeOrdersConfigV5, + TakeOrdersConfigV6, ClearConfigV2, - TaskV2 + TaskV3 } from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {IERC3156FlashBorrower} from "raindex-interface-0.1.10/src/interface/ierc3156/IERC3156FlashBorrower.sol"; import {IERC20} from "@openzeppelin-contracts-5.7.0/token/ERC20/IERC20.sol"; import {LibTestAddOrder} from "test/util/lib/LibTestAddOrder.sol"; import {LibTestTakeOrder} from "test/util/lib/LibTestTakeOrder.sol"; -import {EvaluableV4, SignedContextV1} from "rainlang-interface-0.2.13/src/interface/IInterpreterCallerV4.sol"; +import {EvaluableV4, SignedContextV2} from "rainlang-interface-0.2.14/src/interface/IInterpreterCallerV5.sol"; import {Float, LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; /// @title RaindexV6FlashLenderReentrant @@ -86,7 +86,7 @@ contract RaindexV6FlashLenderReentrant is RaindexV6ExternalRealTest { checkFlashLoanNotRevert( borrower, abi.encodeWithSelector( - IRaindexV7.deposit4.selector, address(iToken0), vaultId, depositAmount, new EvaluableV4[](0) + IRaindexV7.deposit5.selector, address(iToken0), vaultId, depositAmount, new EvaluableV4[](0) ), loanAmount ); @@ -110,7 +110,7 @@ contract RaindexV6FlashLenderReentrant is RaindexV6ExternalRealTest { checkFlashLoanNotRevert( borrower, abi.encodeWithSelector( - IRaindexV7.withdraw4.selector, address(iToken0), vaultId, withdrawAmount, new TaskV2[](0) + IRaindexV7.withdraw5.selector, address(iToken0), vaultId, withdrawAmount, new TaskV3[](0) ), loanAmount ); @@ -125,7 +125,7 @@ contract RaindexV6FlashLenderReentrant is RaindexV6ExternalRealTest { // Create a flash borrower. Reenteroor borrower = new Reenteroor(); checkFlashLoanNotRevert( - borrower, abi.encodeWithSelector(IRaindexV7.addOrder4.selector, config, new TaskV2[](0)), loanAmount + borrower, abi.encodeWithSelector(IRaindexV7.addOrder5.selector, config, new TaskV3[](0)), loanAmount ); } @@ -136,7 +136,7 @@ contract RaindexV6FlashLenderReentrant is RaindexV6ExternalRealTest { Reenteroor borrower = new Reenteroor(); order.owner = address(borrower); checkFlashLoanNotRevert( - borrower, abi.encodeWithSelector(IRaindexV7.removeOrder3.selector, order, new TaskV2[](0)), loanAmount + borrower, abi.encodeWithSelector(IRaindexV7.removeOrder4.selector, order, new TaskV3[](0)), loanAmount ); } @@ -149,16 +149,16 @@ contract RaindexV6FlashLenderReentrant is RaindexV6ExternalRealTest { config.evaluable.bytecode = iParserV2.parse2("_ _:max-positive-value() 1;:;"); vm.recordLogs(); - iRaindex.addOrder4(config, new TaskV2[](0)); + iRaindex.addOrder5(config, new TaskV3[](0)); OrderV4 memory order = LibTestTakeOrder.extractOrderFromLogs(vm.getRecordedLogs()); - TakeOrdersConfigV5 memory takeOrdersConfig = + TakeOrdersConfigV6 memory takeOrdersConfig = LibTestTakeOrder.defaultTakeConfig(LibTestTakeOrder.wrapSingle(order)); // Create a flash borrower. Reenteroor borrower = new Reenteroor(); checkFlashLoanNotRevert( - borrower, abi.encodeWithSelector(IRaindexV7.takeOrders4.selector, takeOrdersConfig), loanAmount + borrower, abi.encodeWithSelector(IRaindexV7.takeOrders5.selector, takeOrdersConfig), loanAmount ); } @@ -187,31 +187,31 @@ contract RaindexV6FlashLenderReentrant is RaindexV6ExternalRealTest { vm.recordLogs(); vm.prank(alice); - iRaindex.addOrder4(aliceConfig, new TaskV2[](0)); + iRaindex.addOrder5(aliceConfig, new TaskV3[](0)); OrderV4 memory aliceOrder = LibTestTakeOrder.extractOrderFromLogs(vm.getRecordedLogs()); vm.recordLogs(); vm.prank(bob); - iRaindex.addOrder4(bobConfig, new TaskV2[](0)); + iRaindex.addOrder5(bobConfig, new TaskV3[](0)); OrderV4 memory bobOrder = LibTestTakeOrder.extractOrderFromLogs(vm.getRecordedLogs()); ClearConfigV2 memory clearConfig = ClearConfigV2(0, 0, 0, 0, 0, 0); vm.mockCall(aliceOrder.validOutputs[0].token, bytes(""), abi.encode(true)); vm.prank(aliceOrder.owner); - iRaindex.deposit4( + iRaindex.deposit5( aliceOrder.validOutputs[0].token, aliceOrder.validOutputs[0].vaultId, LibDecimalFloat.packLossless(type(int64).max, 0), - new TaskV2[](0) + new TaskV3[](0) ); vm.mockCall(bobOrder.validOutputs[0].token, bytes(""), abi.encode(true)); vm.prank(bobOrder.owner); - iRaindex.deposit4( + iRaindex.deposit5( bobOrder.validOutputs[0].token, bobOrder.validOutputs[0].vaultId, LibDecimalFloat.packLossless(type(int64).max, 0), - new TaskV2[](0) + new TaskV3[](0) ); // Create a flash borrower. @@ -223,8 +223,8 @@ contract RaindexV6FlashLenderReentrant is RaindexV6ExternalRealTest { aliceOrder, bobOrder, clearConfig, - new SignedContextV1[](0), - new SignedContextV1[](0) + new SignedContextV2[](0), + new SignedContextV2[](0) ), loanAmount ); diff --git a/test/concrete/arb/GenericPoolRaindexV6ArbOrderTaker.approvalRevoked.t.sol b/test/concrete/arb/GenericPoolRaindexV6ArbOrderTaker.approvalRevoked.t.sol index 52f799f057..550bab7c4d 100644 --- a/test/concrete/arb/GenericPoolRaindexV6ArbOrderTaker.approvalRevoked.t.sol +++ b/test/concrete/arb/GenericPoolRaindexV6ArbOrderTaker.approvalRevoked.t.sol @@ -6,19 +6,19 @@ import {Test} from "forge-std-1.17.0/src/Test.sol"; import {LibTestArb, OrderTakerSetup} from "test/util/lib/LibTestArb.sol"; import {AllowanceCheckingExchange} from "test/util/concrete/AllowanceCheckingExchange.sol"; -/// After a successful arb5, the spender's allowance on the output token +/// After a successful arb6, the spender's allowance on the output token /// from the arb contract must be zero (approve-call-revoke). contract GenericPoolRaindexV6ArbOrderTakerApprovalRevokedTest is Test { function testApprovalRevokedAfterOnTakeOrders2() external { AllowanceCheckingExchange exchange = new AllowanceCheckingExchange(); OrderTakerSetup memory setup = LibTestArb.setup(vm, address(exchange), 100e18); - setup.arb.arb5(setup.raindex, setup.takeOrdersConfig, LibTestArb.noopTask()); + setup.arb.arb6(setup.raindex, setup.takeOrdersConfig, LibTestArb.noopTask()); // During the call the exchange saw max approval. assertEq(exchange.lastAllowance(), type(uint256).max, "exchange saw max allowance during call"); - // After arb5 completes, the spender allowance is revoked to zero. + // After arb6 completes, the spender allowance is revoked to zero. assertEq(setup.outputToken.allowance(address(setup.arb), address(exchange)), 0, "allowance revoked to zero"); } } diff --git a/test/concrete/arb/GenericPoolRaindexV6ArbOrderTaker.exchangeRevert.t.sol b/test/concrete/arb/GenericPoolRaindexV6ArbOrderTaker.exchangeRevert.t.sol index 0bded9aaf8..8f80e56876 100644 --- a/test/concrete/arb/GenericPoolRaindexV6ArbOrderTaker.exchangeRevert.t.sol +++ b/test/concrete/arb/GenericPoolRaindexV6ArbOrderTaker.exchangeRevert.t.sol @@ -6,7 +6,7 @@ import {Test} from "forge-std-1.17.0/src/Test.sol"; import {LibTestArb, OrderTakerSetup} from "test/util/lib/LibTestArb.sol"; import {RevertingExchange} from "test/util/concrete/RevertingExchange.sol"; -/// If the exchange call reverts, the entire arb5 reverts with the +/// If the exchange call reverts, the entire arb6 reverts with the /// exchange's revert reason bubbled up. contract GenericPoolRaindexV6ArbOrderTakerExchangeRevertTest is Test { function testExchangeRevertPropagates() external { @@ -14,6 +14,6 @@ contract GenericPoolRaindexV6ArbOrderTakerExchangeRevertTest is Test { OrderTakerSetup memory setup = LibTestArb.setup(vm, address(exchange), 100e18); vm.expectRevert("exchange failed"); - setup.arb.arb5(setup.raindex, setup.takeOrdersConfig, LibTestArb.noopTask()); + setup.arb.arb6(setup.raindex, setup.takeOrdersConfig, LibTestArb.noopTask()); } } diff --git a/test/concrete/arb/GenericPoolRaindexV6ArbOrderTaker.raindexApprovalRevoked.t.sol b/test/concrete/arb/GenericPoolRaindexV6ArbOrderTaker.raindexApprovalRevoked.t.sol index b45f686442..07af91da9b 100644 --- a/test/concrete/arb/GenericPoolRaindexV6ArbOrderTaker.raindexApprovalRevoked.t.sol +++ b/test/concrete/arb/GenericPoolRaindexV6ArbOrderTaker.raindexApprovalRevoked.t.sol @@ -6,9 +6,9 @@ import {Test} from "forge-std-1.17.0/src/Test.sol"; import {LibTestArb, OrderTakerSetup} from "test/util/lib/LibTestArb.sol"; import {MockExchange} from "test/util/concrete/MockExchange.sol"; -/// arb5 approves the raindex to spend the order's input token (max) before -/// calling takeOrders4, then MUST revoke that allowance back to zero after -/// takeOrders4 returns. This guards against a stale max approval remaining on +/// arb6 approves the raindex to spend the order's input token (max) before +/// calling takeOrders5, then MUST revoke that allowance back to zero after +/// takeOrders5 returns. This guards against a stale max approval remaining on /// the orderbook after the arb completes. contract GenericPoolRaindexV6ArbOrderTakerRaindexApprovalRevokedTest is Test { function testRaindexInputApprovalRevokedAfterArb5() external { @@ -18,15 +18,15 @@ contract GenericPoolRaindexV6ArbOrderTakerRaindexApprovalRevokedTest is Test { // Sanity: before the arb there is no allowance to the raindex. assertEq(setup.inputToken.allowance(address(setup.arb), address(setup.raindex)), 0, "no allowance before arb"); - setup.arb.arb5(setup.raindex, setup.takeOrdersConfig, LibTestArb.noopTask()); + setup.arb.arb6(setup.raindex, setup.takeOrdersConfig, LibTestArb.noopTask()); - // After arb5 the raindex's allowance on the input token is revoked to + // After arb6 the raindex's allowance on the input token is revoked to // zero. If the post-takeOrders revoke is dropped or set non-zero this // assertion fails. assertEq( setup.inputToken.allowance(address(setup.arb), address(setup.raindex)), 0, - "raindex input allowance revoked to zero after arb5" + "raindex input allowance revoked to zero after arb6" ); } } diff --git a/test/concrete/arb/GenericPoolRaindexV6ArbOrderTaker.reentrantCallback.t.sol b/test/concrete/arb/GenericPoolRaindexV6ArbOrderTaker.reentrantCallback.t.sol index 1388988eb4..9cb7d3b678 100644 --- a/test/concrete/arb/GenericPoolRaindexV6ArbOrderTaker.reentrantCallback.t.sol +++ b/test/concrete/arb/GenericPoolRaindexV6ArbOrderTaker.reentrantCallback.t.sol @@ -16,11 +16,11 @@ import { OrderConfigV4, IOV2, EvaluableV4, - TaskV2, - TakeOrdersConfigV5 + TaskV3, + TakeOrdersConfigV6 } from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; -import {IInterpreterV4} from "rainlang-interface-0.2.13/src/interface/IInterpreterV4.sol"; -import {IInterpreterStoreV3} from "rainlang-interface-0.2.13/src/interface/IInterpreterStoreV3.sol"; +import {IInterpreterV4} from "rainlang-interface-0.2.14/src/interface/IInterpreterV4.sol"; +import {IInterpreterStoreV3} from "rainlang-interface-0.2.14/src/interface/IInterpreterStoreV3.sol"; import {TEST_INTERPRETER_ADDRESS} from "rainlang-0.2.19/test/lib/deploy/LibTestInterpreterDeploy.sol"; import {Float, LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; @@ -28,7 +28,7 @@ contract GenericPoolRaindexV6ArbOrderTakerReentrantCallbackTest is RaindexV6Exte address internal owner = address(uint160(uint256(keccak256("owner.reentrant.callback")))); address internal bot = address(uint160(uint256(keccak256("bot.reentrant.callback")))); - /// An order's store re-entering `onTakeOrders2` during `arb5` is rejected, + /// An order's store re-entering `onTakeOrders2` during `arb6` is rejected, /// the arb completes and the caller's ETH is refunded to the caller. function testOrderStoreReentrantCallbackCannotTakeArbEth() external { GenericPoolRaindexV6ArbOrderTaker arb = new GenericPoolRaindexV6ArbOrderTaker(); @@ -41,7 +41,7 @@ contract GenericPoolRaindexV6ArbOrderTakerReentrantCallbackTest is RaindexV6Exte token1.mint(owner, 10e18); vm.startPrank(owner); token1.approve(address(iRaindex), 10e18); - iRaindex.deposit4(address(token1), bytes32(uint256(1)), LibDecimalFloat.packLossless(10, 0), new TaskV2[](0)); + iRaindex.deposit5(address(token1), bytes32(uint256(1)), LibDecimalFloat.packLossless(10, 0), new TaskV3[](0)); vm.stopPrank(); IOV2[] memory ins = new IOV2[](1); @@ -62,16 +62,16 @@ contract GenericPoolRaindexV6ArbOrderTakerReentrantCallbackTest is RaindexV6Exte ); vm.recordLogs(); vm.prank(owner); - iRaindex.addOrder4(cfg, new TaskV2[](0)); + iRaindex.addOrder5(cfg, new TaskV3[](0)); OrderV4 memory order = LibTestTakeOrder.extractOrderFromLogs(vm.getRecordedLogs()); - TakeOrdersConfigV5 memory take = LibTestTakeOrder.defaultTakeConfig(LibTestTakeOrder.wrapSingle(order)); + TakeOrdersConfigV6 memory take = LibTestTakeOrder.defaultTakeConfig(LibTestTakeOrder.wrapSingle(order)); take.maximumIO = LibDecimalFloat.packLossless(1, 0); take.data = abi.encode(address(pool), address(pool), abi.encodeCall(MockExchange.swap, (token1, token0, 1e18))); vm.deal(bot, 1 ether); vm.prank(bot); - arb.arb5{value: 1 ether}(iRaindex, take, LibTestArb.noopTask()); + arb.arb6{value: 1 ether}(iRaindex, take, LibTestArb.noopTask()); assertEq(store.revertData(), abi.encodeWithSelector(UnexpectedOnTakeOrdersCaller.selector, address(store))); assertEq(address(store).balance, 0); diff --git a/test/concrete/arb/GenericPoolRaindexV6ArbOrderTaker.sender.t.sol b/test/concrete/arb/GenericPoolRaindexV6ArbOrderTaker.sender.t.sol index 53f540e2c4..d0be2e252c 100644 --- a/test/concrete/arb/GenericPoolRaindexV6ArbOrderTaker.sender.t.sol +++ b/test/concrete/arb/GenericPoolRaindexV6ArbOrderTaker.sender.t.sol @@ -8,12 +8,12 @@ import {GenericPoolRaindexV6ArbOrderTaker} from "../../../src/concrete/arb/Gener import { OrderV4, EvaluableV4, - TakeOrderConfigV4, - TakeOrdersConfigV5, + TakeOrderConfigV5, + TakeOrdersConfigV6, IInterpreterV4, IInterpreterStoreV3, - TaskV2, - SignedContextV1 + TaskV3, + SignedContextV2 } from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; import { @@ -24,12 +24,12 @@ import { contract GenericPoolRaindexV6ArbOrderTakerSenderTest is GenericPoolRaindexV6ArbOrderTakerTest { /// forge-config: default.fuzz.runs = 10 function testGenericPoolTakeOrdersSender(OrderV4 memory order, uint256 inputIOIndex, uint256 outputIOIndex) public { - TakeOrderConfigV4[] memory orders = buildTakeOrderConfig(order, inputIOIndex, outputIOIndex); + TakeOrderConfigV5[] memory orders = buildTakeOrderConfig(order, inputIOIndex, outputIOIndex); GenericPoolRaindexV6ArbOrderTaker(iArb) - .arb5( + .arb6( iRaindex, - TakeOrdersConfigV5({ + TakeOrdersConfigV6({ minimumIO: LibDecimalFloat.packLossless(0, 0), maximumIO: LibDecimalFloat.packLossless(type(int224).max, 0), maximumIORatio: LibDecimalFloat.packLossless(type(int224).max, 0), @@ -37,11 +37,11 @@ contract GenericPoolRaindexV6ArbOrderTakerSenderTest is GenericPoolRaindexV6ArbO orders: orders, data: abi.encode(iRefundoor, iRefundoor, "") }), - TaskV2({ + TaskV3({ evaluable: EvaluableV4( IInterpreterV4(TEST_INTERPRETER_ADDRESS), IInterpreterStoreV3(TEST_STORE_ADDRESS), "" ), - signedContext: new SignedContextV1[](0) + signedContext: new SignedContextV2[](0) }) ); } diff --git a/test/concrete/arb/GenericPoolRaindexV6ArbOrderTaker.zeroAddress.t.sol b/test/concrete/arb/GenericPoolRaindexV6ArbOrderTaker.zeroAddress.t.sol index 5033a5a76d..0e549ff329 100644 --- a/test/concrete/arb/GenericPoolRaindexV6ArbOrderTaker.zeroAddress.t.sol +++ b/test/concrete/arb/GenericPoolRaindexV6ArbOrderTaker.zeroAddress.t.sol @@ -9,7 +9,7 @@ import {ZeroExchangeSpender, ZeroExchangePool} from "src/lib/LibGenericPoolExcha /// The order-taker routes `takeOrdersConfig.data` into `onTakeOrders2 -> /// LibGenericPoolExchange.exchange`. A zero spender/pool in that data reverts -/// through the real `arb5` path (the guards fire after take-orders, before any +/// through the real `arb6` path (the guards fire after take-orders, before any /// approval/call). contract GenericPoolRaindexV6ArbOrderTakerZeroAddressTest is Test { function testArbZeroSpenderReverts() external { @@ -18,7 +18,7 @@ contract GenericPoolRaindexV6ArbOrderTakerZeroAddressTest is Test { setup.takeOrdersConfig.data = abi.encode(address(0), address(exchange), bytes("")); vm.expectRevert(ZeroExchangeSpender.selector); - setup.arb.arb5(setup.raindex, setup.takeOrdersConfig, LibTestArb.noopTask()); + setup.arb.arb6(setup.raindex, setup.takeOrdersConfig, LibTestArb.noopTask()); } function testArbZeroPoolReverts() external { @@ -27,6 +27,6 @@ contract GenericPoolRaindexV6ArbOrderTakerZeroAddressTest is Test { setup.takeOrdersConfig.data = abi.encode(address(exchange), address(0), bytes("")); vm.expectRevert(ZeroExchangePool.selector); - setup.arb.arb5(setup.raindex, setup.takeOrdersConfig, LibTestArb.noopTask()); + setup.arb.arb6(setup.raindex, setup.takeOrdersConfig, LibTestArb.noopTask()); } } diff --git a/test/concrete/arb/GenericPoolRaindexV6FlashBorrower.approvalRevoked.t.sol b/test/concrete/arb/GenericPoolRaindexV6FlashBorrower.approvalRevoked.t.sol index 570f23a624..bde988c450 100644 --- a/test/concrete/arb/GenericPoolRaindexV6FlashBorrower.approvalRevoked.t.sol +++ b/test/concrete/arb/GenericPoolRaindexV6FlashBorrower.approvalRevoked.t.sol @@ -7,19 +7,19 @@ import {LibTestFlashBorrowerArb, FlashBorrowerSetup} from "test/util/lib/LibTest import {LibTestArb} from "test/util/lib/LibTestArb.sol"; import {AllowanceCheckingExchange} from "test/util/concrete/AllowanceCheckingExchange.sol"; -/// After a successful arb4, the spender's allowance on the borrowed token +/// After a successful arb5, the spender's allowance on the borrowed token /// from the arb contract must be zero (approve-call-revoke). contract GenericPoolRaindexV6FlashBorrowerApprovalRevokedTest is Test { function testApprovalRevokedAfterExchange() external { AllowanceCheckingExchange exchange = new AllowanceCheckingExchange(); FlashBorrowerSetup memory setup = LibTestFlashBorrowerArb.setup(vm, address(exchange), 100e18); - setup.arb.arb4(setup.raindex, setup.takeOrdersConfig, setup.exchangeData, LibTestArb.noopTask()); + setup.arb.arb5(setup.raindex, setup.takeOrdersConfig, setup.exchangeData, LibTestArb.noopTask()); // During the call the exchange saw max approval. assertEq(exchange.lastAllowance(), type(uint256).max); - // After arb4 completes, the spender allowance is revoked to zero. + // After arb5 completes, the spender allowance is revoked to zero. assertEq(setup.outputToken.allowance(address(setup.arb), address(exchange)), 0); } } diff --git a/test/concrete/arb/GenericPoolRaindexV6FlashBorrower.ethForwarded.t.sol b/test/concrete/arb/GenericPoolRaindexV6FlashBorrower.ethForwarded.t.sol index a3dbdd82eb..9f70b1b08c 100644 --- a/test/concrete/arb/GenericPoolRaindexV6FlashBorrower.ethForwarded.t.sol +++ b/test/concrete/arb/GenericPoolRaindexV6FlashBorrower.ethForwarded.t.sol @@ -16,10 +16,10 @@ contract GenericPoolRaindexV6FlashBorrowerEthForwardedTest is Test { AllowanceCheckingExchange exchange = new AllowanceCheckingExchange(); FlashBorrowerSetup memory setup = LibTestFlashBorrowerArb.setup(vm, address(exchange), 100e18); - // Send ETH to the arb contract before calling arb4. + // Send ETH to the arb contract before calling arb5. vm.deal(address(setup.arb), 1 ether); - setup.arb.arb4(setup.raindex, setup.takeOrdersConfig, setup.exchangeData, LibTestArb.noopTask()); + setup.arb.arb5(setup.raindex, setup.takeOrdersConfig, setup.exchangeData, LibTestArb.noopTask()); // The exchange received the ETH during the call. assertEq(exchange.lastEthReceived(), 1 ether); diff --git a/test/concrete/arb/GenericPoolRaindexV6FlashBorrower.exchangeRevert.t.sol b/test/concrete/arb/GenericPoolRaindexV6FlashBorrower.exchangeRevert.t.sol index 430006ddfb..40a8675f99 100644 --- a/test/concrete/arb/GenericPoolRaindexV6FlashBorrower.exchangeRevert.t.sol +++ b/test/concrete/arb/GenericPoolRaindexV6FlashBorrower.exchangeRevert.t.sol @@ -7,7 +7,7 @@ import {LibTestFlashBorrowerArb, FlashBorrowerSetup} from "test/util/lib/LibTest import {LibTestArb} from "test/util/lib/LibTestArb.sol"; import {RevertingExchange} from "test/util/concrete/RevertingExchange.sol"; -/// If the exchange call reverts, the entire arb4 reverts with the +/// If the exchange call reverts, the entire arb5 reverts with the /// exchange's revert reason bubbled up. contract GenericPoolRaindexV6FlashBorrowerExchangeRevertTest is Test { function testExchangeRevertPropagates() external { @@ -15,6 +15,6 @@ contract GenericPoolRaindexV6FlashBorrowerExchangeRevertTest is Test { FlashBorrowerSetup memory setup = LibTestFlashBorrowerArb.setup(vm, address(exchange), 100e18); vm.expectRevert("exchange failed"); - setup.arb.arb4(setup.raindex, setup.takeOrdersConfig, setup.exchangeData, LibTestArb.noopTask()); + setup.arb.arb5(setup.raindex, setup.takeOrdersConfig, setup.exchangeData, LibTestArb.noopTask()); } } diff --git a/test/concrete/arb/GenericPoolRaindexV6FlashBorrower.exchangeTokenSelection.t.sol b/test/concrete/arb/GenericPoolRaindexV6FlashBorrower.exchangeTokenSelection.t.sol index d1991110b3..4d00d90801 100644 --- a/test/concrete/arb/GenericPoolRaindexV6FlashBorrower.exchangeTokenSelection.t.sol +++ b/test/concrete/arb/GenericPoolRaindexV6FlashBorrower.exchangeTokenSelection.t.sol @@ -8,16 +8,16 @@ import {IERC20} from "@openzeppelin-contracts-5.7.0/token/ERC20/IERC20.sol"; import {GenericPoolRaindexV6FlashBorrower} from "../../../src/concrete/arb/GenericPoolRaindexV6FlashBorrower.sol"; import { IRaindexV7, - TakeOrdersConfigV5, - TakeOrderConfigV4, + TakeOrdersConfigV6, + TakeOrderConfigV5, OrderV4, IOV2, EvaluableV4, - SignedContextV1, - TaskV2 + SignedContextV2, + TaskV3 } from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; -import {IInterpreterV4} from "rainlang-interface-0.2.13/src/interface/IInterpreterV4.sol"; -import {IInterpreterStoreV3} from "rainlang-interface-0.2.13/src/interface/IInterpreterStoreV3.sol"; +import {IInterpreterV4} from "rainlang-interface-0.2.14/src/interface/IInterpreterV4.sol"; +import {IInterpreterStoreV3} from "rainlang-interface-0.2.14/src/interface/IInterpreterStoreV3.sol"; import {LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; import {LibRainDeploy} from "rain-deploy-0.1.22/src/lib/LibRainDeploy.sol"; import {LibTOFUTokenDecimals} from "rain-tofu-erc20-decimals-0.1.4/src/lib/LibTOFUTokenDecimals.sol"; @@ -68,15 +68,15 @@ contract GenericPoolRaindexV6FlashBorrowerExchangeTokenSelectionTest is Test { ); } - function noopTask() internal pure returns (TaskV2 memory) { - return TaskV2({ + function noopTask() internal pure returns (TaskV3 memory) { + return TaskV3({ evaluable: EvaluableV4(IInterpreterV4(address(0)), IInterpreterStoreV3(address(0)), hex""), - signedContext: new SignedContextV1[](0) + signedContext: new SignedContextV2[](0) }); } - function takeOrdersConfig(TakeOrderConfigV4[] memory orders) internal pure returns (TakeOrdersConfigV5 memory) { - return TakeOrdersConfigV5({ + function takeOrdersConfig(TakeOrderConfigV5[] memory orders) internal pure returns (TakeOrdersConfigV6 memory) { + return TakeOrdersConfigV6({ minimumIO: LibDecimalFloat.packLossless(100, 0), maximumIO: LibDecimalFloat.packLossless(type(int224).max, 0), maximumIORatio: LibDecimalFloat.packLossless(type(int224).max, 0), @@ -92,11 +92,11 @@ contract GenericPoolRaindexV6FlashBorrowerExchangeTokenSelectionTest is Test { /// `orders[1]` it would approve the decoy and the exchange's pull of the /// real output token would revert. function testExchangeSelectsFirstOrderBorrowedToken() external { - TakeOrderConfigV4[] memory orders = new TakeOrderConfigV4[](2); + TakeOrderConfigV5[] memory orders = new TakeOrderConfigV5[](2); orders[0] = singleIoOrder(address(inputToken), address(outputToken)); orders[1] = singleIoOrder(address(inputToken), address(decoyToken)); - arb.arb4(IRaindexV7(raindex), takeOrdersConfig(orders), exchangeData(), noopTask()); + arb.arb5(IRaindexV7(raindex), takeOrdersConfig(orders), exchangeData(), noopTask()); // The real output token was the one swapped through the exchange. assertEq(outputToken.balanceOf(address(exchange)), 100e18, "exchange pulled first order output"); @@ -124,11 +124,11 @@ contract GenericPoolRaindexV6FlashBorrowerExchangeTokenSelectionTest is Test { nonce: bytes32(0) }); - TakeOrderConfigV4[] memory orders = new TakeOrderConfigV4[](1); + TakeOrderConfigV5[] memory orders = new TakeOrderConfigV5[](1); // inputIOIndex 0, outputIOIndex 1. - orders[0] = TakeOrderConfigV4(order, 0, 1, new SignedContextV1[](0)); + orders[0] = TakeOrderConfigV5(order, 0, 1, new SignedContextV2[](0)); - arb.arb4(IRaindexV7(raindex), takeOrdersConfig(orders), exchangeData(), noopTask()); + arb.arb5(IRaindexV7(raindex), takeOrdersConfig(orders), exchangeData(), noopTask()); // validOutputs[1] (the real output) was swapped through the exchange. assertEq(outputToken.balanceOf(address(exchange)), 100e18, "exchange pulled outputIOIndex token"); @@ -136,7 +136,7 @@ contract GenericPoolRaindexV6FlashBorrowerExchangeTokenSelectionTest is Test { assertEq(decoyToken.allowance(address(arb), address(exchange)), 0, "decoy at index 0 never approved"); } - function singleIoOrder(address inTok, address outTok) internal pure returns (TakeOrderConfigV4 memory) { + function singleIoOrder(address inTok, address outTok) internal pure returns (TakeOrderConfigV5 memory) { IOV2[] memory validInputs = new IOV2[](1); validInputs[0] = IOV2(inTok, bytes32(0)); IOV2[] memory validOutputs = new IOV2[](1); @@ -148,6 +148,6 @@ contract GenericPoolRaindexV6FlashBorrowerExchangeTokenSelectionTest is Test { validOutputs: validOutputs, nonce: bytes32(0) }); - return TakeOrderConfigV4(order, 0, 0, new SignedContextV1[](0)); + return TakeOrderConfigV5(order, 0, 0, new SignedContextV2[](0)); } } diff --git a/test/concrete/arb/GenericPoolRaindexV6FlashBorrower.raindexApprovalRevoked.t.sol b/test/concrete/arb/GenericPoolRaindexV6FlashBorrower.raindexApprovalRevoked.t.sol index 7263047d7c..a0f4f5b385 100644 --- a/test/concrete/arb/GenericPoolRaindexV6FlashBorrower.raindexApprovalRevoked.t.sol +++ b/test/concrete/arb/GenericPoolRaindexV6FlashBorrower.raindexApprovalRevoked.t.sol @@ -7,7 +7,7 @@ import {LibTestFlashBorrowerArb, FlashBorrowerSetup} from "test/util/lib/LibTest import {LibTestArb} from "test/util/lib/LibTestArb.sol"; import {MockExchange} from "test/util/concrete/MockExchange.sol"; -/// arb4 grants the raindex max approval on BOTH the order's input and output +/// arb5 grants the raindex max approval on BOTH the order's input and output /// tokens before taking the flash loan, then MUST revoke both back to zero /// after the flash loan returns. This guards against a stale max approval to /// the orderbook persisting after the arb completes. @@ -16,24 +16,24 @@ contract GenericPoolRaindexV6FlashBorrowerRaindexApprovalRevokedTest is Test { MockExchange exchange = new MockExchange(); FlashBorrowerSetup memory setup = LibTestFlashBorrowerArb.setup(vm, address(exchange), 100e18); - setup.arb.arb4(setup.raindex, setup.takeOrdersConfig, setup.exchangeData, LibTestArb.noopTask()); + setup.arb.arb5(setup.raindex, setup.takeOrdersConfig, setup.exchangeData, LibTestArb.noopTask()); - // After arb4 the raindex's allowance on the OUTPUT token (the borrowed + // After arb5 the raindex's allowance on the OUTPUT token (the borrowed // token) is revoked to zero. If the post-flashLoan output revoke is // dropped or set non-zero this assertion fails. assertEq( setup.outputToken.allowance(address(setup.arb), address(setup.raindex)), 0, - "raindex output allowance revoked to zero after arb4" + "raindex output allowance revoked to zero after arb5" ); - // After arb4 the raindex's allowance on the INPUT token is also revoked + // After arb5 the raindex's allowance on the INPUT token is also revoked // to zero. If the post-flashLoan input revoke is dropped or set // non-zero this assertion fails. assertEq( setup.inputToken.allowance(address(setup.arb), address(setup.raindex)), 0, - "raindex input allowance revoked to zero after arb4" + "raindex input allowance revoked to zero after arb5" ); } } diff --git a/test/concrete/arb/GenericPoolRaindexV6FlashBorrower.sender.t.sol b/test/concrete/arb/GenericPoolRaindexV6FlashBorrower.sender.t.sol index 916cea1d54..47702b5f9d 100644 --- a/test/concrete/arb/GenericPoolRaindexV6FlashBorrower.sender.t.sol +++ b/test/concrete/arb/GenericPoolRaindexV6FlashBorrower.sender.t.sol @@ -7,13 +7,13 @@ import {ArbTest} from "test/util/abstract/ArbTest.sol"; import {GenericPoolRaindexV6FlashBorrower} from "../../../src/concrete/arb/GenericPoolRaindexV6FlashBorrower.sol"; import { OrderV4, - TakeOrderConfigV4, + TakeOrderConfigV5, EvaluableV4, - TakeOrdersConfigV5, + TakeOrdersConfigV6, IInterpreterV4, IInterpreterStoreV3, - TaskV2, - SignedContextV1 + TaskV3, + SignedContextV2 } from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {LibDecimalFloat, Float} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; import { @@ -34,12 +34,12 @@ contract GenericPoolRaindexV6FlashBorrowerTest is ArbTest { uint256 inputIOIndex, uint256 outputIOIndex ) public { - TakeOrderConfigV4[] memory orders = buildTakeOrderConfig(order, inputIOIndex, outputIOIndex); + TakeOrderConfigV5[] memory orders = buildTakeOrderConfig(order, inputIOIndex, outputIOIndex); GenericPoolRaindexV6FlashBorrower(iArb) - .arb4( + .arb5( iRaindex, - TakeOrdersConfigV5({ + TakeOrdersConfigV6({ minimumIO: LibDecimalFloat.packLossless(0, 0), maximumIO: LibDecimalFloat.packLossless(type(int224).max, 0), maximumIORatio: LibDecimalFloat.packLossless(type(int224).max, 0), @@ -48,11 +48,11 @@ contract GenericPoolRaindexV6FlashBorrowerTest is ArbTest { data: "" }), abi.encode(iRefundoor, iRefundoor, ""), - TaskV2({ + TaskV3({ evaluable: EvaluableV4( IInterpreterV4(TEST_INTERPRETER_ADDRESS), IInterpreterStoreV3(TEST_STORE_ADDRESS), "" ), - signedContext: new SignedContextV1[](0) + signedContext: new SignedContextV2[](0) }) ); } diff --git a/test/concrete/arb/GenericPoolRaindexV6FlashBorrower.zeroAddress.t.sol b/test/concrete/arb/GenericPoolRaindexV6FlashBorrower.zeroAddress.t.sol index 571f3f9e6f..797833cf79 100644 --- a/test/concrete/arb/GenericPoolRaindexV6FlashBorrower.zeroAddress.t.sol +++ b/test/concrete/arb/GenericPoolRaindexV6FlashBorrower.zeroAddress.t.sol @@ -18,7 +18,7 @@ contract GenericPoolRaindexV6FlashBorrowerZeroAddressTest is Test { bytes memory badExchangeData = abi.encode(address(0), address(exchange), bytes("")); vm.expectRevert(ZeroExchangeSpender.selector); - setup.arb.arb4(setup.raindex, setup.takeOrdersConfig, badExchangeData, LibTestArb.noopTask()); + setup.arb.arb5(setup.raindex, setup.takeOrdersConfig, badExchangeData, LibTestArb.noopTask()); } function testArbZeroPoolReverts() external { @@ -27,6 +27,6 @@ contract GenericPoolRaindexV6FlashBorrowerZeroAddressTest is Test { bytes memory badExchangeData = abi.encode(address(exchange), address(0), bytes("")); vm.expectRevert(ZeroExchangePool.selector); - setup.arb.arb4(setup.raindex, setup.takeOrdersConfig, badExchangeData, LibTestArb.noopTask()); + setup.arb.arb5(setup.raindex, setup.takeOrdersConfig, badExchangeData, LibTestArb.noopTask()); } } diff --git a/test/concrete/arb/RouteProcessorRaindexV6ArbOrderTaker.nonStandardDecimals.t.sol b/test/concrete/arb/RouteProcessorRaindexV6ArbOrderTaker.nonStandardDecimals.t.sol index 8d0ad762c1..5afe6d6d71 100644 --- a/test/concrete/arb/RouteProcessorRaindexV6ArbOrderTaker.nonStandardDecimals.t.sol +++ b/test/concrete/arb/RouteProcessorRaindexV6ArbOrderTaker.nonStandardDecimals.t.sol @@ -8,17 +8,17 @@ import {IERC20} from "@openzeppelin-contracts-5.7.0/token/ERC20/IERC20.sol"; import {RouteProcessorRaindexV6ArbOrderTaker} from "../../../src/concrete/arb/RouteProcessorRaindexV6ArbOrderTaker.sol"; import { IRaindexV7, - TakeOrdersConfigV5, - TakeOrderConfigV4, + TakeOrdersConfigV6, + TakeOrderConfigV5, OrderV4, IOV2, EvaluableV4, - SignedContextV1, - TaskV2, + SignedContextV2, + TaskV3, Float } from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; -import {IInterpreterV4} from "rainlang-interface-0.2.13/src/interface/IInterpreterV4.sol"; -import {IInterpreterStoreV3} from "rainlang-interface-0.2.13/src/interface/IInterpreterStoreV3.sol"; +import {IInterpreterV4} from "rainlang-interface-0.2.14/src/interface/IInterpreterV4.sol"; +import {IInterpreterStoreV3} from "rainlang-interface-0.2.14/src/interface/IInterpreterStoreV3.sol"; import {LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; import {LibRainDeploy} from "rain-deploy-0.1.22/src/lib/LibRainDeploy.sol"; import {LibTOFUTokenDecimals} from "rain-tofu-erc20-decimals-0.1.4/src/lib/LibTOFUTokenDecimals.sol"; @@ -31,7 +31,7 @@ import {MockToken} from "test/util/concrete/MockToken.sol"; import {MockRouteProcessor} from "test/util/concrete/MockRouteProcessor.sol"; import {RealisticOrderTakerMockRaindex} from "test/util/concrete/RealisticOrderTakerMockRaindex.sol"; -/// arb5 with RouteProcessor MUST correctly convert Float amounts to +/// arb6 with RouteProcessor MUST correctly convert Float amounts to /// fixed-point using the token's decimals, not hardcoded 18. contract RouteProcessorRaindexV6ArbOrderTakerNonStandardDecimalsTest is Test { function testRouteProcessorArb5SixDecimalTokens() external { @@ -43,7 +43,7 @@ contract RouteProcessorRaindexV6ArbOrderTakerNonStandardDecimalsTest is Test { MockToken outputToken = new MockToken("USDT", "USDT", 6); // Raindex will send 100 USDT (100e6) to the taker, then pull 100 USDC. - // arb5 only trusts the canonical raindex deployment, so etch the mock's + // arb6 only trusts the canonical raindex deployment, so etch the mock's // runtime code (immutables included) at that address. RealisticOrderTakerMockRaindex mockRaindex = new RealisticOrderTakerMockRaindex(100e6); vm.etch(LibRaindexDeploy.RAINDEX_DEPLOYED_ADDRESS, address(mockRaindex).code); @@ -75,14 +75,14 @@ contract RouteProcessorRaindexV6ArbOrderTakerNonStandardDecimalsTest is Test { nonce: bytes32(0) }); - TakeOrderConfigV4[] memory orders = new TakeOrderConfigV4[](1); - orders[0] = TakeOrderConfigV4(order, 0, 0, new SignedContextV1[](0)); + TakeOrderConfigV5[] memory orders = new TakeOrderConfigV5[](1); + orders[0] = TakeOrderConfigV5(order, 0, 0, new SignedContextV2[](0)); bytes memory takeOrdersData = abi.encode(hex""); - arb.arb5( + arb.arb6( IRaindexV7(address(raindex)), - TakeOrdersConfigV5({ + TakeOrdersConfigV6({ minimumIO: LibDecimalFloat.packLossless(100, 0), maximumIO: LibDecimalFloat.packLossless(type(int224).max, 0), maximumIORatio: LibDecimalFloat.packLossless(type(int224).max, 0), @@ -90,11 +90,11 @@ contract RouteProcessorRaindexV6ArbOrderTakerNonStandardDecimalsTest is Test { orders: orders, data: takeOrdersData }), - TaskV2({ + TaskV3({ evaluable: EvaluableV4( IInterpreterV4(TEST_INTERPRETER_ADDRESS), IInterpreterStoreV3(TEST_STORE_ADDRESS), hex"" ), - signedContext: new SignedContextV1[](0) + signedContext: new SignedContextV2[](0) }) ); diff --git a/test/concrete/arb/RouteProcessorRaindexV6ArbOrderTaker.onTakeOrders2.t.sol b/test/concrete/arb/RouteProcessorRaindexV6ArbOrderTaker.onTakeOrders2.t.sol index 3051ebd0e6..f6e64e1ce6 100644 --- a/test/concrete/arb/RouteProcessorRaindexV6ArbOrderTaker.onTakeOrders2.t.sol +++ b/test/concrete/arb/RouteProcessorRaindexV6ArbOrderTaker.onTakeOrders2.t.sol @@ -8,17 +8,17 @@ import {IERC20} from "@openzeppelin-contracts-5.7.0/token/ERC20/IERC20.sol"; import {RouteProcessorRaindexV6ArbOrderTaker} from "../../../src/concrete/arb/RouteProcessorRaindexV6ArbOrderTaker.sol"; import { IRaindexV7, - TakeOrdersConfigV5, - TakeOrderConfigV4, + TakeOrdersConfigV6, + TakeOrderConfigV5, OrderV4, IOV2, EvaluableV4, - SignedContextV1, - TaskV2, + SignedContextV2, + TaskV3, Float } from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; -import {IInterpreterV4} from "rainlang-interface-0.2.13/src/interface/IInterpreterV4.sol"; -import {IInterpreterStoreV3} from "rainlang-interface-0.2.13/src/interface/IInterpreterStoreV3.sol"; +import {IInterpreterV4} from "rainlang-interface-0.2.14/src/interface/IInterpreterV4.sol"; +import {IInterpreterStoreV3} from "rainlang-interface-0.2.14/src/interface/IInterpreterStoreV3.sol"; import {LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; import {LibRainDeploy} from "rain-deploy-0.1.22/src/lib/LibRainDeploy.sol"; import {LibTOFUTokenDecimals} from "rain-tofu-erc20-decimals-0.1.4/src/lib/LibTOFUTokenDecimals.sol"; @@ -28,7 +28,7 @@ import {MockRouteProcessor} from "test/util/concrete/MockRouteProcessor.sol"; import {RealisticOrderTakerMockRaindex} from "test/util/concrete/RealisticOrderTakerMockRaindex.sol"; contract RouteProcessorRaindexV6ArbOrderTakerOnTakeOrders2Test is Test { - /// arb5 with RouteProcessor completes a full order-taker cycle: + /// arb6 with RouteProcessor completes a full order-taker cycle: /// takeOrders, onTakeOrders2 callback via mock route processor, finalize. function testRouteProcessorArb5() external { LibRainDeploy.etchZoltuFactory(vm); @@ -37,7 +37,7 @@ contract RouteProcessorRaindexV6ArbOrderTakerOnTakeOrders2Test is Test { MockToken inputToken = new MockToken("Input", "IN", 18); MockToken outputToken = new MockToken("Output", "OUT", 18); - // arb5 only trusts the canonical raindex deployment, so etch the mock's + // arb6 only trusts the canonical raindex deployment, so etch the mock's // runtime code (immutables included) at that address. RealisticOrderTakerMockRaindex mockRaindex = new RealisticOrderTakerMockRaindex(100e18); vm.etch(LibRaindexDeploy.RAINDEX_DEPLOYED_ADDRESS, address(mockRaindex).code); @@ -67,15 +67,15 @@ contract RouteProcessorRaindexV6ArbOrderTakerOnTakeOrders2Test is Test { nonce: bytes32(0) }); - TakeOrderConfigV4[] memory orders = new TakeOrderConfigV4[](1); - orders[0] = TakeOrderConfigV4(order, 0, 0, new SignedContextV1[](0)); + TakeOrderConfigV5[] memory orders = new TakeOrderConfigV5[](1); + orders[0] = TakeOrderConfigV5(order, 0, 0, new SignedContextV2[](0)); // Route bytes are ignored by MockRouteProcessor. bytes memory takeOrdersData = abi.encode(hex""); - arb.arb5( + arb.arb6( IRaindexV7(address(raindex)), - TakeOrdersConfigV5({ + TakeOrdersConfigV6({ minimumIO: LibDecimalFloat.packLossless(100, 0), maximumIO: LibDecimalFloat.packLossless(type(int224).max, 0), maximumIORatio: LibDecimalFloat.packLossless(type(int224).max, 0), @@ -83,9 +83,9 @@ contract RouteProcessorRaindexV6ArbOrderTakerOnTakeOrders2Test is Test { orders: orders, data: takeOrdersData }), - TaskV2({ + TaskV3({ evaluable: EvaluableV4(IInterpreterV4(address(0)), IInterpreterStoreV3(address(0)), hex""), - signedContext: new SignedContextV1[](0) + signedContext: new SignedContextV2[](0) }) ); diff --git a/test/concrete/arb/RouteProcessorRaindexV6ArbOrderTaker.onTakeOrders2Fuzz.t.sol b/test/concrete/arb/RouteProcessorRaindexV6ArbOrderTaker.onTakeOrders2Fuzz.t.sol index 0b7d20225e..e6823508cc 100644 --- a/test/concrete/arb/RouteProcessorRaindexV6ArbOrderTaker.onTakeOrders2Fuzz.t.sol +++ b/test/concrete/arb/RouteProcessorRaindexV6ArbOrderTaker.onTakeOrders2Fuzz.t.sol @@ -15,7 +15,7 @@ import {LibTOFUTokenDecimals} from "rain-tofu-erc20-decimals-0.1.4/src/lib/LibTO /// @title RouteProcessorRaindexV6ArbOrderTakerOnTakeOrders2FuzzTest /// @notice Audit A07-3 (#2534): `onTakeOrders2` had only concrete coverage -/// (the arb5 cycle, a zero-amount direct call, and one lossy-rounding case). +/// (the arb6 cycle, a zero-amount direct call, and one lossy-rounding case). /// This fuzzes the callback directly across both tokens' decimals, the Float /// amounts, and the route bytes. Whatever amounts come in, the callback must /// forward to the RouteProcessor: the input token's fixed-decimal amount diff --git a/test/concrete/arb/RouteProcessorRaindexV6ArbOrderTaker.sender.t.sol b/test/concrete/arb/RouteProcessorRaindexV6ArbOrderTaker.sender.t.sol index a87be18ed9..609de0f44e 100644 --- a/test/concrete/arb/RouteProcessorRaindexV6ArbOrderTaker.sender.t.sol +++ b/test/concrete/arb/RouteProcessorRaindexV6ArbOrderTaker.sender.t.sol @@ -8,12 +8,12 @@ import { import { OrderV4, EvaluableV4, - TakeOrderConfigV4, - TakeOrdersConfigV5, + TakeOrderConfigV5, + TakeOrdersConfigV6, IInterpreterV4, IInterpreterStoreV3, - TaskV2, - SignedContextV1 + TaskV3, + SignedContextV2 } from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {RouteProcessorRaindexV6ArbOrderTaker} from "../../../src/concrete/arb/RouteProcessorRaindexV6ArbOrderTaker.sol"; import {LibDecimalFloat, Float} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; @@ -27,12 +27,12 @@ contract RouteProcessorRaindexV6ArbOrderTakerSenderTest is RouteProcessorRaindex function testRouteProcessorTakeOrdersSender(OrderV4 memory order, uint256 inputIOIndex, uint256 outputIOIndex) public { - TakeOrderConfigV4[] memory orders = buildTakeOrderConfig(order, inputIOIndex, outputIOIndex); + TakeOrderConfigV5[] memory orders = buildTakeOrderConfig(order, inputIOIndex, outputIOIndex); RouteProcessorRaindexV6ArbOrderTaker(iArb) - .arb5( + .arb6( iRaindex, - TakeOrdersConfigV5({ + TakeOrdersConfigV6({ minimumIO: LibDecimalFloat.packLossless(0, 0), maximumIO: LibDecimalFloat.packLossless(type(int224).max, 0), maximumIORatio: LibDecimalFloat.packLossless(type(int224).max, 0), @@ -40,11 +40,11 @@ contract RouteProcessorRaindexV6ArbOrderTakerSenderTest is RouteProcessorRaindex orders: orders, data: abi.encode(bytes("0x00")) }), - TaskV2({ + TaskV3({ evaluable: EvaluableV4( IInterpreterV4(TEST_INTERPRETER_ADDRESS), IInterpreterStoreV3(TEST_STORE_ADDRESS), "" ), - signedContext: new SignedContextV1[](0) + signedContext: new SignedContextV2[](0) }) ); } diff --git a/test/concrete/parser/RaindexV6SubParser.ierc165.t.sol b/test/concrete/parser/RaindexV6SubParser.ierc165.t.sol index 84b450903b..0a1077aa74 100644 --- a/test/concrete/parser/RaindexV6SubParser.ierc165.t.sol +++ b/test/concrete/parser/RaindexV6SubParser.ierc165.t.sol @@ -6,7 +6,7 @@ import {Test} from "forge-std-1.17.0/src/Test.sol"; import {IERC165} from "@openzeppelin-contracts-5.7.0/utils/introspection/IERC165.sol"; import {RaindexV6SubParser} from "../../../src/concrete/parser/RaindexV6SubParser.sol"; -import {ISubParserV4} from "rainlang-interface-0.2.13/src/interface/ISubParserV4.sol"; +import {ISubParserV4} from "rainlang-interface-0.2.14/src/interface/ISubParserV4.sol"; import {IDescribedByMetaV1} from "rain-metadata-0.1.43/src/interface/IDescribedByMetaV1.sol"; import {IParserToolingV1} from "rain-sol-codegen-0.1.39/src/interface/IParserToolingV1.sol"; import {ISubParserToolingV1} from "rain-sol-codegen-0.1.39/src/interface/ISubParserToolingV1.sol"; diff --git a/test/concrete/parser/RaindexV6SubParser.operandHandlersWiring.t.sol b/test/concrete/parser/RaindexV6SubParser.operandHandlersWiring.t.sol index 7e4476af81..46be2e5cf4 100644 --- a/test/concrete/parser/RaindexV6SubParser.operandHandlersWiring.t.sol +++ b/test/concrete/parser/RaindexV6SubParser.operandHandlersWiring.t.sol @@ -13,19 +13,19 @@ import {RaindexV6SubParser} from "../../../src/concrete/parser/RaindexV6SubParse /// order), exactly mirroring the word-parser table. EVERY plain context word /// (base / calling / calculations / vault-in / vault-out / deposit / withdraw) /// is wired to the SAME `LibParseOperand.handleOperandDisallowed` function, so -/// those slots all share one 16-bit pointer. Only TWO slots are different: +/// those slots all share one 16-bit pointer. Only THREE slots are different: /// - signers (column 5, row 0) -> `handleOperandSingleFullNoDefault` -/// - signed-context (column 6, row 0) -> `handleOperandDoublePerByteNoDefault` +/// - signer domains (column 6, row 0) -> `handleOperandSingleFullNoDefault` +/// - signed-context (column 7, row 0) -> `handleOperandDoublePerByteNoDefault` /// Because the build function is a freshly compiled `external pure`, this test /// runs against a fresh deployment WITHOUT etching or pointer regeneration. The /// absolute pointer values are unstable across source edits (solc reorders its /// dispatch table), so the assertions are all RELATIONS within a single build /// output: table length, which slots equal the shared disallowed pointer, and -/// which two slots are the distinct signers / signed-context handlers. This -/// deterministically covers the operand-handler outer length, the column -/// assignments, and the deposit/withdraw column offsets: any of those mutations -/// changes the table length and/or relocates the two distinct handler pointers -/// off slots 17/18. +/// which slots are the distinct signers / signer-domain / signed-context +/// handlers. Any mutation of the outer length, the column assignments, or the +/// deposit/withdraw column offsets changes the table length and/or relocates +/// the distinct handler pointers off slots 17/18/19. contract RaindexV6SubParserOperandHandlersWiringTest is Test { RaindexV6SubParser internal subParser; @@ -40,55 +40,62 @@ contract RaindexV6SubParserOperandHandlersWiringTest is Test { // col 3 vault inputs (5 rows) -> 7..11 // col 4 vault outputs (5 rows) -> 12..16 // col 5 signers (1 row) -> 17 - // col 6 signed context (1 row) -> 18 - // col 7 deposit (6 rows) -> 19..24 - // col 8 withdraw (7 rows) -> 25..31 - uint256 internal constant TABLE_SLOTS = 32; + // col 6 signer domains (1 row) -> 18 + // col 7 signed context (1 row) -> 19 + // col 8 deposit (6 rows) -> 20..25 + // col 9 withdraw (7 rows) -> 26..32 + uint256 internal constant TABLE_SLOTS = 33; uint256 internal constant SLOT_SIGNERS = 17; - uint256 internal constant SLOT_SIGNED_CONTEXT = 18; + uint256 internal constant SLOT_SIGNER_DOMAINS = 18; + uint256 internal constant SLOT_SIGNED_CONTEXT = 19; /// @dev Read the big-endian 16-bit function pointer at flat `slot` from the /// freshly built operand-handler table, asserting the table is the expected - /// 64 bytes (32 16-bit slots). + /// 66 bytes (33 16-bit slots). function pointerAt(uint256 slot) internal view returns (uint16) { bytes memory table = subParser.buildOperandHandlerFunctionPointers(); - assertEq(table.length, TABLE_SLOTS * 2, "operand handler table must hold 32 16-bit pointers"); + assertEq(table.length, TABLE_SLOTS * 2, "operand handler table must hold 33 16-bit pointers"); uint256 byteIndex = slot * 2; return (uint16(uint8(table[byteIndex])) << 8) | uint16(uint8(table[byteIndex + 1])); } - /// The operand-handler table holds exactly 32 slots (64 bytes), matching the + /// The operand-handler table holds exactly 33 slots (66 bytes), matching the /// extended context column/row layout. A mutation to the outer matrix length /// (`new ...[][](CONTEXT_COLUMNS_EXTENDED)`) or to the deposit/withdraw column /// offset (which displaces or drops a whole column) changes this length and /// is caught by the guard inside `pointerAt`. Reading slot 0 exercises it. function testOperandHandlerTableLength() external view { - // pointerAt asserts table.length == 64; any wrong length reverts here. pointerAt(0); } - /// The signers operand handler (column 5, row 0) is the FIRST distinct - /// handler: `handleOperandSingleFullNoDefault`, different from the - /// `handleOperandDisallowed` used by every plain context word. Slots 0..16 - /// (base, calling, calculations, vault-in, vault-out) are all the shared - /// disallowed pointer, so the signers slot must differ from each of them. A - /// column-assignment mutation that moves the signers column off slot 17, or - /// that assigns a disallowed sub-array to the signers column, collapses this - /// distinction and is caught. + /// The signers operand handler (column 5, row 0) is + /// `handleOperandSingleFullNoDefault`, different from the + /// `handleOperandDisallowed` used by every plain context word in slots + /// 0..16. A column-assignment mutation that moves the signers column off + /// slot 17, or that assigns a disallowed sub-array to it, is caught. function testSignersOperandHandlerIsDistinct() external view { uint16 disallowed = pointerAt(0); - // Every plain context slot before signers shares the disallowed pointer. for (uint256 slot = 0; slot <= 16; slot++) { assertEq(pointerAt(slot), disallowed, "plain context slot uses handleOperandDisallowed"); } assertTrue(pointerAt(SLOT_SIGNERS) != disallowed, "signers handler must differ from handleOperandDisallowed"); } - /// The signed-context operand handler (column 6, row 0) is the SECOND - /// distinct handler: `handleOperandDoublePerByteNoDefault`, different from - /// BOTH the disallowed default AND the signers handler. This pins that the - /// signers and signed-context columns are wired to two genuinely different - /// handlers at slots 17 and 18 respectively (not swapped, not collapsed). + /// The signer-domain operand handler (column 6, row 0) is the same + /// `handleOperandSingleFullNoDefault` as signers: one row index operand. + function testSignerDomainsOperandHandlerMatchesSigners() external view { + assertTrue( + pointerAt(SLOT_SIGNER_DOMAINS) != pointerAt(0), + "signer-domain handler must differ from handleOperandDisallowed" + ); + assertEq( + pointerAt(SLOT_SIGNER_DOMAINS), pointerAt(SLOT_SIGNERS), "signer-domain handler must equal signers handler" + ); + } + + /// The signed-context operand handler (column 7, row 0) is + /// `handleOperandDoublePerByteNoDefault`, different from BOTH the + /// disallowed default AND the single-operand signers/signer-domain handler. function testSignedContextOperandHandlerIsDistinct() external view { uint16 disallowed = pointerAt(0); assertTrue( @@ -101,25 +108,19 @@ contract RaindexV6SubParserOperandHandlersWiringTest is Test { ); } - /// Every deposit (slots 19..24) and withdraw (slots 25..31) operand-handler - /// slot is the shared `handleOperandDisallowed` pointer: deposit/withdraw - /// words are plain context words whose operand is disallowed. This, combined - /// with the two distinct-handler tests above and the length guard, pins that - /// the deposit column sits at offset +1 and the withdraw column at offset +2 - /// of the signed-context start column: a mutation swapping those offsets, or - /// dropping a column, either changes the table length (caught by the guard) - /// or relocates the two distinct signers/signed-context handlers into the - /// deposit/withdraw range (caught because slots 19..31 would no longer all - /// equal the disallowed pointer). + /// Every deposit (slots 20..25) and withdraw (slots 26..32) operand-handler + /// slot is the shared `handleOperandDisallowed` pointer. With the length + /// guard and the distinct-handler tests above this pins the deposit column + /// at offset +1 and the withdraw column at offset +2 of the signed-context + /// start column: a swapped or dropped column either changes the table + /// length or moves a distinct handler into the deposit/withdraw range. function testDepositWithdrawOperandHandlersAllDisallowed() external view { uint16 disallowed = pointerAt(0); - for (uint256 slot = 19; slot <= 31; slot++) { + for (uint256 slot = 20; slot <= 32; slot++) { assertEq(pointerAt(slot), disallowed, "deposit/withdraw operand slot uses handleOperandDisallowed"); } - // And neither distinct handler leaks into the deposit/withdraw range: - // the only two non-disallowed slots are 17 (signers) and 18 (signed - // context), strictly before the deposit column at slot 19. - assertTrue(pointerAt(SLOT_SIGNERS) != disallowed, "signers slot 17 is the distinct signers handler"); - assertTrue(pointerAt(SLOT_SIGNED_CONTEXT) != disallowed, "signed-context slot 18 is the distinct handler"); + assertTrue(pointerAt(SLOT_SIGNERS) != disallowed, "signers slot 17 is a distinct handler"); + assertTrue(pointerAt(SLOT_SIGNER_DOMAINS) != disallowed, "signer-domain slot 18 is a distinct handler"); + assertTrue(pointerAt(SLOT_SIGNED_CONTEXT) != disallowed, "signed-context slot 19 is a distinct handler"); } } diff --git a/test/concrete/parser/RaindexV6SubParser.pointers.t.sol b/test/concrete/parser/RaindexV6SubParser.pointers.t.sol index 3398a7b2cb..a9a4df1c31 100644 --- a/test/concrete/parser/RaindexV6SubParser.pointers.t.sol +++ b/test/concrete/parser/RaindexV6SubParser.pointers.t.sol @@ -14,7 +14,7 @@ import { SUB_PARSER_OPERAND_HANDLERS, RaindexV6SubParser } from "../../../src/concrete/parser/RaindexV6SubParser.sol"; -import {LibGenParseMeta} from "rainlang-interface-0.2.13/src/lib/codegen/LibGenParseMeta.sol"; +import {LibGenParseMeta} from "rainlang-interface-0.2.14/src/lib/codegen/LibGenParseMeta.sol"; import {LibRaindexDeploy} from "../../../src/lib/deploy/LibRaindexDeploy.sol"; import {LibEtchRaindex} from "test/util/lib/LibEtchRaindex.sol"; diff --git a/test/concrete/parser/RaindexV6SubParser.routing.t.sol b/test/concrete/parser/RaindexV6SubParser.routing.t.sol index 86741f3134..3abb20b532 100644 --- a/test/concrete/parser/RaindexV6SubParser.routing.t.sol +++ b/test/concrete/parser/RaindexV6SubParser.routing.t.sol @@ -3,8 +3,8 @@ pragma solidity =0.8.25; import {Test} from "forge-std-1.17.0/src/Test.sol"; -import {OperandV2} from "rainlang-interface-0.2.13/src/interface/ISubParserV4.sol"; -import {OPCODE_CONTEXT} from "rainlang-interface-0.2.13/src/interface/IInterpreterV4.sol"; +import {OperandV2} from "rainlang-0.2.19/src/lib/parse/LibParse.sol"; +import {OPCODE_CONTEXT} from "rainlang-interface-0.2.14/src/interface/IInterpreterV4.sol"; import {LibRaindexSubParser} from "../../../src/lib/LibRaindexSubParser.sol"; /// @title RaindexV6SubParserRoutingTest @@ -187,17 +187,25 @@ contract RaindexV6SubParserRoutingTest is Test { checkRouteOperand(LibRaindexSubParser.subParserSigners, OperandV2.wrap(bytes32(uint256(7))), 5, 7); } + /// signer-domain routes to the signer domains column (column 6) and uses + /// the raw operand as the row. + function testRouteSignerDomainsRowFromOperand() external pure { + checkRouteOperand(LibRaindexSubParser.subParserSignerDomains, OperandV2.wrap(bytes32(uint256(0))), 6, 0); + checkRouteOperand(LibRaindexSubParser.subParserSignerDomains, OperandV2.wrap(bytes32(uint256(1))), 6, 1); + checkRouteOperand(LibRaindexSubParser.subParserSignerDomains, OperandV2.wrap(bytes32(uint256(7))), 6, 7); + } + /// signed-context low operand byte selects a column offset added to the - /// signed context start column (column 6); the second byte selects the row. + /// signed context start column (column 7); the second byte selects the row. function testRouteSignedContextColumnMaskAndRowShift() external pure { - // operand 0x0000 -> column 6 + 0, row 0. - checkRouteOperand(LibRaindexSubParser.subParserSignedContext, OperandV2.wrap(bytes32(uint256(0x0000))), 6, 0); - // operand 0x0001 -> low byte 1 -> column 6 + 1 = 7, row 0. - checkRouteOperand(LibRaindexSubParser.subParserSignedContext, OperandV2.wrap(bytes32(uint256(0x0001))), 7, 0); - // operand 0x0100 -> low byte 0 -> column 6, second byte 1 -> row 1. - checkRouteOperand(LibRaindexSubParser.subParserSignedContext, OperandV2.wrap(bytes32(uint256(0x0100))), 6, 1); - // operand 0x0201 -> column 6 + 1 = 7, row 2. Proves column and row are + // operand 0x0000 -> column 7 + 0, row 0. + checkRouteOperand(LibRaindexSubParser.subParserSignedContext, OperandV2.wrap(bytes32(uint256(0x0000))), 7, 0); + // operand 0x0001 -> low byte 1 -> column 7 + 1 = 8, row 0. + checkRouteOperand(LibRaindexSubParser.subParserSignedContext, OperandV2.wrap(bytes32(uint256(0x0001))), 8, 0); + // operand 0x0100 -> low byte 0 -> column 7, second byte 1 -> row 1. + checkRouteOperand(LibRaindexSubParser.subParserSignedContext, OperandV2.wrap(bytes32(uint256(0x0100))), 7, 1); + // operand 0x0201 -> column 7 + 1 = 8, row 2. Proves column and row are // taken from distinct operand bytes (mask vs shift not swapped). - checkRouteOperand(LibRaindexSubParser.subParserSignedContext, OperandV2.wrap(bytes32(uint256(0x0201))), 7, 2); + checkRouteOperand(LibRaindexSubParser.subParserSignedContext, OperandV2.wrap(bytes32(uint256(0x0201))), 8, 2); } } diff --git a/test/concrete/parser/RaindexV6SubParser.routingTokenDecimalsAndMasks.t.sol b/test/concrete/parser/RaindexV6SubParser.routingTokenDecimalsAndMasks.t.sol index 2fe238c998..58021a52a7 100644 --- a/test/concrete/parser/RaindexV6SubParser.routingTokenDecimalsAndMasks.t.sol +++ b/test/concrete/parser/RaindexV6SubParser.routingTokenDecimalsAndMasks.t.sol @@ -3,8 +3,8 @@ pragma solidity =0.8.25; import {Test} from "forge-std-1.17.0/src/Test.sol"; -import {OperandV2} from "rainlang-interface-0.2.13/src/interface/ISubParserV4.sol"; -import {OPCODE_CONTEXT} from "rainlang-interface-0.2.13/src/interface/IInterpreterV4.sol"; +import {OperandV2} from "rainlang-0.2.19/src/lib/parse/LibParse.sol"; +import {OPCODE_CONTEXT} from "rainlang-interface-0.2.14/src/interface/IInterpreterV4.sol"; import {ContextGridOverflow} from "rainlang-0.2.19/src/error/ErrSubParse.sol"; import {LibSubParse} from "rainlang-0.2.19/src/lib/parse/LibSubParse.sol"; import {LibRaindexSubParser} from "../../../src/lib/LibRaindexSubParser.sol"; @@ -67,10 +67,10 @@ contract RaindexV6SubParserRoutingTokenDecimalsAndMasksTest is Test { } /// The signed-context ROW is `(operand >> 8) & 0xFF`. An operand of - /// `0x010000` has low byte 0 (column offset 0 -> column 6) and `>> 8` = + /// `0x010000` has low byte 0 (column offset 0 -> column 7) and `>> 8` = /// `0x0100` = 256. WITH the mask the row is `0x0100 & 0xFF` = 0, so the - /// parser succeeds and returns (column 6, row 0). WITHOUT the mask the row is - /// 256, which exceeds uint8 and reverts `ContextGridOverflow(6, 256)`. This + /// parser succeeds and returns (column 7, row 0). WITHOUT the mask the row is + /// 256, which exceeds uint8 and reverts `ContextGridOverflow(7, 256)`. This /// asserts the masked, non-reverting outcome, so dropping the row mask flips /// success into a revert and fails the test. function testSignedContextRowMaskKeepsRowInRange() external pure { @@ -78,21 +78,21 @@ contract RaindexV6SubParserRoutingTokenDecimalsAndMasksTest is Test { LibRaindexSubParser.subParserSignedContext(0, 0, OperandV2.wrap(bytes32(uint256(0x010000)))); assertTrue(success, "parser must succeed (row mask keeps row in range)"); (uint8 row, uint8 column) = decode(bytecode); - assertEq(column, 6, "column is signed-context start (6) + low byte 0"); + assertEq(column, 7, "column is signed-context start (7) + low byte 0"); assertEq(row, 0, "row is (0x010000 >> 8) & 0xFF = 0"); } /// Confirms the discriminator above is genuine: the SAME wide operand, with /// the row mask DROPPED (`>> 8` without `& 0xFF`), drives the row to 256 and - /// `LibSubParse.subParserContext` reverts `ContextGridOverflow(6, 256)`. This + /// `LibSubParse.subParserContext` reverts `ContextGridOverflow(7, 256)`. This /// documents the exact revert the production mask prevents, so the pairing of /// these two tests pins the mask: removing it makes the happy test above /// revert with this very selector/args. function testSignedContextUnmaskedRowWouldOverflow() external { uint256 column = uint256(0x010000) & 0xFF; // low byte 0 uint256 unmaskedRow = uint256(0x010000) >> 8; // 256 - vm.expectRevert(abi.encodeWithSelector(ContextGridOverflow.selector, column + 6, unmaskedRow)); - this.callContext(column + 6, unmaskedRow); + vm.expectRevert(abi.encodeWithSelector(ContextGridOverflow.selector, column + 7, unmaskedRow)); + this.callContext(column + 7, unmaskedRow); } /// @dev External wrapper so `vm.expectRevert` can catch the library revert. diff --git a/test/concrete/parser/RaindexV6SubParser.signerDomains.t.sol b/test/concrete/parser/RaindexV6SubParser.signerDomains.t.sol new file mode 100644 index 0000000000..40df905188 --- /dev/null +++ b/test/concrete/parser/RaindexV6SubParser.signerDomains.t.sol @@ -0,0 +1,75 @@ +// SPDX-License-Identifier: LicenseRef-DCL-1.0 +// SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd +pragma solidity =0.8.25; + +import {StackAllocationMismatch} from "rainlang-0.2.19/src/error/ErrIntegrity.sol"; +import {ExpectedOperand, UnexpectedOperandValue} from "rainlang-0.2.19/src/error/ErrParse.sol"; +import {OpTest, StackItem} from "rainlang-0.2.19/src/../test/abstract/OpTest.sol"; +import {Strings} from "@openzeppelin-contracts-5.7.0/utils/Strings.sol"; +import {LibRaindexSubParserContextFixture} from "test/util/fixture/LibRaindexSubParserContextFixture.sol"; +import {LibRaindexDeploy} from "../../../src/lib/deploy/LibRaindexDeploy.sol"; +import {LibEtchRaindex} from "test/util/lib/LibEtchRaindex.sol"; + +contract RaindexV6SubParserSignerDomainsTest is OpTest { + using Strings for address; + + function setUp() public { + LibEtchRaindex.etchRaindex(vm); + } + + /// Test signer-domain-0 + function testSubParserContextSignerDomainHappy0() external view { + address subParserAddress = LibRaindexDeploy.SUB_PARSER_DEPLOYED_ADDRESS; + + StackItem[] memory expectedStack = new StackItem[](1); + expectedStack[0] = StackItem.wrap(keccak256(bytes("signer-domain-0"))); + + bytes memory rainlang = + bytes(string.concat("using-words-from ", subParserAddress.toHexString(), " _: signer-domain<0>();")); + + checkHappy(rainlang, LibRaindexSubParserContextFixture.hashedNamesContext(), expectedStack, "signer-domain-0"); + } + + /// Test signer-domain-1 + function testSubParserContextSignerDomainHappy1() external view { + address subParserAddress = LibRaindexDeploy.SUB_PARSER_DEPLOYED_ADDRESS; + + StackItem[] memory expectedStack = new StackItem[](1); + expectedStack[0] = StackItem.wrap(keccak256(bytes("signer-domain-1"))); + + bytes memory rainlang = + bytes(string.concat("using-words-from ", subParserAddress.toHexString(), " _: signer-domain<1>();")); + + checkHappy(rainlang, LibRaindexSubParserContextFixture.hashedNamesContext(), expectedStack, "signer-domain-1"); + } + + /// Test signer-domain without an operand errors. + function testSubParserContextSignerDomainUnhappyNoOperand() external { + address subParserAddress = LibRaindexDeploy.SUB_PARSER_DEPLOYED_ADDRESS; + + bytes memory rainlang = + bytes(string.concat("using-words-from ", subParserAddress.toHexString(), " _: signer-domain();")); + + checkUnhappyParse(rainlang, abi.encodeWithSelector(ExpectedOperand.selector)); + } + + /// Test signer-domain with too many operands errors. + function testSubParserContextSignerDomainUnhappyTooManyOperands() external { + address subParserAddress = LibRaindexDeploy.SUB_PARSER_DEPLOYED_ADDRESS; + + bytes memory rainlang = + bytes(string.concat("using-words-from ", subParserAddress.toHexString(), " _: signer-domain<0 1>();")); + + checkUnhappyParse(rainlang, abi.encodeWithSelector(UnexpectedOperandValue.selector)); + } + + /// Test signer-domain with an input errors. + function testSubParserContextSignerDomainUnhappyInput() external { + address subParserAddress = LibRaindexDeploy.SUB_PARSER_DEPLOYED_ADDRESS; + + bytes memory rainlang = + bytes(string.concat("using-words-from ", subParserAddress.toHexString(), " _: signer-domain<0>(0);")); + + checkUnhappyParse2(rainlang, abi.encodeWithSelector(StackAllocationMismatch.selector, 2, 1)); + } +} diff --git a/test/concrete/parser/RaindexV6SubParser.wordParsersWiring.t.sol b/test/concrete/parser/RaindexV6SubParser.wordParsersWiring.t.sol index 18ca0d3c31..8b25bb99ef 100644 --- a/test/concrete/parser/RaindexV6SubParser.wordParsersWiring.t.sol +++ b/test/concrete/parser/RaindexV6SubParser.wordParsersWiring.t.sol @@ -35,9 +35,10 @@ contract RaindexV6SubParserWordParsersWiringTest is Test { // col 3 vault inputs (5 rows) -> 7..11 // col 4 vault outputs (5 rows) -> 12..16 // col 5 signers (1 row) -> 17 - // col 6 signed context (1 row) -> 18 - // col 7 deposit (6 rows) -> 19..24 - // col 8 withdraw (7 rows) -> 25..31 + // col 6 signer domains (1 row) -> 18 + // col 7 signed context (1 row) -> 19 + // col 8 deposit (6 rows) -> 20..25 + // col 9 withdraw (7 rows) -> 26..32 uint256 internal constant SLOT_BASE_SENDER = 0; // Calling-context column (col 1) slots. Deposit/withdraw row words route to @@ -48,27 +49,27 @@ contract RaindexV6SubParserWordParsersWiringTest is Test { uint256 internal constant SLOT_CALLING_ORDER_OWNER = 3; // calling-context row 1 uint256 internal constant SLOT_CALLING_ORDER_COUNTERPARTY = 4; // calling-context row 2 - uint256 internal constant SLOT_DEPOSIT_DEPOSITOR = 19; - uint256 internal constant SLOT_DEPOSIT_TOKEN = 20; - uint256 internal constant SLOT_DEPOSIT_VAULT_ID = 21; - uint256 internal constant SLOT_DEPOSIT_VAULT_BEFORE = 22; - uint256 internal constant SLOT_DEPOSIT_VAULT_AFTER = 23; - uint256 internal constant SLOT_DEPOSIT_TOKEN_DECIMALS = 24; + uint256 internal constant SLOT_DEPOSIT_DEPOSITOR = 20; + uint256 internal constant SLOT_DEPOSIT_TOKEN = 21; + uint256 internal constant SLOT_DEPOSIT_VAULT_ID = 22; + uint256 internal constant SLOT_DEPOSIT_VAULT_BEFORE = 23; + uint256 internal constant SLOT_DEPOSIT_VAULT_AFTER = 24; + uint256 internal constant SLOT_DEPOSIT_TOKEN_DECIMALS = 25; - uint256 internal constant SLOT_WITHDRAW_WITHDRAWER = 25; - uint256 internal constant SLOT_WITHDRAW_TOKEN = 26; - uint256 internal constant SLOT_WITHDRAW_VAULT_ID = 27; - uint256 internal constant SLOT_WITHDRAW_VAULT_BEFORE = 28; - uint256 internal constant SLOT_WITHDRAW_VAULT_AFTER = 29; - uint256 internal constant SLOT_WITHDRAW_TARGET_AMOUNT = 30; - uint256 internal constant SLOT_WITHDRAW_TOKEN_DECIMALS = 31; + uint256 internal constant SLOT_WITHDRAW_WITHDRAWER = 26; + uint256 internal constant SLOT_WITHDRAW_TOKEN = 27; + uint256 internal constant SLOT_WITHDRAW_VAULT_ID = 28; + uint256 internal constant SLOT_WITHDRAW_VAULT_BEFORE = 29; + uint256 internal constant SLOT_WITHDRAW_VAULT_AFTER = 30; + uint256 internal constant SLOT_WITHDRAW_TARGET_AMOUNT = 31; + uint256 internal constant SLOT_WITHDRAW_TOKEN_DECIMALS = 32; /// @dev Read the big-endian 16-bit function pointer at flat `slot` from the /// freshly built word-parser table. function pointerAt(uint256 slot) internal view returns (uint16) { bytes memory table = subParser.buildSubParserWordParsers(); - // 32 slots, 2 bytes each. - assertEq(table.length, 64, "word parser table must hold 32 16-bit pointers"); + // 33 slots, 2 bytes each. + assertEq(table.length, 66, "word parser table must hold 33 16-bit pointers"); uint256 byteIndex = slot * 2; return (uint16(uint8(table[byteIndex])) << 8) | uint16(uint8(table[byteIndex + 1])); } @@ -176,7 +177,7 @@ contract RaindexV6SubParserWordParsersWiringTest is Test { } /// Pins the DEPOSIT column to flat offset +1 of the signed-context start - /// column (i.e. column 7, slots 19..24). The deposit row words route into + /// column (i.e. column 8, slots 20..25). The deposit row words route into /// CONTEXT_CALLING_CONTEXT_COLUMN rows 0/1/2, the SAME (col,row) as /// order-hash/order-owner/order-counterparty, so solc deduplicates them to a /// shared 16-bit pointer. Asserting that the deposit token/vault-id/before @@ -190,17 +191,17 @@ contract RaindexV6SubParserWordParsersWiringTest is Test { assertEq( pointerAt(SLOT_DEPOSIT_TOKEN), pointerAt(SLOT_CALLING_ORDER_HASH), - "deposit-token (col 7 row 0) aliases calling-context order-hash (row 0)" + "deposit-token (col 8 row 0) aliases calling-context order-hash (row 0)" ); assertEq( pointerAt(SLOT_DEPOSIT_VAULT_ID), pointerAt(SLOT_CALLING_ORDER_OWNER), - "deposit-vault-id (col 7 row 1) aliases calling-context order-owner (row 1)" + "deposit-vault-id (col 8 row 1) aliases calling-context order-owner (row 1)" ); assertEq( pointerAt(SLOT_DEPOSIT_VAULT_BEFORE), pointerAt(SLOT_CALLING_ORDER_COUNTERPARTY), - "deposit-vault-before (col 7 row 2) aliases calling-context order-counterparty (row 2)" + "deposit-vault-before (col 8 row 2) aliases calling-context order-counterparty (row 2)" ); // The three calling-context pointers are themselves pairwise distinct, so // the equalities above genuinely pin each deposit row to its own row, not @@ -215,7 +216,7 @@ contract RaindexV6SubParserWordParsersWiringTest is Test { } /// Pins the WITHDRAW column to flat offset +2 of the signed-context start - /// column (i.e. column 8, slots 25..31). Like deposits, the withdraw row + /// column (i.e. column 9, slots 26..32). Like deposits, the withdraw row /// words 0/1/2 alias the calling-context order words. withdraw-target-amount /// routes to CONTEXT_CALLING_CONTEXT_COLUMN row 4 — a row reached by no order /// word and, among the deposit/withdraw rows, shared only with @@ -227,17 +228,17 @@ contract RaindexV6SubParserWordParsersWiringTest is Test { assertEq( pointerAt(SLOT_WITHDRAW_TOKEN), pointerAt(SLOT_CALLING_ORDER_HASH), - "withdraw-token (col 8 row 0) aliases calling-context order-hash (row 0)" + "withdraw-token (col 9 row 0) aliases calling-context order-hash (row 0)" ); assertEq( pointerAt(SLOT_WITHDRAW_VAULT_ID), pointerAt(SLOT_CALLING_ORDER_OWNER), - "withdraw-vault-id (col 8 row 1) aliases calling-context order-owner (row 1)" + "withdraw-vault-id (col 9 row 1) aliases calling-context order-owner (row 1)" ); assertEq( pointerAt(SLOT_WITHDRAW_VAULT_BEFORE), pointerAt(SLOT_CALLING_ORDER_COUNTERPARTY), - "withdraw-vault-before (col 8 row 2) aliases calling-context order-counterparty (row 2)" + "withdraw-vault-before (col 9 row 2) aliases calling-context order-counterparty (row 2)" ); // withdraw-target-amount routes to calling-context row 4, distinct from // every order word and from deposit rows 0..3. diff --git a/test/concrete/raindex/RaindexV6.addOrder.entask.t.sol b/test/concrete/raindex/RaindexV6.addOrder.entask.t.sol index 213d728a08..26c00818d4 100644 --- a/test/concrete/raindex/RaindexV6.addOrder.entask.t.sol +++ b/test/concrete/raindex/RaindexV6.addOrder.entask.t.sol @@ -6,9 +6,9 @@ import {RaindexV6ExternalRealTest} from "test/util/abstract/RaindexV6ExternalRea import { OrderConfigV4, EvaluableV4, - TaskV2, + TaskV3, OrderV4, - SignedContextV1 + SignedContextV2 } from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {LibTestAddOrder} from "test/util/lib/LibTestAddOrder.sol"; import {LibOrder} from "../../../src/lib/LibOrder.sol"; @@ -48,9 +48,9 @@ contract RaindexV6AddOrderEnactTest is RaindexV6ExternalRealTest { ) internal { LibTestAddOrder.conformConfig(config, iInterpreter, iStore); vm.startPrank(owner); - TaskV2[] memory actions = evalsToActions(evalStrings); + TaskV3[] memory actions = evalsToActions(evalStrings); vm.record(); - bool stateChanged = iRaindex.addOrder4(config, actions); + bool stateChanged = iRaindex.addOrder5(config, actions); assert(stateChanged != nonces[config.nonce]); checkReentrancyRW(nonces[config.nonce] ? 4 : 5, nonces[config.nonce] ? 2 : 3); (bytes32[] memory reads, bytes32[] memory writes) = vm.accesses(address(iStore)); @@ -161,9 +161,9 @@ contract RaindexV6AddOrderEnactTest is RaindexV6ExternalRealTest { LibTestAddOrder.conformConfig(config, iInterpreter, iStore); vm.startPrank(alice); - TaskV2[] memory actions = evalsToActions(evals0); + TaskV3[] memory actions = evalsToActions(evals0); vm.expectRevert("always revert"); - bool stateChanged = iRaindex.addOrder4(config, actions); + bool stateChanged = iRaindex.addOrder5(config, actions); assert(!stateChanged); OrderV4 memory order = OrderV4(alice, config.evaluable, config.validInputs, config.validOutputs, config.nonce); diff --git a/test/concrete/raindex/RaindexV6.addOrder.mock.t.sol b/test/concrete/raindex/RaindexV6.addOrder.mock.t.sol index 55cee07420..3f413db6de 100644 --- a/test/concrete/raindex/RaindexV6.addOrder.mock.t.sol +++ b/test/concrete/raindex/RaindexV6.addOrder.mock.t.sol @@ -3,11 +3,11 @@ pragma solidity =0.8.25; import {RaindexV6ExternalMockTest} from "test/util/abstract/RaindexV6ExternalMockTest.sol"; -import {OrderConfigV4, OrderV4, IOV2, EvaluableV4, TaskV2} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; +import {OrderConfigV4, OrderV4, IOV2, EvaluableV4, TaskV3} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {LibTestAddOrder} from "test/util/lib/LibTestAddOrder.sol"; import {NotRainMetaV1, META_MAGIC_NUMBER_V1} from "rain-metadata-0.1.43/src/interface/unstable/IMetaV1_2.sol"; import {LibMeta} from "rain-metadata-0.1.43/src/lib/LibMeta.sol"; -import {IExpressionDeployerV3} from "rainlang-interface-0.2.13/src/interface/deprecated/v1/IExpressionDeployerV3.sol"; +import {IExpressionDeployerV3} from "rainlang-interface-0.2.14/src/interface/deprecated/v1/IExpressionDeployerV3.sol"; /// @title RaindexV6AddOrderMockTest /// @notice Tests the addOrder function of the RaindexV6 contract. @@ -19,7 +19,7 @@ contract RaindexV6AddOrderMockTest is RaindexV6ExternalMockTest { LibTestAddOrder.conformConfig(config, iInterpreter, iStore); config.evaluable.bytecode = ""; vm.expectRevert(abi.encodeWithSelector(OrderNoSources.selector)); - iRaindex.addOrder4(config, new TaskV2[](0)); + iRaindex.addOrder5(config, new TaskV3[](0)); (OrderV4 memory order, bytes32 orderHash) = LibTestAddOrder.expectedOrder(owner, config); (order); assertTrue(!iRaindex.orderExists(orderHash)); @@ -33,7 +33,7 @@ contract RaindexV6AddOrderMockTest is RaindexV6ExternalMockTest { hex"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d02000000040000000000000000"; config.validInputs = new IOV2[](0); vm.expectRevert(abi.encodeWithSelector(OrderNoInputs.selector)); - iRaindex.addOrder4(config, new TaskV2[](0)); + iRaindex.addOrder5(config, new TaskV3[](0)); (OrderV4 memory order, bytes32 orderHash) = LibTestAddOrder.expectedOrder(owner, config); (order); assertTrue(!iRaindex.orderExists(orderHash)); @@ -48,7 +48,7 @@ contract RaindexV6AddOrderMockTest is RaindexV6ExternalMockTest { vm.assume(config.validInputs.length > 0); config.validOutputs = new IOV2[](0); vm.expectRevert(abi.encodeWithSelector(OrderNoOutputs.selector)); - iRaindex.addOrder4(config, new TaskV2[](0)); + iRaindex.addOrder5(config, new TaskV3[](0)); (OrderV4 memory order, bytes32 orderHash) = LibTestAddOrder.expectedOrder(owner, config); (order); assertTrue(!iRaindex.orderExists(orderHash)); @@ -86,7 +86,7 @@ contract RaindexV6AddOrderMockTest is RaindexV6ExternalMockTest { vm.assume(config.meta.length > 0); vm.expectRevert(abi.encodeWithSelector(NotRainMetaV1.selector, config.meta)); - iRaindex.addOrder4(config, new TaskV2[](0)); + iRaindex.addOrder5(config, new TaskV3[](0)); (OrderV4 memory order, bytes32 orderHash) = LibTestAddOrder.expectedOrder(owner, config); (order); @@ -142,7 +142,7 @@ contract RaindexV6AddOrderMockTest is RaindexV6ExternalMockTest { emit MetaV1_2(owner, orderHash, config.meta); vm.prank(owner); - assertTrue(iRaindex.addOrder4(config, new TaskV2[](0))); + assertTrue(iRaindex.addOrder5(config, new TaskV3[](0))); assertTrue(iRaindex.orderExists(orderHash)); } diff --git a/test/concrete/raindex/RaindexV6.addOrder.nonce.t.sol b/test/concrete/raindex/RaindexV6.addOrder.nonce.t.sol index f077d22859..1bf1541c7b 100644 --- a/test/concrete/raindex/RaindexV6.addOrder.nonce.t.sol +++ b/test/concrete/raindex/RaindexV6.addOrder.nonce.t.sol @@ -3,7 +3,7 @@ pragma solidity =0.8.25; import {RaindexV6ExternalRealTest} from "test/util/abstract/RaindexV6ExternalRealTest.sol"; -import {OrderConfigV4, OrderV4, EvaluableV4, TaskV2} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; +import {OrderConfigV4, OrderV4, EvaluableV4, TaskV3} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {LibTestAddOrder} from "test/util/lib/LibTestAddOrder.sol"; import {LibOrder} from "../../../src/lib/LibOrder.sol"; @@ -16,12 +16,12 @@ contract RaindexV6AddOrderNonceTest is RaindexV6ExternalRealTest { OrderV4 memory order = OrderV4(owner, config.evaluable, config.validInputs, config.validOutputs, config.nonce); vm.prank(owner); - bool stateChange = iRaindex.addOrder4(config, new TaskV2[](0)); + bool stateChange = iRaindex.addOrder5(config, new TaskV3[](0)); assert(stateChange); assert(iRaindex.orderExists(order.hash())); vm.prank(owner); - stateChange = iRaindex.addOrder4(config, new TaskV2[](0)); + stateChange = iRaindex.addOrder5(config, new TaskV3[](0)); assert(!stateChange); assert(iRaindex.orderExists(order.hash())); } @@ -33,7 +33,7 @@ contract RaindexV6AddOrderNonceTest is RaindexV6ExternalRealTest { LibTestAddOrder.conformConfig(config, iInterpreter, iStore); vm.assume(config.nonce != otherNonce); vm.prank(owner); - bool stateChange = iRaindex.addOrder4(config, new TaskV2[](0)); + bool stateChange = iRaindex.addOrder5(config, new TaskV3[](0)); assert(stateChange); assert( iRaindex.orderExists( @@ -43,7 +43,7 @@ contract RaindexV6AddOrderNonceTest is RaindexV6ExternalRealTest { config.nonce = otherNonce; vm.prank(owner); - stateChange = iRaindex.addOrder4(config, new TaskV2[](0)); + stateChange = iRaindex.addOrder5(config, new TaskV3[](0)); assert(stateChange); assert( iRaindex.orderExists( @@ -64,7 +64,7 @@ contract RaindexV6AddOrderNonceTest is RaindexV6ExternalRealTest { config1.nonce = config0.nonce; vm.assume(keccak256(abi.encode(config0)) != keccak256(abi.encode(config1))); vm.prank(owner); - bool stateChange = iRaindex.addOrder4(config0, new TaskV2[](0)); + bool stateChange = iRaindex.addOrder5(config0, new TaskV3[](0)); assert(stateChange); assert( iRaindex.orderExists( @@ -73,7 +73,7 @@ contract RaindexV6AddOrderNonceTest is RaindexV6ExternalRealTest { ); vm.prank(owner); - stateChange = iRaindex.addOrder4(config1, new TaskV2[](0)); + stateChange = iRaindex.addOrder5(config1, new TaskV3[](0)); assert(stateChange); assert( iRaindex.orderExists( diff --git a/test/concrete/raindex/RaindexV6.addOrder.owner.t.sol b/test/concrete/raindex/RaindexV6.addOrder.owner.t.sol index c1f3212a71..4ec7a7103d 100644 --- a/test/concrete/raindex/RaindexV6.addOrder.owner.t.sol +++ b/test/concrete/raindex/RaindexV6.addOrder.owner.t.sol @@ -3,7 +3,7 @@ pragma solidity =0.8.25; import {RaindexV6ExternalRealTest} from "test/util/abstract/RaindexV6ExternalRealTest.sol"; -import {OrderConfigV4, OrderV4, EvaluableV4, TaskV2} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; +import {OrderConfigV4, OrderV4, EvaluableV4, TaskV3} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {LibTestAddOrder} from "test/util/lib/LibTestAddOrder.sol"; import {LibOrder} from "../../../src/lib/LibOrder.sol"; @@ -17,12 +17,12 @@ contract RaindexV6AddOrderOwnerTest is RaindexV6ExternalRealTest { OrderV4 memory order = OrderV4(owner, config.evaluable, config.validInputs, config.validOutputs, config.nonce); vm.prank(owner); - bool stateChange = iRaindex.addOrder4(config, new TaskV2[](0)); + bool stateChange = iRaindex.addOrder5(config, new TaskV3[](0)); assert(stateChange); assert(iRaindex.orderExists(order.hash())); vm.prank(owner); - stateChange = iRaindex.addOrder4(config, new TaskV2[](0)); + stateChange = iRaindex.addOrder5(config, new TaskV3[](0)); assert(!stateChange); assert(iRaindex.orderExists(order.hash())); } @@ -39,12 +39,12 @@ contract RaindexV6AddOrderOwnerTest is RaindexV6ExternalRealTest { OrderV4 memory orderBob = OrderV4(bob, config.evaluable, config.validInputs, config.validOutputs, config.nonce); vm.prank(alice); - bool stateChange = iRaindex.addOrder4(config, new TaskV2[](0)); + bool stateChange = iRaindex.addOrder5(config, new TaskV3[](0)); assert(stateChange); assert(iRaindex.orderExists(orderAlice.hash())); vm.prank(bob); - stateChange = iRaindex.addOrder4(config, new TaskV2[](0)); + stateChange = iRaindex.addOrder5(config, new TaskV3[](0)); assert(stateChange); assert(iRaindex.orderExists(orderBob.hash())); } diff --git a/test/concrete/raindex/RaindexV6.addOrder.t.sol b/test/concrete/raindex/RaindexV6.addOrder.t.sol index 5193ec828f..d73f2dee57 100644 --- a/test/concrete/raindex/RaindexV6.addOrder.t.sol +++ b/test/concrete/raindex/RaindexV6.addOrder.t.sol @@ -4,8 +4,8 @@ pragma solidity =0.8.25; import {RaindexV6ExternalRealTest} from "test/util/abstract/RaindexV6ExternalRealTest.sol"; import {LibTestAddOrder} from "test/util/lib/LibTestAddOrder.sol"; -import {OrderConfigV4, EvaluableV4, TaskV2} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; -import {IParserV2} from "rainlang-interface-0.2.13/src/interface/IParserV2.sol"; +import {OrderConfigV4, EvaluableV4, TaskV3} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; +import {IParserV2} from "rainlang-interface-0.2.14/src/interface/IParserV2.sol"; import {UnsupportedCalculateOutputs} from "../../../src/error/ErrRaindexV6.sol"; /// @title RaindexV6AddOrderTest @@ -18,7 +18,7 @@ contract RaindexV6AddOrderTest is RaindexV6ExternalRealTest { config.evaluable.bytecode = hex""; vm.prank(owner); vm.expectRevert(abi.encodeWithSelector(OrderNoSources.selector)); - iRaindex.addOrder4(config, new TaskV2[](0)); + iRaindex.addOrder5(config, new TaskV3[](0)); (, bytes32 orderHash) = LibTestAddOrder.expectedOrder(owner, config); assertTrue(!iRaindex.orderExists(orderHash)); } @@ -34,7 +34,7 @@ contract RaindexV6AddOrderTest is RaindexV6ExternalRealTest { config.evaluable.bytecode = bytecode; vm.prank(owner); vm.expectRevert(abi.encodeWithSelector(OrderNoHandleIO.selector)); - iRaindex.addOrder4(config, new TaskV2[](0)); + iRaindex.addOrder5(config, new TaskV3[](0)); (, bytes32 orderHash) = LibTestAddOrder.expectedOrder(owner, config); assertTrue(!iRaindex.orderExists(orderHash)); } @@ -47,7 +47,7 @@ contract RaindexV6AddOrderTest is RaindexV6ExternalRealTest { bytes memory bytecode = iParserV2.parse2(":;:;"); config.evaluable.bytecode = bytecode; vm.prank(owner); - iRaindex.addOrder4(config, new TaskV2[](0)); + iRaindex.addOrder5(config, new TaskV3[](0)); } /// A stack of 1 for calculate order reverts. @@ -58,7 +58,7 @@ contract RaindexV6AddOrderTest is RaindexV6ExternalRealTest { bytes memory bytecode = iParserV2.parse2("_:block-timestamp();:;"); config.evaluable.bytecode = bytecode; vm.prank(owner); - iRaindex.addOrder4(config, new TaskV2[](0)); + iRaindex.addOrder5(config, new TaskV3[](0)); } /// A stack of 2 for calculate order deploys. @@ -68,7 +68,7 @@ contract RaindexV6AddOrderTest is RaindexV6ExternalRealTest { bytes memory bytecode = iParserV2.parse2("_ _:block-timestamp() chain-id();:;"); config.evaluable.bytecode = bytecode; vm.prank(owner); - iRaindex.addOrder4(config, new TaskV2[](0)); + iRaindex.addOrder5(config, new TaskV3[](0)); } /// A stack of 3 for calculate order deploys. @@ -78,7 +78,7 @@ contract RaindexV6AddOrderTest is RaindexV6ExternalRealTest { bytes memory bytecode = iParserV2.parse2("_ _ _:block-timestamp() chain-id() block-number();:;"); config.evaluable.bytecode = bytecode; vm.prank(owner); - iRaindex.addOrder4(config, new TaskV2[](0)); + iRaindex.addOrder5(config, new TaskV3[](0)); } /// Inputs for calculate order. Tests one input. @@ -89,7 +89,7 @@ contract RaindexV6AddOrderTest is RaindexV6ExternalRealTest { bytes memory bytecode = iParserV2.parse2("i:;:;"); config.evaluable.bytecode = bytecode; vm.prank(owner); - iRaindex.addOrder4(config, new TaskV2[](0)); + iRaindex.addOrder5(config, new TaskV3[](0)); } /// Inputs for calculate order errors. Tests two inputs. @@ -100,7 +100,7 @@ contract RaindexV6AddOrderTest is RaindexV6ExternalRealTest { bytes memory bytecode = iParserV2.parse2("i0 i1:;:;"); config.evaluable.bytecode = bytecode; vm.prank(owner); - iRaindex.addOrder4(config, new TaskV2[](0)); + iRaindex.addOrder5(config, new TaskV3[](0)); } /// Inputs for calculate order errors. This takes precedent over the same @@ -112,6 +112,6 @@ contract RaindexV6AddOrderTest is RaindexV6ExternalRealTest { bytes memory bytecode = iParserV2.parse2("i:;i:;"); config.evaluable.bytecode = bytecode; vm.prank(owner); - iRaindex.addOrder4(config, new TaskV2[](0)); + iRaindex.addOrder5(config, new TaskV3[](0)); } } diff --git a/test/concrete/raindex/RaindexV6.calculateOrderIOHarness.t.sol b/test/concrete/raindex/RaindexV6.calculateOrderIOHarness.t.sol index 6f15b1b334..59d9c6ef85 100644 --- a/test/concrete/raindex/RaindexV6.calculateOrderIOHarness.t.sol +++ b/test/concrete/raindex/RaindexV6.calculateOrderIOHarness.t.sol @@ -26,14 +26,14 @@ import { IRaindexV7, OrderV4, OrderConfigV4, - QuoteV2, + QuoteV3, IOV2, EvaluableV4, - SignedContextV1, - TaskV2 + SignedContextV2, + TaskV3 } from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; -import {IInterpreterV4, EvalV4, StackItem} from "rainlang-interface-0.2.13/src/interface/IInterpreterV4.sol"; -import {IInterpreterStoreV3} from "rainlang-interface-0.2.13/src/interface/IInterpreterStoreV3.sol"; +import {IInterpreterV4, EvalV4, StackItem} from "rainlang-interface-0.2.14/src/interface/IInterpreterV4.sol"; +import {IInterpreterStoreV3} from "rainlang-interface-0.2.14/src/interface/IInterpreterStoreV3.sol"; import {ITOFUTokenDecimals, TOFUOutcome} from "rain-tofu-erc20-decimals-0.1.4/src/interface/ITOFUTokenDecimals.sol"; import {LibTOFUTokenDecimals} from "rain-tofu-erc20-decimals-0.1.4/src/lib/LibTOFUTokenDecimals.sol"; import {LibRainDeploy} from "rain-deploy-0.1.22/src/lib/LibRainDeploy.sol"; @@ -98,8 +98,8 @@ contract RaindexV6CalculateOrderIOHarnessTest is Test { /// Build a single-input single-output order pointing at the fixed-stack /// interpreter. The evaluable carries the canonical two-source bytecode - /// (calculate + handle IO) so `addOrder4`'s source-count guard accepts it; - /// `calculateOrderIO`/`quote2` drive the fixed-stack interpreter regardless + /// (calculate + handle IO) so `addOrder5`'s source-count guard accepts it; + /// `calculateOrderIO`/`quote3` drive the fixed-stack interpreter regardless /// of the bytecode, so the sources only matter to the add path. function _order() internal view returns (OrderV4 memory order) { IOV2[] memory inputs = new IOV2[](1); @@ -144,7 +144,7 @@ contract RaindexV6CalculateOrderIOHarnessTest is Test { _setStack(LibDecimalFloat.packLossless(2, 0), LibDecimalFloat.packLossless(5, 0)); OrderIOCalculationV4 memory calc = - harness.exposedCalculateOrderIO(order, 0, 0, counterparty, new SignedContextV1[](0)); + harness.exposedCalculateOrderIO(order, 0, 0, counterparty, new SignedContextV2[](0)); // `LibContext.build` prepends a base column (sender, this) at index 0, // so the FINAL context matrix is indexed directly by the column constant @@ -175,7 +175,7 @@ contract RaindexV6CalculateOrderIOHarnessTest is Test { _setStack(LibDecimalFloat.packLossless(2, 0), LibDecimalFloat.packLossless(5, 0)); OrderIOCalculationV4 memory calc = - harness.exposedCalculateOrderIO(order, 0, 0, counterparty, new SignedContextV1[](0)); + harness.exposedCalculateOrderIO(order, 0, 0, counterparty, new SignedContextV2[](0)); bytes32[] memory inputCol = calc.context[CONTEXT_VAULT_INPUTS_COLUMN]; assertEq(inputCol[CONTEXT_VAULT_IO_TOKEN], bytes32(uint256(uint160(inputToken))), "input token"); @@ -199,7 +199,7 @@ contract RaindexV6CalculateOrderIOHarnessTest is Test { _setStack(LibDecimalFloat.packLossless(2, 0), LibDecimalFloat.packLossless(50, 0)); OrderIOCalculationV4 memory calc = - harness.exposedCalculateOrderIO(order, 0, 0, counterparty, new SignedContextV1[](0)); + harness.exposedCalculateOrderIO(order, 0, 0, counterparty, new SignedContextV2[](0)); bytes32[] memory outputCol = calc.context[CONTEXT_VAULT_OUTPUTS_COLUMN]; assertEq(outputCol[CONTEXT_VAULT_IO_TOKEN], bytes32(uint256(uint160(outputToken))), "output token"); @@ -224,7 +224,7 @@ contract RaindexV6CalculateOrderIOHarnessTest is Test { _setStack(ioRatio, outputMax); OrderIOCalculationV4 memory calc = - harness.exposedCalculateOrderIO(order, 0, 0, counterparty, new SignedContextV1[](0)); + harness.exposedCalculateOrderIO(order, 0, 0, counterparty, new SignedContextV2[](0)); assertTrue(calc.IORatio.eq(ioRatio), "IORatio is stack[0]"); assertTrue(calc.outputMax.eq(outputMax), "outputMax is stack[1] (uncapped)"); @@ -240,7 +240,7 @@ contract RaindexV6CalculateOrderIOHarnessTest is Test { _setStack(LibDecimalFloat.packLossless(2, 0), LibDecimalFloat.packLossless(50, 0)); OrderIOCalculationV4 memory calc = - harness.exposedCalculateOrderIO(order, 0, 0, counterparty, new SignedContextV1[](0)); + harness.exposedCalculateOrderIO(order, 0, 0, counterparty, new SignedContextV2[](0)); assertTrue(calc.outputMax.eq(LibDecimalFloat.packLossless(9, 0)), "output max capped to vault balance 9"); } @@ -254,7 +254,7 @@ contract RaindexV6CalculateOrderIOHarnessTest is Test { _setStack(LibDecimalFloat.packLossless(2, 0), LibDecimalFloat.packLossless(4, 0)); OrderIOCalculationV4 memory calc = - harness.exposedCalculateOrderIO(order, 0, 0, counterparty, new SignedContextV1[](0)); + harness.exposedCalculateOrderIO(order, 0, 0, counterparty, new SignedContextV2[](0)); assertTrue(calc.outputMax.eq(LibDecimalFloat.packLossless(4, 0)), "output max below balance is uncapped"); } @@ -270,7 +270,7 @@ contract RaindexV6CalculateOrderIOHarnessTest is Test { _setStack(LibDecimalFloat.packLossless(2, 0), LibDecimalFloat.packLossless(50, 0)); OrderIOCalculationV4 memory calc = - harness.exposedCalculateOrderIO(order, 0, 0, counterparty, new SignedContextV1[](0)); + harness.exposedCalculateOrderIO(order, 0, 0, counterparty, new SignedContextV2[](0)); assertTrue(calc.outputMax.isZero(), "output max capped to empty OUTPUT vault balance"); } @@ -286,7 +286,7 @@ contract RaindexV6CalculateOrderIOHarnessTest is Test { _setStack(ioRatio, LibDecimalFloat.packLossless(50, 0)); OrderIOCalculationV4 memory calc = - harness.exposedCalculateOrderIO(order, 0, 0, counterparty, new SignedContextV1[](0)); + harness.exposedCalculateOrderIO(order, 0, 0, counterparty, new SignedContextV2[](0)); bytes32[] memory calculations = calc.context[CONTEXT_CALCULATIONS_COLUMN]; assertEq(calculations.length, 2, "calculations column has two rows"); @@ -312,7 +312,7 @@ contract RaindexV6CalculateOrderIOHarnessTest is Test { _setStackRaw(stack); vm.expectRevert(abi.encodeWithSelector(UnsupportedCalculateOutputs.selector, uint256(1))); - harness.exposedCalculateOrderIO(order, 0, 0, counterparty, new SignedContextV1[](0)); + harness.exposedCalculateOrderIO(order, 0, 0, counterparty, new SignedContextV2[](0)); } /// The exact boundary: a stack of EXACTLY 2 entries is accepted (not @@ -324,7 +324,7 @@ contract RaindexV6CalculateOrderIOHarnessTest is Test { _setStack(LibDecimalFloat.packLossless(2, 0), LibDecimalFloat.packLossless(4, 0)); OrderIOCalculationV4 memory calc = - harness.exposedCalculateOrderIO(order, 0, 0, counterparty, new SignedContextV1[](0)); + harness.exposedCalculateOrderIO(order, 0, 0, counterparty, new SignedContextV2[](0)); assertTrue(calc.outputMax.eq(LibDecimalFloat.packLossless(4, 0)), "length-2 stack accepted"); } @@ -337,7 +337,7 @@ contract RaindexV6CalculateOrderIOHarnessTest is Test { _setStackRaw(new bytes32[](0)); vm.expectRevert(abi.encodeWithSelector(UnsupportedCalculateOutputs.selector, uint256(0))); - harness.exposedCalculateOrderIO(order, 0, 0, counterparty, new SignedContextV1[](0)); + harness.exposedCalculateOrderIO(order, 0, 0, counterparty, new SignedContextV2[](0)); } /// The INPUT token's TOFU decimals check reverts `TokenDecimalsReadFailure` @@ -358,7 +358,7 @@ contract RaindexV6CalculateOrderIOHarnessTest is Test { ITOFUTokenDecimals.TokenDecimalsReadFailure.selector, inputToken, TOFUOutcome.Inconsistent ) ); - harness.exposedCalculateOrderIO(order, 0, 0, counterparty, new SignedContextV1[](0)); + harness.exposedCalculateOrderIO(order, 0, 0, counterparty, new SignedContextV2[](0)); } /// The INPUT token's TOFU check reverts `TokenDecimalsReadFailure` with @@ -380,7 +380,7 @@ contract RaindexV6CalculateOrderIOHarnessTest is Test { ITOFUTokenDecimals.TokenDecimalsReadFailure.selector, inputToken, TOFUOutcome.ReadFailure ) ); - harness.exposedCalculateOrderIO(order, 0, 0, counterparty, new SignedContextV1[](0)); + harness.exposedCalculateOrderIO(order, 0, 0, counterparty, new SignedContextV2[](0)); } /// The OUTPUT token's TOFU decimals check reverts `TokenDecimalsReadFailure` @@ -403,7 +403,7 @@ contract RaindexV6CalculateOrderIOHarnessTest is Test { ITOFUTokenDecimals.TokenDecimalsReadFailure.selector, outputToken, TOFUOutcome.Inconsistent ) ); - harness.exposedCalculateOrderIO(order, 0, 0, counterparty, new SignedContextV1[](0)); + harness.exposedCalculateOrderIO(order, 0, 0, counterparty, new SignedContextV2[](0)); } /// The OUTPUT token's TOFU check reverts `TokenDecimalsReadFailure` with @@ -425,7 +425,7 @@ contract RaindexV6CalculateOrderIOHarnessTest is Test { ITOFUTokenDecimals.TokenDecimalsReadFailure.selector, outputToken, TOFUOutcome.ReadFailure ) ); - harness.exposedCalculateOrderIO(order, 0, 0, counterparty, new SignedContextV1[](0)); + harness.exposedCalculateOrderIO(order, 0, 0, counterparty, new SignedContextV2[](0)); } /// Positive control: with both tokens' decimals CONSISTENT (a stored value @@ -443,16 +443,16 @@ contract RaindexV6CalculateOrderIOHarnessTest is Test { harness.seedTofu(inputToken); OrderIOCalculationV4 memory calc = - harness.exposedCalculateOrderIO(order, 0, 0, counterparty, new SignedContextV1[](0)); + harness.exposedCalculateOrderIO(order, 0, 0, counterparty, new SignedContextV2[](0)); assertTrue(calc.outputMax.eq(LibDecimalFloat.packLossless(4, 0)), "consistent+initial accepted"); } // --------------------------------------------------------------------- - // quote2 wrapper behaviors against the fresh-compiled RaindexV6. + // quote3 wrapper behaviors against the fresh-compiled RaindexV6. // --------------------------------------------------------------------- /// Add the harness's standard order so `sOrders[hash] == ORDER_LIVE`. - /// `addOrder4` does not call the interpreter, so the fixed-stack interpreter + /// `addOrder5` does not call the interpreter, so the fixed-stack interpreter /// is fine. Pranks the owner so the recorded owner matches. function _addOrder(OrderV4 memory order) internal { OrderConfigV4 memory config = OrderConfigV4({ @@ -464,12 +464,12 @@ contract RaindexV6CalculateOrderIOHarnessTest is Test { meta: "" }); vm.prank(order.owner); - IRaindexV7(address(harness)).addOrder4(config, new TaskV2[](0)); + IRaindexV7(address(harness)).addOrder5(config, new TaskV3[](0)); } /// A LIVE order quotes `(true, vault-capped outputMax, IORatio)`. The output /// vault holds 9; the calculated max (50) is capped to 9; the ratio (3) - /// passes through. Pins the `quote2` happy path: the `true` exists flag and + /// passes through. Pins the `quote3` happy path: the `true` exists flag and /// the (outputMax, IORatio) tuple matching `calculateOrderIO`'s capped result. function testQuoteLiveOrderReturnsCappedMaxAndRatio() external { OrderV4 memory order = _order(); @@ -477,9 +477,9 @@ contract RaindexV6CalculateOrderIOHarnessTest is Test { _setStack(LibDecimalFloat.packLossless(3, 0), LibDecimalFloat.packLossless(50, 0)); _addOrder(order); - QuoteV2 memory quoteConfig = - QuoteV2({order: order, inputIOIndex: 0, outputIOIndex: 0, signedContext: new SignedContextV1[](0)}); - (bool exists, Float outputMax, Float ioRatio) = IRaindexV7(address(harness)).quote2(quoteConfig); + QuoteV3 memory quoteConfig = + QuoteV3({order: order, inputIOIndex: 0, outputIOIndex: 0, signedContext: new SignedContextV2[](0)}); + (bool exists, Float outputMax, Float ioRatio) = IRaindexV7(address(harness)).quote3(quoteConfig); assertTrue(exists, "live order exists"); assertTrue(outputMax.eq(LibDecimalFloat.packLossless(9, 0)), "quote output max vault-capped to 9"); @@ -497,9 +497,9 @@ contract RaindexV6CalculateOrderIOHarnessTest is Test { _setStack(LibDecimalFloat.packLossless(3, 0), LibDecimalFloat.packLossless(50, 0)); // Deliberately do NOT add the order. - QuoteV2 memory quoteConfig = - QuoteV2({order: order, inputIOIndex: 0, outputIOIndex: 0, signedContext: new SignedContextV1[](0)}); - (bool exists, Float outputMax, Float ioRatio) = IRaindexV7(address(harness)).quote2(quoteConfig); + QuoteV3 memory quoteConfig = + QuoteV3({order: order, inputIOIndex: 0, outputIOIndex: 0, signedContext: new SignedContextV2[](0)}); + (bool exists, Float outputMax, Float ioRatio) = IRaindexV7(address(harness)).quote3(quoteConfig); assertFalse(exists, "dead order does not exist"); assertTrue(outputMax.isZero(), "dead order output max zero"); @@ -508,7 +508,7 @@ contract RaindexV6CalculateOrderIOHarnessTest is Test { /// A removed (was-live, now dead) order also quotes `(false, 0, 0)`. Pins /// that the liveness check is `== ORDER_LIVE` and not merely "ever existed": - /// after `removeOrder3` flips the slot back to ORDER_DEAD the quote returns + /// after `removeOrder4` flips the slot back to ORDER_DEAD the quote returns /// the dead payload even though a non-zero stack is loaded. function testQuoteRemovedOrderReturnsFalseZeroZero() external { OrderV4 memory order = _order(); @@ -516,18 +516,18 @@ contract RaindexV6CalculateOrderIOHarnessTest is Test { _setStack(LibDecimalFloat.packLossless(3, 0), LibDecimalFloat.packLossless(50, 0)); _addOrder(order); vm.prank(order.owner); - IRaindexV7(address(harness)).removeOrder3(order, new TaskV2[](0)); + IRaindexV7(address(harness)).removeOrder4(order, new TaskV3[](0)); - QuoteV2 memory quoteConfig = - QuoteV2({order: order, inputIOIndex: 0, outputIOIndex: 0, signedContext: new SignedContextV1[](0)}); - (bool exists, Float outputMax, Float ioRatio) = IRaindexV7(address(harness)).quote2(quoteConfig); + QuoteV3 memory quoteConfig = + QuoteV3({order: order, inputIOIndex: 0, outputIOIndex: 0, signedContext: new SignedContextV2[](0)}); + (bool exists, Float outputMax, Float ioRatio) = IRaindexV7(address(harness)).quote3(quoteConfig); assertFalse(exists, "removed order does not exist"); assertTrue(outputMax.isZero(), "removed order output max zero"); assertTrue(ioRatio.isZero(), "removed order io ratio zero"); } - /// `quote2` runs `checkTokenSelfTrade` AFTER the liveness gate: a LIVE order + /// `quote3` runs `checkTokenSelfTrade` AFTER the liveness gate: a LIVE order /// whose input and output tokens are the same reverts `TokenSelfTrade`. Pins /// that the self-trade guard fires on a live order (the dead path would have /// returned false instead of reverting). A single same-token IO is used at @@ -552,9 +552,9 @@ contract RaindexV6CalculateOrderIOHarnessTest is Test { _setStack(LibDecimalFloat.packLossless(3, 0), LibDecimalFloat.packLossless(50, 0)); _addOrder(order); - QuoteV2 memory quoteConfig = - QuoteV2({order: order, inputIOIndex: 0, outputIOIndex: 0, signedContext: new SignedContextV1[](0)}); + QuoteV3 memory quoteConfig = + QuoteV3({order: order, inputIOIndex: 0, outputIOIndex: 0, signedContext: new SignedContextV2[](0)}); vm.expectRevert(abi.encodeWithSelector(IRaindexV7.TokenSelfTrade.selector)); - IRaindexV7(address(harness)).quote2(quoteConfig); + IRaindexV7(address(harness)).quote3(quoteConfig); } } diff --git a/test/concrete/raindex/RaindexV6.clear.badStack.t.sol b/test/concrete/raindex/RaindexV6.clear.badStack.t.sol index 62d2c573bc..27a71d81fb 100644 --- a/test/concrete/raindex/RaindexV6.clear.badStack.t.sol +++ b/test/concrete/raindex/RaindexV6.clear.badStack.t.sol @@ -9,8 +9,8 @@ import { OrderV4, EvaluableV4, ClearConfigV2, - SignedContextV1, - TaskV2 + SignedContextV2, + TaskV3 } from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {UnsupportedCalculateOutputs} from "../../../src/error/ErrRaindexV6.sol"; import {IERC20Metadata} from "@openzeppelin-contracts-5.7.0/token/ERC20/extensions/IERC20Metadata.sol"; @@ -43,14 +43,14 @@ contract RaindexV6ClearOrderBadStackTest is RaindexV6ExternalRealTest { OrderV4(bob, configBob.evaluable, configBob.validInputs, configBob.validOutputs, configBob.nonce); vm.prank(alice); - iRaindex.addOrder4(configAlice, new TaskV2[](0)); + iRaindex.addOrder5(configAlice, new TaskV3[](0)); vm.prank(bob); - iRaindex.addOrder4(configBob, new TaskV2[](0)); + iRaindex.addOrder5(configBob, new TaskV3[](0)); vm.expectRevert(abi.encodeWithSelector(UnsupportedCalculateOutputs.selector, badStackHeight)); iRaindex.clear4( - orderAlice, orderBob, ClearConfigV2(0, 0, 0, 0, 0, 0), new SignedContextV1[](0), new SignedContextV1[](0) + orderAlice, orderBob, ClearConfigV2(0, 0, 0, 0, 0, 0), new SignedContextV2[](0), new SignedContextV2[](0) ); } diff --git a/test/concrete/raindex/RaindexV6.clear.calculateStateChange.t.sol b/test/concrete/raindex/RaindexV6.clear.calculateStateChange.t.sol index c59ecf1161..f21fe6adda 100644 --- a/test/concrete/raindex/RaindexV6.clear.calculateStateChange.t.sol +++ b/test/concrete/raindex/RaindexV6.clear.calculateStateChange.t.sol @@ -7,7 +7,7 @@ import {OrderIOCalculationV4} from "src/struct/OrderIOCalculationV4.sol"; import {ClearStateChangeV2} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {OrderV4} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {Float, LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; -import {StateNamespace} from "rainlang-interface-0.2.13/src/interface/IInterpreterV4.sol"; +import {StateNamespace} from "rainlang-interface-0.2.14/src/interface/IInterpreterV4.sol"; import {IRaindexV6ClearStateChangeHarness} from "test/util/interface/IRaindexV6ClearStateChangeHarness.sol"; /// @title RaindexV6ClearStateChangeTest diff --git a/test/concrete/raindex/RaindexV6.clear.context.t.sol b/test/concrete/raindex/RaindexV6.clear.context.t.sol index 639834db66..c8062c30a6 100644 --- a/test/concrete/raindex/RaindexV6.clear.context.t.sol +++ b/test/concrete/raindex/RaindexV6.clear.context.t.sol @@ -7,9 +7,9 @@ import {LibTestAddOrder} from "test/util/lib/LibTestAddOrder.sol"; import { OrderConfigV4, OrderV4, - TaskV2, + TaskV3, ClearConfigV2, - SignedContextV1, + SignedContextV2, IOV2, EvaluableV4 } from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; @@ -129,7 +129,7 @@ contract RaindexV6ClearOrderContextTest is RaindexV6ExternalRealTest { token, abi.encodeWithSelector(IERC20.transferFrom.selector, owner, address(iRaindex)), abi.encode(true) ); vm.prank(owner); - iRaindex.deposit4(token, vaultId, LibDecimalFloat.packLossless(amount, exponent), new TaskV2[](0)); + iRaindex.deposit5(token, vaultId, LibDecimalFloat.packLossless(amount, exponent), new TaskV3[](0)); } } @@ -228,10 +228,10 @@ contract RaindexV6ClearOrderContextTest is RaindexV6ExternalRealTest { OrderV4(bob, configBob.evaluable, configBob.validInputs, configBob.validOutputs, configBob.nonce); vm.prank(alice); - iRaindex.addOrder4(configAlice, new TaskV2[](0)); + iRaindex.addOrder5(configAlice, new TaskV3[](0)); vm.prank(bob); - iRaindex.addOrder4(configBob, new TaskV2[](0)); + iRaindex.addOrder5(configBob, new TaskV3[](0)); setupOutputVault(address(iToken1), alice, vaultIds.aliceOutputVaultId, 100e6, -6, 6); setupOutputVault(address(iToken0), bob, vaultIds.bobOutputVaultId, 100e12, -12, 12); @@ -244,7 +244,7 @@ contract RaindexV6ClearOrderContextTest is RaindexV6ExternalRealTest { } iRaindex.clear4( - orderAlice, orderBob, ClearConfigV2(0, 0, 0, 0, 0, 0), new SignedContextV1[](0), new SignedContextV1[](0) + orderAlice, orderBob, ClearConfigV2(0, 0, 0, 0, 0, 0), new SignedContextV2[](0), new SignedContextV2[](0) ); } diff --git a/test/concrete/raindex/RaindexV6.clear.deadOrder.t.sol b/test/concrete/raindex/RaindexV6.clear.deadOrder.t.sol index 479109b5bd..0d61b11458 100644 --- a/test/concrete/raindex/RaindexV6.clear.deadOrder.t.sol +++ b/test/concrete/raindex/RaindexV6.clear.deadOrder.t.sol @@ -7,8 +7,8 @@ import {RaindexV6ExternalRealTest} from "test/util/abstract/RaindexV6ExternalRea import {LibTestAddOrder} from "test/util/lib/LibTestAddOrder.sol"; import {LibTestTakeOrder} from "test/util/lib/LibTestTakeOrder.sol"; import {LibOrder} from "../../../src/lib/LibOrder.sol"; -import {OrderConfigV4, OrderV4, ClearConfigV2, TaskV2} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; -import {SignedContextV1} from "rainlang-interface-0.2.13/src/interface/deprecated/v1/IInterpreterCallerV2.sol"; +import {OrderConfigV4, OrderV4, ClearConfigV2, TaskV3} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; +import {SignedContextV2} from "rainlang-interface-0.2.14/src/interface/IInterpreterCallerV5.sol"; /// @title RaindexV6ClearDeadOrderTest /// If either order passed to `clear4` is dead (never added, or removed) the @@ -34,7 +34,7 @@ contract RaindexV6ClearDeadOrderTest is RaindexV6ExternalRealTest { function addOrder(address owner, OrderConfigV4 memory config) internal returns (OrderV4 memory) { vm.prank(owner); vm.recordLogs(); - iRaindex.addOrder4(config, new TaskV2[](0)); + iRaindex.addOrder5(config, new TaskV3[](0)); return LibTestTakeOrder.extractOrderFromLogs(vm.getRecordedLogs()); } @@ -64,7 +64,7 @@ contract RaindexV6ClearDeadOrderTest is RaindexV6ExternalRealTest { emit OrderNotFound(address(this), alice, orderAlice.hash()); vm.recordLogs(); iRaindex.clear4( - orderAlice, orderBob, ClearConfigV2(0, 0, 0, 0, 0, 0), new SignedContextV1[](0), new SignedContextV1[](0) + orderAlice, orderBob, ClearConfigV2(0, 0, 0, 0, 0, 0), new SignedContextV2[](0), new SignedContextV2[](0) ); // Exactly one log: the OrderNotFound for alice. No ClearV3, no @@ -108,7 +108,7 @@ contract RaindexV6ClearDeadOrderTest is RaindexV6ExternalRealTest { emit OrderNotFound(address(this), bob, orderBob.hash()); vm.recordLogs(); iRaindex.clear4( - orderAlice, orderBob, ClearConfigV2(0, 0, 0, 0, 0, 0), new SignedContextV1[](0), new SignedContextV1[](0) + orderAlice, orderBob, ClearConfigV2(0, 0, 0, 0, 0, 0), new SignedContextV2[](0), new SignedContextV2[](0) ); Vm.Log[] memory logs = vm.getRecordedLogs(); diff --git a/test/concrete/raindex/RaindexV6.clear.freshDriver.t.sol b/test/concrete/raindex/RaindexV6.clear.freshDriver.t.sol index 8ce3d8822d..082d63d5d6 100644 --- a/test/concrete/raindex/RaindexV6.clear.freshDriver.t.sol +++ b/test/concrete/raindex/RaindexV6.clear.freshDriver.t.sol @@ -12,10 +12,10 @@ import { ClearConfigV2, ClearStateChangeV2, EvaluableV4, - SignedContextV1, + SignedContextV2, IInterpreterV4, IInterpreterStoreV3, - TaskV2 + TaskV3 } from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {Float, LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; import {LibRainDeploy} from "rain-deploy-0.1.22/src/lib/LibRainDeploy.sol"; @@ -24,10 +24,10 @@ import {MockToken} from "test/util/concrete/MockToken.sol"; import {LibOrder} from "src/lib/LibOrder.sol"; import {CalcInterpreter} from "test/util/concrete/CalcInterpreter.sol"; import {IRaindexV6ClearDriverHarness} from "test/util/interface/IRaindexV6ClearDriverHarness.sol"; -import {IParserV2} from "rainlang-interface-0.2.13/src/interface/IParserV2.sol"; -import {FullyQualifiedNamespace} from "rainlang-interface-0.2.13/src/interface/IInterpreterStoreV3.sol"; -import {StateNamespace} from "rainlang-interface-0.2.13/src/interface/IInterpreterV4.sol"; -import {LibNamespace} from "rainlang-interface-0.2.13/src/lib/ns/LibNamespace.sol"; +import {IParserV2} from "rainlang-interface-0.2.14/src/interface/IParserV2.sol"; +import {FullyQualifiedNamespace} from "rainlang-interface-0.2.14/src/interface/IInterpreterStoreV3.sol"; +import {StateNamespace} from "rainlang-interface-0.2.14/src/interface/IInterpreterV4.sol"; +import {LibNamespace} from "rainlang-interface-0.2.14/src/lib/ns/LibNamespace.sol"; import { LibTestInterpreterDeploy, TEST_INTERPRETER_ADDRESS, @@ -138,7 +138,7 @@ contract RaindexV6ClearFreshDriverTest is Test { function doClear(OrderV4 memory aliceOrder, OrderV4 memory bobOrder) internal { vm.prank(bountyBot); - raindex.clear4(aliceOrder, bobOrder, clearConfig(), new SignedContextV1[](0), new SignedContextV1[](0)); + raindex.clear4(aliceOrder, bobOrder, clearConfig(), new SignedContextV2[](0), new SignedContextV2[](0)); } // --------------------------------------------------------------------- @@ -240,7 +240,7 @@ contract RaindexV6ClearFreshDriverTest is Test { vm.prank(bountyBot); vm.expectRevert(NegativeBounty.selector); - raindex.clear4(aliceOrder, bobOrder, clearConfig(), new SignedContextV1[](0), new SignedContextV1[](0)); + raindex.clear4(aliceOrder, bobOrder, clearConfig(), new SignedContextV2[](0), new SignedContextV2[](0)); } /// ASYMMETRIC: ONLY alice's bounty is negative, bob's is exactly zero. @@ -257,7 +257,7 @@ contract RaindexV6ClearFreshDriverTest is Test { vm.prank(bountyBot); vm.expectRevert(NegativeBounty.selector); - raindex.clear4(aliceOrder, bobOrder, clearConfig(), new SignedContextV1[](0), new SignedContextV1[](0)); + raindex.clear4(aliceOrder, bobOrder, clearConfig(), new SignedContextV2[](0), new SignedContextV2[](0)); } /// ASYMMETRIC mirror: ONLY bob's bounty is negative, alice's is exactly zero. @@ -272,7 +272,7 @@ contract RaindexV6ClearFreshDriverTest is Test { vm.prank(bountyBot); vm.expectRevert(NegativeBounty.selector); - raindex.clear4(aliceOrder, bobOrder, clearConfig(), new SignedContextV1[](0), new SignedContextV1[](0)); + raindex.clear4(aliceOrder, bobOrder, clearConfig(), new SignedContextV2[](0), new SignedContextV2[](0)); } /// The NegativeBounty guard must run BEFORE any bounty vault is credited and @@ -285,7 +285,7 @@ contract RaindexV6ClearFreshDriverTest is Test { wireOrders(f(11, -1), f(1, 0), f(11, -1), f(1, 0), f(10, 0)); vm.prank(bountyBot); - try raindex.clear4(aliceOrder, bobOrder, clearConfig(), new SignedContextV1[](0), new SignedContextV1[](0)) { + try raindex.clear4(aliceOrder, bobOrder, clearConfig(), new SignedContextV2[](0), new SignedContextV2[](0)) { revert("clear should have reverted"); } catch {} @@ -307,7 +307,7 @@ contract RaindexV6ClearFreshDriverTest is Test { vm.prank(bountyBot); vm.expectRevert(ClearZeroAmount.selector); - raindex.clear4(aliceOrder, bobOrder, clearConfig(), new SignedContextV1[](0), new SignedContextV1[](0)); + raindex.clear4(aliceOrder, bobOrder, clearConfig(), new SignedContextV2[](0), new SignedContextV2[](0)); } function testFreshClearBothZeroOutputReverts() external { @@ -363,7 +363,7 @@ contract RaindexV6ClearFreshDriverTest is Test { vm.prank(bountyBot); vm.expectRevert(ClearZeroAmount.selector); - raindex.clear4(aliceOrder, bobOrder, clearConfig(), new SignedContextV1[](0), new SignedContextV1[](0)); + raindex.clear4(aliceOrder, bobOrder, clearConfig(), new SignedContextV2[](0), new SignedContextV2[](0)); assertEq(store.get(aliceNamespace, bytes32(uint256(1))), bytes32(0), "alice store unchanged"); } @@ -413,7 +413,7 @@ contract RaindexV6ClearFreshDriverTest is Test { vm.prank(bountyBot); vm.expectPartialRevert(ExponentUnderflow.selector); - raindex.clear4(aliceOrder, bobOrder, clearConfig(), new SignedContextV1[](0), new SignedContextV1[](0)); + raindex.clear4(aliceOrder, bobOrder, clearConfig(), new SignedContextV2[](0), new SignedContextV2[](0)); } function testFreshClearBobCappedOutputUnderflowReverts() external { @@ -422,7 +422,7 @@ contract RaindexV6ClearFreshDriverTest is Test { vm.prank(bountyBot); vm.expectPartialRevert(ExponentUnderflow.selector); - raindex.clear4(aliceOrder, bobOrder, clearConfig(), new SignedContextV1[](0), new SignedContextV1[](0)); + raindex.clear4(aliceOrder, bobOrder, clearConfig(), new SignedContextV2[](0), new SignedContextV2[](0)); } // --------------------------------------------------------------------- @@ -527,7 +527,7 @@ contract RaindexV6ClearFreshDriverTest is Test { // SameOwner is selector-checked from src; import not needed because we // use the raw 4-byte selector of the error in the src file. vm.expectRevert(bytes4(keccak256("SameOwner()"))); - raindex.clear4(aliceOrder, bobOrder, clearConfig(), new SignedContextV1[](0), new SignedContextV1[](0)); + raindex.clear4(aliceOrder, bobOrder, clearConfig(), new SignedContextV2[](0), new SignedContextV2[](0)); } /// TokenMismatch (leg 1 ONLY): alice's OUTPUT token must equal bob's INPUT @@ -544,7 +544,7 @@ contract RaindexV6ClearFreshDriverTest is Test { vm.prank(bountyBot); vm.expectRevert(bytes4(keccak256("TokenMismatch()"))); - raindex.clear4(aliceOrder, bobOrder, clearConfig(), new SignedContextV1[](0), new SignedContextV1[](0)); + raindex.clear4(aliceOrder, bobOrder, clearConfig(), new SignedContextV2[](0), new SignedContextV2[](0)); } /// TokenMismatch (leg 2): bob's OUTPUT token must equal alice's INPUT token. @@ -559,7 +559,7 @@ contract RaindexV6ClearFreshDriverTest is Test { vm.prank(bountyBot); vm.expectRevert(bytes4(keccak256("TokenMismatch()"))); - raindex.clear4(aliceOrder, bobOrder, clearConfig(), new SignedContextV1[](0), new SignedContextV1[](0)); + raindex.clear4(aliceOrder, bobOrder, clearConfig(), new SignedContextV2[](0), new SignedContextV2[](0)); } /// TokenSelfTrade: alice's input token == alice's output token reverts @@ -574,7 +574,7 @@ contract RaindexV6ClearFreshDriverTest is Test { vm.prank(bountyBot); vm.expectRevert(bytes4(keccak256("TokenSelfTrade()"))); - raindex.clear4(aliceOrder, bobOrder, clearConfig(), new SignedContextV1[](0), new SignedContextV1[](0)); + raindex.clear4(aliceOrder, bobOrder, clearConfig(), new SignedContextV2[](0), new SignedContextV2[](0)); } /// Dead alice order (never made live): clear4 emits OrderNotFound for alice's @@ -588,7 +588,7 @@ contract RaindexV6ClearFreshDriverTest is Test { vm.recordLogs(); vm.prank(bountyBot); - raindex.clear4(aliceOrder, bobOrder, clearConfig(), new SignedContextV1[](0), new SignedContextV1[](0)); + raindex.clear4(aliceOrder, bobOrder, clearConfig(), new SignedContextV2[](0), new SignedContextV2[](0)); Vm.Log[] memory logs = vm.getRecordedLogs(); assertEq(logs.length, 1, "only OrderNotFound emitted"); @@ -610,7 +610,7 @@ contract RaindexV6ClearFreshDriverTest is Test { vm.recordLogs(); vm.prank(bountyBot); - raindex.clear4(aliceOrder, bobOrder, clearConfig(), new SignedContextV1[](0), new SignedContextV1[](0)); + raindex.clear4(aliceOrder, bobOrder, clearConfig(), new SignedContextV2[](0), new SignedContextV2[](0)); Vm.Log[] memory logs = vm.getRecordedLogs(); assertEq(logs.length, 1, "only OrderNotFound emitted"); diff --git a/test/concrete/raindex/RaindexV6.clear.handleIO.revert.t.sol b/test/concrete/raindex/RaindexV6.clear.handleIO.revert.t.sol index bcfc895db1..b85cb58377 100644 --- a/test/concrete/raindex/RaindexV6.clear.handleIO.revert.t.sol +++ b/test/concrete/raindex/RaindexV6.clear.handleIO.revert.t.sol @@ -10,8 +10,8 @@ import { IOV2, OrderConfigV4, EvaluableV4, - SignedContextV1, - TaskV2, + SignedContextV2, + TaskV3, Float } from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; @@ -61,7 +61,7 @@ contract RaindexV6ClearHandleIORevertTest is RaindexV6ExternalRealTest { mockVault0Output(outputToken, owner, uint256(int256(type(int224).max))); } else { vm.prank(owner); - iRaindex.deposit4(outputToken, vaultId, LibDecimalFloat.packLossless(type(int224).max, 0), new TaskV2[](0)); + iRaindex.deposit5(outputToken, vaultId, LibDecimalFloat.packLossless(type(int224).max, 0), new TaskV3[](0)); Float balance = iRaindex.vaultBalance2(owner, outputToken, vaultId); assertTrue(balance.eq(LibDecimalFloat.packLossless(type(int224).max, 0))); } @@ -75,7 +75,7 @@ contract RaindexV6ClearHandleIORevertTest is RaindexV6ExternalRealTest { vm.prank(owner); vm.recordLogs(); - iRaindex.addOrder4(config, new TaskV2[](0)); + iRaindex.addOrder5(config, new TaskV3[](0)); Vm.Log[] memory entries = vm.getRecordedLogs(); assertEq(entries.length, 1); @@ -114,12 +114,12 @@ contract RaindexV6ClearHandleIORevertTest is RaindexV6ExternalRealTest { if (aliceErr.length > 0) { vm.expectRevert(aliceErr); } - iRaindex.clear4(aliceOrder, bobOrder, clearConfig, new SignedContextV1[](0), new SignedContextV1[](0)); + iRaindex.clear4(aliceOrder, bobOrder, clearConfig, new SignedContextV2[](0), new SignedContextV2[](0)); if (bobErr.length > 0) { vm.expectRevert(bobErr); } - iRaindex.clear4(bobOrder, aliceOrder, clearConfig, new SignedContextV1[](0), new SignedContextV1[](0)); + iRaindex.clear4(bobOrder, aliceOrder, clearConfig, new SignedContextV2[](0), new SignedContextV2[](0)); } function testClearOrderHandleIO0() external { diff --git a/test/concrete/raindex/RaindexV6.clear.mock.t.sol b/test/concrete/raindex/RaindexV6.clear.mock.t.sol index 6b3c58b9ae..6a9a41aeee 100644 --- a/test/concrete/raindex/RaindexV6.clear.mock.t.sol +++ b/test/concrete/raindex/RaindexV6.clear.mock.t.sol @@ -12,15 +12,15 @@ import { IOV2, ClearConfigV2, EvaluableV4, - SignedContextV1, + SignedContextV2, IInterpreterV4, - TaskV2, + TaskV3, Float } from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {LibTestAddOrder} from "test/util/lib/LibTestAddOrder.sol"; import {NotOrderOwner, NegativeBounty, ClearZeroAmount} from "../../../src/error/ErrRaindexV6.sol"; -import {LibNamespace} from "rainlang-interface-0.2.13/src/lib/ns/LibNamespace.sol"; -import {StateNamespace, SourceIndexV2, StackItem} from "rainlang-interface-0.2.13/src/interface/IInterpreterV4.sol"; +import {LibNamespace} from "rainlang-interface-0.2.14/src/lib/ns/LibNamespace.sol"; +import {StateNamespace, SourceIndexV2, StackItem} from "rainlang-interface-0.2.14/src/interface/IInterpreterV4.sol"; import {Math} from "@openzeppelin-contracts-5.7.0/utils/math/Math.sol"; import {LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; @@ -47,7 +47,7 @@ contract RaindexV6ClearTest is RaindexV6ExternalMockTest { abi.encode(true) ); vm.prank(depositor); - iRaindex.deposit4(address(token), vaultId, amount, new TaskV2[](0)); + iRaindex.deposit5(address(token), vaultId, amount, new TaskV3[](0)); Float balance = iRaindex.vaultBalance2(depositor, token, vaultId); assertTrue(balance.eq(amount)); } @@ -81,7 +81,7 @@ contract RaindexV6ClearTest is RaindexV6ExternalMockTest { bobConfig.evaluable.interpreter = iInterpreter; bobConfig.evaluable.store = iStore; - // addOrder4 requires a valid serialized parser output with >= 2 sources. + // addOrder5 requires a valid serialized parser output with >= 2 sources. // The fuzzed bytecode is replaced with the canonical 2-source serialized // blob (the same `_ _:1e18 1e18;:;` output LibTestAddOrder.conformConfig // installs). The two orders are differentiated by owner, token layout and @@ -393,7 +393,7 @@ contract RaindexV6ClearTest is RaindexV6ExternalMockTest { if (clear.expectedError.length > 0) { vm.expectRevert(clear.expectedError); } - iRaindex.clear4(aliceOrder, bobOrder, configClear, new SignedContextV1[](0), new SignedContextV1[](0)); + iRaindex.clear4(aliceOrder, bobOrder, configClear, new SignedContextV2[](0), new SignedContextV2[](0)); } if (clear.expectedError.length == 0) { diff --git a/test/concrete/raindex/RaindexV6.clear.sameOwner.t.sol b/test/concrete/raindex/RaindexV6.clear.sameOwner.t.sol index bf6a2d6b94..e9eb1bf6c4 100644 --- a/test/concrete/raindex/RaindexV6.clear.sameOwner.t.sol +++ b/test/concrete/raindex/RaindexV6.clear.sameOwner.t.sol @@ -5,8 +5,8 @@ pragma solidity =0.8.25; import {RaindexV6ExternalRealTest} from "test/util/abstract/RaindexV6ExternalRealTest.sol"; import {LibTestAddOrder} from "test/util/lib/LibTestAddOrder.sol"; import {LibTestTakeOrder} from "test/util/lib/LibTestTakeOrder.sol"; -import {OrderConfigV4, OrderV4, ClearConfigV2, TaskV2} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; -import {SignedContextV1} from "rainlang-interface-0.2.13/src/interface/deprecated/v1/IInterpreterCallerV2.sol"; +import {OrderConfigV4, OrderV4, ClearConfigV2, TaskV3} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; +import {SignedContextV2} from "rainlang-interface-0.2.14/src/interface/IInterpreterCallerV5.sol"; import {SameOwner} from "../../../src/error/ErrRaindexV6.sol"; /// Clearing two orders with the same owner must revert with SameOwner. @@ -27,17 +27,17 @@ contract RaindexV6ClearSameOwnerTest is RaindexV6ExternalRealTest { // Add both orders as the same owner. vm.prank(alice); vm.recordLogs(); - iRaindex.addOrder4(configAlice, new TaskV2[](0)); + iRaindex.addOrder5(configAlice, new TaskV3[](0)); OrderV4 memory orderAlice = LibTestTakeOrder.extractOrderFromLogs(vm.getRecordedLogs()); vm.prank(alice); vm.recordLogs(); - iRaindex.addOrder4(configBob, new TaskV2[](0)); + iRaindex.addOrder5(configBob, new TaskV3[](0)); OrderV4 memory orderBob = LibTestTakeOrder.extractOrderFromLogs(vm.getRecordedLogs()); vm.expectRevert(abi.encodeWithSelector(SameOwner.selector)); iRaindex.clear4( - orderAlice, orderBob, ClearConfigV2(0, 0, 0, 0, 0, 0), new SignedContextV1[](0), new SignedContextV1[](0) + orderAlice, orderBob, ClearConfigV2(0, 0, 0, 0, 0, 0), new SignedContextV2[](0), new SignedContextV2[](0) ); } } diff --git a/test/concrete/raindex/RaindexV6.clear.sameToken.t.sol b/test/concrete/raindex/RaindexV6.clear.sameToken.t.sol index d22ff22272..974ef1435a 100644 --- a/test/concrete/raindex/RaindexV6.clear.sameToken.t.sol +++ b/test/concrete/raindex/RaindexV6.clear.sameToken.t.sol @@ -9,8 +9,8 @@ import { OrderV4, EvaluableV4, ClearConfigV2, - SignedContextV1, - TaskV2 + SignedContextV2, + TaskV3 } from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {LibTestAddOrder} from "test/util/lib/LibTestAddOrder.sol"; @@ -37,14 +37,14 @@ contract RaindexV6ClearSameTokenTest is RaindexV6ExternalRealTest { OrderV4(bob, configBob.evaluable, configBob.validInputs, configBob.validOutputs, configBob.nonce); vm.prank(alice); - iRaindex.addOrder4(configAlice, new TaskV2[](0)); + iRaindex.addOrder5(configAlice, new TaskV3[](0)); vm.prank(bob); - iRaindex.addOrder4(configBob, new TaskV2[](0)); + iRaindex.addOrder5(configBob, new TaskV3[](0)); vm.expectRevert(abi.encodeWithSelector(IRaindexV7.TokenSelfTrade.selector)); iRaindex.clear4( - orderAlice, orderBob, ClearConfigV2(0, 0, 0, 0, 0, 0), new SignedContextV1[](0), new SignedContextV1[](0) + orderAlice, orderBob, ClearConfigV2(0, 0, 0, 0, 0, 0), new SignedContextV2[](0), new SignedContextV2[](0) ); } } diff --git a/test/concrete/raindex/RaindexV6.clear.signedContextRouting.t.sol b/test/concrete/raindex/RaindexV6.clear.signedContextRouting.t.sol index 93eee85509..d1901cfd3d 100644 --- a/test/concrete/raindex/RaindexV6.clear.signedContextRouting.t.sol +++ b/test/concrete/raindex/RaindexV6.clear.signedContextRouting.t.sol @@ -6,24 +6,24 @@ import {RaindexV6ExternalRealTest} from "test/util/abstract/RaindexV6ExternalRea import { OrderConfigV4, OrderV4, - TaskV2, + TaskV3, ClearConfigV2, - SignedContextV1, + SignedContextV2, IOV2, EvaluableV4 } from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; -import {IRaindexV6} from "raindex-interface-0.1.10/src/interface/deprecated/v6/IRaindexV6.sol"; +import {IRaindexV6, SignedContextV1} from "raindex-interface-0.1.10/src/interface/deprecated/v6/IRaindexV6.sol"; import {IERC20} from "@openzeppelin-contracts-5.7.0/token/ERC20/IERC20.sol"; -import {MessageHashUtils} from "@openzeppelin-contracts-5.7.0/utils/cryptography/MessageHashUtils.sol"; import {Strings} from "@openzeppelin-contracts-5.7.0/utils/Strings.sol"; import {LibDecimalFloat, Float} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; +import {LibTestSignedContext} from "test/util/lib/LibTestSignedContext.sol"; /// @title RaindexV6ClearSignedContextRoutingTest /// @notice `clear4` evaluates alice's order with `aliceSignedContext` and bob's -/// with `bobSignedContext`, matching `quote2`/`takeOrders4`. Each order's -/// expression asserts the signer and signed content it sees, so routing is -/// pinned by signer and content rather than slot. Runs against fresh-compiled -/// RaindexV6 so source mutations are observable. +/// with `bobSignedContext`, matching `quote3`/`takeOrders5`. Each order's +/// expression asserts the signer, domain and signed content it sees, so routing +/// is pinned by signer, domain and content rather than slot. Runs against +/// fresh-compiled RaindexV6 so source mutations are observable. contract RaindexV6ClearSignedContextRoutingTest is RaindexV6ExternalRealTest { using Strings for address; using Strings for uint256; @@ -34,37 +34,40 @@ contract RaindexV6ClearSignedContextRoutingTest is RaindexV6ExternalRealTest { bytes32 internal constant BOB_IN = bytes32(uint256(0xb1)); bytes32 internal constant BOB_OUT = bytes32(uint256(0xb2)); + struct Expected { + uint256 pk; + bytes32 domain; + bytes32 content; + } + function setUp() external { vm.etch(address(iRaindex), vm.getDeployedCode("RaindexV6.sol:RaindexV6")); } - function signedContext(uint256 pk, bytes32 content) internal pure returns (SignedContextV1[] memory) { + function signedContext(Expected memory expected) internal pure returns (SignedContextV2[] memory) { bytes32[] memory context = new bytes32[](1); - context[0] = content; - (uint8 v, bytes32 r, bytes32 s) = - vm.sign(pk, MessageHashUtils.toEthSignedMessageHash(keccak256(abi.encodePacked(context)))); - SignedContextV1[] memory signedContexts = new SignedContextV1[](1); - signedContexts[0] = - SignedContextV1({signer: vm.addr(pk), context: context, signature: abi.encodePacked(r, s, v)}); + context[0] = expected.content; + SignedContextV2[] memory signedContexts = new SignedContextV2[](1); + signedContexts[0] = LibTestSignedContext.sign(vm, expected.pk, expected.domain, context); return signedContexts; } - function expectingBytecode(string memory name, address expectedSigner, bytes32 expectedContent) - internal - view - returns (bytes memory) - { + function expectingBytecode(string memory name, Expected memory expected) internal view returns (bytes memory) { return iParserV2.parse2( bytes( string.concat( "using-words-from ", address(iSubParser).toHexString(), "\n:ensure(equal-to(signer<0>() ", - expectedSigner.toHexString(), + vm.addr(expected.pk).toHexString(), + ") \"", + name, + " signer\"),\n:ensure(equal-to(signer-domain<0>() ", + uint256(expected.domain).toHexString(), ") \"", name, - " signer\"),\n:ensure(equal-to(signed-context<0 0>() ", - uint256(expectedContent).toHexString(), + " domain\"),\n:ensure(equal-to(signed-context<0 0>() ", + uint256(expected.content).toHexString(), ") \"", name, " signed context\"),\n_ _: 1 1;\n:;" @@ -100,77 +103,79 @@ contract RaindexV6ClearSignedContextRoutingTest is RaindexV6ExternalRealTest { abi.encode(true) ); vm.startPrank(owner); - iRaindex.deposit4(outputToken, outputVault, LibDecimalFloat.packLossless(100, 0), new TaskV2[](0)); - iRaindex.addOrder4(config, new TaskV2[](0)); + iRaindex.deposit5(outputToken, outputVault, LibDecimalFloat.packLossless(100, 0), new TaskV3[](0)); + iRaindex.addOrder5(config, new TaskV3[](0)); vm.stopPrank(); return OrderV4(owner, config.evaluable, config.validInputs, config.validOutputs, config.nonce); } - function aliceOrderExpecting(uint256 signerPk, bytes32 content) internal returns (OrderV4 memory) { - bytes memory bytecode = expectingBytecode("alice", vm.addr(signerPk), content); - return addFundedOrder(makeAddr("alice"), address(iToken0), ALICE_IN, address(iToken1), ALICE_OUT, bytecode); - } - - function bobOrderExpecting(uint256 signerPk, bytes32 content) internal returns (OrderV4 memory) { - bytes memory bytecode = expectingBytecode("bob", vm.addr(signerPk), content); - return addFundedOrder(makeAddr("bob"), address(iToken1), BOB_IN, address(iToken0), BOB_OUT, bytecode); - } - - function orders(uint256 aliceSignerPk, bytes32 aliceContent, uint256 bobSignerPk, bytes32 bobContent) - internal - returns (OrderV4 memory, OrderV4 memory) - { - return (aliceOrderExpecting(aliceSignerPk, aliceContent), bobOrderExpecting(bobSignerPk, bobContent)); + function orders(Expected memory alice, Expected memory bob) internal returns (OrderV4 memory, OrderV4 memory) { + return ( + addFundedOrder( + makeAddr("alice"), + address(iToken0), + ALICE_IN, + address(iToken1), + ALICE_OUT, + expectingBytecode("alice", alice) + ), + addFundedOrder( + makeAddr("bob"), address(iToken1), BOB_IN, address(iToken0), BOB_OUT, expectingBytecode("bob", bob) + ) + ); } function boundPk(uint256 pk) internal pure returns (uint256) { return bound(pk, 1, SECP256K1_ORDER - 1); } + function clearConfig() internal pure returns (ClearConfigV2 memory) { + return ClearConfigV2(0, 0, 0, 0, bytes32(uint256(0xc1)), bytes32(uint256(0xc2))); + } + /// forge-config: default.fuzz.runs = 32 - function testClearRoutesEachSignedContextToItsOwnOrder( - uint256 aliceSignerPk, - bytes32 aliceContent, - uint256 bobSignerPk, - bytes32 bobContent - ) external { - aliceSignerPk = boundPk(aliceSignerPk); - bobSignerPk = boundPk(bobSignerPk); - vm.assume(vm.addr(aliceSignerPk) != vm.addr(bobSignerPk)); - (OrderV4 memory aliceOrder, OrderV4 memory bobOrder) = - orders(aliceSignerPk, aliceContent, bobSignerPk, bobContent); - - iRaindex.clear4( - aliceOrder, - bobOrder, - ClearConfigV2(0, 0, 0, 0, bytes32(uint256(0xc1)), bytes32(uint256(0xc2))), - signedContext(aliceSignerPk, aliceContent), - signedContext(bobSignerPk, bobContent) - ); + function testClearRoutesEachSignedContextToItsOwnOrder(Expected memory alice, Expected memory bob) external { + alice.pk = boundPk(alice.pk); + bob.pk = boundPk(bob.pk); + vm.assume(vm.addr(alice.pk) != vm.addr(bob.pk)); + (OrderV4 memory aliceOrder, OrderV4 memory bobOrder) = orders(alice, bob); + + iRaindex.clear4(aliceOrder, bobOrder, clearConfig(), signedContext(alice), signedContext(bob)); assertTrue(iRaindex.vaultBalance2(aliceOrder.owner, address(iToken0), ALICE_IN).gt(LibDecimalFloat.FLOAT_ZERO)); assertTrue(iRaindex.vaultBalance2(bobOrder.owner, address(iToken1), BOB_IN).gt(LibDecimalFloat.FLOAT_ZERO)); } /// forge-config: default.fuzz.runs = 32 - function testClearRevertsWhenSignedContextsAreSwapped( - uint256 aliceSignerPk, - bytes32 aliceContent, - uint256 bobSignerPk, - bytes32 bobContent - ) external { - aliceSignerPk = boundPk(aliceSignerPk); - bobSignerPk = boundPk(bobSignerPk); - vm.assume(vm.addr(aliceSignerPk) != vm.addr(bobSignerPk)); - (OrderV4 memory aliceOrder, OrderV4 memory bobOrder) = - orders(aliceSignerPk, aliceContent, bobSignerPk, bobContent); - ClearConfigV2 memory clearConfig = ClearConfigV2(0, 0, 0, 0, bytes32(uint256(0xc1)), bytes32(uint256(0xc2))); - SignedContextV1[] memory aliceSignedContext = signedContext(aliceSignerPk, aliceContent); - SignedContextV1[] memory bobSignedContext = signedContext(bobSignerPk, bobContent); + function testClearRevertsWhenSignedContextsAreSwapped(Expected memory alice, Expected memory bob) external { + alice.pk = boundPk(alice.pk); + bob.pk = boundPk(bob.pk); + vm.assume(vm.addr(alice.pk) != vm.addr(bob.pk)); + (OrderV4 memory aliceOrder, OrderV4 memory bobOrder) = orders(alice, bob); + SignedContextV2[] memory aliceSignedContext = signedContext(alice); + SignedContextV2[] memory bobSignedContext = signedContext(bob); vm.expectRevert("alice signer"); - iRaindex.clear4(aliceOrder, bobOrder, clearConfig, bobSignedContext, aliceSignedContext); + iRaindex.clear4(aliceOrder, bobOrder, clearConfig(), bobSignedContext, aliceSignedContext); + } + + /// Same signer and content for both orders, so only the domain tells the + /// two signed contexts apart. + /// forge-config: default.fuzz.runs = 32 + function testClearRevertsWhenDomainsAreSwapped(uint256 pk, bytes32 aliceDomain, bytes32 bobDomain, bytes32 content) + external + { + vm.assume(aliceDomain != bobDomain); + pk = boundPk(pk); + Expected memory alice = Expected(pk, aliceDomain, content); + Expected memory bob = Expected(pk, bobDomain, content); + (OrderV4 memory aliceOrder, OrderV4 memory bobOrder) = orders(alice, bob); + SignedContextV2[] memory aliceSignedContext = signedContext(alice); + SignedContextV2[] memory bobSignedContext = signedContext(bob); + + vm.expectRevert("alice domain"); + iRaindex.clear4(aliceOrder, bobOrder, clearConfig(), bobSignedContext, aliceSignedContext); } function testClear3SelectorIsRemoved() external { diff --git a/test/concrete/raindex/RaindexV6.clear.zeroAmount.t.sol b/test/concrete/raindex/RaindexV6.clear.zeroAmount.t.sol index 0a8d25e0e1..cfca4454bf 100644 --- a/test/concrete/raindex/RaindexV6.clear.zeroAmount.t.sol +++ b/test/concrete/raindex/RaindexV6.clear.zeroAmount.t.sol @@ -6,8 +6,8 @@ import {RaindexV6ExternalRealTest} from "test/util/abstract/RaindexV6ExternalRea import { OrderConfigV4, OrderV4, - TaskV2, - SignedContextV1, + TaskV3, + SignedContextV2, ClearConfigV2 } from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {LibTestAddOrder} from "test/util/lib/LibTestAddOrder.sol"; @@ -41,13 +41,13 @@ contract RaindexV6ClearZeroAmountTest is RaindexV6ExternalRealTest { OrderV4(bob, configBob.evaluable, configBob.validInputs, configBob.validOutputs, configBob.nonce); vm.prank(alice); - iRaindex.addOrder4(configAlice, new TaskV2[](0)); + iRaindex.addOrder5(configAlice, new TaskV3[](0)); vm.prank(bob); - iRaindex.addOrder4(configBob, new TaskV2[](0)); + iRaindex.addOrder5(configBob, new TaskV3[](0)); vm.expectRevert(ClearZeroAmount.selector); iRaindex.clear4( - orderAlice, orderBob, ClearConfigV2(0, 0, 0, 0, 0, 0), new SignedContextV1[](0), new SignedContextV1[](0) + orderAlice, orderBob, ClearConfigV2(0, 0, 0, 0, 0, 0), new SignedContextV2[](0), new SignedContextV2[](0) ); } } diff --git a/test/concrete/raindex/RaindexV6.deposit.entask.t.sol b/test/concrete/raindex/RaindexV6.deposit.entask.t.sol index ee3bf61ae9..670a1b8a1f 100644 --- a/test/concrete/raindex/RaindexV6.deposit.entask.t.sol +++ b/test/concrete/raindex/RaindexV6.deposit.entask.t.sol @@ -6,8 +6,8 @@ import {RaindexV6ExternalRealTest, LibDecimalFloat, Float} from "test/util/abstr import { OrderConfigV4, EvaluableV4, - TaskV2, - SignedContextV1 + TaskV3, + SignedContextV2 } from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {IERC20} from "@openzeppelin-contracts-5.7.0/token/ERC20/IERC20.sol"; import {IERC20Metadata} from "@openzeppelin-contracts-5.7.0/token/ERC20/extensions/IERC20Metadata.sol"; @@ -54,13 +54,13 @@ contract RaindexV6DepositEnactTest is RaindexV6ExternalRealTest { abi.encode(true) ); - TaskV2[] memory actions = new TaskV2[](evalStrings.length); + TaskV3[] memory actions = new TaskV3[](evalStrings.length); for (uint256 i = 0; i < evalStrings.length; i++) { actions[i] = - TaskV2(EvaluableV4(iInterpreter, iStore, iParserV2.parse2(evalStrings[i])), new SignedContextV1[](0)); + TaskV3(EvaluableV4(iInterpreter, iStore, iParserV2.parse2(evalStrings[i])), new SignedContextV2[](0)); } vm.record(); - iRaindex.deposit4(address(iToken0), vaultId, amount, actions); + iRaindex.deposit5(address(iToken0), vaultId, amount, actions); checkReentrancyRW(); (bytes32[] memory reads, bytes32[] memory writes) = vm.accesses(address(iStore)); assert(reads.length == expectedReads); @@ -274,12 +274,12 @@ contract RaindexV6DepositEnactTest is RaindexV6ExternalRealTest { bytes[] memory evals = new bytes[](1); evals[0] = bytes(":ensure(0 \"revert in action\");"); - TaskV2[] memory actions = evalsToActions(evals); + TaskV3[] memory actions = evalsToActions(evals); assertTrue(iRaindex.vaultBalance2(alice, address(iToken0), vaultId).isZero()); vm.expectRevert("revert in action"); - iRaindex.deposit4(address(iToken0), vaultId, amount, actions); + iRaindex.deposit5(address(iToken0), vaultId, amount, actions); assertTrue(iRaindex.vaultBalance2(alice, address(iToken0), vaultId).isZero()); } diff --git a/test/concrete/raindex/RaindexV6.deposit.t.sol b/test/concrete/raindex/RaindexV6.deposit.t.sol index 4c5d0d903e..91d59546b5 100644 --- a/test/concrete/raindex/RaindexV6.deposit.t.sol +++ b/test/concrete/raindex/RaindexV6.deposit.t.sol @@ -5,7 +5,7 @@ pragma solidity =0.8.25; import {stdError} from "forge-std-1.17.0/src/Test.sol"; import {REVERTING_MOCK_BYTECODE, CONSOLE_ADDRESS} from "test/util/lib/LibTestConstants.sol"; import {RaindexV6ExternalMockTest} from "test/util/abstract/RaindexV6ExternalMockTest.sol"; -import {TaskV2, EvaluableV4, IRaindexV7} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; +import {TaskV3, EvaluableV4, IRaindexV7} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {Reenteroor} from "test/util/concrete/Reenteroor.sol"; import {IERC20} from "@openzeppelin-contracts-5.7.0/token/ERC20/IERC20.sol"; import {LibDecimalFloat, Float} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; @@ -32,7 +32,7 @@ contract RaindexV6DepositTest is RaindexV6ExternalMockTest { Float amount = LibDecimalFloat.fromFixedDecimalLosslessPacked(amount18, 18); - iRaindex.deposit4(address(iToken0), vaultId, amount, new TaskV2[](0)); + iRaindex.deposit5(address(iToken0), vaultId, amount, new TaskV3[](0)); assertTrue(iRaindex.vaultBalance2(depositor, address(iToken0), vaultId).eq(amount)); } @@ -44,7 +44,7 @@ contract RaindexV6DepositTest is RaindexV6ExternalMockTest { vm.expectRevert( abi.encodeWithSelector(IRaindexV7.ZeroDepositAmount.selector, address(depositor), address(iToken0), vaultId) ); - iRaindex.deposit4(address(iToken0), vaultId, LibDecimalFloat.packLossless(0, 0), new TaskV2[](0)); + iRaindex.deposit5(address(iToken0), vaultId, LibDecimalFloat.packLossless(0, 0), new TaskV3[](0)); } /// Depositing a negative amount is caught by the same non-positive guard as @@ -64,7 +64,7 @@ contract RaindexV6DepositTest is RaindexV6ExternalMockTest { vm.expectRevert( abi.encodeWithSelector(IRaindexV7.ZeroDepositAmount.selector, address(depositor), address(iToken0), vaultId) ); - iRaindex.deposit4(address(iToken0), vaultId, amount, new TaskV2[](0)); + iRaindex.deposit5(address(iToken0), vaultId, amount, new TaskV3[](0)); } /// Depositing vaultID of zero should revert. @@ -72,7 +72,7 @@ contract RaindexV6DepositTest is RaindexV6ExternalMockTest { vm.assume(amount.gt(Float.wrap(0))); vm.prank(depositor); vm.expectRevert(abi.encodeWithSelector(IRaindexV7.ZeroVaultId.selector, address(depositor), address(token))); - iRaindex.deposit4(token, bytes32(0), amount, new TaskV2[](0)); + iRaindex.deposit5(token, bytes32(0), amount, new TaskV3[](0)); } /// Test a warm deposit, which is the best case scenario for gas. In this @@ -86,8 +86,8 @@ contract RaindexV6DepositTest is RaindexV6ExternalMockTest { abi.encodeWithSelector(IERC20.transferFrom.selector, address(this), address(iRaindex), 1), abi.encode(true) ); - iRaindex.deposit4( - address(iToken0), bytes32(uint256(0x01)), LibDecimalFloat.packLossless(1, -18), new TaskV2[](0) + iRaindex.deposit5( + address(iToken0), bytes32(uint256(0x01)), LibDecimalFloat.packLossless(1, -18), new TaskV3[](0) ); vm.mockCall( address(iToken0), @@ -95,8 +95,8 @@ contract RaindexV6DepositTest is RaindexV6ExternalMockTest { abi.encode(true) ); vm.resumeGasMetering(); - iRaindex.deposit4( - address(iToken0), bytes32(uint256(0x01)), LibDecimalFloat.packLossless(1, -18), new TaskV2[](0) + iRaindex.deposit5( + address(iToken0), bytes32(uint256(0x01)), LibDecimalFloat.packLossless(1, -18), new TaskV3[](0) ); } @@ -112,8 +112,8 @@ contract RaindexV6DepositTest is RaindexV6ExternalMockTest { abi.encode(true) ); vm.resumeGasMetering(); - iRaindex.deposit4( - address(iToken0), bytes32(uint256(0x01)), LibDecimalFloat.packLossless(1, -18), new TaskV2[](0) + iRaindex.deposit5( + address(iToken0), bytes32(uint256(0x01)), LibDecimalFloat.packLossless(1, -18), new TaskV3[](0) ); } @@ -127,7 +127,7 @@ contract RaindexV6DepositTest is RaindexV6ExternalMockTest { // The token contract always reverts when not mocked. vm.prank(depositor); vm.expectRevert(); - iRaindex.deposit4(address(iToken0), vaultId, amount, new TaskV2[](0)); + iRaindex.deposit5(address(iToken0), vaultId, amount, new TaskV3[](0)); // Mocking the token to return false should also revert. vm.prank(depositor); @@ -138,7 +138,7 @@ contract RaindexV6DepositTest is RaindexV6ExternalMockTest { ); // This error string appears when the call completes but returns false. vm.expectRevert(abi.encodeWithSelector(SafeERC20.SafeERC20FailedOperation.selector, address(iToken0))); - iRaindex.deposit4(address(iToken0), vaultId, amount, new TaskV2[](0)); + iRaindex.deposit5(address(iToken0), vaultId, amount, new TaskV3[](0)); } /// Defines a deposit to be used in testDepositMany. @@ -194,7 +194,7 @@ contract RaindexV6DepositTest is RaindexV6ExternalMockTest { emit DepositV2(actions[i].depositor, actions[i].token, actions[i].vaultId, actions[i].amount18); vm.record(); vm.recordLogs(); - iRaindex.deposit4(actions[i].token, actions[i].vaultId, actions[i].amount, new TaskV2[](0)); + iRaindex.deposit5(actions[i].token, actions[i].vaultId, actions[i].amount, new TaskV3[](0)); (bytes32[] memory reads, bytes32[] memory writes) = vm.accesses(address(iRaindex)); assertEq(vm.getRecordedLogs().length, 1, "logs"); // - reentrancy guard x3 @@ -226,7 +226,7 @@ contract RaindexV6DepositTest is RaindexV6ExternalMockTest { vm.expectEmit(false, false, false, true); emit DepositV2(depositor, address(iToken0), vaultId, amount18); Float amount = LibDecimalFloat.fromFixedDecimalLosslessPacked(amount18, 18); - iRaindex.deposit4(address(iToken0), vaultId, amount, new TaskV2[](0)); + iRaindex.deposit5(address(iToken0), vaultId, amount, new TaskV3[](0)); } /// Depositing should NOT allow reentrancy. @@ -251,9 +251,9 @@ contract RaindexV6DepositTest is RaindexV6ExternalMockTest { address(reenteroor), abi.encodeWithSelector(IERC20Metadata.decimals.selector), abi.encode(uint8(18)) ); reenteroor.reenterWith( - abi.encodeWithSelector(IRaindexV7.deposit4.selector, reToken, reVaultId, reAmount, new TaskV2[](0)) + abi.encodeWithSelector(IRaindexV7.deposit5.selector, reToken, reVaultId, reAmount, new TaskV3[](0)) ); vm.expectRevert(abi.encodeWithSelector(ReentrancyGuard.ReentrancyGuardReentrantCall.selector)); - iRaindex.deposit4(address(reenteroor), vaultId, amount, new TaskV2[](0)); + iRaindex.deposit5(address(reenteroor), vaultId, amount, new TaskV3[](0)); } } diff --git a/test/concrete/raindex/RaindexV6.depositWithdrawHarness.t.sol b/test/concrete/raindex/RaindexV6.depositWithdrawHarness.t.sol index def58ea6e6..1c169b9a1a 100644 --- a/test/concrete/raindex/RaindexV6.depositWithdrawHarness.t.sol +++ b/test/concrete/raindex/RaindexV6.depositWithdrawHarness.t.sol @@ -8,14 +8,14 @@ import {IERC20} from "@openzeppelin-contracts-5.7.0/token/ERC20/IERC20.sol"; import {MockToken} from "test/util/concrete/MockToken.sol"; import {LibRainDeploy} from "rain-deploy-0.1.22/src/lib/LibRainDeploy.sol"; import {LibTOFUTokenDecimals} from "rain-tofu-erc20-decimals-0.1.4/src/lib/LibTOFUTokenDecimals.sol"; -import {TaskV2, IRaindexV7} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; +import {TaskV3, IRaindexV7} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {IRaindexV7Stub} from "test/util/abstract/IRaindexV7Stub.sol"; import {IERC20Metadata} from "@openzeppelin-contracts-5.7.0/token/ERC20/extensions/IERC20Metadata.sol"; import {TOFUOutcome} from "rain-tofu-erc20-decimals-0.1.4/src/lib/LibTOFUTokenDecimals.sol"; import {ITOFUTokenDecimals} from "rain-tofu-erc20-decimals-0.1.4/src/interface/ITOFUTokenDecimals.sol"; /// @title RaindexV6DepositWithdrawHarnessTest -/// @notice Solvency-critical accounting for the external deposit4/withdraw4 +/// @notice Solvency-critical accounting for the external deposit5/withdraw5 /// entrypoints, exercised against REAL ERC20 tokens (not always-true mocks) via /// a freshly-compiled harness so source mutations are live. Pins: /// - withdraw capping at the vault balance (`targetAmount.min(balance)`), @@ -29,7 +29,7 @@ contract RaindexV6DepositWithdrawHarnessTest is Test, IRaindexV7Stub { bytes32 internal constant VAULT = bytes32(uint256(1)); function setUp() external { - // deposit4/withdraw4 read token decimals via the deployed TOFU contract. + // deposit5/withdraw5 read token decimals via the deployed TOFU contract. LibRainDeploy.etchZoltuFactory(vm); LibRainDeploy.deployZoltu(LibTOFUTokenDecimals.TOFU_DECIMALS_EXPECTED_CREATION_CODE); @@ -46,7 +46,7 @@ contract RaindexV6DepositWithdrawHarnessTest is Test, IRaindexV7Stub { token.approve(address(harness), amount18); Float amount = LibDecimalFloat.fromFixedDecimalLosslessPacked(amount18, 18); vm.prank(alice); - harness.deposit4(address(token), VAULT, amount, new TaskV2[](0)); + harness.deposit5(address(token), VAULT, amount, new TaskV3[](0)); return amount; } @@ -77,7 +77,7 @@ contract RaindexV6DepositWithdrawHarnessTest is Test, IRaindexV7Stub { vm.expectEmit(false, false, false, true); emit WithdrawV2(alice, address(sToken), VAULT, targetAmount, depositAmount, depositAmount18); vm.prank(alice); - harness.withdraw4(address(sToken), VAULT, targetAmount, new TaskV2[](0)); + harness.withdraw5(address(sToken), VAULT, targetAmount, new TaskV3[](0)); // Exactly the balance (5e18) was returned to alice, never the target. assertEq(sToken.balanceOf(alice), depositAmount18, "alice received exactly the balance"); @@ -107,7 +107,7 @@ contract RaindexV6DepositWithdrawHarnessTest is Test, IRaindexV7Stub { vm.expectEmit(false, false, false, true); emit DepositV2(alice, address(sToken), VAULT, amount6); vm.prank(alice); - harness.deposit4(address(sToken), VAULT, amount, new TaskV2[](0)); + harness.deposit5(address(sToken), VAULT, amount, new TaskV3[](0)); // The vault is credited exactly 7 whole tokens, and 7e6 base units moved. assertTrue(harness.vaultBalance2(alice, address(sToken), VAULT).eq(amount), "vault credited exact deposit"); @@ -140,7 +140,7 @@ contract RaindexV6DepositWithdrawHarnessTest is Test, IRaindexV7Stub { address alice = makeAddr("alice"); vm.prank(alice); vm.expectRevert(abi.encodeWithSelector(IRaindexV7.ZeroDepositAmount.selector, alice, address(sToken), VAULT)); - harness.deposit4(address(sToken), VAULT, Float.wrap(0), new TaskV2[](0)); + harness.deposit5(address(sToken), VAULT, Float.wrap(0), new TaskV3[](0)); } /// A withdraw target of exactly zero reverts `ZeroWithdrawTargetAmount`. Pins @@ -152,7 +152,7 @@ contract RaindexV6DepositWithdrawHarnessTest is Test, IRaindexV7Stub { vm.expectRevert( abi.encodeWithSelector(IRaindexV7.ZeroWithdrawTargetAmount.selector, alice, address(sToken), VAULT) ); - harness.withdraw4(address(sToken), VAULT, Float.wrap(0), new TaskV2[](0)); + harness.withdraw5(address(sToken), VAULT, Float.wrap(0), new TaskV3[](0)); } /// A partial withdraw (target < balance) moves EXACTLY the target out, reduces @@ -168,7 +168,7 @@ contract RaindexV6DepositWithdrawHarnessTest is Test, IRaindexV7Stub { vm.expectEmit(false, false, false, true); emit WithdrawV2(alice, address(sToken), VAULT, target, target, 4e18); vm.prank(alice); - harness.withdraw4(address(sToken), VAULT, target, new TaskV2[](0)); + harness.withdraw5(address(sToken), VAULT, target, new TaskV3[](0)); assertEq(sToken.balanceOf(alice), 4e18, "alice received exact target"); assertEq(sToken.balanceOf(address(harness)), 6e18, "harness retains remainder"); @@ -198,7 +198,7 @@ contract RaindexV6DepositWithdrawHarnessTest is Test, IRaindexV7Stub { vm.expectEmit(false, false, false, true); emit DepositV2(alice, address(sToken), VAULT, 2); vm.prank(alice); - harness.deposit4(address(sToken), VAULT, amount, new TaskV2[](0)); + harness.deposit5(address(sToken), VAULT, amount, new TaskV3[](0)); // Exactly 2 base units moved (rounded UP from the 1.5 base-unit target), // never the truncated 1. @@ -225,7 +225,7 @@ contract RaindexV6DepositWithdrawHarnessTest is Test, IRaindexV7Stub { sToken.approve(address(harness), 1_000_000); Float seed = LibDecimalFloat.packLossless(1, 0); vm.prank(alice); - harness.deposit4(address(sToken), VAULT, seed, new TaskV2[](0)); + harness.deposit5(address(sToken), VAULT, seed, new TaskV3[](0)); // 1.5 base units at 6 decimals: lossy, truncates DOWN to 1 base unit pushed. Float target = LibDecimalFloat.packLossless(15, -7); @@ -234,7 +234,7 @@ contract RaindexV6DepositWithdrawHarnessTest is Test, IRaindexV7Stub { vm.expectEmit(false, false, false, true); emit WithdrawV2(alice, address(sToken), VAULT, target, target, 1); vm.prank(alice); - harness.withdraw4(address(sToken), VAULT, target, new TaskV2[](0)); + harness.withdraw5(address(sToken), VAULT, target, new TaskV3[](0)); // Exactly 1 base unit returned (truncated DOWN from 1.5), never the // rounded-up 2. Alice held 0 after the seed deposit, so now holds 1. @@ -260,7 +260,7 @@ contract RaindexV6DepositWithdrawHarnessTest is Test, IRaindexV7Stub { vm.expectEmit(false, false, false, true); emit WithdrawV2(alice, address(sToken), VAULT, target, Float.wrap(0), 0); vm.prank(alice); - harness.withdraw4(address(sToken), VAULT, target, new TaskV2[](0)); + harness.withdraw5(address(sToken), VAULT, target, new TaskV3[](0)); assertEq(sToken.balanceOf(alice), 0, "alice received nothing"); assertTrue(harness.vaultBalance2(alice, address(sToken), VAULT).isZero(), "vault stays empty"); @@ -323,7 +323,7 @@ contract RaindexV6DepositWithdrawHarnessTest is Test, IRaindexV7Stub { vm.prank(owner); sToken.approve(address(harness), 1); vm.prank(owner); - harness.deposit4(address(sToken), VAULT, LibDecimalFloat.packLossless(1, -18), new TaskV2[](0)); + harness.deposit5(address(sToken), VAULT, LibDecimalFloat.packLossless(1, -18), new TaskV3[](0)); // The token now reports DIFFERENT decimals than were stored. vm.mockCall(address(sToken), abi.encodeWithSelector(IERC20Metadata.decimals.selector), abi.encode(uint8(6))); @@ -349,7 +349,7 @@ contract RaindexV6DepositWithdrawHarnessTest is Test, IRaindexV7Stub { vm.prank(owner); sToken.approve(address(harness), 5e18); vm.prank(owner); - harness.deposit4(address(sToken), VAULT, LibDecimalFloat.packLossless(1, -18), new TaskV2[](0)); + harness.deposit5(address(sToken), VAULT, LibDecimalFloat.packLossless(1, -18), new TaskV3[](0)); // Owner still holds 5e18 - 1 after the seed deposit; approval reduced by 1. // A subsequent consistent read returns min(balance, approval) without revert. @@ -374,7 +374,7 @@ contract RaindexV6DepositWithdrawHarnessTest is Test, IRaindexV7Stub { // First deposit seeds the TOFU store with 18 decimals. vm.prank(owner); - harness.deposit4(address(sToken), VAULT, LibDecimalFloat.packLossless(1, 0), new TaskV2[](0)); + harness.deposit5(address(sToken), VAULT, LibDecimalFloat.packLossless(1, 0), new TaskV3[](0)); // The token now reports DIFFERENT decimals than were stored. vm.mockCall(address(sToken), abi.encodeWithSelector(IERC20Metadata.decimals.selector), abi.encode(uint8(6))); @@ -385,7 +385,7 @@ contract RaindexV6DepositWithdrawHarnessTest is Test, IRaindexV7Stub { ) ); vm.prank(owner); - harness.deposit4(address(sToken), VAULT, LibDecimalFloat.packLossless(1, 0), new TaskV2[](0)); + harness.deposit5(address(sToken), VAULT, LibDecimalFloat.packLossless(1, 0), new TaskV3[](0)); } /// A withdraw MUST revert `TokenDecimalsReadFailure(Inconsistent)` when the @@ -401,7 +401,7 @@ contract RaindexV6DepositWithdrawHarnessTest is Test, IRaindexV7Stub { // Seed the TOFU store and a withdrawable internal balance. vm.prank(owner); - harness.deposit4(address(sToken), VAULT, LibDecimalFloat.packLossless(5, 0), new TaskV2[](0)); + harness.deposit5(address(sToken), VAULT, LibDecimalFloat.packLossless(5, 0), new TaskV3[](0)); // The token now reports DIFFERENT decimals than were stored. vm.mockCall(address(sToken), abi.encodeWithSelector(IERC20Metadata.decimals.selector), abi.encode(uint8(6))); @@ -412,6 +412,6 @@ contract RaindexV6DepositWithdrawHarnessTest is Test, IRaindexV7Stub { ) ); vm.prank(owner); - harness.withdraw4(address(sToken), VAULT, LibDecimalFloat.packLossless(1, 0), new TaskV2[](0)); + harness.withdraw5(address(sToken), VAULT, LibDecimalFloat.packLossless(1, 0), new TaskV3[](0)); } } diff --git a/test/concrete/raindex/RaindexV6.doPost.fresh.t.sol b/test/concrete/raindex/RaindexV6.doPost.fresh.t.sol index 05afdc7600..5af9a67f5a 100644 --- a/test/concrete/raindex/RaindexV6.doPost.fresh.t.sol +++ b/test/concrete/raindex/RaindexV6.doPost.fresh.t.sol @@ -7,24 +7,24 @@ import { OrderConfigV4, OrderV4, EvaluableV4, - TaskV2, - SignedContextV1 + TaskV3, + SignedContextV2 } from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {LibTestAddOrder} from "test/util/lib/LibTestAddOrder.sol"; import {LibOrder} from "../../../src/lib/LibOrder.sol"; /// @title RaindexV6DoPostFreshTest /// @notice Mutation-validating coverage for the `LibRaindex.doPost` task loop as -/// exercised through `entask2`: namespace = msg.sender, empty-bytecode skip, and +/// exercised through `entask3`: namespace = msg.sender, empty-bytecode skip, and /// the writes -> `store.set` step. Runs against the freshly compiled source. contract RaindexV6DoPostFreshTest is RaindexV6FreshTest { using LibOrder for OrderV4; - function actionsFor(bytes[] memory evalStrings) internal view returns (TaskV2[] memory) { - TaskV2[] memory actions = new TaskV2[](evalStrings.length); + function actionsFor(bytes[] memory evalStrings) internal view returns (TaskV3[] memory) { + TaskV3[] memory actions = new TaskV3[](evalStrings.length); for (uint256 i = 0; i < evalStrings.length; i++) { actions[i] = - TaskV2(EvaluableV4(iInterpreter, iStore, iParserV2.parse2(evalStrings[i])), new SignedContextV1[](0)); + TaskV3(EvaluableV4(iInterpreter, iStore, iParserV2.parse2(evalStrings[i])), new SignedContextV2[](0)); } return actions; } @@ -37,7 +37,7 @@ contract RaindexV6DoPostFreshTest is RaindexV6FreshTest { evals[0] = bytes(":set(1 2);"); evals[1] = bytes(":ensure(equal-to(get(1) 2) \"set works\");"); vm.prank(alice); - iRaindex.entask2(actionsFor(evals)); + iRaindex.entask3(actionsFor(evals)); } /// State written in one entask call MUST persist into a later entask call by @@ -47,12 +47,12 @@ contract RaindexV6DoPostFreshTest is RaindexV6FreshTest { bytes[] memory writeEvals = new bytes[](1); writeEvals[0] = bytes(":set(5 9);"); vm.prank(alice); - iRaindex.entask2(actionsFor(writeEvals)); + iRaindex.entask3(actionsFor(writeEvals)); bytes[] memory readEvals = new bytes[](1); readEvals[0] = bytes(":ensure(equal-to(get(5) 9) \"persisted\");"); vm.prank(alice); - iRaindex.entask2(actionsFor(readEvals)); + iRaindex.entask3(actionsFor(readEvals)); } /// The store namespace is keyed by msg.sender: a write by alice MUST NOT be @@ -66,23 +66,23 @@ contract RaindexV6DoPostFreshTest is RaindexV6FreshTest { bytes[] memory writeEvals = new bytes[](1); writeEvals[0] = bytes(":set(7 42);"); vm.prank(alice); - iRaindex.entask2(actionsFor(writeEvals)); + iRaindex.entask3(actionsFor(writeEvals)); // Alice can read her own write. bytes[] memory aliceRead = new bytes[](1); aliceRead[0] = bytes(":ensure(equal-to(get(7) 42) \"alice sees\");"); vm.prank(alice); - iRaindex.entask2(actionsFor(aliceRead)); + iRaindex.entask3(actionsFor(aliceRead)); // Bob CANNOT see alice's write: get(7) is 0 in bob's namespace, so the // equal-to-42 ensure reverts. Build the actions BEFORE arming // expectRevert so the parse call is not what expectRevert catches. bytes[] memory bobRead = new bytes[](1); bobRead[0] = bytes(":ensure(equal-to(get(7) 42) \"bob must not see\");"); - TaskV2[] memory bobActions = actionsFor(bobRead); + TaskV3[] memory bobActions = actionsFor(bobRead); vm.prank(bob); vm.expectRevert(bytes("bob must not see")); - iRaindex.entask2(bobActions); + iRaindex.entask3(bobActions); } /// A task with empty bytecode MUST be skipped (no eval, no revert). An empty @@ -93,29 +93,29 @@ contract RaindexV6DoPostFreshTest is RaindexV6FreshTest { /// forge-config: default.fuzz.runs = 20 function testFreshEntaskEmptyBytecodeSkipped(address alice) external { // Empty bytecode task: skipped. By itself this MUST NOT revert. - TaskV2[] memory emptyActions = new TaskV2[](1); - emptyActions[0] = TaskV2(EvaluableV4(iInterpreter, iStore, hex""), new SignedContextV1[](0)); + TaskV3[] memory emptyActions = new TaskV3[](1); + emptyActions[0] = TaskV3(EvaluableV4(iInterpreter, iStore, hex""), new SignedContextV2[](0)); vm.prank(alice); - iRaindex.entask2(emptyActions); + iRaindex.entask3(emptyActions); // An empty task followed by a reverting task: the empty one is skipped // and the reverting one still runs, so the call reverts. Build the // actions (including the parse) BEFORE arming expectRevert. - TaskV2[] memory mixed = new TaskV2[](2); - mixed[0] = TaskV2(EvaluableV4(iInterpreter, iStore, hex""), new SignedContextV1[](0)); - mixed[1] = TaskV2( - EvaluableV4(iInterpreter, iStore, iParserV2.parse2(bytes(":ensure(0 \"runs\");"))), new SignedContextV1[](0) + TaskV3[] memory mixed = new TaskV3[](2); + mixed[0] = TaskV3(EvaluableV4(iInterpreter, iStore, hex""), new SignedContextV2[](0)); + mixed[1] = TaskV3( + EvaluableV4(iInterpreter, iStore, iParserV2.parse2(bytes(":ensure(0 \"runs\");"))), new SignedContextV2[](0) ); vm.prank(alice); vm.expectRevert(bytes("runs")); - iRaindex.entask2(mixed); + iRaindex.entask3(mixed); } - /// entask2 with no tasks is a clean no-op. + /// entask3 with no tasks is a clean no-op. /// forge-config: default.fuzz.runs = 10 function testFreshEntaskEmptyArrayNoop(address alice) external { vm.prank(alice); - iRaindex.entask2(new TaskV2[](0)); + iRaindex.entask3(new TaskV3[](0)); } /// A revert in any entask task MUST revert the whole call (per the NatSpec: @@ -128,10 +128,10 @@ contract RaindexV6DoPostFreshTest is RaindexV6FreshTest { evals[0] = bytes("_:1;"); evals[1] = bytes(":ensure(0 \"second reverts\");"); // Build the actions (parse) BEFORE arming expectRevert so it catches the - // entask2 revert, not the parse call. - TaskV2[] memory actions = actionsFor(evals); + // entask3 revert, not the parse call. + TaskV3[] memory actions = actionsFor(evals); vm.prank(alice); vm.expectRevert(bytes("second reverts")); - iRaindex.entask2(actions); + iRaindex.entask3(actions); } } diff --git a/test/concrete/raindex/RaindexV6.entask.t.sol b/test/concrete/raindex/RaindexV6.entask.t.sol index 485b2cb0af..d430fa3e76 100644 --- a/test/concrete/raindex/RaindexV6.entask.t.sol +++ b/test/concrete/raindex/RaindexV6.entask.t.sol @@ -6,8 +6,8 @@ import {RaindexV6ExternalRealTest} from "test/util/abstract/RaindexV6ExternalRea import { OrderConfigV4, EvaluableV4, - TaskV2, - SignedContextV1 + TaskV3, + SignedContextV2 } from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; contract RaindexV6EnactTest is RaindexV6ExternalRealTest { @@ -29,13 +29,13 @@ contract RaindexV6EnactTest is RaindexV6ExternalRealTest { internal { vm.startPrank(owner); - TaskV2[] memory actions = new TaskV2[](evalStrings.length); + TaskV3[] memory actions = new TaskV3[](evalStrings.length); for (uint256 i = 0; i < evalStrings.length; i++) { actions[i] = - TaskV2(EvaluableV4(iInterpreter, iStore, iParserV2.parse2(evalStrings[i])), new SignedContextV1[](0)); + TaskV3(EvaluableV4(iInterpreter, iStore, iParserV2.parse2(evalStrings[i])), new SignedContextV2[](0)); } vm.record(); - iRaindex.entask2(actions); + iRaindex.entask3(actions); checkReentrancyRW(); (bytes32[] memory reads, bytes32[] memory writes) = vm.accesses(address(iStore)); assert(reads.length == expectedReads); diff --git a/test/concrete/raindex/RaindexV6.errorSelector.t.sol b/test/concrete/raindex/RaindexV6.errorSelector.t.sol index fa0424823f..922011c8f0 100644 --- a/test/concrete/raindex/RaindexV6.errorSelector.t.sol +++ b/test/concrete/raindex/RaindexV6.errorSelector.t.sol @@ -9,11 +9,11 @@ import { IOV2, EvaluableV4, ClearConfigV2, - SignedContextV1, - TaskV2 + SignedContextV2, + TaskV3 } from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; -import {IInterpreterV4} from "rainlang-interface-0.2.13/src/interface/IInterpreterV4.sol"; -import {IInterpreterStoreV3} from "rainlang-interface-0.2.13/src/interface/IInterpreterStoreV3.sol"; +import {IInterpreterV4} from "rainlang-interface-0.2.14/src/interface/IInterpreterV4.sol"; +import {IInterpreterStoreV3} from "rainlang-interface-0.2.14/src/interface/IInterpreterStoreV3.sol"; /// @title RaindexV6ErrorSelectorTest /// @notice Signature strings are the oracle for the revert data the deployed @@ -44,8 +44,8 @@ contract RaindexV6ErrorSelectorTest is Test { alice, bob, ClearConfigV2(0, 0, 0, 0, bytes32(0), bytes32(0)), - new SignedContextV1[](0), - new SignedContextV1[](0) + new SignedContextV2[](0), + new SignedContextV2[](0) ); } @@ -53,7 +53,7 @@ contract RaindexV6ErrorSelectorTest is Test { vm.assume(owner != sender); vm.prank(sender); vm.expectRevert(abi.encodeWithSelector(bytes4(keccak256("NotOrderOwner(address)")), owner)); - raindex.removeOrder3(order(owner, address(1), address(2)), new TaskV2[](0)); + raindex.removeOrder4(order(owner, address(1), address(2)), new TaskV3[](0)); } function testClearSameOwnerRevertData(address owner) external { diff --git a/test/concrete/raindex/RaindexV6.multicall.t.sol b/test/concrete/raindex/RaindexV6.multicall.t.sol index 1942baf0e9..88f3f9e431 100644 --- a/test/concrete/raindex/RaindexV6.multicall.t.sol +++ b/test/concrete/raindex/RaindexV6.multicall.t.sol @@ -4,7 +4,7 @@ pragma solidity =0.8.25; import {IERC20} from "@openzeppelin-contracts-5.7.0/token/ERC20/IERC20.sol"; import {RaindexV6ExternalRealTest} from "test/util/abstract/RaindexV6ExternalRealTest.sol"; -import {IRaindexV7, TaskV2} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; +import {IRaindexV7, TaskV3} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {Float, LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; /// `multicall` is inherited from OpenZeppelin and not declared on the Raindex @@ -27,7 +27,7 @@ contract RaindexV6MulticallTest is RaindexV6ExternalRealTest { /// Two deposits to different vaults, bundled into a single `multicall`, /// both land and are credited to alice. The returned `results` array has - /// one (empty, since `deposit4` is void) entry per call. + /// one (empty, since `deposit5` is void) entry per call. function testMulticallBundledDepositsBothApply() external { Float amount1 = LibDecimalFloat.packLossless(3, 0); Float amount2 = LibDecimalFloat.packLossless(5, 0); @@ -41,9 +41,9 @@ contract RaindexV6MulticallTest is RaindexV6ExternalRealTest { bytes[] memory calls = new bytes[](2); calls[0] = - abi.encodeCall(IRaindexV7.deposit4, (address(iToken1), bytes32(uint256(0x01)), amount1, new TaskV2[](0))); + abi.encodeCall(IRaindexV7.deposit5, (address(iToken1), bytes32(uint256(0x01)), amount1, new TaskV3[](0))); calls[1] = - abi.encodeCall(IRaindexV7.deposit4, (address(iToken1), bytes32(uint256(0x02)), amount2, new TaskV2[](0))); + abi.encodeCall(IRaindexV7.deposit5, (address(iToken1), bytes32(uint256(0x02)), amount2, new TaskV3[](0))); vm.prank(iAlice); bytes[] memory results = IMulticall(address(iRaindex)).multicall(calls); @@ -79,9 +79,9 @@ contract RaindexV6MulticallTest is RaindexV6ExternalRealTest { bytes[] memory calls = new bytes[](2); calls[0] = - abi.encodeCall(IRaindexV7.deposit4, (address(iToken1), bytes32(uint256(0x01)), amount1, new TaskV2[](0))); + abi.encodeCall(IRaindexV7.deposit5, (address(iToken1), bytes32(uint256(0x01)), amount1, new TaskV3[](0))); calls[1] = - abi.encodeCall(IRaindexV7.deposit4, (address(iToken0), bytes32(uint256(0x02)), amount2, new TaskV2[](0))); + abi.encodeCall(IRaindexV7.deposit5, (address(iToken0), bytes32(uint256(0x02)), amount2, new TaskV3[](0))); vm.prank(iAlice); vm.expectRevert(); diff --git a/test/concrete/raindex/RaindexV6.orderMgmt.fresh.t.sol b/test/concrete/raindex/RaindexV6.orderMgmt.fresh.t.sol index bd71857591..217b276ac6 100644 --- a/test/concrete/raindex/RaindexV6.orderMgmt.fresh.t.sol +++ b/test/concrete/raindex/RaindexV6.orderMgmt.fresh.t.sol @@ -8,8 +8,8 @@ import { OrderV4, IOV2, EvaluableV4, - TaskV2, - SignedContextV1 + TaskV3, + SignedContextV2 } from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {IMetaV1_2} from "rain-metadata-0.1.43/src/interface/unstable/IMetaV1_2.sol"; import {META_MAGIC_NUMBER_V1} from "rain-metadata-0.1.43/src/lib/LibMeta.sol"; @@ -20,7 +20,7 @@ import {NotOrderOwner} from "../../../src/error/ErrRaindexV6.sol"; import {Strings} from "@openzeppelin-contracts-5.7.0/utils/Strings.sol"; /// @title RaindexV6OrderMgmtFreshTest -/// @notice Mutation-validating coverage for `addOrder4`, `removeOrder3` and the +/// @notice Mutation-validating coverage for `addOrder5`, `removeOrder4` and the /// post-action (doPost) entask path. Uses `RaindexV6FreshTest` so the freshly /// compiled `src/concrete/raindex/RaindexV6.sol` is the code under test (the /// pointer-etched harnesses run the committed runtime bytecode and are blind to @@ -32,16 +32,16 @@ contract RaindexV6OrderMgmtFreshTest is RaindexV6FreshTest, IMetaV1_2 { using Strings for uint256; /// The canonical two-source (calculate + handle IO) serialized bytecode that - /// `addOrder4`'s source-count guard accepts, so each test exercises the + /// `addOrder5`'s source-count guard accepts, so each test exercises the /// specific input/output/meta guard it targets rather than the source-count - /// guard. The runtime stack/IO checks are not reached by `addOrder4`. + /// guard. The runtime stack/IO checks are not reached by `addOrder5`. bytes constant CALC_BYTECODE = LibTestAddOrder.VALID_ORDER_BYTECODE; // ----------------------------------------------------------------------- - // addOrder4: input/output guards (A1, A2) + // addOrder5: input/output guards (A1, A2) // ----------------------------------------------------------------------- - /// addOrder4 MUST revert with `OrderNoInputs` when there are zero inputs, + /// addOrder5 MUST revert with `OrderNoInputs` when there are zero inputs, /// and MUST NOT record the order. The guard fires before everything else, /// so even a valid-output order with zero inputs reverts. /// forge-config: default.fuzz.runs = 20 @@ -57,7 +57,7 @@ contract RaindexV6OrderMgmtFreshTest is RaindexV6FreshTest, IMetaV1_2 { vm.prank(owner); vm.expectRevert(abi.encodeWithSelector(OrderNoInputs.selector)); - iRaindex.addOrder4(config, new TaskV2[](0)); + iRaindex.addOrder5(config, new TaskV3[](0)); assertFalse(iRaindex.orderExists(orderHash)); } @@ -76,11 +76,11 @@ contract RaindexV6OrderMgmtFreshTest is RaindexV6FreshTest, IMetaV1_2 { (, bytes32 orderHash) = LibTestAddOrder.expectedOrder(owner, config); vm.prank(owner); - assertTrue(iRaindex.addOrder4(config, new TaskV2[](0))); + assertTrue(iRaindex.addOrder5(config, new TaskV3[](0))); assertTrue(iRaindex.orderExists(orderHash)); } - /// addOrder4 MUST revert with `OrderNoOutputs` when there are zero outputs + /// addOrder5 MUST revert with `OrderNoOutputs` when there are zero outputs /// (inputs present), and MUST NOT record the order. /// forge-config: default.fuzz.runs = 20 function testFreshAddOrderNoOutputsReverts(address owner, OrderConfigV4 memory config) external { @@ -93,7 +93,7 @@ contract RaindexV6OrderMgmtFreshTest is RaindexV6FreshTest, IMetaV1_2 { (, bytes32 orderHash) = LibTestAddOrder.expectedOrder(owner, config); vm.prank(owner); vm.expectRevert(abi.encodeWithSelector(OrderNoOutputs.selector)); - iRaindex.addOrder4(config, new TaskV2[](0)); + iRaindex.addOrder5(config, new TaskV3[](0)); assertFalse(iRaindex.orderExists(orderHash)); } @@ -112,11 +112,11 @@ contract RaindexV6OrderMgmtFreshTest is RaindexV6FreshTest, IMetaV1_2 { vm.prank(owner); vm.expectRevert(abi.encodeWithSelector(OrderNoInputs.selector)); - iRaindex.addOrder4(config, new TaskV2[](0)); + iRaindex.addOrder5(config, new TaskV3[](0)); } // ----------------------------------------------------------------------- - // addOrder4: owner/event/state/return (A3, A5, A6, A9) + // addOrder5: owner/event/state/return (A3, A5, A6, A9) // ----------------------------------------------------------------------- /// A successful add MUST emit `AddOrderV3(owner, orderHash, order)` with the @@ -137,7 +137,7 @@ contract RaindexV6OrderMgmtFreshTest is RaindexV6FreshTest, IMetaV1_2 { emit AddOrderV3(owner, orderHash, order); vm.prank(owner); - assertTrue(iRaindex.addOrder4(config, new TaskV2[](0))); + assertTrue(iRaindex.addOrder5(config, new TaskV3[](0))); assertTrue(iRaindex.orderExists(orderHash)); } @@ -156,14 +156,14 @@ contract RaindexV6OrderMgmtFreshTest is RaindexV6FreshTest, IMetaV1_2 { OrderV4(other, config.evaluable, config.validInputs, config.validOutputs, config.nonce); vm.prank(sender); - iRaindex.addOrder4(config, new TaskV2[](0)); + iRaindex.addOrder5(config, new TaskV3[](0)); assertTrue(iRaindex.orderExists(senderOrder.hash())); assertFalse(iRaindex.orderExists(otherOrder.hash())); } // ----------------------------------------------------------------------- - // addOrder4: dedup no-op (A4) + // addOrder5: dedup no-op (A4) // ----------------------------------------------------------------------- /// First add of a (owner, config) returns true; a second identical add is a @@ -175,12 +175,12 @@ contract RaindexV6OrderMgmtFreshTest is RaindexV6FreshTest, IMetaV1_2 { OrderV4 memory order = OrderV4(owner, config.evaluable, config.validInputs, config.validOutputs, config.nonce); vm.prank(owner); - assertTrue(iRaindex.addOrder4(config, new TaskV2[](0))); + assertTrue(iRaindex.addOrder5(config, new TaskV3[](0))); assertTrue(iRaindex.orderExists(order.hash())); vm.recordLogs(); vm.prank(owner); - assertFalse(iRaindex.addOrder4(config, new TaskV2[](0))); + assertFalse(iRaindex.addOrder5(config, new TaskV3[](0))); // No event whatsoever on the no-op second add. assertEq(vm.getRecordedLogs().length, 0); assertTrue(iRaindex.orderExists(order.hash())); @@ -195,17 +195,17 @@ contract RaindexV6OrderMgmtFreshTest is RaindexV6FreshTest, IMetaV1_2 { OrderV4 memory order = OrderV4(owner, config.evaluable, config.validInputs, config.validOutputs, config.nonce); vm.startPrank(owner); - assertTrue(iRaindex.addOrder4(config, new TaskV2[](0))); - assertTrue(iRaindex.removeOrder3(order, new TaskV2[](0))); + assertTrue(iRaindex.addOrder5(config, new TaskV3[](0))); + assertTrue(iRaindex.removeOrder4(order, new TaskV3[](0))); assertFalse(iRaindex.orderExists(order.hash())); // Re-add: dead again so this is a fresh state change. - assertTrue(iRaindex.addOrder4(config, new TaskV2[](0))); + assertTrue(iRaindex.addOrder5(config, new TaskV3[](0))); assertTrue(iRaindex.orderExists(order.hash())); vm.stopPrank(); } // ----------------------------------------------------------------------- - // addOrder4: meta guard (A7) + // addOrder5: meta guard (A7) // ----------------------------------------------------------------------- /// A non-empty, valid rain meta MUST emit `MetaV1_2(owner, orderHash, meta)` @@ -229,7 +229,7 @@ contract RaindexV6OrderMgmtFreshTest is RaindexV6FreshTest, IMetaV1_2 { emit MetaV1_2(owner, orderHash, config.meta); vm.prank(owner); - assertTrue(iRaindex.addOrder4(config, new TaskV2[](0))); + assertTrue(iRaindex.addOrder5(config, new TaskV3[](0))); } /// Empty meta MUST NOT emit a `MetaV1_2` event. A successful add with empty @@ -241,7 +241,7 @@ contract RaindexV6OrderMgmtFreshTest is RaindexV6FreshTest, IMetaV1_2 { vm.recordLogs(); vm.prank(owner); - assertTrue(iRaindex.addOrder4(config, new TaskV2[](0))); + assertTrue(iRaindex.addOrder5(config, new TaskV3[](0))); // Exactly one log: AddOrderV3, no MetaV1_2. assertEq(vm.getRecordedLogs().length, 1); } @@ -263,12 +263,12 @@ contract RaindexV6OrderMgmtFreshTest is RaindexV6FreshTest, IMetaV1_2 { (, bytes32 orderHash) = LibTestAddOrder.expectedOrder(owner, config); vm.prank(owner); vm.expectRevert(); - iRaindex.addOrder4(config, new TaskV2[](0)); + iRaindex.addOrder5(config, new TaskV3[](0)); assertFalse(iRaindex.orderExists(orderHash)); } // ----------------------------------------------------------------------- - // addOrder4: post-action context (A8, P5) + // addOrder5: post-action context (A8, P5) // ----------------------------------------------------------------------- /// The post-action context for addOrder MUST expose the order hash and the @@ -297,13 +297,13 @@ contract RaindexV6OrderMgmtFreshTest is RaindexV6FreshTest, IMetaV1_2 { evals[2] = bytes(string.concat(usingWordsFrom, ":ensure(equal-to(order-owner() ", alice.toHexString(), ") \"o\");")); - TaskV2[] memory actions = new TaskV2[](3); + TaskV3[] memory actions = new TaskV3[](3); for (uint256 i = 0; i < 3; i++) { - actions[i] = TaskV2(EvaluableV4(iInterpreter, iStore, iParserV2.parse2(evals[i])), new SignedContextV1[](0)); + actions[i] = TaskV3(EvaluableV4(iInterpreter, iStore, iParserV2.parse2(evals[i])), new SignedContextV2[](0)); } vm.prank(alice); - assertTrue(iRaindex.addOrder4(config, actions)); + assertTrue(iRaindex.addOrder5(config, actions)); } /// A revert in a post-action task MUST prevent the order being added (whole @@ -317,13 +317,13 @@ contract RaindexV6OrderMgmtFreshTest is RaindexV6FreshTest, IMetaV1_2 { bytes[] memory evals = new bytes[](1); evals[0] = bytes(":ensure(0 \"always revert\");"); - TaskV2[] memory actions = evalsToActions(evals); + TaskV3[] memory actions = evalsToActions(evals); OrderV4 memory order = OrderV4(alice, config.evaluable, config.validInputs, config.validOutputs, config.nonce); vm.prank(alice); vm.expectRevert("always revert"); - iRaindex.addOrder4(config, actions); + iRaindex.addOrder5(config, actions); assertFalse(iRaindex.orderExists(order.hash())); } @@ -337,22 +337,22 @@ contract RaindexV6OrderMgmtFreshTest is RaindexV6FreshTest, IMetaV1_2 { config.meta = new bytes(0); vm.startPrank(alice); - assertTrue(iRaindex.addOrder4(config, new TaskV2[](0))); + assertTrue(iRaindex.addOrder5(config, new TaskV3[](0))); bytes[] memory evals = new bytes[](1); evals[0] = bytes(":ensure(0 \"always revert\");"); - TaskV2[] memory actions = evalsToActions(evals); + TaskV3[] memory actions = evalsToActions(evals); // The order is already live so this is a no-op; the reverting eval does // NOT run, so the call returns false without reverting. - assertFalse(iRaindex.addOrder4(config, actions)); + assertFalse(iRaindex.addOrder5(config, actions)); vm.stopPrank(); } // ----------------------------------------------------------------------- - // removeOrder3: owner guard (R1) + // removeOrder4: owner guard (R1) // ----------------------------------------------------------------------- - /// removeOrder3 MUST revert with `NotOrderOwner(order.owner)` when msg.sender + /// removeOrder4 MUST revert with `NotOrderOwner(order.owner)` when msg.sender /// is not the order owner, even after the order is live, and MUST NOT change /// state. /// forge-config: default.fuzz.runs = 20 @@ -366,16 +366,16 @@ contract RaindexV6OrderMgmtFreshTest is RaindexV6FreshTest, IMetaV1_2 { // Reverts even before the order is added. vm.prank(bob); vm.expectRevert(abi.encodeWithSelector(NotOrderOwner.selector, alice)); - iRaindex.removeOrder3(order, new TaskV2[](0)); + iRaindex.removeOrder4(order, new TaskV3[](0)); vm.prank(alice); - iRaindex.addOrder4(config, new TaskV2[](0)); + iRaindex.addOrder5(config, new TaskV3[](0)); assertTrue(iRaindex.orderExists(order.hash())); // Still reverts after it is live, with the order owner as the revert arg. vm.prank(bob); vm.expectRevert(abi.encodeWithSelector(NotOrderOwner.selector, alice)); - iRaindex.removeOrder3(order, new TaskV2[](0)); + iRaindex.removeOrder4(order, new TaskV3[](0)); assertTrue(iRaindex.orderExists(order.hash())); } @@ -394,11 +394,11 @@ contract RaindexV6OrderMgmtFreshTest is RaindexV6FreshTest, IMetaV1_2 { vm.prank(bob); vm.expectRevert(abi.encodeWithSelector(NotOrderOwner.selector, alice)); - iRaindex.removeOrder3(order, new TaskV2[](0)); + iRaindex.removeOrder4(order, new TaskV3[](0)); } // ----------------------------------------------------------------------- - // removeOrder3: live check / state / event / return (R2..R7) + // removeOrder4: live check / state / event / return (R2..R7) // ----------------------------------------------------------------------- /// Removing a LIVE order MUST emit `RemoveOrderV3(owner, orderHash, order)`, @@ -411,14 +411,14 @@ contract RaindexV6OrderMgmtFreshTest is RaindexV6FreshTest, IMetaV1_2 { bytes32 orderHash = order.hash(); vm.prank(owner); - iRaindex.addOrder4(config, new TaskV2[](0)); + iRaindex.addOrder5(config, new TaskV3[](0)); assertTrue(iRaindex.orderExists(orderHash)); vm.expectEmit(true, true, true, true, address(iRaindex)); emit RemoveOrderV3(owner, orderHash, order); vm.prank(owner); - assertTrue(iRaindex.removeOrder3(order, new TaskV2[](0))); + assertTrue(iRaindex.removeOrder4(order, new TaskV3[](0))); assertFalse(iRaindex.orderExists(orderHash)); } @@ -435,7 +435,7 @@ contract RaindexV6OrderMgmtFreshTest is RaindexV6FreshTest, IMetaV1_2 { vm.recordLogs(); vm.prank(owner); - assertFalse(iRaindex.removeOrder3(order, new TaskV2[](0))); + assertFalse(iRaindex.removeOrder4(order, new TaskV3[](0))); assertEq(vm.getRecordedLogs().length, 0); assertFalse(iRaindex.orderExists(orderHash)); } @@ -449,19 +449,19 @@ contract RaindexV6OrderMgmtFreshTest is RaindexV6FreshTest, IMetaV1_2 { OrderV4 memory order = OrderV4(owner, config.evaluable, config.validInputs, config.validOutputs, config.nonce); vm.startPrank(owner); - iRaindex.addOrder4(config, new TaskV2[](0)); - assertTrue(iRaindex.removeOrder3(order, new TaskV2[](0))); + iRaindex.addOrder5(config, new TaskV3[](0)); + assertTrue(iRaindex.removeOrder4(order, new TaskV3[](0))); assertFalse(iRaindex.orderExists(order.hash())); vm.recordLogs(); - assertFalse(iRaindex.removeOrder3(order, new TaskV2[](0))); + assertFalse(iRaindex.removeOrder4(order, new TaskV3[](0))); assertEq(vm.getRecordedLogs().length, 0); assertFalse(iRaindex.orderExists(order.hash())); vm.stopPrank(); } // ----------------------------------------------------------------------- - // removeOrder3: post-action context (R6, P5) + // removeOrder4: post-action context (R6, P5) // ----------------------------------------------------------------------- /// The post-action context for removeOrder MUST expose the order hash and @@ -489,15 +489,15 @@ contract RaindexV6OrderMgmtFreshTest is RaindexV6FreshTest, IMetaV1_2 { evals[2] = bytes(string.concat(usingWordsFrom, ":ensure(equal-to(order-owner() ", alice.toHexString(), ") \"o\");")); - TaskV2[] memory actions = new TaskV2[](3); + TaskV3[] memory actions = new TaskV3[](3); for (uint256 i = 0; i < 3; i++) { - actions[i] = TaskV2(EvaluableV4(iInterpreter, iStore, iParserV2.parse2(evals[i])), new SignedContextV1[](0)); + actions[i] = TaskV3(EvaluableV4(iInterpreter, iStore, iParserV2.parse2(evals[i])), new SignedContextV2[](0)); } vm.startPrank(alice); - iRaindex.addOrder4(config, new TaskV2[](0)); + iRaindex.addOrder5(config, new TaskV3[](0)); // The evals only run because this is a live -> dead state change. - assertTrue(iRaindex.removeOrder3(order, actions)); + assertTrue(iRaindex.removeOrder4(order, actions)); vm.stopPrank(); } @@ -512,15 +512,15 @@ contract RaindexV6OrderMgmtFreshTest is RaindexV6FreshTest, IMetaV1_2 { OrderV4 memory order = OrderV4(alice, config.evaluable, config.validInputs, config.validOutputs, config.nonce); vm.startPrank(alice); - iRaindex.addOrder4(config, new TaskV2[](0)); + iRaindex.addOrder5(config, new TaskV3[](0)); assertTrue(iRaindex.orderExists(order.hash())); bytes[] memory evals = new bytes[](1); evals[0] = bytes(":ensure(0 \"always revert\");"); - TaskV2[] memory actions = evalsToActions(evals); + TaskV3[] memory actions = evalsToActions(evals); vm.expectRevert("always revert"); - iRaindex.removeOrder3(order, actions); + iRaindex.removeOrder4(order, actions); // Order remains live because the post-action reverted the whole tx. assertTrue(iRaindex.orderExists(order.hash())); vm.stopPrank(); @@ -536,12 +536,12 @@ contract RaindexV6OrderMgmtFreshTest is RaindexV6FreshTest, IMetaV1_2 { bytes[] memory evals = new bytes[](1); evals[0] = bytes(":ensure(0 \"always revert\");"); - TaskV2[] memory actions = evalsToActions(evals); + TaskV3[] memory actions = evalsToActions(evals); // Order is dead, so the remove is a no-op and the reverting eval does NOT // run; the call returns false without reverting. vm.prank(alice); - assertFalse(iRaindex.removeOrder3(order, actions)); + assertFalse(iRaindex.removeOrder4(order, actions)); assertFalse(iRaindex.orderExists(order.hash())); } } diff --git a/test/concrete/raindex/RaindexV6.postTaskSignedContext.t.sol b/test/concrete/raindex/RaindexV6.postTaskSignedContext.t.sol index 5e7d016cb2..a3ebad7528 100644 --- a/test/concrete/raindex/RaindexV6.postTaskSignedContext.t.sol +++ b/test/concrete/raindex/RaindexV6.postTaskSignedContext.t.sol @@ -7,22 +7,23 @@ import { OrderConfigV4, OrderV4, IOV2, - TaskV2, + TaskV3, EvaluableV4, - SignedContextV1 -} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; + SignedContextV2 +} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {IERC20} from "@openzeppelin-contracts-5.7.0/token/ERC20/IERC20.sol"; -import {MessageHashUtils} from "@openzeppelin-contracts-5.7.0/utils/cryptography/MessageHashUtils.sol"; +import {LibTestSignedContext} from "test/util/lib/LibTestSignedContext.sol"; import {Strings} from "@openzeppelin-contracts-5.7.0/utils/Strings.sol"; import {LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; import {LibTestAddOrder} from "test/util/lib/LibTestAddOrder.sol"; /// @title RaindexV6PostTaskSignedContextTest -/// @notice `signer()` and `signed-context()` read the real signers and -/// signed data in every Raindex post task, so a caller cannot forge a signer by -/// placing an address in signed data. +/// @notice `signer()`, `signer-domain()` and `signed-context()` read +/// the real signers, domains and signed data in every Raindex post task, so a +/// caller cannot forge a signer by placing an address in signed data. contract RaindexV6PostTaskSignedContextTest is RaindexV6ExternalRealTest { using Strings for address; + using Strings for uint256; uint256 internal constant SIGNER_A_PK = 0xA11CE; uint256 internal constant SIGNER_B_PK = 0xB0B; @@ -30,11 +31,11 @@ contract RaindexV6PostTaskSignedContextTest is RaindexV6ExternalRealTest { address internal constant DATA_B = address(0xDA7A1); address internal constant TRUSTED = address(0x7777); address internal constant ACTOR = address(0xD0); + bytes32 internal constant DOMAIN_A = keccak256("domain a"); + bytes32 internal constant DOMAIN_B = keccak256("domain b"); - function signed(uint256 pk, bytes32[] memory ctx) internal pure returns (SignedContextV1 memory) { - bytes32 h = MessageHashUtils.toEthSignedMessageHash(keccak256(abi.encodePacked(ctx))); - (uint8 v, bytes32 r, bytes32 s) = vm.sign(pk, h); - return SignedContextV1(vm.addr(pk), ctx, abi.encodePacked(r, s, v)); + function signed(uint256 pk, bytes32 domain, bytes32[] memory ctx) internal pure returns (SignedContextV2 memory) { + return LibTestSignedContext.sign(vm, pk, domain, ctx); } function single(address a) internal pure returns (bytes32[] memory) { @@ -43,9 +44,9 @@ contract RaindexV6PostTaskSignedContextTest is RaindexV6ExternalRealTest { return ctx; } - function task(string memory body, SignedContextV1[] memory sc) internal view returns (TaskV2[] memory) { - TaskV2[] memory post = new TaskV2[](1); - post[0] = TaskV2( + function task(string memory body, SignedContextV2[] memory sc) internal view returns (TaskV3[] memory) { + TaskV3[] memory post = new TaskV3[](1); + post[0] = TaskV3( EvaluableV4( iInterpreter, iStore, @@ -60,10 +61,10 @@ contract RaindexV6PostTaskSignedContextTest is RaindexV6ExternalRealTest { /// Two signers, each signing its own data; the task asserts each word reads /// its own signer and datum. - function realSignersTask() internal view returns (TaskV2[] memory) { - SignedContextV1[] memory sc = new SignedContextV1[](2); - sc[0] = signed(SIGNER_A_PK, single(DATA_A)); - sc[1] = signed(SIGNER_B_PK, single(DATA_B)); + function realSignersTask() internal view returns (TaskV3[] memory) { + SignedContextV2[] memory sc = new SignedContextV2[](2); + sc[0] = signed(SIGNER_A_PK, DOMAIN_A, single(DATA_A)); + sc[1] = signed(SIGNER_B_PK, DOMAIN_B, single(DATA_B)); return task( string.concat( ":ensure(equal-to(signer<0>() ", @@ -72,6 +73,12 @@ contract RaindexV6PostTaskSignedContextTest is RaindexV6ExternalRealTest { ":ensure(equal-to(signer<1>() ", vm.addr(SIGNER_B_PK).toHexString(), ") \"signer 1\"),", + ":ensure(equal-to(signer-domain<0>() ", + uint256(DOMAIN_A).toHexString(), + ") \"signer domain 0\"),", + ":ensure(equal-to(signer-domain<1>() ", + uint256(DOMAIN_B).toHexString(), + ") \"signer domain 1\"),", ":ensure(equal-to(signed-context<0 0>() ", DATA_A.toHexString(), ") \"signed context 0\"),", @@ -85,29 +92,29 @@ contract RaindexV6PostTaskSignedContextTest is RaindexV6ExternalRealTest { /// One attacker key signs three contexts, the third holding `TRUSTED`. A /// task that accepts only `TRUSTED` as signer must reject it. - function forgedSignerTask() internal view returns (TaskV2[] memory) { - SignedContextV1[] memory sc = new SignedContextV1[](3); - sc[0] = signed(SIGNER_A_PK, single(DATA_A)); - sc[1] = signed(SIGNER_A_PK, single(DATA_A)); - sc[2] = signed(SIGNER_A_PK, single(TRUSTED)); + function forgedSignerTask() internal view returns (TaskV3[] memory) { + SignedContextV2[] memory sc = new SignedContextV2[](3); + sc[0] = signed(SIGNER_A_PK, DOMAIN_A, single(DATA_A)); + sc[1] = signed(SIGNER_A_PK, DOMAIN_A, single(DATA_A)); + sc[2] = signed(SIGNER_A_PK, DOMAIN_A, single(TRUSTED)); return task(string.concat(":ensure(equal-to(signer<0>() ", TRUSTED.toHexString(), ") \"signer trusted\");"), sc); } - function deposit(TaskV2[] memory post) internal { + function deposit(TaskV3[] memory post) internal { vm.mockCall( address(iToken0), abi.encodeWithSelector(IERC20.transferFrom.selector, ACTOR, address(iRaindex), 1e18), abi.encode(true) ); vm.prank(ACTOR); - iRaindex.deposit4(address(iToken0), bytes32(uint256(1)), LibDecimalFloat.packLossless(1, 0), post); + iRaindex.deposit5(address(iToken0), bytes32(uint256(1)), LibDecimalFloat.packLossless(1, 0), post); } - function withdraw(TaskV2[] memory post) internal { - deposit(new TaskV2[](0)); + function withdraw(TaskV3[] memory post) internal { + deposit(new TaskV3[](0)); vm.mockCall(address(iToken0), abi.encodeWithSelector(IERC20.transfer.selector, ACTOR, 1e18), abi.encode(true)); vm.prank(ACTOR); - iRaindex.withdraw4(address(iToken0), bytes32(uint256(1)), LibDecimalFloat.packLossless(1, 0), post); + iRaindex.withdraw5(address(iToken0), bytes32(uint256(1)), LibDecimalFloat.packLossless(1, 0), post); } function orderConfig() internal view returns (OrderConfigV4 memory) { @@ -120,26 +127,26 @@ contract RaindexV6PostTaskSignedContextTest is RaindexV6ExternalRealTest { ); } - function addOrder(TaskV2[] memory post) internal { + function addOrder(TaskV3[] memory post) internal { vm.prank(ACTOR); - assertTrue(iRaindex.addOrder4(orderConfig(), post)); + assertTrue(iRaindex.addOrder5(orderConfig(), post)); } - function removeOrder(TaskV2[] memory post) internal { + function removeOrder(TaskV3[] memory post) internal { OrderConfigV4 memory config = orderConfig(); vm.prank(ACTOR); - iRaindex.addOrder4(config, new TaskV2[](0)); + iRaindex.addOrder5(config, new TaskV3[](0)); vm.prank(ACTOR); assertTrue( - iRaindex.removeOrder3( + iRaindex.removeOrder4( OrderV4(ACTOR, config.evaluable, config.validInputs, config.validOutputs, config.nonce), post ) ); } - function entask(TaskV2[] memory post) internal { + function entask(TaskV3[] memory post) internal { vm.prank(ACTOR); - iRaindex.entask2(post); + iRaindex.entask3(post); } function testDepositTaskSignerWordsReadRealSigners() external { @@ -147,7 +154,7 @@ contract RaindexV6PostTaskSignedContextTest is RaindexV6ExternalRealTest { } function testDepositTaskRejectsSignerForgedInSignedData() external { - TaskV2[] memory post = forgedSignerTask(); + TaskV3[] memory post = forgedSignerTask(); vm.expectRevert("signer trusted"); this.externalDeposit(post); } @@ -157,7 +164,7 @@ contract RaindexV6PostTaskSignedContextTest is RaindexV6ExternalRealTest { } function testWithdrawTaskRejectsSignerForgedInSignedData() external { - TaskV2[] memory post = forgedSignerTask(); + TaskV3[] memory post = forgedSignerTask(); vm.expectRevert("signer trusted"); this.externalWithdraw(post); } @@ -167,7 +174,7 @@ contract RaindexV6PostTaskSignedContextTest is RaindexV6ExternalRealTest { } function testAddOrderTaskRejectsSignerForgedInSignedData() external { - TaskV2[] memory post = forgedSignerTask(); + TaskV3[] memory post = forgedSignerTask(); vm.expectRevert("signer trusted"); this.externalAddOrder(post); } @@ -177,7 +184,7 @@ contract RaindexV6PostTaskSignedContextTest is RaindexV6ExternalRealTest { } function testRemoveOrderTaskRejectsSignerForgedInSignedData() external { - TaskV2[] memory post = forgedSignerTask(); + TaskV3[] memory post = forgedSignerTask(); vm.expectRevert("signer trusted"); this.externalRemoveOrder(post); } @@ -187,28 +194,28 @@ contract RaindexV6PostTaskSignedContextTest is RaindexV6ExternalRealTest { } function testEntaskRejectsSignerForgedInSignedData() external { - TaskV2[] memory post = forgedSignerTask(); + TaskV3[] memory post = forgedSignerTask(); vm.expectRevert("signer trusted"); this.externalEntask(post); } - function externalDeposit(TaskV2[] memory post) external { + function externalDeposit(TaskV3[] memory post) external { deposit(post); } - function externalWithdraw(TaskV2[] memory post) external { + function externalWithdraw(TaskV3[] memory post) external { withdraw(post); } - function externalAddOrder(TaskV2[] memory post) external { + function externalAddOrder(TaskV3[] memory post) external { addOrder(post); } - function externalRemoveOrder(TaskV2[] memory post) external { + function externalRemoveOrder(TaskV3[] memory post) external { removeOrder(post); } - function externalEntask(TaskV2[] memory post) external { + function externalEntask(TaskV3[] memory post) external { entask(post); } } diff --git a/test/concrete/raindex/RaindexV6.quote.sameToken.t.sol b/test/concrete/raindex/RaindexV6.quote.sameToken.t.sol index 5f9f6b6e41..1e0f739aad 100644 --- a/test/concrete/raindex/RaindexV6.quote.sameToken.t.sol +++ b/test/concrete/raindex/RaindexV6.quote.sameToken.t.sol @@ -5,12 +5,12 @@ pragma solidity =0.8.25; import {RaindexV6ExternalRealTest} from "test/util/abstract/RaindexV6ExternalRealTest.sol"; import { IRaindexV7, - QuoteV2, + QuoteV3, OrderConfigV4, OrderV4, IOV2, - SignedContextV1, - TaskV2 + SignedContextV2, + TaskV3 } from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {Float} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; import {LibTestAddOrder} from "test/util/lib/LibTestAddOrder.sol"; @@ -19,10 +19,10 @@ import {LibTestAddOrder} from "test/util/lib/LibTestAddOrder.sol"; contract RaindexV6QuoteSameTokenTest is RaindexV6ExternalRealTest { /// Same token for input and output is error. /// forge-config: default.fuzz.runs = 10 - function testQuoteSameToken(QuoteV2 memory quoteConfig) external { + function testQuoteSameToken(QuoteV3 memory quoteConfig) external { vm.assume(quoteConfig.order.validInputs.length > 0); vm.assume(quoteConfig.order.validOutputs.length > 0); - // addOrder4 requires a valid serialized parser output with >= 2 sources, + // addOrder5 requires a valid serialized parser output with >= 2 sources, // so replace the fuzzed bytecode with the canonical valid order bytecode. // The self-trade check happens at quote time (TokenSelfTrade below), not // add time, so the order still adds successfully. @@ -31,7 +31,7 @@ contract RaindexV6QuoteSameTokenTest is RaindexV6ExternalRealTest { quoteConfig.inputIOIndex = 0; quoteConfig.outputIOIndex = 0; vm.prank(quoteConfig.order.owner); - iRaindex.addOrder4( + iRaindex.addOrder5( OrderConfigV4({ evaluable: quoteConfig.order.evaluable, validInputs: quoteConfig.order.validInputs, @@ -40,10 +40,10 @@ contract RaindexV6QuoteSameTokenTest is RaindexV6ExternalRealTest { secret: bytes32(0), meta: "" }), - new TaskV2[](0) + new TaskV3[](0) ); vm.expectRevert(abi.encodeWithSelector(IRaindexV7.TokenSelfTrade.selector)); - (bool success, Float maxOutput, Float ioRatio) = iRaindex.quote2(quoteConfig); + (bool success, Float maxOutput, Float ioRatio) = iRaindex.quote3(quoteConfig); (success, maxOutput, ioRatio); } @@ -82,14 +82,14 @@ contract RaindexV6QuoteSameTokenTest is RaindexV6ExternalRealTest { OrderV4 memory order = OrderV4(owner, config.evaluable, config.validInputs, config.validOutputs, config.nonce); vm.prank(owner); - iRaindex.addOrder4(config, new TaskV2[](0)); + iRaindex.addOrder5(config, new TaskV3[](0)); - QuoteV2 memory quoteConfig = - QuoteV2({order: order, inputIOIndex: 0, outputIOIndex: 1, signedContext: new SignedContextV1[](0)}); + QuoteV3 memory quoteConfig = + QuoteV3({order: order, inputIOIndex: 0, outputIOIndex: 1, signedContext: new SignedContextV2[](0)}); // validInputs[0] (tokenA) == validOutputs[1] (tokenA): self-trade. vm.expectRevert(abi.encodeWithSelector(IRaindexV7.TokenSelfTrade.selector)); - (bool success, Float maxOutput, Float ioRatio) = iRaindex.quote2(quoteConfig); + (bool success, Float maxOutput, Float ioRatio) = iRaindex.quote3(quoteConfig); (success, maxOutput, ioRatio); } } diff --git a/test/concrete/raindex/RaindexV6.quote.t.sol b/test/concrete/raindex/RaindexV6.quote.t.sol index 7a8badf80d..a064d11495 100644 --- a/test/concrete/raindex/RaindexV6.quote.t.sol +++ b/test/concrete/raindex/RaindexV6.quote.t.sol @@ -5,12 +5,12 @@ pragma solidity =0.8.25; import {RaindexV6ExternalRealTest, console2} from "test/util/abstract/RaindexV6ExternalRealTest.sol"; import { IRaindexV7, - QuoteV2, + QuoteV3, OrderConfigV4, EvaluableV4, - TaskV2, + TaskV3, OrderV4, - SignedContextV1 + SignedContextV2 } from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {LibTestAddOrder} from "test/util/lib/LibTestAddOrder.sol"; import {IERC20} from "@openzeppelin-contracts-5.7.0/token/ERC20/IERC20.sol"; @@ -29,8 +29,8 @@ contract RaindexV6QuoteTest is RaindexV6ExternalRealTest { /// Dead orders always eval to false. /// forge-config: default.fuzz.runs = 100 - function testQuoteDeadOrder(QuoteV2 memory quoteConfig) external view { - (bool success, Float maxOutput, Float ioRatio) = iRaindex.quote2(quoteConfig); + function testQuoteDeadOrder(QuoteV3 memory quoteConfig) external view { + (bool success, Float maxOutput, Float ioRatio) = iRaindex.quote3(quoteConfig); assert(!success); assertTrue(maxOutput.isZero(), "max output"); assertTrue(ioRatio.isZero(), "io ratio"); @@ -89,8 +89,8 @@ contract RaindexV6QuoteTest is RaindexV6ExternalRealTest { abi.encode(true) ); vm.prank(owner); - iRaindex.deposit4( - config.validOutputs[0].token, config.validOutputs[0].vaultId, depositAmount, new TaskV2[](0) + iRaindex.deposit5( + config.validOutputs[0].token, config.validOutputs[0].vaultId, depositAmount, new TaskV3[](0) ); } if (inputVaultId == bytes32(0)) { @@ -101,7 +101,7 @@ contract RaindexV6QuoteTest is RaindexV6ExternalRealTest { for (uint256 i = 0; i < rainlang.length; i++) { config.evaluable.bytecode = iParserV2.parse2(rainlang[i]); vm.prank(owner); - iRaindex.addOrder4(config, new TaskV2[](0)); + iRaindex.addOrder5(config, new TaskV3[](0)); OrderV4 memory order = OrderV4({ owner: owner, @@ -111,9 +111,9 @@ contract RaindexV6QuoteTest is RaindexV6ExternalRealTest { nonce: config.nonce }); - QuoteV2 memory quoteConfig = - QuoteV2({order: order, inputIOIndex: 0, outputIOIndex: 0, signedContext: new SignedContextV1[](0)}); - (bool success, Float maxOutput, Float ioRatio) = iRaindex.quote2(quoteConfig); + QuoteV3 memory quoteConfig = + QuoteV3({order: order, inputIOIndex: 0, outputIOIndex: 0, signedContext: new SignedContextV2[](0)}); + (bool success, Float maxOutput, Float ioRatio) = iRaindex.quote3(quoteConfig); assert(success); assertTrue(maxOutput.eq(expectedMaxOutput[i]), "max output"); diff --git a/test/concrete/raindex/RaindexV6.removeOrder.entask.t.sol b/test/concrete/raindex/RaindexV6.removeOrder.entask.t.sol index 32c6ac7712..6cf4bc21a0 100644 --- a/test/concrete/raindex/RaindexV6.removeOrder.entask.t.sol +++ b/test/concrete/raindex/RaindexV6.removeOrder.entask.t.sol @@ -7,8 +7,8 @@ import { OrderConfigV4, EvaluableV4, OrderV4, - TaskV2, - SignedContextV1 + TaskV3, + SignedContextV2 } from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {LibTestAddOrder} from "test/util/lib/LibTestAddOrder.sol"; import {LibOrder} from "../../../src/lib/LibOrder.sol"; @@ -47,19 +47,19 @@ contract RaindexV6RemoveOrderEnactTest is RaindexV6ExternalRealTest { ) internal { LibTestAddOrder.conformConfig(config, iInterpreter, iStore); vm.startPrank(owner); - TaskV2[] memory actions = new TaskV2[](evalStrings.length); + TaskV3[] memory actions = new TaskV3[](evalStrings.length); for (uint256 i = 0; i < evalStrings.length; i++) { actions[i] = - TaskV2(EvaluableV4(iInterpreter, iStore, iParserV2.parse2(evalStrings[i])), new SignedContextV1[](0)); + TaskV3(EvaluableV4(iInterpreter, iStore, iParserV2.parse2(evalStrings[i])), new SignedContextV2[](0)); } // Hacky way to give a unique nonce to each order passed in. config.nonce = keccak256(abi.encode(evalStrings)); if (addOrder) { - iRaindex.addOrder4(config, new TaskV2[](0)); + iRaindex.addOrder5(config, new TaskV3[](0)); } OrderV4 memory order = OrderV4(owner, config.evaluable, config.validInputs, config.validOutputs, config.nonce); vm.record(); - bool stateChanged = iRaindex.removeOrder3(order, actions); + bool stateChanged = iRaindex.removeOrder4(order, actions); assertEq(stateChanged, addOrder); checkReentrancyRW(addOrder ? 5 : 4, addOrder ? 3 : 2); (bytes32[] memory reads, bytes32[] memory writes) = vm.accesses(address(iStore)); @@ -156,8 +156,8 @@ contract RaindexV6RemoveOrderEnactTest is RaindexV6ExternalRealTest { vm.startPrank(alice); bytes[] memory evals0 = new bytes[](1); evals0[0] = bytes(":;"); - TaskV2[] memory actions = evalsToActions(evals0); - bool stateChanged = iRaindex.addOrder4(config, actions); + TaskV3[] memory actions = evalsToActions(evals0); + bool stateChanged = iRaindex.addOrder5(config, actions); assert(stateChanged); OrderV4 memory order = OrderV4(alice, config.evaluable, config.validInputs, config.validOutputs, config.nonce); @@ -167,10 +167,10 @@ contract RaindexV6RemoveOrderEnactTest is RaindexV6ExternalRealTest { bytes[] memory evals1 = new bytes[](1); evals1[0] = bytes(":ensure(0 \"always revert\");"); - TaskV2[] memory actions1 = evalsToActions(evals1); + TaskV3[] memory actions1 = evalsToActions(evals1); vm.expectRevert("always revert"); - bool stateChanged2 = iRaindex.removeOrder3(order, actions1); + bool stateChanged2 = iRaindex.removeOrder4(order, actions1); assert(!stateChanged2); diff --git a/test/concrete/raindex/RaindexV6.removeOrder.mock.t.sol b/test/concrete/raindex/RaindexV6.removeOrder.mock.t.sol index e9c35d3a5c..10e38af74f 100644 --- a/test/concrete/raindex/RaindexV6.removeOrder.mock.t.sol +++ b/test/concrete/raindex/RaindexV6.removeOrder.mock.t.sol @@ -3,7 +3,7 @@ pragma solidity =0.8.25; import {RaindexV6ExternalMockTest} from "test/util/abstract/RaindexV6ExternalMockTest.sol"; -import {OrderConfigV4, OrderV4, EvaluableV4, TaskV2} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; +import {OrderConfigV4, OrderV4, EvaluableV4, TaskV3} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {LibTestAddOrder} from "test/util/lib/LibTestAddOrder.sol"; import {NotOrderOwner} from "../../../src/error/ErrRaindexV6.sol"; @@ -23,7 +23,7 @@ contract RaindexV6RemoveOrderMockTest is RaindexV6ExternalMockTest { // It will revert even if the order has not been added yet. vm.expectRevert(abi.encodeWithSelector(NotOrderOwner.selector, alice)); vm.prank(bob); - iRaindex.removeOrder3(expectedOrder, new TaskV2[](0)); + iRaindex.removeOrder4(expectedOrder, new TaskV3[](0)); // And will revert after the order is added. (OrderV4 memory order, bytes32 orderHash) = addOrderWithChecks(alice, config, expression); @@ -31,7 +31,7 @@ contract RaindexV6RemoveOrderMockTest is RaindexV6ExternalMockTest { vm.expectRevert(abi.encodeWithSelector(NotOrderOwner.selector, alice)); vm.prank(bob); - iRaindex.removeOrder3(order, new TaskV2[](0)); + iRaindex.removeOrder4(order, new TaskV3[](0)); // Alice can remove the order. removeOrderWithChecks(alice, order); @@ -39,7 +39,7 @@ contract RaindexV6RemoveOrderMockTest is RaindexV6ExternalMockTest { // It will revert even after the order has been removed. vm.expectRevert(abi.encodeWithSelector(NotOrderOwner.selector, alice)); vm.prank(bob); - iRaindex.removeOrder3(order, new TaskV2[](0)); + iRaindex.removeOrder4(order, new TaskV3[](0)); } /// The same order can be added and removed multiple times. @@ -72,7 +72,7 @@ contract RaindexV6RemoveOrderMockTest is RaindexV6ExternalMockTest { vm.record(); vm.recordLogs(); vm.prank(alice); - assertFalse(iRaindex.removeOrder3(order, new TaskV2[](0))); + assertFalse(iRaindex.removeOrder4(order, new TaskV3[](0))); assertEq(vm.getRecordedLogs().length, 0); (bytes32[] memory reads, bytes32[] memory writes) = vm.accesses(address(iRaindex)); // 3x for reentrancy guard, 1x for dead order check. @@ -126,11 +126,11 @@ contract RaindexV6RemoveOrderMockTest is RaindexV6ExternalMockTest { // Owners can't interfere with each other. vm.expectRevert(abi.encodeWithSelector(NotOrderOwner.selector, bob)); vm.prank(alice); - iRaindex.removeOrder3(orderBob, new TaskV2[](0)); + iRaindex.removeOrder4(orderBob, new TaskV3[](0)); vm.expectRevert(abi.encodeWithSelector(NotOrderOwner.selector, alice)); vm.prank(bob); - iRaindex.removeOrder3(orderAlice, new TaskV2[](0)); + iRaindex.removeOrder4(orderAlice, new TaskV3[](0)); removeOrderWithChecks(alice, orderAlice); removeOrderWithChecks(bob, orderBob); @@ -186,17 +186,17 @@ contract RaindexV6RemoveOrderMockTest is RaindexV6ExternalMockTest { // Owners can't interfere with each other. vm.expectRevert(abi.encodeWithSelector(NotOrderOwner.selector, bob)); vm.prank(alice); - iRaindex.removeOrder3(orderBobOne, new TaskV2[](0)); + iRaindex.removeOrder4(orderBobOne, new TaskV3[](0)); vm.expectRevert(abi.encodeWithSelector(NotOrderOwner.selector, bob)); vm.prank(alice); - iRaindex.removeOrder3(orderBobTwo, new TaskV2[](0)); + iRaindex.removeOrder4(orderBobTwo, new TaskV3[](0)); vm.expectRevert(abi.encodeWithSelector(NotOrderOwner.selector, alice)); vm.prank(bob); - iRaindex.removeOrder3(orderAliceOne, new TaskV2[](0)); + iRaindex.removeOrder4(orderAliceOne, new TaskV3[](0)); vm.expectRevert(abi.encodeWithSelector(NotOrderOwner.selector, alice)); vm.prank(bob); - iRaindex.removeOrder3(orderAliceTwo, new TaskV2[](0)); + iRaindex.removeOrder4(orderAliceTwo, new TaskV3[](0)); removeOrderWithChecks(alice, orderAliceOne); removeOrderWithChecks(bob, orderBobOne); diff --git a/test/concrete/raindex/RaindexV6.removeOrder.owner.t.sol b/test/concrete/raindex/RaindexV6.removeOrder.owner.t.sol index 99e4d08d95..45229d67a0 100644 --- a/test/concrete/raindex/RaindexV6.removeOrder.owner.t.sol +++ b/test/concrete/raindex/RaindexV6.removeOrder.owner.t.sol @@ -3,7 +3,7 @@ pragma solidity =0.8.25; import {RaindexV6ExternalRealTest} from "test/util/abstract/RaindexV6ExternalRealTest.sol"; -import {OrderConfigV4, OrderV4, EvaluableV4, TaskV2} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; +import {OrderConfigV4, OrderV4, EvaluableV4, TaskV3} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {LibTestAddOrder} from "test/util/lib/LibTestAddOrder.sol"; import {LibOrder} from "../../../src/lib/LibOrder.sol"; import {NotOrderOwner} from "../../../src/error/ErrRaindexV6.sol"; @@ -20,17 +20,17 @@ contract RaindexV6RemoveOrderOwnerTest is RaindexV6ExternalRealTest { vm.startPrank(owner); for (uint256 i = 0; i < 2; i++) { - bool stateChange = iRaindex.addOrder4(config, new TaskV2[](0)); + bool stateChange = iRaindex.addOrder5(config, new TaskV3[](0)); assert(stateChange); assert(iRaindex.orderExists(order.hash())); - stateChange = iRaindex.addOrder4(config, new TaskV2[](0)); + stateChange = iRaindex.addOrder5(config, new TaskV3[](0)); assert(!stateChange); assert(iRaindex.orderExists(order.hash())); - stateChange = iRaindex.removeOrder3(order, new TaskV2[](0)); + stateChange = iRaindex.removeOrder4(order, new TaskV3[](0)); assert(stateChange); assert(!iRaindex.orderExists(order.hash())); - stateChange = iRaindex.removeOrder3(order, new TaskV2[](0)); + stateChange = iRaindex.removeOrder4(order, new TaskV3[](0)); assert(!stateChange); assert(!iRaindex.orderExists(order.hash())); } @@ -51,20 +51,20 @@ contract RaindexV6RemoveOrderOwnerTest is RaindexV6ExternalRealTest { { vm.prank(alice); - bool stateChange = iRaindex.addOrder4(config, new TaskV2[](0)); + bool stateChange = iRaindex.addOrder5(config, new TaskV3[](0)); assert(stateChange); assert(iRaindex.orderExists(orderAlice.hash())); assert(!iRaindex.orderExists(orderBob.hash())); vm.prank(bob); - stateChange = iRaindex.removeOrder3(orderBob, new TaskV2[](0)); + stateChange = iRaindex.removeOrder4(orderBob, new TaskV3[](0)); assert(!stateChange); assert(iRaindex.orderExists(orderAlice.hash())); assert(!iRaindex.orderExists(orderBob.hash())); vm.prank(alice); - stateChange = iRaindex.removeOrder3(orderAlice, new TaskV2[](0)); + stateChange = iRaindex.removeOrder4(orderAlice, new TaskV3[](0)); assert(stateChange); assert(!iRaindex.orderExists(orderAlice.hash())); assert(!iRaindex.orderExists(orderBob.hash())); @@ -72,19 +72,19 @@ contract RaindexV6RemoveOrderOwnerTest is RaindexV6ExternalRealTest { { vm.prank(bob); - bool stateChange = iRaindex.addOrder4(config, new TaskV2[](0)); + bool stateChange = iRaindex.addOrder5(config, new TaskV3[](0)); assert(stateChange); assert(iRaindex.orderExists(orderBob.hash())); assert(!iRaindex.orderExists(orderAlice.hash())); vm.prank(alice); - stateChange = iRaindex.removeOrder3(orderAlice, new TaskV2[](0)); + stateChange = iRaindex.removeOrder4(orderAlice, new TaskV3[](0)); assert(!stateChange); assert(iRaindex.orderExists(orderBob.hash())); assert(!iRaindex.orderExists(orderAlice.hash())); vm.prank(bob); - stateChange = iRaindex.removeOrder3(orderBob, new TaskV2[](0)); + stateChange = iRaindex.removeOrder4(orderBob, new TaskV3[](0)); assert(stateChange); assert(!iRaindex.orderExists(orderBob.hash())); assert(!iRaindex.orderExists(orderAlice.hash())); @@ -92,25 +92,25 @@ contract RaindexV6RemoveOrderOwnerTest is RaindexV6ExternalRealTest { { vm.prank(alice); - bool stateChange = iRaindex.addOrder4(config, new TaskV2[](0)); + bool stateChange = iRaindex.addOrder5(config, new TaskV3[](0)); assert(stateChange); assert(iRaindex.orderExists(orderAlice.hash())); assert(!iRaindex.orderExists(orderBob.hash())); vm.prank(bob); - stateChange = iRaindex.addOrder4(config, new TaskV2[](0)); + stateChange = iRaindex.addOrder5(config, new TaskV3[](0)); assert(stateChange); assert(iRaindex.orderExists(orderBob.hash())); assert(iRaindex.orderExists(orderAlice.hash())); vm.prank(alice); - stateChange = iRaindex.removeOrder3(orderAlice, new TaskV2[](0)); + stateChange = iRaindex.removeOrder4(orderAlice, new TaskV3[](0)); assert(stateChange); assert(!iRaindex.orderExists(orderAlice.hash())); assert(iRaindex.orderExists(orderBob.hash())); vm.prank(bob); - stateChange = iRaindex.removeOrder3(orderBob, new TaskV2[](0)); + stateChange = iRaindex.removeOrder4(orderBob, new TaskV3[](0)); assert(stateChange); assert(!iRaindex.orderExists(orderBob.hash())); assert(!iRaindex.orderExists(orderAlice.hash())); @@ -125,13 +125,13 @@ contract RaindexV6RemoveOrderOwnerTest is RaindexV6ExternalRealTest { OrderV4 memory order = OrderV4(alice, config.evaluable, config.validInputs, config.validOutputs, config.nonce); vm.prank(alice); - bool stateChange = iRaindex.addOrder4(config, new TaskV2[](0)); + bool stateChange = iRaindex.addOrder5(config, new TaskV3[](0)); assert(stateChange); assert(iRaindex.orderExists(order.hash())); vm.prank(bob); vm.expectRevert(abi.encodeWithSelector(NotOrderOwner.selector, alice)); - stateChange = iRaindex.removeOrder3(order, new TaskV2[](0)); + stateChange = iRaindex.removeOrder4(order, new TaskV3[](0)); assert(!stateChange); assert(iRaindex.orderExists(order.hash())); } diff --git a/test/concrete/raindex/RaindexV6.takeOrder.badStack.t.sol b/test/concrete/raindex/RaindexV6.takeOrder.badStack.t.sol index ea3a09064e..6241d1110d 100644 --- a/test/concrete/raindex/RaindexV6.takeOrder.badStack.t.sol +++ b/test/concrete/raindex/RaindexV6.takeOrder.badStack.t.sol @@ -8,8 +8,8 @@ import {LibTestTakeOrder} from "test/util/lib/LibTestTakeOrder.sol"; import { OrderConfigV4, OrderV4, - TaskV2, - TakeOrdersConfigV5 + TaskV3, + TakeOrdersConfigV6 } from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {UnsupportedCalculateOutputs} from "../../../src/error/ErrRaindexV6.sol"; @@ -27,17 +27,17 @@ contract RaindexV6TakeOrderBadStackTest is RaindexV6ExternalRealTest { OrderV4 memory order = OrderV4(alice, config.evaluable, config.validInputs, config.validOutputs, config.nonce); - TakeOrdersConfigV5 memory takeOrdersConfig = + TakeOrdersConfigV6 memory takeOrdersConfig = LibTestTakeOrder.defaultTakeConfig(LibTestTakeOrder.wrapSingle(order)); config.validInputs[0].token = address(iToken0); config.validOutputs[0].token = address(iToken1); vm.prank(alice); - iRaindex.addOrder4(config, new TaskV2[](0)); + iRaindex.addOrder5(config, new TaskV3[](0)); vm.prank(bob); vm.expectRevert(abi.encodeWithSelector(UnsupportedCalculateOutputs.selector, badStackHeight)); - iRaindex.takeOrders4(takeOrdersConfig); + iRaindex.takeOrders5(takeOrdersConfig); } /// forge-config: default.fuzz.runs = 100 diff --git a/test/concrete/raindex/RaindexV6.takeOrder.batchEvalConsistency.t.sol b/test/concrete/raindex/RaindexV6.takeOrder.batchEvalConsistency.t.sol index 3cccf3f30f..77f73b9253 100644 --- a/test/concrete/raindex/RaindexV6.takeOrder.batchEvalConsistency.t.sol +++ b/test/concrete/raindex/RaindexV6.takeOrder.batchEvalConsistency.t.sol @@ -10,15 +10,15 @@ import { OrderConfigV4, EvaluableV4, IOV2, - TakeOrderConfigV4, - TakeOrdersConfigV5, - SignedContextV1, - TaskV2 + TakeOrderConfigV5, + TakeOrdersConfigV6, + SignedContextV2, + TaskV3 } from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {Float, LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; /// @title RaindexV6TakeOrderBatchEvalConsistencyTest -/// @notice Within a single `takeOrders4` batch, each order's `calculate` should +/// @notice Within a single `takeOrders5` batch, each order's `calculate` should /// see the complete effects of every earlier order in the batch — a sequential /// view. Today that holds for some state and not others, depending purely on how /// the effect is applied: @@ -76,7 +76,7 @@ contract RaindexV6TakeOrderBatchEvalConsistencyTest is RaindexV6ExternalRealTest /// Fund the owner's iToken1 output vault so orders have output to give. function fundOutput(address o) internal { vm.prank(o); - iRaindex.deposit4(address(iToken1), INTERNAL_VAULT, LibDecimalFloat.packLossless(100, 0), new TaskV2[](0)); + iRaindex.deposit5(address(iToken1), INTERNAL_VAULT, LibDecimalFloat.packLossless(100, 0), new TaskV3[](0)); } function addOrder(address o, bytes memory expr, bytes32 inputVaultId) internal returns (OrderV4 memory) { @@ -105,18 +105,18 @@ contract RaindexV6TakeOrderBatchEvalConsistencyTest is RaindexV6ExternalRealTest meta: "" }); vm.prank(o); - iRaindex.addOrder4(config, new TaskV2[](0)); + iRaindex.addOrder5(config, new TaskV3[](0)); return OrderV4(o, config.evaluable, config.validInputs, config.validOutputs, config.nonce); } function take(OrderV4 memory a, OrderV4 memory b) internal returns (Float totalTakerInput) { - TakeOrderConfigV4[] memory orders = new TakeOrderConfigV4[](2); + TakeOrderConfigV5[] memory orders = new TakeOrderConfigV5[](2); orders[0] = - TakeOrderConfigV4({order: a, inputIOIndex: 0, outputIOIndex: 0, signedContext: new SignedContextV1[](0)}); + TakeOrderConfigV5({order: a, inputIOIndex: 0, outputIOIndex: 0, signedContext: new SignedContextV2[](0)}); orders[1] = - TakeOrderConfigV4({order: b, inputIOIndex: 0, outputIOIndex: 0, signedContext: new SignedContextV1[](0)}); + TakeOrderConfigV5({order: b, inputIOIndex: 0, outputIOIndex: 0, signedContext: new SignedContextV2[](0)}); vm.prank(iTaker); - (totalTakerInput,) = iRaindex.takeOrders4(LibTestTakeOrder.defaultTakeConfig(orders)); + (totalTakerInput,) = iRaindex.takeOrders5(LibTestTakeOrder.defaultTakeConfig(orders)); } // A: plain fill of 1, crediting its input vault. @@ -175,15 +175,15 @@ contract RaindexV6TakeOrderBatchEvalConsistencyTest is RaindexV6ExternalRealTest } function take3(OrderV4 memory a, OrderV4 memory b, OrderV4 memory c) internal returns (Float totalTakerInput) { - TakeOrderConfigV4[] memory orders = new TakeOrderConfigV4[](3); + TakeOrderConfigV5[] memory orders = new TakeOrderConfigV5[](3); orders[0] = - TakeOrderConfigV4({order: a, inputIOIndex: 0, outputIOIndex: 0, signedContext: new SignedContextV1[](0)}); + TakeOrderConfigV5({order: a, inputIOIndex: 0, outputIOIndex: 0, signedContext: new SignedContextV2[](0)}); orders[1] = - TakeOrderConfigV4({order: b, inputIOIndex: 0, outputIOIndex: 0, signedContext: new SignedContextV1[](0)}); + TakeOrderConfigV5({order: b, inputIOIndex: 0, outputIOIndex: 0, signedContext: new SignedContextV2[](0)}); orders[2] = - TakeOrderConfigV4({order: c, inputIOIndex: 0, outputIOIndex: 0, signedContext: new SignedContextV1[](0)}); + TakeOrderConfigV5({order: c, inputIOIndex: 0, outputIOIndex: 0, signedContext: new SignedContextV2[](0)}); vm.prank(iTaker); - (totalTakerInput,) = iRaindex.takeOrders4(LibTestTakeOrder.defaultTakeConfig(orders)); + (totalTakerInput,) = iRaindex.takeOrders5(LibTestTakeOrder.defaultTakeConfig(orders)); } // C: output as much as its input vault holds (reads the accumulated balance, diff --git a/test/concrete/raindex/RaindexV6.takeOrder.batchStateAdversarial.t.sol b/test/concrete/raindex/RaindexV6.takeOrder.batchStateAdversarial.t.sol index c270ac700e..ee7c19899a 100644 --- a/test/concrete/raindex/RaindexV6.takeOrder.batchStateAdversarial.t.sol +++ b/test/concrete/raindex/RaindexV6.takeOrder.batchStateAdversarial.t.sol @@ -8,16 +8,16 @@ import {RaindexV6ExternalRealTest} from "test/util/abstract/RaindexV6ExternalRea import {LibTestTakeOrder} from "test/util/lib/LibTestTakeOrder.sol"; import { OrderV4, - TakeOrderConfigV4, - TakeOrdersConfigV5, - SignedContextV1, - TaskV2 + TakeOrderConfigV5, + TakeOrdersConfigV6, + SignedContextV2, + TaskV3 } from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {Float, LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; /// @title RaindexV6TakeOrderBatchStateAdversarialTest /// @notice Audit Protofire H01 (#2617): adversarial coverage of the per-owner -/// `stateOverlay` threading in `takeOrders4`. Each test pins one behaviour of +/// `stateOverlay` threading in `takeOrders5`. Each test pins one behaviour of /// the fix with a discriminating total: the value differs from what the /// pre-fix (or a mutated) contract would produce. contract RaindexV6TakeOrderBatchStateAdversarialTest is RaindexV6ExternalRealTest { @@ -38,8 +38,8 @@ contract RaindexV6TakeOrderBatchStateAdversarialTest is RaindexV6ExternalRealTes function fund(address o) internal { vm.prank(o); - iRaindex.deposit4( - address(iToken1), bytes32(uint256(0x01)), LibDecimalFloat.packLossless(100, 0), new TaskV2[](0) + iRaindex.deposit5( + address(iToken1), bytes32(uint256(0x01)), LibDecimalFloat.packLossless(100, 0), new TaskV3[](0) ); } @@ -50,14 +50,14 @@ contract RaindexV6TakeOrderBatchStateAdversarialTest is RaindexV6ExternalRealTes } function take(OrderV4[] memory ordersList) internal returns (Float totalTakerInput) { - TakeOrderConfigV4[] memory orders = new TakeOrderConfigV4[](ordersList.length); + TakeOrderConfigV5[] memory orders = new TakeOrderConfigV5[](ordersList.length); for (uint256 i = 0; i < ordersList.length; i++) { - orders[i] = TakeOrderConfigV4({ - order: ordersList[i], inputIOIndex: 0, outputIOIndex: 0, signedContext: new SignedContextV1[](0) + orders[i] = TakeOrderConfigV5({ + order: ordersList[i], inputIOIndex: 0, outputIOIndex: 0, signedContext: new SignedContextV2[](0) }); } vm.prank(iBob); - (totalTakerInput,) = iRaindex.takeOrders4(LibTestTakeOrder.defaultTakeConfig(orders)); + (totalTakerInput,) = iRaindex.takeOrders5(LibTestTakeOrder.defaultTakeConfig(orders)); } /// Threading works across DIFFERENT orders of the same owner, not just @@ -129,7 +129,7 @@ contract RaindexV6TakeOrderBatchStateAdversarialTest is RaindexV6ExternalRealTes } /// The fix does not change cross-transaction persistence: a "fill once" - /// order filled in one `takeOrders4` is exhausted in a later one (the + /// order filled in one `takeOrders5` is exhausted in a later one (the /// calculate write is still persisted by handleIO). tx1 fills 1, tx2 fills 0. function testCrossTransactionPersistenceUnchanged() external { mockTransfers(); @@ -191,12 +191,12 @@ contract RaindexV6TakeOrderBatchStateAdversarialTest is RaindexV6ExternalRealTes fund(o); OrderV4 memory a = addOrder(o, ":set(0 1),_ _:1 1000;:;"); OrderV4 memory b = addOrder(o, "used:get(0),_ _:if(used 0 1) 1;:;"); - TakeOrderConfigV4[] memory orders = new TakeOrderConfigV4[](2); + TakeOrderConfigV5[] memory orders = new TakeOrderConfigV5[](2); orders[0] = - TakeOrderConfigV4({order: a, inputIOIndex: 0, outputIOIndex: 0, signedContext: new SignedContextV1[](0)}); + TakeOrderConfigV5({order: a, inputIOIndex: 0, outputIOIndex: 0, signedContext: new SignedContextV2[](0)}); orders[1] = - TakeOrderConfigV4({order: b, inputIOIndex: 0, outputIOIndex: 0, signedContext: new SignedContextV1[](0)}); - TakeOrdersConfigV5 memory config = TakeOrdersConfigV5({ + TakeOrderConfigV5({order: b, inputIOIndex: 0, outputIOIndex: 0, signedContext: new SignedContextV2[](0)}); + TakeOrdersConfigV6 memory config = TakeOrdersConfigV6({ orders: orders, minimumIO: LibDecimalFloat.packLossless(0, 0), maximumIO: LibDecimalFloat.packLossless(type(int224).max, 0), @@ -205,7 +205,7 @@ contract RaindexV6TakeOrderBatchStateAdversarialTest is RaindexV6ExternalRealTes data: "" }); vm.prank(iBob); - (Float total,) = iRaindex.takeOrders4(config); + (Float total,) = iRaindex.takeOrders5(config); assertTrue(total.eq(LibDecimalFloat.packLossless(1, 0)), "ratio-untaken order's write must not be visible to B"); } @@ -254,12 +254,12 @@ contract RaindexV6TakeOrderBatchStateAdversarialTest is RaindexV6ExternalRealTes fund(o); OrderV4 memory a = addOrder(o, ":set(0 1),_ _:1 1000;:;"); OrderV4 memory b = addOrder(o, ":set(1 9),_ _:1 1;:;"); - TakeOrderConfigV4[] memory orders = new TakeOrderConfigV4[](2); + TakeOrderConfigV5[] memory orders = new TakeOrderConfigV5[](2); orders[0] = - TakeOrderConfigV4({order: a, inputIOIndex: 0, outputIOIndex: 0, signedContext: new SignedContextV1[](0)}); + TakeOrderConfigV5({order: a, inputIOIndex: 0, outputIOIndex: 0, signedContext: new SignedContextV2[](0)}); orders[1] = - TakeOrderConfigV4({order: b, inputIOIndex: 0, outputIOIndex: 0, signedContext: new SignedContextV1[](0)}); - TakeOrdersConfigV5 memory config = TakeOrdersConfigV5({ + TakeOrderConfigV5({order: b, inputIOIndex: 0, outputIOIndex: 0, signedContext: new SignedContextV2[](0)}); + TakeOrdersConfigV6 memory config = TakeOrdersConfigV6({ orders: orders, minimumIO: LibDecimalFloat.packLossless(0, 0), maximumIO: LibDecimalFloat.packLossless(type(int224).max, 0), @@ -269,7 +269,7 @@ contract RaindexV6TakeOrderBatchStateAdversarialTest is RaindexV6ExternalRealTes }); // tx1: A ratio-untaken, B fills; B's handleIO must commit only key 1. vm.prank(iBob); - (Float total1,) = iRaindex.takeOrders4(config); + (Float total1,) = iRaindex.takeOrders5(config); assertTrue(total1.eq(LibDecimalFloat.packLossless(1, 0)), "tx1: only B fills"); // tx2: key-0 reader fills (A gone), key-1 reader skips (B kept) -> 1. OrderV4 memory readKey0 = addOrder(o, "used:get(0),_ _:if(used 0 1) 1;:;"); diff --git a/test/concrete/raindex/RaindexV6.takeOrder.batchStateBypass.t.sol b/test/concrete/raindex/RaindexV6.takeOrder.batchStateBypass.t.sol index 6e54c15c70..e6369d5c7f 100644 --- a/test/concrete/raindex/RaindexV6.takeOrder.batchStateBypass.t.sol +++ b/test/concrete/raindex/RaindexV6.takeOrder.batchStateBypass.t.sol @@ -7,16 +7,16 @@ import {RaindexV6ExternalRealTest} from "test/util/abstract/RaindexV6ExternalRea import {LibTestTakeOrder} from "test/util/lib/LibTestTakeOrder.sol"; import { OrderV4, - TakeOrderConfigV4, - TakeOrdersConfigV5, - SignedContextV1, - TaskV2 + TakeOrderConfigV5, + TakeOrdersConfigV6, + SignedContextV2, + TaskV3 } from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {Float, LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; /// @title RaindexV6TakeOrderBatchStateBypassTest /// @notice Audit Protofire H01 (#2617): a stateful per-order cap enforced in an -/// order's calculate phase holds WITHIN a single `takeOrders4` batch, not only +/// order's calculate phase holds WITHIN a single `takeOrders5` batch, not only /// across transactions. Every order's calculate entrypoint evaluates with an /// empty `stateOverlay`, and `handleIO` runs per order inside the loop, /// committing that order's calculate-phase `kvs` to the store before the next @@ -25,7 +25,7 @@ import {Float, LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalF /// /// This suite verifies the cap with a "fill once" order: the calculate phase /// reads a store flag, marks it via `set`, and offers output only while the flag -/// is unset. Repeating the order three times in a single `takeOrders4` fills +/// is unset. Repeating the order three times in a single `takeOrders5` fills /// exactly once. contract RaindexV6TakeOrderBatchStateBypassTest is RaindexV6ExternalRealTest { using LibDecimalFloat for Float; @@ -46,8 +46,8 @@ contract RaindexV6TakeOrderBatchStateBypassTest is RaindexV6ExternalRealTest { abi.encode(true) ); vm.prank(owner); - iRaindex.deposit4( - address(iToken1), bytes32(uint256(0x01)), LibDecimalFloat.packLossless(10, 0), new TaskV2[](0) + iRaindex.deposit5( + address(iToken1), bytes32(uint256(0x01)), LibDecimalFloat.packLossless(10, 0), new TaskV3[](0) ); // calculate: read flag, set flag, offer 1 only while flag is unset (ratio 1). @@ -63,13 +63,13 @@ contract RaindexV6TakeOrderBatchStateBypassTest is RaindexV6ExternalRealTest { ); // The taker submits the SAME order three times in one batch. - TakeOrderConfigV4[] memory orders = new TakeOrderConfigV4[](3); + TakeOrderConfigV5[] memory orders = new TakeOrderConfigV5[](3); for (uint256 i = 0; i < 3; i++) { - orders[i] = TakeOrderConfigV4({ - order: order, inputIOIndex: 0, outputIOIndex: 0, signedContext: new SignedContextV1[](0) + orders[i] = TakeOrderConfigV5({ + order: order, inputIOIndex: 0, outputIOIndex: 0, signedContext: new SignedContextV2[](0) }); } - TakeOrdersConfigV5 memory config = LibTestTakeOrder.defaultTakeConfig(orders); + TakeOrdersConfigV6 memory config = LibTestTakeOrder.defaultTakeConfig(orders); // Allow the settlement transfers (taker receives token1, pays token0). vm.mockCall(address(iToken1), abi.encodeWithSelector(IERC20.transfer.selector, bob), abi.encode(true)); @@ -80,7 +80,7 @@ contract RaindexV6TakeOrderBatchStateBypassTest is RaindexV6ExternalRealTest { ); vm.prank(bob); - (Float totalTakerInput,) = iRaindex.takeOrders4(config); + (Float totalTakerInput,) = iRaindex.takeOrders5(config); // The calculate-phase cap fills at most once (total output 1): the first // repeat sets the flag, per-order handleIO commits it before the next @@ -88,7 +88,7 @@ contract RaindexV6TakeOrderBatchStateBypassTest is RaindexV6ExternalRealTest { // offer 0. assertTrue( totalTakerInput.eq(LibDecimalFloat.packLossless(1, 0)), - "stateful calculate-phase cap must hold within a single takeOrders4 batch" + "stateful calculate-phase cap must hold within a single takeOrders5 batch" ); } @@ -104,12 +104,12 @@ contract RaindexV6TakeOrderBatchStateBypassTest is RaindexV6ExternalRealTest { // Fund both owners' output vaults. vm.mockCall(address(iToken1), abi.encodeWithSelector(IERC20.transferFrom.selector), abi.encode(true)); vm.prank(ownerA); - iRaindex.deposit4( - address(iToken1), bytes32(uint256(0x01)), LibDecimalFloat.packLossless(10, 0), new TaskV2[](0) + iRaindex.deposit5( + address(iToken1), bytes32(uint256(0x01)), LibDecimalFloat.packLossless(10, 0), new TaskV3[](0) ); vm.prank(ownerB); - iRaindex.deposit4( - address(iToken1), bytes32(uint256(0x01)), LibDecimalFloat.packLossless(10, 0), new TaskV2[](0) + iRaindex.deposit5( + address(iToken1), bytes32(uint256(0x01)), LibDecimalFloat.packLossless(10, 0), new TaskV3[](0) ); OrderV4 memory orderA = LibTestTakeOrder.addOrderWithExpression( @@ -131,14 +131,14 @@ contract RaindexV6TakeOrderBatchStateBypassTest is RaindexV6ExternalRealTest { bytes32(uint256(0x01)) ); - TakeOrderConfigV4[] memory orders = new TakeOrderConfigV4[](2); - orders[0] = TakeOrderConfigV4({ - order: orderA, inputIOIndex: 0, outputIOIndex: 0, signedContext: new SignedContextV1[](0) + TakeOrderConfigV5[] memory orders = new TakeOrderConfigV5[](2); + orders[0] = TakeOrderConfigV5({ + order: orderA, inputIOIndex: 0, outputIOIndex: 0, signedContext: new SignedContextV2[](0) }); - orders[1] = TakeOrderConfigV4({ - order: orderB, inputIOIndex: 0, outputIOIndex: 0, signedContext: new SignedContextV1[](0) + orders[1] = TakeOrderConfigV5({ + order: orderB, inputIOIndex: 0, outputIOIndex: 0, signedContext: new SignedContextV2[](0) }); - TakeOrdersConfigV5 memory config = LibTestTakeOrder.defaultTakeConfig(orders); + TakeOrdersConfigV6 memory config = LibTestTakeOrder.defaultTakeConfig(orders); vm.mockCall(address(iToken1), abi.encodeWithSelector(IERC20.transfer.selector, bob), abi.encode(true)); vm.mockCall( @@ -148,7 +148,7 @@ contract RaindexV6TakeOrderBatchStateBypassTest is RaindexV6ExternalRealTest { ); vm.prank(bob); - (Float totalTakerInput,) = iRaindex.takeOrders4(config); + (Float totalTakerInput,) = iRaindex.takeOrders5(config); assertTrue( totalTakerInput.eq(LibDecimalFloat.packLossless(2, 0)), diff --git a/test/concrete/raindex/RaindexV6.takeOrder.calculationsContext.t.sol b/test/concrete/raindex/RaindexV6.takeOrder.calculationsContext.t.sol index e4c0ab3b29..c1b5d64a63 100644 --- a/test/concrete/raindex/RaindexV6.takeOrder.calculationsContext.t.sol +++ b/test/concrete/raindex/RaindexV6.takeOrder.calculationsContext.t.sol @@ -4,7 +4,7 @@ pragma solidity =0.8.25; import {RaindexV6ExternalRealTest} from "test/util/abstract/RaindexV6ExternalRealTest.sol"; import {LibTestTakeOrder} from "test/util/lib/LibTestTakeOrder.sol"; -import {OrderV4, TakeOrdersConfigV5, IRaindexV7} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; +import {OrderV4, TakeOrdersConfigV6, IRaindexV7} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {Float, LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; import {Strings} from "@openzeppelin-contracts-5.7.0/utils/Strings.sol"; import {LibOrder} from "../../../src/lib/LibOrder.sol"; @@ -44,7 +44,7 @@ contract RaindexV6TakeOrderCalculationsContextTest is RaindexV6ExternalRealTest ) ); OrderV4 memory order = _addOrder(expression); - TakeOrdersConfigV5 memory config = LibTestTakeOrder.defaultTakeConfig(LibTestTakeOrder.wrapSingle(order)); + TakeOrdersConfigV6 memory config = LibTestTakeOrder.defaultTakeConfig(LibTestTakeOrder.wrapSingle(order)); // The calculate eval (with its in-band `ensure`s on the calculations // words) must run to completion. The empty output vault then clamps the @@ -52,7 +52,7 @@ contract RaindexV6TakeOrderCalculationsContextTest is RaindexV6ExternalRealTest vm.prank(bob); vm.expectEmit(true, true, true, true); emit IRaindexV7.OrderZeroAmount(bob, alice, LibOrder.hash(order)); - (Float totalTakerInput, Float totalTakerOutput) = iRaindex.takeOrders4(config); + (Float totalTakerInput, Float totalTakerOutput) = iRaindex.takeOrders5(config); assertTrue(totalTakerInput.isZero(), "totalTakerInput must be zero"); assertTrue(totalTakerOutput.isZero(), "totalTakerOutput must be zero"); diff --git a/test/concrete/raindex/RaindexV6.takeOrder.dirtyFreeMemory.t.sol b/test/concrete/raindex/RaindexV6.takeOrder.dirtyFreeMemory.t.sol index 7756a5c670..975c0aeb0d 100644 --- a/test/concrete/raindex/RaindexV6.takeOrder.dirtyFreeMemory.t.sol +++ b/test/concrete/raindex/RaindexV6.takeOrder.dirtyFreeMemory.t.sol @@ -8,15 +8,15 @@ import {LibTestTakeOrder} from "test/util/lib/LibTestTakeOrder.sol"; import {MockToken} from "test/util/concrete/MockToken.sol"; import { OrderV4, - TakeOrderConfigV4, - TakeOrdersConfigV5, - SignedContextV1, - TaskV2 -} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; + TakeOrderConfigV5, + TakeOrdersConfigV6, + SignedContextV2, + TaskV3 +} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {Float, LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; /// @title RaindexV6TakeOrderDirtyFreeMemoryTest -/// @notice `takeOrders4` settles exactly the taken orders when the memory past +/// @notice `takeOrders5` settles exactly the taken orders when the memory past /// the free memory pointer is nonzero on entry. contract RaindexV6TakeOrderDirtyFreeMemoryTest is RaindexV6ExternalRealTest { using LibDecimalFloat for Float; @@ -46,7 +46,7 @@ contract RaindexV6TakeOrderDirtyFreeMemoryTest is RaindexV6ExternalRealTest { vm.startPrank(who); token.approve(address(iRaindex), amount * 1e18); // forge-lint: disable-next-line(unsafe-typecast) - iRaindex.deposit4(address(token), vaultId, LibDecimalFloat.packLossless(int256(amount), 0), new TaskV2[](0)); + iRaindex.deposit5(address(token), vaultId, LibDecimalFloat.packLossless(int256(amount), 0), new TaskV3[](0)); vm.stopPrank(); } @@ -63,14 +63,14 @@ contract RaindexV6TakeOrderDirtyFreeMemoryTest is RaindexV6ExternalRealTest { vm.prank(bob); token0.approve(address(iRaindex), 3e18); - TakeOrderConfigV4[] memory orders = new TakeOrderConfigV4[](2); - orders[0] = TakeOrderConfigV4(taken, 0, 0, new SignedContextV1[](0)); - orders[1] = TakeOrderConfigV4(zeroAmount, 0, 0, new SignedContextV1[](0)); - TakeOrdersConfigV5 memory config = LibTestTakeOrder.defaultTakeConfig(orders); + TakeOrderConfigV5[] memory orders = new TakeOrderConfigV5[](2); + orders[0] = TakeOrderConfigV5(taken, 0, 0, new SignedContextV2[](0)); + orders[1] = TakeOrderConfigV5(zeroAmount, 0, 0, new SignedContextV2[](0)); + TakeOrdersConfigV6 memory config = LibTestTakeOrder.defaultTakeConfig(orders); config.maximumIO = LibDecimalFloat.packLossless(10, 0); vm.prank(bob); - (Float totalTakerInput, Float totalTakerOutput) = iRaindex.takeOrders4(config); + (Float totalTakerInput, Float totalTakerOutput) = iRaindex.takeOrders5(config); assertTrue(totalTakerInput.eq(LibDecimalFloat.packLossless(3, 0)), "taker input"); assertTrue(totalTakerOutput.eq(LibDecimalFloat.packLossless(3, 0)), "taker output"); diff --git a/test/concrete/raindex/RaindexV6.takeOrder.exceedsMaxRatio.t.sol b/test/concrete/raindex/RaindexV6.takeOrder.exceedsMaxRatio.t.sol index b8b772a5f0..4ed4c424ec 100644 --- a/test/concrete/raindex/RaindexV6.takeOrder.exceedsMaxRatio.t.sol +++ b/test/concrete/raindex/RaindexV6.takeOrder.exceedsMaxRatio.t.sol @@ -5,7 +5,7 @@ pragma solidity =0.8.25; import {IERC20} from "@openzeppelin-contracts-5.7.0/token/ERC20/IERC20.sol"; import {RaindexV6ExternalRealTest} from "test/util/abstract/RaindexV6ExternalRealTest.sol"; import {LibTestTakeOrder} from "test/util/lib/LibTestTakeOrder.sol"; -import {OrderV4, TakeOrdersConfigV5, TaskV2, IRaindexV7} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; +import {OrderV4, TakeOrdersConfigV6, TaskV3, IRaindexV7} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {Float, LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; import {LibOrder} from "../../../src/lib/LibOrder.sol"; @@ -25,8 +25,8 @@ contract RaindexV6TakeOrderExceedsMaxRatioTest is RaindexV6ExternalRealTest { abi.encode(true) ); vm.prank(alice); - iRaindex.deposit4( - address(iToken1), bytes32(uint256(0x01)), LibDecimalFloat.packLossless(10, 0), new TaskV2[](0) + iRaindex.deposit5( + address(iToken1), bytes32(uint256(0x01)), LibDecimalFloat.packLossless(10, 0), new TaskV3[](0) ); // Order with outputMax=1 and IORatio=100. @@ -41,13 +41,13 @@ contract RaindexV6TakeOrderExceedsMaxRatioTest is RaindexV6ExternalRealTest { ); // maximumIORatio = 1, but order ratio is 100 -> skip. - TakeOrdersConfigV5 memory takeConfig = LibTestTakeOrder.defaultTakeConfig(LibTestTakeOrder.wrapSingle(order)); + TakeOrdersConfigV6 memory takeConfig = LibTestTakeOrder.defaultTakeConfig(LibTestTakeOrder.wrapSingle(order)); takeConfig.maximumIORatio = LibDecimalFloat.packLossless(1, 0); vm.prank(bob); vm.expectEmit(true, true, true, true); emit IRaindexV7.OrderExceedsMaxRatio(bob, alice, LibOrder.hash(order)); - (Float totalTakerInput, Float totalTakerOutput) = iRaindex.takeOrders4(takeConfig); + (Float totalTakerInput, Float totalTakerOutput) = iRaindex.takeOrders5(takeConfig); assertTrue(totalTakerInput.isZero(), "totalTakerInput must be zero"); assertTrue(totalTakerOutput.isZero(), "totalTakerOutput must be zero"); diff --git a/test/concrete/raindex/RaindexV6.takeOrder.freshMutation.t.sol b/test/concrete/raindex/RaindexV6.takeOrder.freshMutation.t.sol index 88adb7e2b9..e08ad6c005 100644 --- a/test/concrete/raindex/RaindexV6.takeOrder.freshMutation.t.sol +++ b/test/concrete/raindex/RaindexV6.takeOrder.freshMutation.t.sol @@ -9,19 +9,19 @@ import {LibTestTakeOrder} from "test/util/lib/LibTestTakeOrder.sol"; import { OrderV4, IOV2, - TakeOrderConfigV4, - TakeOrdersConfigV5, - TaskV2, + TakeOrderConfigV5, + TakeOrdersConfigV6, + TaskV3, IRaindexV7 } from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; -import {SignedContextV1} from "rainlang-interface-0.2.13/src/interface/deprecated/v1/IInterpreterCallerV2.sol"; +import {SignedContextV2} from "rainlang-interface-0.2.14/src/interface/IInterpreterCallerV5.sol"; import {Float, LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; import {LibOrder} from "../../../src/lib/LibOrder.sol"; import {MinimumIO, TokenMismatch} from "../../../src/error/ErrRaindexV6.sol"; import {RecordingTaker} from "test/util/concrete/RecordingTaker.sol"; /// @title RaindexV6TakeOrderFreshMutationTest -/// @notice Adversarial-mutation coverage of the takeOrders4 take/skip loop run +/// @notice Adversarial-mutation coverage of the takeOrders5 take/skip loop run /// against a FRESH-COMPILED RaindexV6 (see RaindexV6FreshTakeOrderTest) so that /// mutations to src/concrete/raindex/RaindexV6.sol are observed. The committed /// suite etches generated bytecode and is blind to source edits. @@ -51,7 +51,7 @@ contract RaindexV6TakeOrderFreshMutationTest is RaindexV6FreshTakeOrderTest { vm.prank(owner); // amount is a whole-token test quantity, far below int256 max. // forge-lint: disable-next-line(unsafe-typecast) - iRaindex.deposit4(address(iToken1), vaultId, LibDecimalFloat.packLossless(int256(amount), 0), new TaskV2[](0)); + iRaindex.deposit5(address(iToken1), vaultId, LibDecimalFloat.packLossless(int256(amount), 0), new TaskV3[](0)); } /// Add an order owned by `owner` with input=iToken0(vaultId), output=iToken1(vaultId). @@ -73,7 +73,7 @@ contract RaindexV6TakeOrderFreshMutationTest is RaindexV6FreshTakeOrderTest { vm.mockCall(address(iToken0), abi.encodeWithSelector(IERC20.transferFrom.selector), abi.encode(true)); } - function _config(OrderV4 memory order) internal pure returns (TakeOrdersConfigV5 memory) { + function _config(OrderV4 memory order) internal pure returns (TakeOrdersConfigV6 memory) { return LibTestTakeOrder.defaultTakeConfig(LibTestTakeOrder.wrapSingle(order)); } @@ -99,7 +99,7 @@ contract RaindexV6TakeOrderFreshMutationTest is RaindexV6FreshTakeOrderTest { _depositOutput(alice, 10, VAULT1); OrderV4 memory order = _order(alice, "_ _:5 2;:;"); - TakeOrdersConfigV5 memory config = _config(order); + TakeOrdersConfigV6 memory config = _config(order); config.IOIsInput = true; config.maximumIO = LibDecimalFloat.packLossless(3, 0); @@ -121,7 +121,7 @@ contract RaindexV6TakeOrderFreshMutationTest is RaindexV6FreshTakeOrderTest { ); vm.prank(bob); - (Float totalTakerInput, Float totalTakerOutput) = iRaindex.takeOrders4(config); + (Float totalTakerInput, Float totalTakerOutput) = iRaindex.takeOrders5(config); assertTrue(totalTakerInput.eq(LibDecimalFloat.packLossless(3, 0)), "taker input == 3"); assertTrue(totalTakerOutput.eq(LibDecimalFloat.packLossless(6, 0)), "taker output == 6"); } @@ -137,12 +137,12 @@ contract RaindexV6TakeOrderFreshMutationTest is RaindexV6FreshTakeOrderTest { OrderV4 memory order = _order(alice, "_ _:2 1;:;"); _mockTakerTransfers(); - TakeOrdersConfigV5 memory config = _config(order); + TakeOrdersConfigV6 memory config = _config(order); config.IOIsInput = true; config.maximumIO = LibDecimalFloat.packLossless(100, 0); vm.prank(bob); - (Float totalTakerInput, Float totalTakerOutput) = iRaindex.takeOrders4(config); + (Float totalTakerInput, Float totalTakerOutput) = iRaindex.takeOrders5(config); assertTrue(totalTakerInput.eq(LibDecimalFloat.packLossless(2, 0)), "taker input == 2 (outputMax)"); assertTrue(totalTakerOutput.eq(LibDecimalFloat.packLossless(2, 0)), "taker output == 2"); } @@ -157,7 +157,7 @@ contract RaindexV6TakeOrderFreshMutationTest is RaindexV6FreshTakeOrderTest { _depositOutput(alice, 20, VAULT1); OrderV4 memory order = _order(alice, "_ _:10 0.5;:;"); - TakeOrdersConfigV5 memory config = _config(order); + TakeOrdersConfigV6 memory config = _config(order); config.IOIsInput = false; config.maximumIO = LibDecimalFloat.packLossless(2, 0); @@ -179,7 +179,7 @@ contract RaindexV6TakeOrderFreshMutationTest is RaindexV6FreshTakeOrderTest { ); vm.prank(bob); - (Float totalTakerInput, Float totalTakerOutput) = iRaindex.takeOrders4(config); + (Float totalTakerInput, Float totalTakerOutput) = iRaindex.takeOrders5(config); assertTrue(totalTakerInput.eq(LibDecimalFloat.packLossless(4, 0)), "taker input == 4"); assertTrue(totalTakerOutput.eq(LibDecimalFloat.packLossless(2, 0)), "taker output == 2"); } @@ -194,12 +194,12 @@ contract RaindexV6TakeOrderFreshMutationTest is RaindexV6FreshTakeOrderTest { OrderV4 memory order = _order(alice, "_ _:10 0.5;:;"); _mockTakerTransfers(); - TakeOrdersConfigV5 memory config = _config(order); + TakeOrdersConfigV6 memory config = _config(order); config.IOIsInput = false; config.maximumIO = LibDecimalFloat.packLossless(100, 0); vm.prank(bob); - (Float totalTakerInput, Float totalTakerOutput) = iRaindex.takeOrders4(config); + (Float totalTakerInput, Float totalTakerOutput) = iRaindex.takeOrders5(config); assertTrue(totalTakerInput.eq(LibDecimalFloat.packLossless(10, 0)), "taker input == 10"); assertTrue(totalTakerOutput.eq(LibDecimalFloat.packLossless(5, 0)), "taker output == 5 (orderMaxInput)"); } @@ -212,7 +212,7 @@ contract RaindexV6TakeOrderFreshMutationTest is RaindexV6FreshTakeOrderTest { _depositOutput(alice, 10, VAULT1); OrderV4 memory order = _order(alice, "_ _:1 100;:;"); - TakeOrdersConfigV5 memory config = _config(order); + TakeOrdersConfigV6 memory config = _config(order); config.maximumIORatio = LibDecimalFloat.packLossless(1, 0); // No token should move on a skip. @@ -225,7 +225,7 @@ contract RaindexV6TakeOrderFreshMutationTest is RaindexV6FreshTakeOrderTest { vm.prank(bob); vm.expectEmit(true, true, true, true); emit IRaindexV7.OrderExceedsMaxRatio(bob, alice, LibOrder.hash(order)); - (Float totalTakerInput, Float totalTakerOutput) = iRaindex.takeOrders4(config); + (Float totalTakerInput, Float totalTakerOutput) = iRaindex.takeOrders5(config); assertTrue(totalTakerInput.isZero(), "input zero"); assertTrue(totalTakerOutput.isZero(), "output zero"); } @@ -240,13 +240,13 @@ contract RaindexV6TakeOrderFreshMutationTest is RaindexV6FreshTakeOrderTest { OrderV4 memory order = _order(alice, "_ _:1 2;:;"); _mockTakerTransfers(); - TakeOrdersConfigV5 memory config = _config(order); + TakeOrdersConfigV6 memory config = _config(order); config.IOIsInput = true; config.maximumIO = LibDecimalFloat.packLossless(1, 0); config.maximumIORatio = LibDecimalFloat.packLossless(2, 0); vm.prank(bob); - (Float totalTakerInput, Float totalTakerOutput) = iRaindex.takeOrders4(config); + (Float totalTakerInput, Float totalTakerOutput) = iRaindex.takeOrders5(config); // outputMax=1, ratio=2: takerInput=min(1,1)=1, takerOutput=2. assertTrue(totalTakerInput.eq(LibDecimalFloat.packLossless(1, 0)), "input 1 (ratio==max is taken)"); assertTrue(totalTakerOutput.eq(LibDecimalFloat.packLossless(2, 0)), "output 2"); @@ -259,14 +259,14 @@ contract RaindexV6TakeOrderFreshMutationTest is RaindexV6FreshTakeOrderTest { _depositOutput(alice, 10, VAULT1); OrderV4 memory order = _order(alice, "_ _:0 1;:;"); - TakeOrdersConfigV5 memory config = _config(order); + TakeOrdersConfigV6 memory config = _config(order); vm.mockCallRevert(address(iToken0), abi.encodeWithSelector(IERC20.transfer.selector), "no transfer"); vm.mockCallRevert(address(iToken1), abi.encodeWithSelector(IERC20.transfer.selector), "no transfer"); vm.prank(bob); vm.expectEmit(true, true, true, true); emit IRaindexV7.OrderZeroAmount(bob, alice, LibOrder.hash(order)); - (Float totalTakerInput, Float totalTakerOutput) = iRaindex.takeOrders4(config); + (Float totalTakerInput, Float totalTakerOutput) = iRaindex.takeOrders5(config); assertTrue(totalTakerInput.isZero(), "input zero"); assertTrue(totalTakerOutput.isZero(), "output zero"); } @@ -280,12 +280,12 @@ contract RaindexV6TakeOrderFreshMutationTest is RaindexV6FreshTakeOrderTest { _depositOutput(alice, 10, VAULT1); OrderV4 memory order = _order(alice, "_ _:0 100;:;"); - TakeOrdersConfigV5 memory config = _config(order); + TakeOrdersConfigV6 memory config = _config(order); config.maximumIORatio = LibDecimalFloat.packLossless(1, 0); vm.prank(bob); vm.recordLogs(); - iRaindex.takeOrders4(config); + iRaindex.takeOrders5(config); Vm.Log[] memory logs = vm.getRecordedLogs(); assertEq(logs.length, 1, "exactly one skip event"); assertEq( @@ -306,30 +306,30 @@ contract RaindexV6TakeOrderFreshMutationTest is RaindexV6FreshTakeOrderTest { vm, alice, "_ _:5 1;:;", address(iToken1), VAULT1, address(iToken1), VAULT1 ); - TakeOrdersConfigV5 memory config = _config(order); + TakeOrdersConfigV6 memory config = _config(order); config.maximumIO = LibDecimalFloat.packLossless(5, 0); vm.prank(bob); // selector for TokenSelfTrade() as declared on IRaindexV7. vm.expectRevert(bytes4(keccak256("TokenSelfTrade()"))); - iRaindex.takeOrders4(config); + iRaindex.takeOrders5(config); } // --------------------------------------------------------------------- // B1: empty orders array reverts NoOrders. // --------------------------------------------------------------------- function testNoOrdersReverts() external { - TakeOrdersConfigV5 memory config = TakeOrdersConfigV5({ + TakeOrdersConfigV6 memory config = TakeOrdersConfigV6({ minimumIO: LibDecimalFloat.packLossless(0, 0), maximumIO: LibDecimalFloat.packLossless(1, 0), maximumIORatio: LibDecimalFloat.packLossless(1, 0), IOIsInput: true, - orders: new TakeOrderConfigV4[](0), + orders: new TakeOrderConfigV5[](0), data: "" }); vm.prank(bob); vm.expectRevert(IRaindexV7.NoOrders.selector); - iRaindex.takeOrders4(config); + iRaindex.takeOrders5(config); } // --------------------------------------------------------------------- @@ -341,12 +341,12 @@ contract RaindexV6TakeOrderFreshMutationTest is RaindexV6FreshTakeOrderTest { _depositOutput(alice, 10, VAULT1); OrderV4 memory order = _order(alice, "_ _:5 1;:;"); - TakeOrdersConfigV5 memory config = _config(order); + TakeOrdersConfigV6 memory config = _config(order); config.maximumIO = LibDecimalFloat.packLossless(0, 0); vm.prank(bob); vm.expectRevert(IRaindexV7.ZeroMaximumIO.selector); - iRaindex.takeOrders4(config); + iRaindex.takeOrders5(config); } // --------------------------------------------------------------------- @@ -358,12 +358,12 @@ contract RaindexV6TakeOrderFreshMutationTest is RaindexV6FreshTakeOrderTest { _depositOutput(alice, 10, VAULT1); OrderV4 memory order = _order(alice, "_ _:5 1;:;"); - TakeOrdersConfigV5 memory config = _config(order); + TakeOrdersConfigV6 memory config = _config(order); config.maximumIO = LibDecimalFloat.packLossless(-1, 0); vm.prank(bob); vm.expectRevert(IRaindexV7.ZeroMaximumIO.selector); - iRaindex.takeOrders4(config); + iRaindex.takeOrders5(config); } // --------------------------------------------------------------------- @@ -378,16 +378,16 @@ contract RaindexV6TakeOrderFreshMutationTest is RaindexV6FreshTakeOrderTest { vm, alice, "_ _:5 1;:;", address(iToken1), VAULT1, address(iToken1), VAULT1 ); - TakeOrderConfigV4[] memory orders = new TakeOrderConfigV4[](2); - orders[0] = TakeOrderConfigV4(order0, 0, 0, new SignedContextV1[](0)); - orders[1] = TakeOrderConfigV4(order1, 0, 0, new SignedContextV1[](0)); - TakeOrdersConfigV5 memory config = LibTestTakeOrder.defaultTakeConfig(orders); + TakeOrderConfigV5[] memory orders = new TakeOrderConfigV5[](2); + orders[0] = TakeOrderConfigV5(order0, 0, 0, new SignedContextV2[](0)); + orders[1] = TakeOrderConfigV5(order1, 0, 0, new SignedContextV2[](0)); + TakeOrdersConfigV6 memory config = LibTestTakeOrder.defaultTakeConfig(orders); config.maximumIO = LibDecimalFloat.packLossless(100, 0); _mockTakerTransfers(); vm.prank(bob); vm.expectRevert(TokenMismatch.selector); - iRaindex.takeOrders4(config); + iRaindex.takeOrders5(config); } // --------------------------------------------------------------------- @@ -401,16 +401,16 @@ contract RaindexV6TakeOrderFreshMutationTest is RaindexV6FreshTakeOrderTest { vm, alice, "_ _:5 1;:;", address(iToken0), VAULT1, address(iToken0), VAULT1 ); - TakeOrderConfigV4[] memory orders = new TakeOrderConfigV4[](2); - orders[0] = TakeOrderConfigV4(order0, 0, 0, new SignedContextV1[](0)); - orders[1] = TakeOrderConfigV4(order1, 0, 0, new SignedContextV1[](0)); - TakeOrdersConfigV5 memory config = LibTestTakeOrder.defaultTakeConfig(orders); + TakeOrderConfigV5[] memory orders = new TakeOrderConfigV5[](2); + orders[0] = TakeOrderConfigV5(order0, 0, 0, new SignedContextV2[](0)); + orders[1] = TakeOrderConfigV5(order1, 0, 0, new SignedContextV2[](0)); + TakeOrdersConfigV6 memory config = LibTestTakeOrder.defaultTakeConfig(orders); config.maximumIO = LibDecimalFloat.packLossless(100, 0); _mockTakerTransfers(); vm.prank(bob); vm.expectRevert(TokenMismatch.selector); - iRaindex.takeOrders4(config); + iRaindex.takeOrders5(config); } // --------------------------------------------------------------------- @@ -424,7 +424,7 @@ contract RaindexV6TakeOrderFreshMutationTest is RaindexV6FreshTakeOrderTest { OrderV4 memory order = _order(alice, "_ _:1e-18 1;:;"); _mockTakerTransfers(); - TakeOrdersConfigV5 memory config = _config(order); + TakeOrdersConfigV6 memory config = _config(order); config.IOIsInput = true; config.minimumIO = LibDecimalFloat.packLossless(1, 0); @@ -434,7 +434,7 @@ contract RaindexV6TakeOrderFreshMutationTest is RaindexV6FreshTakeOrderTest { MinimumIO.selector, LibDecimalFloat.packLossless(1, 0), LibDecimalFloat.packLossless(1, -18) ) ); - iRaindex.takeOrders4(config); + iRaindex.takeOrders5(config); } // --------------------------------------------------------------------- @@ -447,13 +447,13 @@ contract RaindexV6TakeOrderFreshMutationTest is RaindexV6FreshTakeOrderTest { OrderV4 memory order = _order(alice, "_ _:1 1;:;"); _mockTakerTransfers(); - TakeOrdersConfigV5 memory config = _config(order); + TakeOrdersConfigV6 memory config = _config(order); config.IOIsInput = true; config.maximumIO = LibDecimalFloat.packLossless(1, 0); config.minimumIO = LibDecimalFloat.packLossless(1, 0); vm.prank(bob); - (Float totalTakerInput,) = iRaindex.takeOrders4(config); + (Float totalTakerInput,) = iRaindex.takeOrders5(config); assertTrue(totalTakerInput.eq(LibDecimalFloat.packLossless(1, 0)), "input == minimumIO fills"); } @@ -471,7 +471,7 @@ contract RaindexV6TakeOrderFreshMutationTest is RaindexV6FreshTakeOrderTest { OrderV4 memory order = _order(alice, "_ _:1 3;:;"); _mockTakerTransfers(); - TakeOrdersConfigV5 memory config = _config(order); + TakeOrdersConfigV6 memory config = _config(order); config.IOIsInput = true; config.maximumIO = LibDecimalFloat.packLossless(1, 0); config.minimumIO = LibDecimalFloat.packLossless(2, 0); @@ -482,7 +482,7 @@ contract RaindexV6TakeOrderFreshMutationTest is RaindexV6FreshTakeOrderTest { MinimumIO.selector, LibDecimalFloat.packLossless(2, 0), LibDecimalFloat.packLossless(1, 0) ) ); - iRaindex.takeOrders4(config); + iRaindex.takeOrders5(config); } // --------------------------------------------------------------------- @@ -493,15 +493,15 @@ contract RaindexV6TakeOrderFreshMutationTest is RaindexV6FreshTakeOrderTest { _depositOutput(alice, 10, VAULT1); OrderV4 memory order = _order(alice, "_ _:5 1;:;"); vm.prank(alice); - iRaindex.removeOrder3(order, new TaskV2[](0)); + iRaindex.removeOrder4(order, new TaskV3[](0)); - TakeOrdersConfigV5 memory config = _config(order); + TakeOrdersConfigV6 memory config = _config(order); vm.mockCallRevert(address(iToken0), abi.encodeWithSelector(IERC20.transfer.selector), "no transfer"); vm.mockCallRevert(address(iToken1), abi.encodeWithSelector(IERC20.transfer.selector), "no transfer"); vm.prank(bob); vm.recordLogs(); - (Float totalTakerInput, Float totalTakerOutput) = iRaindex.takeOrders4(config); + (Float totalTakerInput, Float totalTakerOutput) = iRaindex.takeOrders5(config); Vm.Log[] memory logs = vm.getRecordedLogs(); assertEq(logs.length, 1, "exactly one event"); assertEq( @@ -518,7 +518,7 @@ contract RaindexV6TakeOrderFreshMutationTest is RaindexV6FreshTakeOrderTest { } // --------------------------------------------------------------------- - // B26: TakeOrderV3 is emitted on a successful fill with the taker's input + // B26: TakeOrderV4 is emitted on a successful fill with the taker's input // and output. Order outputMax=3, ratio=2, max input 3 => input 3, output 6. // --------------------------------------------------------------------- function testTakeOrderV3EmittedWithAmounts() external { @@ -526,17 +526,17 @@ contract RaindexV6TakeOrderFreshMutationTest is RaindexV6FreshTakeOrderTest { OrderV4 memory order = _order(alice, "_ _:3 2;:;"); _mockTakerTransfers(); - TakeOrdersConfigV5 memory config = _config(order); + TakeOrdersConfigV6 memory config = _config(order); config.IOIsInput = true; config.maximumIO = LibDecimalFloat.packLossless(3, 0); - TakeOrderConfigV4 memory expectedConfig = TakeOrderConfigV4(order, 0, 0, new SignedContextV1[](0)); + TakeOrderConfigV5 memory expectedConfig = TakeOrderConfigV5(order, 0, 0, new SignedContextV2[](0)); vm.prank(bob); vm.expectEmit(address(iRaindex)); - emit IRaindexV7.TakeOrderV3( + emit IRaindexV7.TakeOrderV4( bob, expectedConfig, LibDecimalFloat.packLossless(3, 0), LibDecimalFloat.packLossless(6, 0) ); - iRaindex.takeOrders4(config); + iRaindex.takeOrders5(config); } // --------------------------------------------------------------------- @@ -555,7 +555,7 @@ contract RaindexV6TakeOrderFreshMutationTest is RaindexV6FreshTakeOrderTest { vm.mockCall(address(iToken1), abi.encodeWithSelector(IERC20.transfer.selector), abi.encode(true)); vm.mockCall(address(iToken0), abi.encodeWithSelector(IERC20.transferFrom.selector), abi.encode(true)); - TakeOrdersConfigV5 memory config = _config(order); + TakeOrdersConfigV6 memory config = _config(order); config.IOIsInput = true; config.maximumIO = LibDecimalFloat.packLossless(4, 0); config.data = hex"abcd"; @@ -584,7 +584,7 @@ contract RaindexV6TakeOrderFreshMutationTest is RaindexV6FreshTakeOrderTest { vm.mockCall(address(iToken1), abi.encodeWithSelector(IERC20.transfer.selector), abi.encode(true)); vm.mockCall(address(iToken0), abi.encodeWithSelector(IERC20.transferFrom.selector), abi.encode(true)); - TakeOrdersConfigV5 memory config = _config(order); + TakeOrdersConfigV6 memory config = _config(order); config.IOIsInput = true; config.maximumIO = LibDecimalFloat.packLossless(4, 0); config.data = ""; // empty @@ -602,7 +602,7 @@ contract RaindexV6TakeOrderFreshMutationTest is RaindexV6FreshTakeOrderTest { RecordingTaker taker = new RecordingTaker(iRaindex); OrderV4 memory order = _order(alice, "_ _:0 1;:;"); // zero output => skip - TakeOrdersConfigV5 memory config = _config(order); + TakeOrdersConfigV6 memory config = _config(order); config.data = hex"abcd"; // non-empty config.minimumIO = LibDecimalFloat.packLossless(0, 0); @@ -616,7 +616,7 @@ contract RaindexV6TakeOrderFreshMutationTest is RaindexV6FreshTakeOrderTest { // discriminates ADD from ASSIGN). ratio=1; maximumIO(input)=20 lets both // fill fully. totals == 3+5 == 8: a mutation that ASSIGNS instead of adds // gives 5 (the last), one that stops the loop early gives 3, one that drops - // the second handle gives a wrong vault movement. Both TakeOrderV3 events + // the second handle gives a wrong vault movement. Both TakeOrderV4 events // fire (one per filled order). // --------------------------------------------------------------------- function testBatchAccumulatesTwoOrders() external { @@ -625,25 +625,25 @@ contract RaindexV6TakeOrderFreshMutationTest is RaindexV6FreshTakeOrderTest { OrderV4 memory orderA = _order(alice, "_ _:3 1;:;"); OrderV4 memory orderC = _order(carol, "_ _:5 1;:;"); - TakeOrderConfigV4[] memory orders = new TakeOrderConfigV4[](2); - orders[0] = TakeOrderConfigV4(orderA, 0, 0, new SignedContextV1[](0)); - orders[1] = TakeOrderConfigV4(orderC, 0, 0, new SignedContextV1[](0)); - TakeOrdersConfigV5 memory config = LibTestTakeOrder.defaultTakeConfig(orders); + TakeOrderConfigV5[] memory orders = new TakeOrderConfigV5[](2); + orders[0] = TakeOrderConfigV5(orderA, 0, 0, new SignedContextV2[](0)); + orders[1] = TakeOrderConfigV5(orderC, 0, 0, new SignedContextV2[](0)); + TakeOrdersConfigV6 memory config = LibTestTakeOrder.defaultTakeConfig(orders); config.IOIsInput = true; config.maximumIO = LibDecimalFloat.packLossless(20, 0); _mockTakerTransfers(); vm.prank(bob); vm.recordLogs(); - (Float totalTakerInput, Float totalTakerOutput) = iRaindex.takeOrders4(config); + (Float totalTakerInput, Float totalTakerOutput) = iRaindex.takeOrders5(config); assertTrue( totalTakerInput.eq(LibDecimalFloat.packLossless(8, 0)), "total input == 3+5 == 8 (added, not assigned)" ); assertTrue(totalTakerOutput.eq(LibDecimalFloat.packLossless(8, 0)), "total output == 8"); - // Exactly two TakeOrderV3 events (one per filled order). - assertEq(_countTakeOrderV3(vm.getRecordedLogs()), 2, "both orders emit TakeOrderV3"); + // Exactly two TakeOrderV4 events (one per filled order). + assertEq(_countTakeOrderV3(vm.getRecordedLogs()), 2, "both orders emit TakeOrderV4"); // Both owners' output vaults were debited by their fill (alice 3, carol // 5): pins that BOTH orders' recordVaultOutput + handleIO ran, not just @@ -662,7 +662,7 @@ contract RaindexV6TakeOrderFreshMutationTest is RaindexV6FreshTakeOrderTest { // B5/B17: the loop stops once remainingTakerIO is exhausted. Order A // outputMax=3, order C outputMax=5; maximumIO(input)=3 fills the FIRST // order fully (3) and leaves nothing, so the SECOND (5) does NOT fill: total - // input == 3 (not 5, not 8), exactly ONE TakeOrderV3. Pins the loop guard + // input == 3 (not 5, not 8), exactly ONE TakeOrderV4. Pins the loop guard // `remainingTakerIO.gt(0)` and the remaining decrement. // --------------------------------------------------------------------- function testLoopStopsWhenTakerExhausted() external { @@ -671,17 +671,17 @@ contract RaindexV6TakeOrderFreshMutationTest is RaindexV6FreshTakeOrderTest { OrderV4 memory orderA = _order(alice, "_ _:3 1;:;"); OrderV4 memory orderC = _order(carol, "_ _:5 1;:;"); - TakeOrderConfigV4[] memory orders = new TakeOrderConfigV4[](2); - orders[0] = TakeOrderConfigV4(orderA, 0, 0, new SignedContextV1[](0)); - orders[1] = TakeOrderConfigV4(orderC, 0, 0, new SignedContextV1[](0)); - TakeOrdersConfigV5 memory config = LibTestTakeOrder.defaultTakeConfig(orders); + TakeOrderConfigV5[] memory orders = new TakeOrderConfigV5[](2); + orders[0] = TakeOrderConfigV5(orderA, 0, 0, new SignedContextV2[](0)); + orders[1] = TakeOrderConfigV5(orderC, 0, 0, new SignedContextV2[](0)); + TakeOrdersConfigV6 memory config = LibTestTakeOrder.defaultTakeConfig(orders); config.IOIsInput = true; config.maximumIO = LibDecimalFloat.packLossless(3, 0); _mockTakerTransfers(); vm.prank(bob); vm.recordLogs(); - (Float totalTakerInput, Float totalTakerOutput) = iRaindex.takeOrders4(config); + (Float totalTakerInput, Float totalTakerOutput) = iRaindex.takeOrders5(config); assertTrue(totalTakerInput.eq(LibDecimalFloat.packLossless(3, 0)), "total input capped at 3 (only first fills)"); assertTrue(totalTakerOutput.eq(LibDecimalFloat.packLossless(3, 0)), "total output == 3"); @@ -705,17 +705,17 @@ contract RaindexV6TakeOrderFreshMutationTest is RaindexV6FreshTakeOrderTest { OrderV4 memory orderA = _order(alice, "_ _:3 2;:;"); OrderV4 memory orderC = _order(carol, "_ _:3 2;:;"); - TakeOrderConfigV4[] memory orders = new TakeOrderConfigV4[](2); - orders[0] = TakeOrderConfigV4(orderA, 0, 0, new SignedContextV1[](0)); - orders[1] = TakeOrderConfigV4(orderC, 0, 0, new SignedContextV1[](0)); - TakeOrdersConfigV5 memory config = LibTestTakeOrder.defaultTakeConfig(orders); + TakeOrderConfigV5[] memory orders = new TakeOrderConfigV5[](2); + orders[0] = TakeOrderConfigV5(orderA, 0, 0, new SignedContextV2[](0)); + orders[1] = TakeOrderConfigV5(orderC, 0, 0, new SignedContextV2[](0)); + TakeOrdersConfigV6 memory config = LibTestTakeOrder.defaultTakeConfig(orders); config.IOIsInput = true; config.maximumIO = LibDecimalFloat.packLossless(5, 0); _mockTakerTransfers(); vm.prank(bob); vm.recordLogs(); - (Float totalTakerInput, Float totalTakerOutput) = iRaindex.takeOrders4(config); + (Float totalTakerInput, Float totalTakerOutput) = iRaindex.takeOrders5(config); assertTrue(totalTakerInput.eq(LibDecimalFloat.packLossless(5, 0)), "total input == 3+2 == 5"); assertTrue(totalTakerOutput.eq(LibDecimalFloat.packLossless(10, 0)), "total output == 6+4 == 10"); @@ -737,12 +737,12 @@ contract RaindexV6TakeOrderFreshMutationTest is RaindexV6FreshTakeOrderTest { OrderV4 memory order = _orderDistinctVaults(alice, "_ _:3 2;:;", inVault, outVault); _mockTakerTransfers(); - TakeOrdersConfigV5 memory config = _config(order); + TakeOrdersConfigV6 memory config = _config(order); config.IOIsInput = true; config.maximumIO = LibDecimalFloat.packLossless(3, 0); vm.prank(bob); - iRaindex.takeOrders4(config); + iRaindex.takeOrders5(config); // Output vault debited by takerInput == 3 (not takerOutput == 6): 10-3=7. assertTrue( @@ -764,12 +764,12 @@ contract RaindexV6TakeOrderFreshMutationTest is RaindexV6FreshTakeOrderTest { OrderV4 memory order = _orderDistinctVaults(alice, "_ _:3 2;:;", inVault, outVault); _mockTakerTransfers(); - TakeOrdersConfigV5 memory config = _config(order); + TakeOrdersConfigV6 memory config = _config(order); config.IOIsInput = true; config.maximumIO = LibDecimalFloat.packLossless(3, 0); vm.prank(bob); - iRaindex.takeOrders4(config); + iRaindex.takeOrders5(config); // Input vault credited by takerOutput == 6 (not takerInput == 3). assertTrue( @@ -795,17 +795,17 @@ contract RaindexV6TakeOrderFreshMutationTest is RaindexV6FreshTakeOrderTest { OrderV4 memory orderA = _order(alice, "_ _:10 2;:;"); OrderV4 memory orderC = _order(carol, "_ _:10 2;:;"); - TakeOrderConfigV4[] memory orders = new TakeOrderConfigV4[](2); - orders[0] = TakeOrderConfigV4(orderA, 0, 0, new SignedContextV1[](0)); - orders[1] = TakeOrderConfigV4(orderC, 0, 0, new SignedContextV1[](0)); - TakeOrdersConfigV5 memory config = LibTestTakeOrder.defaultTakeConfig(orders); + TakeOrderConfigV5[] memory orders = new TakeOrderConfigV5[](2); + orders[0] = TakeOrderConfigV5(orderA, 0, 0, new SignedContextV2[](0)); + orders[1] = TakeOrderConfigV5(orderC, 0, 0, new SignedContextV2[](0)); + TakeOrdersConfigV6 memory config = LibTestTakeOrder.defaultTakeConfig(orders); config.IOIsInput = false; config.maximumIO = LibDecimalFloat.packLossless(6, 0); _mockTakerTransfers(); vm.prank(bob); vm.recordLogs(); - (Float totalTakerInput, Float totalTakerOutput) = iRaindex.takeOrders4(config); + (Float totalTakerInput, Float totalTakerOutput) = iRaindex.takeOrders5(config); assertTrue( totalTakerOutput.eq(LibDecimalFloat.packLossless(6, 0)), "total output capped at 6 (only first fills)" @@ -827,22 +827,22 @@ contract RaindexV6TakeOrderFreshMutationTest is RaindexV6FreshTakeOrderTest { OrderV4 memory order = _order(alice, "_ _:5 1;:ensure(0 \"handleio ran\");"); _mockTakerTransfers(); - TakeOrdersConfigV5 memory config = _config(order); + TakeOrdersConfigV6 memory config = _config(order); config.IOIsInput = true; config.maximumIO = LibDecimalFloat.packLossless(5, 0); vm.prank(bob); vm.expectRevert(bytes("handleio ran")); - iRaindex.takeOrders4(config); + iRaindex.takeOrders5(config); } - /// Count TakeOrderV3 events in the recorded logs. The topic is the keccak of - /// the fully-expanded event signature (TakeOrderConfigV4 -> OrderV4 -> - /// EvaluableV4/IOV2[]/SignedContextV1[]; Float is a `bytes32` user type, so + /// Count TakeOrderV4 events in the recorded logs. The topic is the keccak of + /// the fully-expanded event signature (TakeOrderConfigV5 -> OrderV4 -> + /// EvaluableV4/IOV2[]/SignedContextV2[]; Float is a `bytes32` user type, so /// the two trailing input/output args canonicalize to `bytes32`). function _countTakeOrderV3(Vm.Log[] memory logs) internal pure returns (uint256 count) { bytes32 takeSig = keccak256( - "TakeOrderV3(address,((address,(address,address,bytes),(address,bytes32)[],(address,bytes32)[],bytes32),uint256,uint256,(address,bytes32[],bytes)[]),bytes32,bytes32)" + "TakeOrderV4(address,((address,(address,address,bytes),(address,bytes32)[],(address,bytes32)[],bytes32),uint256,uint256,(address,bytes32[],bytes)[]),bytes32,bytes32)" ); for (uint256 i = 0; i < logs.length; i++) { if (logs[i].topics.length > 0 && logs[i].topics[0] == takeSig) { diff --git a/test/concrete/raindex/RaindexV6.takeOrder.freshVaultZero.t.sol b/test/concrete/raindex/RaindexV6.takeOrder.freshVaultZero.t.sol index 662f031abc..1f103f9836 100644 --- a/test/concrete/raindex/RaindexV6.takeOrder.freshVaultZero.t.sol +++ b/test/concrete/raindex/RaindexV6.takeOrder.freshVaultZero.t.sol @@ -9,10 +9,10 @@ import {Reenteroor} from "test/util/concrete/Reenteroor.sol"; import { IRaindexV7, OrderV4, - TakeOrderConfigV4, - TakeOrdersConfigV5, - SignedContextV1, - TaskV2 + TakeOrderConfigV5, + TakeOrdersConfigV6, + SignedContextV2, + TaskV3 } from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {Float, LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; @@ -44,7 +44,7 @@ contract RaindexV6TakeOrderFreshVaultZeroTest is RaindexV6FreshTakeOrderTest { token.approve(address(iRaindex), amount * 1e18); // amount is a whole-token test quantity, far below int256 max. // forge-lint: disable-next-line(unsafe-typecast) - iRaindex.deposit4(address(token), vaultId, LibDecimalFloat.packLossless(int256(amount), 0), new TaskV2[](0)); + iRaindex.deposit5(address(token), vaultId, LibDecimalFloat.packLossless(int256(amount), 0), new TaskV3[](0)); vm.stopPrank(); } @@ -68,11 +68,11 @@ contract RaindexV6TakeOrderFreshVaultZeroTest is RaindexV6FreshTakeOrderTest { token0.approve(address(iRaindex), 3e18); assertEq(token0.balanceOf(address(iRaindex)), 0, "no ambient token0 in orderbook"); - TakeOrdersConfigV5 memory config = LibTestTakeOrder.defaultTakeConfig(LibTestTakeOrder.wrapSingle(order)); + TakeOrdersConfigV6 memory config = LibTestTakeOrder.defaultTakeConfig(LibTestTakeOrder.wrapSingle(order)); config.maximumIO = LibDecimalFloat.packLossless(3, 0); vm.prank(bob); - iRaindex.takeOrders4(config); + iRaindex.takeOrders5(config); // Owner received the vault-0 input in their wallet; taker funded it. assertEq(token0.balanceOf(owner), 3e18, "owner received vault-0 input pushed to wallet"); @@ -108,14 +108,14 @@ contract RaindexV6TakeOrderFreshVaultZeroTest is RaindexV6FreshTakeOrderTest { vm.prank(bob); token0.approve(address(iRaindex), 3e18); - TakeOrderConfigV4[] memory orders = new TakeOrderConfigV4[](2); - orders[0] = TakeOrderConfigV4(orderA, 0, 0, new SignedContextV1[](0)); - orders[1] = TakeOrderConfigV4(orderB, 0, 0, new SignedContextV1[](0)); - TakeOrdersConfigV5 memory config = LibTestTakeOrder.defaultTakeConfig(orders); + TakeOrderConfigV5[] memory orders = new TakeOrderConfigV5[](2); + orders[0] = TakeOrderConfigV5(orderA, 0, 0, new SignedContextV2[](0)); + orders[1] = TakeOrderConfigV5(orderB, 0, 0, new SignedContextV2[](0)); + TakeOrdersConfigV6 memory config = LibTestTakeOrder.defaultTakeConfig(orders); config.maximumIO = LibDecimalFloat.packLossless(3, 0); vm.prank(bob); - iRaindex.takeOrders4(config); + iRaindex.takeOrders5(config); // Owner's wallet nets both vault-0 inputs (1 + 2 == 3), settled once. assertEq(token0.balanceOf(owner), 3e18, "owner wallet nets both vault-0 inputs"); @@ -125,7 +125,7 @@ contract RaindexV6TakeOrderFreshVaultZeroTest is RaindexV6FreshTakeOrderTest { } // --------------------------------------------------------------------- - // B39: the nonReentrant guard. A taker that re-enters takeOrders4 from its + // B39: the nonReentrant guard. A taker that re-enters takeOrders5 from its // onTakeOrders2 callback is reverted with ReentrancyGuardReentrantCall. A // mutation removing nonReentrant lets the re-entry proceed (no such revert). // --------------------------------------------------------------------- @@ -140,17 +140,17 @@ contract RaindexV6TakeOrderFreshVaultZeroTest is RaindexV6FreshTakeOrderTest { vm.prank(address(taker)); token0.approve(address(iRaindex), 1e18); - TakeOrderConfigV4[] memory orders = new TakeOrderConfigV4[](1); - orders[0] = TakeOrderConfigV4(order, 0, 0, new SignedContextV1[](0)); - TakeOrdersConfigV5 memory config = LibTestTakeOrder.defaultTakeConfig(orders); + TakeOrderConfigV5[] memory orders = new TakeOrderConfigV5[](1); + orders[0] = TakeOrderConfigV5(order, 0, 0, new SignedContextV2[](0)); + TakeOrdersConfigV6 memory config = LibTestTakeOrder.defaultTakeConfig(orders); config.maximumIO = LibDecimalFloat.packLossless(1, 0); config.data = hex"01"; - // The callback re-enters takeOrders4; the nonReentrant guard reverts it. - taker.reenterWith(abi.encodeWithSelector(IRaindexV7.takeOrders4.selector, config)); + // The callback re-enters takeOrders5; the nonReentrant guard reverts it. + taker.reenterWith(abi.encodeWithSelector(IRaindexV7.takeOrders5.selector, config)); vm.expectRevert(abi.encodeWithSelector(bytes4(keccak256("ReentrancyGuardReentrantCall()")))); vm.prank(address(taker)); - iRaindex.takeOrders4(config); + iRaindex.takeOrders5(config); } } diff --git a/test/concrete/raindex/RaindexV6.takeOrder.handleIO.revert.t.sol b/test/concrete/raindex/RaindexV6.takeOrder.handleIO.revert.t.sol index c0fe65804f..1a072278f3 100644 --- a/test/concrete/raindex/RaindexV6.takeOrder.handleIO.revert.t.sol +++ b/test/concrete/raindex/RaindexV6.takeOrder.handleIO.revert.t.sol @@ -6,12 +6,12 @@ import {Vm} from "forge-std-1.17.0/src/Vm.sol"; import {RaindexV6ExternalRealTest, IERC20} from "test/util/abstract/RaindexV6ExternalRealTest.sol"; import { OrderV4, - TakeOrderConfigV4, + TakeOrderConfigV5, IOV2, OrderConfigV4, - TakeOrdersConfigV5, + TakeOrdersConfigV6, EvaluableV4, - TaskV2 + TaskV3 } from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {Float, LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; import {IERC20Metadata} from "@openzeppelin-contracts-5.7.0/token/ERC20/extensions/IERC20Metadata.sol"; @@ -63,8 +63,8 @@ contract RaindexV6TakeOrderHandleIORevertTest is RaindexV6ExternalRealTest { if (outputVaultId == bytes32(0)) { mockVault0Output(outputToken, address(this), uint256(int256(type(int224).max))); } else { - iRaindex.deposit4( - outputToken, vaultId, LibDecimalFloat.packLossless(type(int224).max, -18), new TaskV2[](0) + iRaindex.deposit5( + outputToken, vaultId, LibDecimalFloat.packLossless(type(int224).max, -18), new TaskV3[](0) ); assertTrue( iRaindex.vaultBalance2(address(this), outputToken, vaultId) @@ -75,7 +75,7 @@ contract RaindexV6TakeOrderHandleIORevertTest is RaindexV6ExternalRealTest { mockVault0Input(inputToken, address(this), 0); } - TakeOrderConfigV4[] memory orders = new TakeOrderConfigV4[](configs.length); + TakeOrderConfigV5[] memory orders = new TakeOrderConfigV5[](configs.length); for (uint256 i = 0; i < configs.length; i++) { bytes memory bytecode = iParserV2.parse2(configs[i]); @@ -83,20 +83,20 @@ contract RaindexV6TakeOrderHandleIORevertTest is RaindexV6ExternalRealTest { config = OrderConfigV4(evaluable, validInputs, validOutputs, bytes32(i), bytes32(0), ""); vm.recordLogs(); - iRaindex.addOrder4(config, new TaskV2[](0)); + iRaindex.addOrder5(config, new TaskV3[](0)); Vm.Log[] memory entries = vm.getRecordedLogs(); assertEq(entries.length, 1); OrderV4 memory order = LibTestTakeOrder.extractOrderFromLogs(entries); orders[i] = LibTestTakeOrder.wrapSingle(order)[0]; } - TakeOrdersConfigV5 memory takeOrdersConfig = LibTestTakeOrder.defaultTakeConfig(orders); + TakeOrdersConfigV6 memory takeOrdersConfig = LibTestTakeOrder.defaultTakeConfig(orders); takeOrdersConfig.maximumIO = maxInput; if (err.length > 0) { vm.expectRevert(err); } - (Float totalTakerInput, Float totalTakerOutput) = iRaindex.takeOrders4(takeOrdersConfig); + (Float totalTakerInput, Float totalTakerOutput) = iRaindex.takeOrders5(takeOrdersConfig); // We don't really care about the outputs as the tests are basically just // trying to show that the IO handler is running or not running by simple // reverts. diff --git a/test/concrete/raindex/RaindexV6.takeOrder.maximumInput.t.sol b/test/concrete/raindex/RaindexV6.takeOrder.maximumInput.t.sol index 93a34592f5..b8f15bd69e 100644 --- a/test/concrete/raindex/RaindexV6.takeOrder.maximumInput.t.sol +++ b/test/concrete/raindex/RaindexV6.takeOrder.maximumInput.t.sol @@ -6,15 +6,15 @@ import {IERC20} from "@openzeppelin-contracts-5.7.0/token/ERC20/IERC20.sol"; import {RaindexV6ExternalRealTest, Vm} from "test/util/abstract/RaindexV6ExternalRealTest.sol"; import { OrderV4, - TakeOrderConfigV4, - TakeOrdersConfigV5, + TakeOrderConfigV5, + TakeOrdersConfigV6, IOV2, EvaluableV4, OrderConfigV4, - TaskV2, + TaskV3, IRaindexV7 } from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; -import {SignedContextV1} from "rainlang-interface-0.2.13/src/interface/deprecated/v1/IInterpreterCallerV2.sol"; +import {SignedContextV2} from "rainlang-interface-0.2.14/src/interface/IInterpreterCallerV5.sol"; import {LibTestTakeOrder} from "test/util/lib/LibTestTakeOrder.sol"; import {Float, LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; @@ -28,14 +28,14 @@ contract RaindexV6TakeOrderMaximumInputTest is RaindexV6ExternalRealTest { /// the caller has full control over this, and it would cause none of the /// orders to be taken. /// forge-config: default.fuzz.runs = 100 - function testTakeOrderNoopZeroMaxTakerInput(OrderV4 memory order, SignedContextV1 memory signedContext) external { + function testTakeOrderNoopZeroMaxTakerInput(OrderV4 memory order, SignedContextV2 memory signedContext) external { vm.assume(order.validInputs.length > 0); vm.assume(order.validOutputs.length > 0); - TakeOrderConfigV4[] memory orders = new TakeOrderConfigV4[](1); - SignedContextV1[] memory signedContexts = new SignedContextV1[](1); + TakeOrderConfigV5[] memory orders = new TakeOrderConfigV5[](1); + SignedContextV2[] memory signedContexts = new SignedContextV2[](1); signedContexts[0] = signedContext; - orders[0] = TakeOrderConfigV4(order, 0, 0, signedContexts); - TakeOrdersConfigV5 memory config = TakeOrdersConfigV5({ + orders[0] = TakeOrderConfigV5(order, 0, 0, signedContexts); + TakeOrdersConfigV6 memory config = TakeOrdersConfigV6({ minimumIO: LibDecimalFloat.packLossless(0, 0), maximumIO: LibDecimalFloat.packLossless(0, 0), maximumIORatio: LibDecimalFloat.packLossless(type(int224).max, 0), @@ -44,7 +44,7 @@ contract RaindexV6TakeOrderMaximumInputTest is RaindexV6ExternalRealTest { data: "" }); vm.expectRevert(IRaindexV7.ZeroMaximumIO.selector); - (Float totalTakerInput, Float totalTakerOutput) = iRaindex.takeOrders4(config); + (Float totalTakerInput, Float totalTakerOutput) = iRaindex.takeOrders5(config); (totalTakerInput, totalTakerOutput); } @@ -89,7 +89,7 @@ contract RaindexV6TakeOrderMaximumInputTest is RaindexV6ExternalRealTest { vm.prank(testOrders[i].owner); vm.recordLogs(); - iRaindex.addOrder4(orderConfig, new TaskV2[](0)); + iRaindex.addOrder5(orderConfig, new TaskV3[](0)); Vm.Log[] memory entries = vm.getRecordedLogs(); assertEq(entries.length, 1); orders[i] = LibTestTakeOrder.extractOrderFromLogs(entries); @@ -127,8 +127,8 @@ contract RaindexV6TakeOrderMaximumInputTest is RaindexV6ExternalRealTest { Float balanceBefore = iRaindex.vaultBalance2(testVaults[i].owner, testVaults[i].token, testVaults[i].vaultId); vm.prank(testVaults[i].owner); - iRaindex.deposit4( - testVaults[i].token, testVaults[i].vaultId, testVaults[i].deposit, new TaskV2[](0) + iRaindex.deposit5( + testVaults[i].token, testVaults[i].vaultId, testVaults[i].deposit, new TaskV3[](0) ); Float balanceAfter = @@ -140,11 +140,11 @@ contract RaindexV6TakeOrderMaximumInputTest is RaindexV6ExternalRealTest { } } - TakeOrderConfigV4[] memory takeOrders = new TakeOrderConfigV4[](orders.length); + TakeOrderConfigV5[] memory takeOrders = new TakeOrderConfigV5[](orders.length); for (uint256 i = 0; i < orders.length; i++) { - takeOrders[i] = TakeOrderConfigV4(orders[i], 0, 0, new SignedContextV1[](0)); + takeOrders[i] = TakeOrderConfigV5(orders[i], 0, 0, new SignedContextV2[](0)); } - TakeOrdersConfigV5 memory config = LibTestTakeOrder.defaultTakeConfig(takeOrders); + TakeOrdersConfigV6 memory config = LibTestTakeOrder.defaultTakeConfig(takeOrders); config.maximumIO = maximumTakerInput; { @@ -178,7 +178,7 @@ contract RaindexV6TakeOrderMaximumInputTest is RaindexV6ExternalRealTest { } { vm.prank(bob); - (Float totalTakerInput, Float totalTakerOutput) = iRaindex.takeOrders4(config); + (Float totalTakerInput, Float totalTakerOutput) = iRaindex.takeOrders5(config); assertTrue(totalTakerInput.eq(expectedTakerInput), "totalTakerInput"); assertTrue(totalTakerOutput.eq(expectedTakerOutput), "totalTakerOutput"); } diff --git a/test/concrete/raindex/RaindexV6.takeOrder.maximumOutput.t.sol b/test/concrete/raindex/RaindexV6.takeOrder.maximumOutput.t.sol index 562cb10a76..80ddedff2a 100644 --- a/test/concrete/raindex/RaindexV6.takeOrder.maximumOutput.t.sol +++ b/test/concrete/raindex/RaindexV6.takeOrder.maximumOutput.t.sol @@ -6,14 +6,14 @@ import {IERC20} from "@openzeppelin-contracts-5.7.0/token/ERC20/IERC20.sol"; import {RaindexV6ExternalRealTest, Vm} from "test/util/abstract/RaindexV6ExternalRealTest.sol"; import { OrderV4, - TakeOrderConfigV4, - TakeOrdersConfigV5, - SignedContextV1, + TakeOrderConfigV5, + TakeOrdersConfigV6, + SignedContextV2, IRaindexV7, OrderConfigV4, IOV2, EvaluableV4, - TaskV2 + TaskV3 } from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {LibTestTakeOrder} from "test/util/lib/LibTestTakeOrder.sol"; import {LibDecimalFloat, Float} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; @@ -22,16 +22,16 @@ contract RaindexV6TakeOrderMaximumOutputTest is RaindexV6ExternalRealTest { using LibDecimalFloat for Float; /// It should be possible to take an order with zero maximum output. - function testTakeOrderMaximumOutputZero(OrderV4 memory order, SignedContextV1 memory signedContext) external { + function testTakeOrderMaximumOutputZero(OrderV4 memory order, SignedContextV2 memory signedContext) external { vm.assume(order.validInputs.length > 0); vm.assume(order.validOutputs.length > 0); order.validInputs[0].token = address(iToken0); order.validOutputs[0].token = address(iToken1); - TakeOrderConfigV4[] memory orders = new TakeOrderConfigV4[](1); - SignedContextV1[] memory signedContexts = new SignedContextV1[](1); + TakeOrderConfigV5[] memory orders = new TakeOrderConfigV5[](1); + SignedContextV2[] memory signedContexts = new SignedContextV2[](1); signedContexts[0] = signedContext; - orders[0] = TakeOrderConfigV4({order: order, inputIOIndex: 0, outputIOIndex: 0, signedContext: signedContexts}); - TakeOrdersConfigV5 memory config = TakeOrdersConfigV5({ + orders[0] = TakeOrderConfigV5({order: order, inputIOIndex: 0, outputIOIndex: 0, signedContext: signedContexts}); + TakeOrdersConfigV6 memory config = TakeOrdersConfigV6({ orders: orders, minimumIO: LibDecimalFloat.packLossless(0, 0), maximumIO: LibDecimalFloat.packLossless(0, 0), @@ -40,7 +40,7 @@ contract RaindexV6TakeOrderMaximumOutputTest is RaindexV6ExternalRealTest { data: "" }); vm.expectRevert(IRaindexV7.ZeroMaximumIO.selector); - (Float totalTakerInput, Float totalTakerOutput) = iRaindex.takeOrders4(config); + (Float totalTakerInput, Float totalTakerOutput) = iRaindex.takeOrders5(config); (totalTakerInput, totalTakerOutput); } @@ -93,7 +93,7 @@ contract RaindexV6TakeOrderMaximumOutputTest is RaindexV6ExternalRealTest { vm.prank(testOrders[i].owner); vm.recordLogs(); - iRaindex.addOrder4(orderConfig, new TaskV2[](0)); + iRaindex.addOrder5(orderConfig, new TaskV3[](0)); Vm.Log[] memory logs = vm.getRecordedLogs(); assertEq(logs.length, 1); orders[i] = LibTestTakeOrder.extractOrderFromLogs(logs); @@ -132,8 +132,8 @@ contract RaindexV6TakeOrderMaximumOutputTest is RaindexV6ExternalRealTest { Float balanceBefore = iRaindex.vaultBalance2(testVaults[i].owner, testVaults[i].token, testVaults[i].vaultId); vm.prank(testVaults[i].owner); - iRaindex.deposit4( - testVaults[i].token, testVaults[i].vaultId, testVaults[i].deposit, new TaskV2[](0) + iRaindex.deposit5( + testVaults[i].token, testVaults[i].vaultId, testVaults[i].deposit, new TaskV3[](0) ); Float balanceAfter = @@ -145,14 +145,14 @@ contract RaindexV6TakeOrderMaximumOutputTest is RaindexV6ExternalRealTest { } } - TakeOrderConfigV4[] memory takeOrders = new TakeOrderConfigV4[](orders.length); + TakeOrderConfigV5[] memory takeOrders = new TakeOrderConfigV5[](orders.length); for (uint256 i = 0; i < orders.length; i++) { - takeOrders[i] = TakeOrderConfigV4({ - order: orders[i], inputIOIndex: 0, outputIOIndex: 0, signedContext: new SignedContextV1[](0) + takeOrders[i] = TakeOrderConfigV5({ + order: orders[i], inputIOIndex: 0, outputIOIndex: 0, signedContext: new SignedContextV2[](0) }); } - TakeOrdersConfigV5 memory config = LibTestTakeOrder.defaultTakeConfig(takeOrders); + TakeOrdersConfigV6 memory config = LibTestTakeOrder.defaultTakeConfig(takeOrders); config.maximumIO = maximumTakerOutput; config.IOIsInput = false; @@ -187,7 +187,7 @@ contract RaindexV6TakeOrderMaximumOutputTest is RaindexV6ExternalRealTest { } { vm.prank(bob); - (Float totalTakerInput, Float totalTakerOutput) = iRaindex.takeOrders4(config); + (Float totalTakerInput, Float totalTakerOutput) = iRaindex.takeOrders5(config); assertTrue(totalTakerInput.eq(expectedTakerInput), "taker input"); assertTrue(totalTakerOutput.eq(expectedTakerOutput), "taker output"); diff --git a/test/concrete/raindex/RaindexV6.takeOrder.minimumIO.t.sol b/test/concrete/raindex/RaindexV6.takeOrder.minimumIO.t.sol index cb1fae9e69..1c8e5c4930 100644 --- a/test/concrete/raindex/RaindexV6.takeOrder.minimumIO.t.sol +++ b/test/concrete/raindex/RaindexV6.takeOrder.minimumIO.t.sol @@ -5,12 +5,12 @@ pragma solidity =0.8.25; import {IERC20} from "@openzeppelin-contracts-5.7.0/token/ERC20/IERC20.sol"; import {RaindexV6ExternalRealTest} from "test/util/abstract/RaindexV6ExternalRealTest.sol"; import {LibTestTakeOrder} from "test/util/lib/LibTestTakeOrder.sol"; -import {OrderV4, TakeOrdersConfigV5, TaskV2} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; +import {OrderV4, TakeOrdersConfigV6, TaskV3} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {Float, LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; import {MinimumIO} from "../../../src/error/ErrRaindexV6.sol"; /// When the total taker IO is less than the configured minimumIO, -/// takeOrders4 must revert with MinimumIO(minimumIO, actualIO). +/// takeOrders5 must revert with MinimumIO(minimumIO, actualIO). contract RaindexV6TakeOrderMinimumIOTest is RaindexV6ExternalRealTest { function testTakeOrderMinimumIORevert() external { address alice = address(uint160(uint256(keccak256("alice.rain.test")))); @@ -23,7 +23,7 @@ contract RaindexV6TakeOrderMinimumIOTest is RaindexV6ExternalRealTest { abi.encode(true) ); vm.prank(alice); - iRaindex.deposit4(address(iToken1), bytes32(uint256(0x01)), LibDecimalFloat.packLossless(1, 0), new TaskV2[](0)); + iRaindex.deposit5(address(iToken1), bytes32(uint256(0x01)), LibDecimalFloat.packLossless(1, 0), new TaskV3[](0)); // Order outputs 1e-18 at ratio 1. OrderV4 memory order = LibTestTakeOrder.addOrderWithExpression( @@ -37,7 +37,7 @@ contract RaindexV6TakeOrderMinimumIOTest is RaindexV6ExternalRealTest { ); // Take with minimumIO = 1, but order only provides 1e-18. - TakeOrdersConfigV5 memory takeConfig = LibTestTakeOrder.defaultTakeConfig(LibTestTakeOrder.wrapSingle(order)); + TakeOrdersConfigV6 memory takeConfig = LibTestTakeOrder.defaultTakeConfig(LibTestTakeOrder.wrapSingle(order)); takeConfig.minimumIO = LibDecimalFloat.packLossless(1, 0); vm.prank(bob); @@ -46,6 +46,6 @@ contract RaindexV6TakeOrderMinimumIOTest is RaindexV6ExternalRealTest { MinimumIO.selector, LibDecimalFloat.packLossless(1, 0), LibDecimalFloat.packLossless(1, -18) ) ); - iRaindex.takeOrders4(takeConfig); + iRaindex.takeOrders5(takeConfig); } } diff --git a/test/concrete/raindex/RaindexV6.takeOrder.minimumIOOutput.t.sol b/test/concrete/raindex/RaindexV6.takeOrder.minimumIOOutput.t.sol index 64ef93ca56..5e64de5368 100644 --- a/test/concrete/raindex/RaindexV6.takeOrder.minimumIOOutput.t.sol +++ b/test/concrete/raindex/RaindexV6.takeOrder.minimumIOOutput.t.sol @@ -5,7 +5,7 @@ pragma solidity =0.8.25; import {IERC20} from "@openzeppelin-contracts-5.7.0/token/ERC20/IERC20.sol"; import {RaindexV6ExternalRealTest} from "test/util/abstract/RaindexV6ExternalRealTest.sol"; import {LibTestTakeOrder} from "test/util/lib/LibTestTakeOrder.sol"; -import {OrderV4, TakeOrdersConfigV5, TaskV2} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; +import {OrderV4, TakeOrdersConfigV6, TaskV3} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {Float, LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; import {MinimumIO} from "../../../src/error/ErrRaindexV6.sol"; @@ -40,8 +40,8 @@ contract RaindexV6TakeOrderMinimumIOOutputTest is RaindexV6ExternalRealTest { abi.encode(true) ); vm.prank(iAlice); - iRaindex.deposit4( - address(iToken1), bytes32(uint256(0x01)), LibDecimalFloat.packLossless(10, 0), new TaskV2[](0) + iRaindex.deposit5( + address(iToken1), bytes32(uint256(0x01)), LibDecimalFloat.packLossless(10, 0), new TaskV3[](0) ); // outputMax (token1) = 10, IORatio = 0.5. The order can give far more @@ -68,7 +68,7 @@ contract RaindexV6TakeOrderMinimumIOOutputTest is RaindexV6ExternalRealTest { function testTakeOrderMinimumIOOutputBranchRevert() external { OrderV4 memory order = addFundedOrder(); - TakeOrdersConfigV5 memory takeConfig = LibTestTakeOrder.defaultTakeConfig(LibTestTakeOrder.wrapSingle(order)); + TakeOrdersConfigV6 memory takeConfig = LibTestTakeOrder.defaultTakeConfig(LibTestTakeOrder.wrapSingle(order)); takeConfig.IOIsInput = false; // Cap the take so totalTakerOutput == maximumIO == 0.5 exactly. takeConfig.maximumIO = LibDecimalFloat.packLossless(5, -1); @@ -90,7 +90,7 @@ contract RaindexV6TakeOrderMinimumIOOutputTest is RaindexV6ExternalRealTest { MinimumIO.selector, LibDecimalFloat.packLossless(75, -2), LibDecimalFloat.packLossless(5, -1) ) ); - iRaindex.takeOrders4(takeConfig); + iRaindex.takeOrders5(takeConfig); } /// Positive control for the same `IOIsInput == false` path: with @@ -101,7 +101,7 @@ contract RaindexV6TakeOrderMinimumIOOutputTest is RaindexV6ExternalRealTest { function testTakeOrderMinimumIOOutputBranchFillsAtZeroMinimum() external { OrderV4 memory order = addFundedOrder(); - TakeOrdersConfigV5 memory takeConfig = LibTestTakeOrder.defaultTakeConfig(LibTestTakeOrder.wrapSingle(order)); + TakeOrdersConfigV6 memory takeConfig = LibTestTakeOrder.defaultTakeConfig(LibTestTakeOrder.wrapSingle(order)); takeConfig.IOIsInput = false; takeConfig.maximumIO = LibDecimalFloat.packLossless(5, -1); takeConfig.minimumIO = LibDecimalFloat.packLossless(0, 0); @@ -124,7 +124,7 @@ contract RaindexV6TakeOrderMinimumIOOutputTest is RaindexV6ExternalRealTest { ); vm.prank(iBob); - (Float totalTakerInput, Float totalTakerOutput) = iRaindex.takeOrders4(takeConfig); + (Float totalTakerInput, Float totalTakerOutput) = iRaindex.takeOrders5(takeConfig); assertTrue(totalTakerInput.eq(LibDecimalFloat.packLossless(1, 0)), "taker input == 1.0 token1"); assertTrue(totalTakerOutput.eq(LibDecimalFloat.packLossless(5, -1)), "taker output == 0.5 token0"); diff --git a/test/concrete/raindex/RaindexV6.takeOrder.noop.t.sol b/test/concrete/raindex/RaindexV6.takeOrder.noop.t.sol index 8967dc8cd5..e72941282e 100644 --- a/test/concrete/raindex/RaindexV6.takeOrder.noop.t.sol +++ b/test/concrete/raindex/RaindexV6.takeOrder.noop.t.sol @@ -9,9 +9,9 @@ import {LibTestTakeOrder} from "test/util/lib/LibTestTakeOrder.sol"; import {RaindexV6ExternalRealTest} from "test/util/abstract/RaindexV6ExternalRealTest.sol"; import { OrderV4, - TakeOrdersConfigV5, - TakeOrderConfigV4, - SignedContextV1 + TakeOrdersConfigV6, + TakeOrderConfigV5, + SignedContextV2 } from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {Float, LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; import {IERC20Metadata} from "@openzeppelin-contracts-5.7.0/token/ERC20/extensions/IERC20Metadata.sol"; @@ -26,9 +26,9 @@ contract RaindexV6TakeOrderNoopTest is RaindexV6ExternalRealTest { /// Take orders makes no sense without any orders in the input array and the /// caller has full control over this so we error. function testTakeOrderNoopZeroOrders() external { - TakeOrdersConfigV5 memory config = LibTestTakeOrder.defaultTakeConfig(new TakeOrderConfigV4[](0)); + TakeOrdersConfigV6 memory config = LibTestTakeOrder.defaultTakeConfig(new TakeOrderConfigV5[](0)); vm.expectRevert(NoOrders.selector); - (Float totalTakerInput, Float totalTakerOutput) = iRaindex.takeOrders4(config); + (Float totalTakerInput, Float totalTakerOutput) = iRaindex.takeOrders5(config); (totalTakerInput, totalTakerOutput); } @@ -42,7 +42,7 @@ contract RaindexV6TakeOrderNoopTest is RaindexV6ExternalRealTest { OrderV4 memory order, uint256 inputIOIndex, uint256 outputIOIndex, - SignedContextV1 memory signedContext + SignedContextV2 memory signedContext ) external { vm.assume(order.validInputs.length > 0); inputIOIndex = bound(inputIOIndex, 0, order.validInputs.length - 1); @@ -54,16 +54,16 @@ contract RaindexV6TakeOrderNoopTest is RaindexV6ExternalRealTest { // We don't bound the input or output indexes as we want to allow // malformed orders to be passed in, and still show that nothing happens. - SignedContextV1[] memory signedContexts = new SignedContextV1[](1); + SignedContextV2[] memory signedContexts = new SignedContextV2[](1); signedContexts[0] = signedContext; - TakeOrderConfigV4 memory orderConfig = TakeOrderConfigV4(order, inputIOIndex, outputIOIndex, signedContexts); - TakeOrderConfigV4[] memory orders = new TakeOrderConfigV4[](1); + TakeOrderConfigV5 memory orderConfig = TakeOrderConfigV5(order, inputIOIndex, outputIOIndex, signedContexts); + TakeOrderConfigV5[] memory orders = new TakeOrderConfigV5[](1); orders[0] = orderConfig; - TakeOrdersConfigV5 memory config = LibTestTakeOrder.defaultTakeConfig(orders); + TakeOrdersConfigV6 memory config = LibTestTakeOrder.defaultTakeConfig(orders); vm.expectEmit(address(iRaindex)); emit OrderNotFound(address(this), order.owner, order.hash()); vm.recordLogs(); - (Float totalTakerInput, Float totalTakerOutput) = iRaindex.takeOrders4(config); + (Float totalTakerInput, Float totalTakerOutput) = iRaindex.takeOrders5(config); assertTrue(totalTakerInput.isZero()); assertTrue(totalTakerOutput.isZero()); Vm.Log[] memory logs = vm.getRecordedLogs(); @@ -79,8 +79,8 @@ contract RaindexV6TakeOrderNoopTest is RaindexV6ExternalRealTest { uint256 outputIOIndex1, uint256 inputIOIndex2, uint256 outputIOIndex2, - SignedContextV1 memory signedContext1, - SignedContextV1 memory signedContext2 + SignedContextV2 memory signedContext1, + SignedContextV2 memory signedContext2 ) external { vm.assume(order1.validInputs.length > 0); inputIOIndex1 = bound(inputIOIndex1, 0, order1.validInputs.length - 1); @@ -102,21 +102,21 @@ contract RaindexV6TakeOrderNoopTest is RaindexV6ExternalRealTest { order1.validInputs[inputIOIndex1].token = order2.validInputs[inputIOIndex2].token; order1.validOutputs[outputIOIndex1].token = order2.validOutputs[outputIOIndex2].token; - TakeOrdersConfigV5 memory config; + TakeOrdersConfigV6 memory config; { - TakeOrderConfigV4[] memory orders; + TakeOrderConfigV5[] memory orders; { // We don't bound the input or output indexes as we want to allow // malformed orders to be passed in, and still show that nothing happens. - SignedContextV1[] memory signedContexts1 = new SignedContextV1[](1); + SignedContextV2[] memory signedContexts1 = new SignedContextV2[](1); signedContexts1[0] = signedContext1; - TakeOrderConfigV4 memory orderConfig1 = - TakeOrderConfigV4(order1, inputIOIndex1, outputIOIndex1, signedContexts1); - SignedContextV1[] memory signedContexts2 = new SignedContextV1[](1); + TakeOrderConfigV5 memory orderConfig1 = + TakeOrderConfigV5(order1, inputIOIndex1, outputIOIndex1, signedContexts1); + SignedContextV2[] memory signedContexts2 = new SignedContextV2[](1); signedContexts2[0] = signedContext2; - TakeOrderConfigV4 memory orderConfig2 = - TakeOrderConfigV4(order2, inputIOIndex2, outputIOIndex2, signedContexts2); - orders = new TakeOrderConfigV4[](2); + TakeOrderConfigV5 memory orderConfig2 = + TakeOrderConfigV5(order2, inputIOIndex2, outputIOIndex2, signedContexts2); + orders = new TakeOrderConfigV5[](2); orders[0] = orderConfig1; orders[1] = orderConfig2; } @@ -126,7 +126,7 @@ contract RaindexV6TakeOrderNoopTest is RaindexV6ExternalRealTest { vm.recordLogs(); { - (Float totalTakerInput, Float totalTakerOutput) = iRaindex.takeOrders4(config); + (Float totalTakerInput, Float totalTakerOutput) = iRaindex.takeOrders5(config); assertTrue(totalTakerInput.isZero()); assertTrue(totalTakerOutput.isZero()); } diff --git a/test/concrete/raindex/RaindexV6.takeOrder.precision.t.sol b/test/concrete/raindex/RaindexV6.takeOrder.precision.t.sol index 93661ca832..0e5f523a9b 100644 --- a/test/concrete/raindex/RaindexV6.takeOrder.precision.t.sol +++ b/test/concrete/raindex/RaindexV6.takeOrder.precision.t.sol @@ -6,12 +6,12 @@ import {Vm} from "forge-std-1.17.0/src/Test.sol"; import {RaindexV6ExternalRealTest, IERC20} from "test/util/abstract/RaindexV6ExternalRealTest.sol"; import { OrderV4, - TakeOrdersConfigV5, - TakeOrderConfigV4, + TakeOrdersConfigV6, + TakeOrderConfigV5, IOV2, OrderConfigV4, EvaluableV4, - TaskV2 + TaskV3 } from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {Float, LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; import {IERC20Metadata} from "@openzeppelin-contracts-5.7.0/token/ERC20/extensions/IERC20Metadata.sol"; @@ -126,7 +126,7 @@ contract RaindexV6TakeOrderPrecisionTest is RaindexV6ExternalRealTest { { if (outputVaultId != bytes32(0) && expectedTakerTotalInput.gt(LibDecimalFloat.packLossless(0, 0))) { - iRaindex.deposit4(outputToken, outputVaultId, expectedTakerTotalInput, new TaskV2[](0)); + iRaindex.deposit5(outputToken, outputVaultId, expectedTakerTotalInput, new TaskV3[](0)); } if (outputVaultId != bytes32(0)) { assertTrue( @@ -134,14 +134,14 @@ contract RaindexV6TakeOrderPrecisionTest is RaindexV6ExternalRealTest { ); } vm.recordLogs(); - iRaindex.addOrder4(config, new TaskV2[](0)); + iRaindex.addOrder5(config, new TaskV3[](0)); Vm.Log[] memory entries = vm.getRecordedLogs(); assertEq(entries.length, 1); OrderV4 memory order = LibTestTakeOrder.extractOrderFromLogs(entries); - TakeOrdersConfigV5 memory takeOrdersConfig = + TakeOrdersConfigV6 memory takeOrdersConfig = LibTestTakeOrder.defaultTakeConfig(LibTestTakeOrder.wrapSingle(order)); - (Float totalTakerInput, Float totalTakerOutput) = iRaindex.takeOrders4(takeOrdersConfig); + (Float totalTakerInput, Float totalTakerOutput) = iRaindex.takeOrders5(takeOrdersConfig); assertTrue(totalTakerInput.eq(expectedTakerTotalInput), "input"); assertTrue(totalTakerOutput.eq(expectedTakerTotalOutput), "output"); } diff --git a/test/concrete/raindex/RaindexV6.takeOrder.sameToken.t.sol b/test/concrete/raindex/RaindexV6.takeOrder.sameToken.t.sol index 637af8bee2..f6f8cc5801 100644 --- a/test/concrete/raindex/RaindexV6.takeOrder.sameToken.t.sol +++ b/test/concrete/raindex/RaindexV6.takeOrder.sameToken.t.sol @@ -7,10 +7,10 @@ import { IRaindexV7, OrderConfigV4, OrderV4, - TaskV2, - TakeOrderConfigV4, - SignedContextV1, - TakeOrdersConfigV5 + TaskV3, + TakeOrderConfigV5, + SignedContextV2, + TakeOrdersConfigV6 } from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {LibTestAddOrder} from "test/util/lib/LibTestAddOrder.sol"; import {Float, LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; @@ -26,14 +26,14 @@ contract RaindexV6TakeOrderSameTokenTest is RaindexV6ExternalRealTest { OrderV4(alice, configAlice.evaluable, configAlice.validInputs, configAlice.validOutputs, configAlice.nonce); vm.prank(alice); - iRaindex.addOrder4(configAlice, new TaskV2[](0)); + iRaindex.addOrder5(configAlice, new TaskV3[](0)); - TakeOrderConfigV4[] memory takeOrders = new TakeOrderConfigV4[](1); - takeOrders[0] = TakeOrderConfigV4({ - order: orderAlice, inputIOIndex: 0, outputIOIndex: 0, signedContext: new SignedContextV1[](0) + TakeOrderConfigV5[] memory takeOrders = new TakeOrderConfigV5[](1); + takeOrders[0] = TakeOrderConfigV5({ + order: orderAlice, inputIOIndex: 0, outputIOIndex: 0, signedContext: new SignedContextV2[](0) }); - TakeOrdersConfigV5 memory takeOrdersConfig = TakeOrdersConfigV5({ + TakeOrdersConfigV6 memory takeOrdersConfig = TakeOrdersConfigV6({ minimumIO: LibDecimalFloat.packLossless(0, 0), maximumIO: LibDecimalFloat.packLossless(type(int224).max, 0), maximumIORatio: LibDecimalFloat.packLossless(type(int224).max, 0), @@ -43,6 +43,6 @@ contract RaindexV6TakeOrderSameTokenTest is RaindexV6ExternalRealTest { }); vm.expectRevert(abi.encodeWithSelector(IRaindexV7.TokenSelfTrade.selector)); - iRaindex.takeOrders4(takeOrdersConfig); + iRaindex.takeOrders5(takeOrdersConfig); } } diff --git a/test/concrete/raindex/RaindexV6.takeOrder.takenFlag.t.sol b/test/concrete/raindex/RaindexV6.takeOrder.takenFlag.t.sol index d6d723a477..d09bb13aa6 100644 --- a/test/concrete/raindex/RaindexV6.takeOrder.takenFlag.t.sol +++ b/test/concrete/raindex/RaindexV6.takeOrder.takenFlag.t.sol @@ -5,12 +5,12 @@ pragma solidity =0.8.25; import {IERC20} from "@openzeppelin-contracts-5.7.0/token/ERC20/IERC20.sol"; import {RaindexV6ExternalRealTest} from "test/util/abstract/RaindexV6ExternalRealTest.sol"; import {LibTestTakeOrder} from "test/util/lib/LibTestTakeOrder.sol"; -import {OrderV4, TakeOrdersConfigV5, TaskV2, IRaindexV7} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; +import {OrderV4, TakeOrdersConfigV6, TaskV3, IRaindexV7} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {Float, LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; import {LibOrder} from "../../../src/lib/LibOrder.sol"; import {RecordingOrderTaker} from "test/util/concrete/RecordingOrderTaker.sol"; -/// An order in a `takeOrders4` batch is taken only when its calculation yields a +/// An order in a `takeOrders5` batch is taken only when its calculation yields a /// strictly positive output at a non-negative ratio within the taker's /// limit. Non-positive outputs and negative ratios are no-op skips /// (`OrderZeroAmount`) rather than reverting the whole batch, and the @@ -36,13 +36,13 @@ contract RaindexV6TakeOrderTakenFlagTest is RaindexV6ExternalRealTest { abi.encode(true) ); vm.prank(alice); - iRaindex.deposit4( + iRaindex.deposit5( address(iToken1), bytes32(uint256(0x01)), // amount is a whole-token test quantity, far below int256 max. // forge-lint: disable-next-line(unsafe-typecast) LibDecimalFloat.packLossless(int256(amount), 0), - new TaskV2[](0) + new TaskV3[](0) ); } @@ -51,12 +51,12 @@ contract RaindexV6TakeOrderTakenFlagTest is RaindexV6ExternalRealTest { function testNegativeOutputMaxSkips() external { // outputMax = -1, IORatio = 1. OrderV4 memory order = _addOrder("_ _:sub(0 1) 1;:;"); - TakeOrdersConfigV5 memory config = LibTestTakeOrder.defaultTakeConfig(LibTestTakeOrder.wrapSingle(order)); + TakeOrdersConfigV6 memory config = LibTestTakeOrder.defaultTakeConfig(LibTestTakeOrder.wrapSingle(order)); vm.prank(bob); vm.expectEmit(true, true, true, true); emit IRaindexV7.OrderZeroAmount(bob, alice, LibOrder.hash(order)); - (Float totalTakerInput, Float totalTakerOutput) = iRaindex.takeOrders4(config); + (Float totalTakerInput, Float totalTakerOutput) = iRaindex.takeOrders5(config); assertTrue(totalTakerInput.isZero(), "totalTakerInput must be zero"); assertTrue(totalTakerOutput.isZero(), "totalTakerOutput must be zero"); @@ -68,12 +68,12 @@ contract RaindexV6TakeOrderTakenFlagTest is RaindexV6ExternalRealTest { _depositOutput(10); // outputMax = 1, IORatio = -1. OrderV4 memory order = _addOrder("_ _:1 sub(0 1);:;"); - TakeOrdersConfigV5 memory config = LibTestTakeOrder.defaultTakeConfig(LibTestTakeOrder.wrapSingle(order)); + TakeOrdersConfigV6 memory config = LibTestTakeOrder.defaultTakeConfig(LibTestTakeOrder.wrapSingle(order)); vm.prank(bob); vm.expectEmit(true, true, true, true); emit IRaindexV7.OrderZeroAmount(bob, alice, LibOrder.hash(order)); - (Float totalTakerInput, Float totalTakerOutput) = iRaindex.takeOrders4(config); + (Float totalTakerInput, Float totalTakerOutput) = iRaindex.takeOrders5(config); assertTrue(totalTakerInput.isZero(), "totalTakerInput must be zero"); assertTrue(totalTakerOutput.isZero(), "totalTakerOutput must be zero"); @@ -83,12 +83,12 @@ contract RaindexV6TakeOrderTakenFlagTest is RaindexV6ExternalRealTest { function testZeroOutputMaxStillSkips() external { // outputMax = 0, IORatio = 1. OrderV4 memory order = _addOrder("_ _:0 1;:;"); - TakeOrdersConfigV5 memory config = LibTestTakeOrder.defaultTakeConfig(LibTestTakeOrder.wrapSingle(order)); + TakeOrdersConfigV6 memory config = LibTestTakeOrder.defaultTakeConfig(LibTestTakeOrder.wrapSingle(order)); vm.prank(bob); vm.expectEmit(true, true, true, true); emit IRaindexV7.OrderZeroAmount(bob, alice, LibOrder.hash(order)); - (Float totalTakerInput, Float totalTakerOutput) = iRaindex.takeOrders4(config); + (Float totalTakerInput, Float totalTakerOutput) = iRaindex.takeOrders5(config); assertTrue(totalTakerInput.isZero(), "totalTakerInput must be zero"); assertTrue(totalTakerOutput.isZero(), "totalTakerOutput must be zero"); @@ -100,7 +100,7 @@ contract RaindexV6TakeOrderTakenFlagTest is RaindexV6ExternalRealTest { RecordingOrderTaker taker = new RecordingOrderTaker(iRaindex); // A skipping order (zero outputMax) means nothing is taken. OrderV4 memory order = _addOrder("_ _:0 1;:;"); - TakeOrdersConfigV5 memory config = LibTestTakeOrder.defaultTakeConfig(LibTestTakeOrder.wrapSingle(order)); + TakeOrdersConfigV6 memory config = LibTestTakeOrder.defaultTakeConfig(LibTestTakeOrder.wrapSingle(order)); config.data = hex"01"; // non-empty callback data config.minimumIO = LibDecimalFloat.packLossless(0, 0); // no minimum so zero-fill does not revert diff --git a/test/concrete/raindex/RaindexV6.takeOrder.tokenMismatch.t.sol b/test/concrete/raindex/RaindexV6.takeOrder.tokenMismatch.t.sol index 50edd9e3ef..dd724992fc 100644 --- a/test/concrete/raindex/RaindexV6.takeOrder.tokenMismatch.t.sol +++ b/test/concrete/raindex/RaindexV6.takeOrder.tokenMismatch.t.sol @@ -6,10 +6,10 @@ import {RaindexV6ExternalRealTest} from "test/util/abstract/RaindexV6ExternalRea import { OrderV4, IOV2, - TakeOrderConfigV4, - TakeOrdersConfigV5, + TakeOrderConfigV5, + TakeOrdersConfigV6, EvaluableV4, - SignedContextV1 + SignedContextV2 } from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {TokenMismatch} from "../../../src/error/ErrRaindexV6.sol"; import {Float, LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; @@ -52,10 +52,10 @@ contract RaindexV6TakeOrderTokenMismatchTest is RaindexV6ExternalRealTest { // Line up outputs so we don't trigger that code path. b.validOutputs[bOutputIOIndex].token = a.validOutputs[aOutputIOIndex].token; - TakeOrderConfigV4[] memory orders = new TakeOrderConfigV4[](2); - orders[0] = TakeOrderConfigV4(a, aInputIOIndex, aOutputIOIndex, new SignedContextV1[](0)); - orders[1] = TakeOrderConfigV4(b, bInputIOIndex, bOutputIOIndex, new SignedContextV1[](0)); - TakeOrdersConfigV5 memory config = TakeOrdersConfigV5({ + TakeOrderConfigV5[] memory orders = new TakeOrderConfigV5[](2); + orders[0] = TakeOrderConfigV5(a, aInputIOIndex, aOutputIOIndex, new SignedContextV2[](0)); + orders[1] = TakeOrderConfigV5(b, bInputIOIndex, bOutputIOIndex, new SignedContextV2[](0)); + TakeOrdersConfigV6 memory config = TakeOrdersConfigV6({ minimumIO: Float.wrap(0), maximumIO: LibDecimalFloat.fromFixedDecimalLosslessPacked(maxTakerInput18, 18), maximumIORatio: LibDecimalFloat.fromFixedDecimalLosslessPacked(maxIORatio, 18), @@ -64,7 +64,7 @@ contract RaindexV6TakeOrderTokenMismatchTest is RaindexV6ExternalRealTest { data: "" }); vm.expectRevert(abi.encodeWithSelector(TokenMismatch.selector)); - (Float totalTakerInput, Float totalTakerOutput) = iRaindex.takeOrders4(config); + (Float totalTakerInput, Float totalTakerOutput) = iRaindex.takeOrders5(config); (totalTakerInput, totalTakerOutput); } @@ -98,10 +98,10 @@ contract RaindexV6TakeOrderTokenMismatchTest is RaindexV6ExternalRealTest { // Line up inputs so we don't trigger that code path. b.validInputs[bInputIOIndex].token = a.validInputs[aInputIOIndex].token; - TakeOrderConfigV4[] memory orders = new TakeOrderConfigV4[](2); - orders[0] = TakeOrderConfigV4(a, aInputIOIndex, aOutputIOIndex, new SignedContextV1[](0)); - orders[1] = TakeOrderConfigV4(b, bInputIOIndex, bOutputIOIndex, new SignedContextV1[](0)); - TakeOrdersConfigV5 memory config = TakeOrdersConfigV5({ + TakeOrderConfigV5[] memory orders = new TakeOrderConfigV5[](2); + orders[0] = TakeOrderConfigV5(a, aInputIOIndex, aOutputIOIndex, new SignedContextV2[](0)); + orders[1] = TakeOrderConfigV5(b, bInputIOIndex, bOutputIOIndex, new SignedContextV2[](0)); + TakeOrdersConfigV6 memory config = TakeOrdersConfigV6({ minimumIO: Float.wrap(0), maximumIO: LibDecimalFloat.fromFixedDecimalLosslessPacked(maxTakerInput18, 18), maximumIORatio: LibDecimalFloat.fromFixedDecimalLosslessPacked(maxIORatio18, 18), @@ -110,7 +110,7 @@ contract RaindexV6TakeOrderTokenMismatchTest is RaindexV6ExternalRealTest { data: "" }); vm.expectRevert(abi.encodeWithSelector(TokenMismatch.selector)); - (Float totalTakerInput, Float totalTakerOutput) = iRaindex.takeOrders4(config); + (Float totalTakerInput, Float totalTakerOutput) = iRaindex.takeOrders5(config); (totalTakerInput, totalTakerOutput); } } diff --git a/test/concrete/raindex/RaindexV6.takeOrder.vaultZeroInput.t.sol b/test/concrete/raindex/RaindexV6.takeOrder.vaultZeroInput.t.sol index a749667a31..8b135a334d 100644 --- a/test/concrete/raindex/RaindexV6.takeOrder.vaultZeroInput.t.sol +++ b/test/concrete/raindex/RaindexV6.takeOrder.vaultZeroInput.t.sol @@ -10,11 +10,11 @@ import {Reenteroor} from "test/util/concrete/Reenteroor.sol"; import { IRaindexV7, OrderV4, - TakeOrderConfigV4, - TakeOrdersConfigV5, + TakeOrderConfigV5, + TakeOrdersConfigV6, ClearConfigV2, - SignedContextV1, - TaskV2 + SignedContextV2, + TaskV3 } from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {Float, LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; import {NegativeBounty} from "../../../src/error/ErrRaindexV6.sol"; @@ -23,7 +23,7 @@ import {NegativeBounty} from "../../../src/error/ErrRaindexV6.sol"; /// @notice An order with a `vaultId == 0` INPUT is settled as a direct wallet /// transfer to the owner (`increaseVaultBalance` -> `pushTokens`) rather than an /// internal vault credit. The orderbook must pull every incoming token before it -/// pushes that input out: `takeOrders4` defers vault-0 input pushes until after +/// pushes that input out: `takeOrders5` defers vault-0 input pushes until after /// the taker payment is pulled, and `clear4` pulls both orders' outputs before /// pushing either input. These tests use real `MockToken` ERC20s with zero /// ambient orderbook balance, so a vault-0 input is fully funded by the @@ -53,11 +53,11 @@ contract RaindexV6TakeOrderVaultZeroInputTest is RaindexV6ExternalRealTest { token.approve(address(iRaindex), amount * 1e18); // amount is a whole-token test quantity, far below int256 max. // forge-lint: disable-next-line(unsafe-typecast) - iRaindex.deposit4(address(token), vaultId, LibDecimalFloat.packLossless(int256(amount), 0), new TaskV2[](0)); + iRaindex.deposit5(address(token), vaultId, LibDecimalFloat.packLossless(int256(amount), 0), new TaskV3[](0)); vm.stopPrank(); } - /// `takeOrders4`: an order whose INPUT is `token0` at vault 0 fills against a + /// `takeOrders5`: an order whose INPUT is `token0` at vault 0 fills against a /// taker who holds `token0`, while the orderbook holds no ambient `token0`. /// The vault-0 input is pushed to the owner only after the taker's `token0` /// payment has been pulled, so the trade is funded by the taker alone. @@ -74,9 +74,9 @@ contract RaindexV6TakeOrderVaultZeroInputTest is RaindexV6ExternalRealTest { token0.approve(address(iRaindex), 1e18); assertEq(token0.balanceOf(address(iRaindex)), 0, "orderbook starts with zero ambient token0"); - TakeOrdersConfigV5 memory config = LibTestTakeOrder.defaultTakeConfig(LibTestTakeOrder.wrapSingle(order)); + TakeOrdersConfigV6 memory config = LibTestTakeOrder.defaultTakeConfig(LibTestTakeOrder.wrapSingle(order)); vm.prank(bob); - (Float totalTakerInput, Float totalTakerOutput) = iRaindex.takeOrders4(config); + (Float totalTakerInput, Float totalTakerOutput) = iRaindex.takeOrders5(config); assertTrue(totalTakerInput.eq(LibDecimalFloat.packLossless(1, 0)), "1 token0 filled"); assertTrue(totalTakerOutput.eq(LibDecimalFloat.packLossless(1, 0)), "1 token1 filled"); @@ -116,7 +116,7 @@ contract RaindexV6TakeOrderVaultZeroInputTest is RaindexV6ExternalRealTest { assertEq(token0.balanceOf(address(iRaindex)), 0, "orderbook starts with zero ambient token0"); iRaindex.clear4( - aliceOrder, bobOrder, ClearConfigV2(0, 0, 0, 0, 0, 0), new SignedContextV1[](0), new SignedContextV1[](0) + aliceOrder, bobOrder, ClearConfigV2(0, 0, 0, 0, 0, 0), new SignedContextV2[](0), new SignedContextV2[](0) ); // Alice's vault-0 input was pushed to her wallet, funded by Bob's vault-0 @@ -138,13 +138,13 @@ contract RaindexV6TakeOrderVaultZeroInputTest is RaindexV6ExternalRealTest { } function _take(OrderV4 memory a, OrderV4 memory b) internal returns (Float, Float) { - TakeOrderConfigV4[] memory orders = new TakeOrderConfigV4[](2); + TakeOrderConfigV5[] memory orders = new TakeOrderConfigV5[](2); orders[0] = - TakeOrderConfigV4({order: a, inputIOIndex: 0, outputIOIndex: 0, signedContext: new SignedContextV1[](0)}); + TakeOrderConfigV5({order: a, inputIOIndex: 0, outputIOIndex: 0, signedContext: new SignedContextV2[](0)}); orders[1] = - TakeOrderConfigV4({order: b, inputIOIndex: 0, outputIOIndex: 0, signedContext: new SignedContextV1[](0)}); + TakeOrderConfigV5({order: b, inputIOIndex: 0, outputIOIndex: 0, signedContext: new SignedContextV2[](0)}); vm.prank(bob); - return iRaindex.takeOrders4(LibTestTakeOrder.defaultTakeConfig(orders)); + return iRaindex.takeOrders5(LibTestTakeOrder.defaultTakeConfig(orders)); } /// Two same-owner vault-0 input orders in one batch. Their input credits @@ -236,15 +236,15 @@ contract RaindexV6TakeOrderVaultZeroInputTest is RaindexV6ExternalRealTest { token0.approve(address(iRaindex), 2e18); assertEq(token0.balanceOf(address(iRaindex)), 50e18, "orderbook holds only carol's pool pre-take"); - TakeOrdersConfigV5 memory config = LibTestTakeOrder.defaultTakeConfig(LibTestTakeOrder.wrapSingle(order)); + TakeOrdersConfigV6 memory config = LibTestTakeOrder.defaultTakeConfig(LibTestTakeOrder.wrapSingle(order)); vm.prank(bob); - iRaindex.takeOrders4(config); + iRaindex.takeOrders5(config); assertEq(token0.balanceOf(owner), 1e18, "take 1: owner receives exactly one unit"); assertEq(token0.balanceOf(address(iRaindex)), 50e18, "take 1: pool intact"); vm.prank(bob); - iRaindex.takeOrders4(config); + iRaindex.takeOrders5(config); assertEq(token0.balanceOf(owner), 2e18, "take 2: owner receives exactly one more unit, no dangling re-push"); assertEq(token0.balanceOf(bob), 0, "taker funded exactly two units total"); assertEq(token0.balanceOf(address(iRaindex)), 50e18, "take 2: pool still intact, no drain from a dangling slot"); @@ -278,7 +278,7 @@ contract RaindexV6TakeOrderVaultZeroInputTest is RaindexV6ExternalRealTest { assertEq(token0.balanceOf(address(iRaindex)), 50e18, "orderbook holds only carol's pool pre-clear"); iRaindex.clear4( - aliceOrder, bobOrder, ClearConfigV2(0, 0, 0, 0, 0, 0), new SignedContextV1[](0), new SignedContextV1[](0) + aliceOrder, bobOrder, ClearConfigV2(0, 0, 0, 0, 0, 0), new SignedContextV2[](0), new SignedContextV2[](0) ); assertEq(token0.balanceOf(alice), 1e18, "alice received her vault-0 input"); @@ -316,9 +316,9 @@ contract RaindexV6TakeOrderVaultZeroInputTest is RaindexV6ExternalRealTest { token0.approve(address(iRaindex), 1e18); assertEq(token1.balanceOf(address(iRaindex)), 50e18, "orderbook holds only carol's token1 pool pre-take"); - TakeOrdersConfigV5 memory config = LibTestTakeOrder.defaultTakeConfig(LibTestTakeOrder.wrapSingle(order)); + TakeOrdersConfigV6 memory config = LibTestTakeOrder.defaultTakeConfig(LibTestTakeOrder.wrapSingle(order)); vm.prank(bob); - iRaindex.takeOrders4(config); + iRaindex.takeOrders5(config); assertEq(token1.balanceOf(owner), 0, "owner's wallet funded the vault-0 output"); assertEq(token1.balanceOf(bob), 1e18, "taker received the vault-0 output"); @@ -357,9 +357,9 @@ contract RaindexV6TakeOrderVaultZeroInputTest is RaindexV6ExternalRealTest { token0.approve(address(iRaindex), 5e18); assertEq(token0.balanceOf(address(iRaindex)), 50e18, "orderbook holds only carol's pool pre-take"); - TakeOrdersConfigV5 memory config = LibTestTakeOrder.defaultTakeConfig(LibTestTakeOrder.wrapSingle(order)); + TakeOrdersConfigV6 memory config = LibTestTakeOrder.defaultTakeConfig(LibTestTakeOrder.wrapSingle(order)); vm.prank(bob); - iRaindex.takeOrders4(config); + iRaindex.takeOrders5(config); assertEq(token0.balanceOf(owner), 2e18, "owner received exactly the 2 filled, not the offered 5"); assertEq(token0.balanceOf(bob), 3e18, "taker spent only the 2 that filled, keeps 3"); @@ -451,11 +451,11 @@ contract RaindexV6TakeOrderVaultZeroInputTest is RaindexV6ExternalRealTest { ); } - /// The flash-swap reentrancy window: takeOrders4 pushes the order outputs to + /// The flash-swap reentrancy window: takeOrders5 pushes the order outputs to /// the taker and invokes its `onTakeOrders2` callback BEFORE it pulls the /// taker's payment and BEFORE it flushes the vault-0 input slots. So during /// the callback the vault-0 slot is accrued but not yet settled — the most - /// dangerous moment to re-enter. A malicious taker that re-enters takeOrders4 + /// dangerous moment to re-enter. A malicious taker that re-enters takeOrders5 /// from its callback must be stopped by the nonReentrant guard, so it can /// never act on the mid-flight slot. (The existing arb reentrancy test uses a /// mock orderbook; this exercises the real RaindexV6 guard with a live vault-0 @@ -468,12 +468,12 @@ contract RaindexV6TakeOrderVaultZeroInputTest is RaindexV6ExternalRealTest { Reenteroor taker = new Reenteroor(); - TakeOrderConfigV4[] memory orders = new TakeOrderConfigV4[](1); - orders[0] = TakeOrderConfigV4({ - order: order, inputIOIndex: 0, outputIOIndex: 0, signedContext: new SignedContextV1[](0) + TakeOrderConfigV5[] memory orders = new TakeOrderConfigV5[](1); + orders[0] = TakeOrderConfigV5({ + order: order, inputIOIndex: 0, outputIOIndex: 0, signedContext: new SignedContextV2[](0) }); - // Non-empty data makes takeOrders4 invoke the onTakeOrders2 callback. - TakeOrdersConfigV5 memory config = TakeOrdersConfigV5({ + // Non-empty data makes takeOrders5 invoke the onTakeOrders2 callback. + TakeOrdersConfigV6 memory config = TakeOrdersConfigV6({ orders: orders, minimumIO: LibDecimalFloat.packLossless(0, 0), maximumIO: LibDecimalFloat.packLossless(type(int224).max, 0), @@ -482,13 +482,13 @@ contract RaindexV6TakeOrderVaultZeroInputTest is RaindexV6ExternalRealTest { data: hex"01" }); - // The taker's callback re-enters takeOrders4 (its config is irrelevant: + // The taker's callback re-enters takeOrders5 (its config is irrelevant: // the nonReentrant guard reverts at function entry). - taker.reenterWith(abi.encodeWithSelector(IRaindexV7.takeOrders4.selector, config)); + taker.reenterWith(abi.encodeWithSelector(IRaindexV7.takeOrders5.selector, config)); vm.expectRevert(abi.encodeWithSelector(bytes4(keccak256("ReentrancyGuardReentrantCall()")))); vm.prank(address(taker)); - iRaindex.takeOrders4(config); + iRaindex.takeOrders5(config); } /// `clear4` where BOTH orders take their input via vault 0, so the orderbook @@ -517,7 +517,7 @@ contract RaindexV6TakeOrderVaultZeroInputTest is RaindexV6ExternalRealTest { assertEq(token0.balanceOf(address(iRaindex)), 51e18, "pool (50) + bob's deposited output (1)"); iRaindex.clear4( - aliceOrder, bobOrder, ClearConfigV2(0, 0, 0, 0, 0, 0), new SignedContextV1[](0), new SignedContextV1[](0) + aliceOrder, bobOrder, ClearConfigV2(0, 0, 0, 0, 0, 0), new SignedContextV2[](0), new SignedContextV2[](0) ); // Both vault-0 inputs reached the respective wallets, funded by the @@ -553,7 +553,7 @@ contract RaindexV6TakeOrderVaultZeroInputTest is RaindexV6ExternalRealTest { token0d6.mint(carol, 50e6); vm.startPrank(carol); token0d6.approve(address(iRaindex), 50e6); - iRaindex.deposit4(address(token0d6), poolVaultId, LibDecimalFloat.packLossless(50, 0), new TaskV2[](0)); + iRaindex.deposit5(address(token0d6), poolVaultId, LibDecimalFloat.packLossless(50, 0), new TaskV3[](0)); vm.stopPrank(); _deposit(owner, token1, OUTPUT_VAULT_ID, 10); @@ -566,9 +566,9 @@ contract RaindexV6TakeOrderVaultZeroInputTest is RaindexV6ExternalRealTest { token0d6.approve(address(iRaindex), 1e6); assertEq(token0d6.balanceOf(address(iRaindex)), 50e6, "orderbook holds only carol's 6-decimal pool pre-take"); - TakeOrdersConfigV5 memory config = LibTestTakeOrder.defaultTakeConfig(LibTestTakeOrder.wrapSingle(order)); + TakeOrdersConfigV6 memory config = LibTestTakeOrder.defaultTakeConfig(LibTestTakeOrder.wrapSingle(order)); vm.prank(bob); - iRaindex.takeOrders4(config); + iRaindex.takeOrders5(config); assertEq(token0d6.balanceOf(owner), 1e6, "owner received the 6-decimal vault-0 input (1.0 -> 1e6)"); assertEq(token0d6.balanceOf(bob), 0, "taker funded the input in full"); @@ -602,9 +602,9 @@ contract RaindexV6TakeOrderVaultZeroInputTest is RaindexV6ExternalRealTest { vm.prank(bob); token1.approve(address(iRaindex), 5e18); - TakeOrdersConfigV5 memory config = LibTestTakeOrder.defaultTakeConfig(LibTestTakeOrder.wrapSingle(order)); + TakeOrdersConfigV6 memory config = LibTestTakeOrder.defaultTakeConfig(LibTestTakeOrder.wrapSingle(order)); vm.prank(bob); - iRaindex.takeOrders4(config); + iRaindex.takeOrders5(config); // Filled exactly the approved 3, not the offered 5. assertEq(token0.balanceOf(bob), 3e18, "taker received exactly the approved 3 token0"); @@ -645,7 +645,7 @@ contract RaindexV6TakeOrderVaultZeroInputTest is RaindexV6ExternalRealTest { // 6th ClearConfig arg (bobBountyVaultId) = 0 -> bob's bounty -> clearer wallet. iRaindex.clear4( - aliceOrder, bobOrder, ClearConfigV2(0, 0, 0, 0, 0, 0), new SignedContextV1[](0), new SignedContextV1[](0) + aliceOrder, bobOrder, ClearConfigV2(0, 0, 0, 0, 0, 0), new SignedContextV2[](0), new SignedContextV2[](0) ); assertEq(token0.balanceOf(address(this)), 1e18, "clearer received the 1 token0 bounty in their wallet"); @@ -712,7 +712,7 @@ contract RaindexV6TakeOrderVaultZeroInputTest is RaindexV6ExternalRealTest { vm.expectRevert(NegativeBounty.selector); iRaindex.clear4( - aliceOrder, bobOrder, ClearConfigV2(0, 0, 0, 0, 0, 0), new SignedContextV1[](0), new SignedContextV1[](0) + aliceOrder, bobOrder, ClearConfigV2(0, 0, 0, 0, 0, 0), new SignedContextV2[](0), new SignedContextV2[](0) ); } } diff --git a/test/concrete/raindex/RaindexV6.takeOrder.zeroAmount.t.sol b/test/concrete/raindex/RaindexV6.takeOrder.zeroAmount.t.sol index 48e9daa9ba..63367b1da1 100644 --- a/test/concrete/raindex/RaindexV6.takeOrder.zeroAmount.t.sol +++ b/test/concrete/raindex/RaindexV6.takeOrder.zeroAmount.t.sol @@ -6,7 +6,7 @@ import {Vm} from "forge-std-1.17.0/src/Test.sol"; import {IERC20} from "@openzeppelin-contracts-5.7.0/token/ERC20/IERC20.sol"; import {RaindexV6ExternalRealTest} from "test/util/abstract/RaindexV6ExternalRealTest.sol"; import {LibTestTakeOrder} from "test/util/lib/LibTestTakeOrder.sol"; -import {OrderV4, TakeOrdersConfigV5, TaskV2} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; +import {OrderV4, TakeOrdersConfigV6, TaskV3} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {Float, LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; import {LibOrder} from "../../../src/lib/LibOrder.sol"; @@ -33,8 +33,8 @@ contract RaindexV6TakeOrderZeroAmountTest is RaindexV6ExternalRealTest { abi.encode(true) ); vm.prank(alice); - iRaindex.deposit4( - address(iToken1), bytes32(uint256(0x01)), LibDecimalFloat.packLossless(10, 0), new TaskV2[](0) + iRaindex.deposit5( + address(iToken1), bytes32(uint256(0x01)), LibDecimalFloat.packLossless(10, 0), new TaskV3[](0) ); // Order with outputMax=0 and a perfectly fine IORatio=1. @@ -44,7 +44,7 @@ contract RaindexV6TakeOrderZeroAmountTest is RaindexV6ExternalRealTest { // maximumIORatio is generous so the skip is purely due to the zero // output max, not a ratio rejection. - TakeOrdersConfigV5 memory takeConfig = LibTestTakeOrder.defaultTakeConfig(LibTestTakeOrder.wrapSingle(order)); + TakeOrdersConfigV6 memory takeConfig = LibTestTakeOrder.defaultTakeConfig(LibTestTakeOrder.wrapSingle(order)); // No token should move out of either vault token. vm.mockCallRevert( @@ -56,13 +56,13 @@ contract RaindexV6TakeOrderZeroAmountTest is RaindexV6ExternalRealTest { vm.prank(bob); vm.recordLogs(); - (Float totalTakerInput, Float totalTakerOutput) = iRaindex.takeOrders4(takeConfig); + (Float totalTakerInput, Float totalTakerOutput) = iRaindex.takeOrders5(takeConfig); assertTrue(totalTakerInput.isZero(), "totalTakerInput must be zero"); assertTrue(totalTakerOutput.isZero(), "totalTakerOutput must be zero"); // The skip path emits exactly one event (OrderZeroAmount) and does not - // emit a TakeOrderV3, confirming no fill occurred. Decoding the single + // emit a TakeOrderV4, confirming no fill occurred. Decoding the single // recorded log directly (rather than vm.expectEmit) avoids counting the // expectEmit helper's own synthetic log. Vm.Log[] memory logs = vm.getRecordedLogs(); diff --git a/test/concrete/raindex/RaindexV6.takeOrder.zeroMaxOOBIndex.t.sol b/test/concrete/raindex/RaindexV6.takeOrder.zeroMaxOOBIndex.t.sol index 325b42c814..94ebc48f0f 100644 --- a/test/concrete/raindex/RaindexV6.takeOrder.zeroMaxOOBIndex.t.sol +++ b/test/concrete/raindex/RaindexV6.takeOrder.zeroMaxOOBIndex.t.sol @@ -6,14 +6,14 @@ import {RaindexV6ExternalRealTest} from "test/util/abstract/RaindexV6ExternalRea import {LibTestTakeOrder} from "test/util/lib/LibTestTakeOrder.sol"; import { OrderV4, - TakeOrderConfigV4, - TakeOrdersConfigV5, + TakeOrderConfigV5, + TakeOrdersConfigV6, IRaindexV7 } from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; -import {SignedContextV1} from "rainlang-interface-0.2.13/src/interface/deprecated/v1/IInterpreterCallerV2.sol"; +import {SignedContextV2} from "rainlang-interface-0.2.14/src/interface/IInterpreterCallerV5.sol"; import {Float, LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; -/// `takeOrders4` guards a zero maximum IO before dereferencing any order IO +/// `takeOrders5` guards a zero maximum IO before dereferencing any order IO /// index, so a zero max with an out-of-range index reverts with the explicit /// `ZeroMaximumIO` rather than a generic out-of-bounds bounds-check panic. contract RaindexV6TakeOrderZeroMaxOOBIndexTest is RaindexV6ExternalRealTest { @@ -35,10 +35,10 @@ contract RaindexV6TakeOrderZeroMaxOOBIndexTest is RaindexV6ExternalRealTest { // The order has a single input (index 0); index 1 is out of range. OrderV4 memory order = _addOrder("_ _:1e0 1e0;:;"); - TakeOrderConfigV4[] memory orders = new TakeOrderConfigV4[](1); - orders[0] = TakeOrderConfigV4(order, 1, 0, new SignedContextV1[](0)); + TakeOrderConfigV5[] memory orders = new TakeOrderConfigV5[](1); + orders[0] = TakeOrderConfigV5(order, 1, 0, new SignedContextV2[](0)); - TakeOrdersConfigV5 memory config = TakeOrdersConfigV5({ + TakeOrdersConfigV6 memory config = TakeOrdersConfigV6({ minimumIO: LibDecimalFloat.packLossless(0, 0), maximumIO: LibDecimalFloat.packLossless(0, 0), maximumIORatio: LibDecimalFloat.packLossless(type(int224).max, 0), @@ -49,6 +49,6 @@ contract RaindexV6TakeOrderZeroMaxOOBIndexTest is RaindexV6ExternalRealTest { vm.prank(bob); vm.expectRevert(IRaindexV7.ZeroMaximumIO.selector); - iRaindex.takeOrders4(config); + iRaindex.takeOrders5(config); } } diff --git a/test/concrete/raindex/RaindexV6.takeOrder.zeroRatio.t.sol b/test/concrete/raindex/RaindexV6.takeOrder.zeroRatio.t.sol index 1421c521ab..ac4ef12fe5 100644 --- a/test/concrete/raindex/RaindexV6.takeOrder.zeroRatio.t.sol +++ b/test/concrete/raindex/RaindexV6.takeOrder.zeroRatio.t.sol @@ -7,18 +7,18 @@ import {RaindexV6ExternalRealTest} from "test/util/abstract/RaindexV6ExternalRea import {LibTestTakeOrder} from "test/util/lib/LibTestTakeOrder.sol"; import { OrderV4, - TakeOrderConfigV4, - TakeOrdersConfigV5, - TaskV2, + TakeOrderConfigV5, + TakeOrdersConfigV6, + TaskV3, IRaindexV7 } from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; -import {SignedContextV1} from "rainlang-interface-0.2.13/src/interface/deprecated/v1/IInterpreterCallerV2.sol"; +import {SignedContextV2} from "rainlang-interface-0.2.14/src/interface/IInterpreterCallerV5.sol"; import {Float, LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; import {LibOrder} from "../../../src/lib/LibOrder.sol"; import {MinimumIO} from "../../../src/error/ErrRaindexV6.sol"; import {RecordingOrderTaker} from "test/util/concrete/RecordingOrderTaker.sol"; -/// A `takeOrders4` order whose IO ratio is 0 gives its output for nothing: the +/// A `takeOrders5` order whose IO ratio is 0 gives its output for nothing: the /// taker receives the order's output (capped by `outputMax`, and in the /// market-buy branch by the remaining taker IO) and pays 0. contract RaindexV6TakeOrderZeroRatioTest is RaindexV6ExternalRealTest { @@ -53,15 +53,15 @@ contract RaindexV6TakeOrderZeroRatioTest is RaindexV6ExternalRealTest { abi.encode(true) ); vm.prank(alice); - iRaindex.deposit4(address(iToken1), bytes32(uint256(0x01)), _f(VAULT_DEPOSIT), new TaskV2[](0)); + iRaindex.deposit5(address(iToken1), bytes32(uint256(0x01)), _f(VAULT_DEPOSIT), new TaskV3[](0)); vm.mockCall(address(iToken1), abi.encodeWithSelector(IERC20.transfer.selector), abi.encode(true)); vm.mockCall(address(iToken0), abi.encodeWithSelector(IERC20.transferFrom.selector), abi.encode(true)); } - function _two(OrderV4 memory a, OrderV4 memory b) internal pure returns (TakeOrderConfigV4[] memory) { - TakeOrderConfigV4[] memory orders = new TakeOrderConfigV4[](2); - orders[0] = TakeOrderConfigV4(a, 0, 0, new SignedContextV1[](0)); - orders[1] = TakeOrderConfigV4(b, 0, 0, new SignedContextV1[](0)); + function _two(OrderV4 memory a, OrderV4 memory b) internal pure returns (TakeOrderConfigV5[] memory) { + TakeOrderConfigV5[] memory orders = new TakeOrderConfigV5[](2); + orders[0] = TakeOrderConfigV5(a, 0, 0, new SignedContextV2[](0)); + orders[1] = TakeOrderConfigV5(b, 0, 0, new SignedContextV2[](0)); return orders; } @@ -82,14 +82,14 @@ contract RaindexV6TakeOrderZeroRatioTest is RaindexV6ExternalRealTest { maximumIO = bound(maximumIO, 1, VAULT_DEPOSIT * 2); _setUpVaultAndTransfers(); OrderV4 memory order = _order(outputMax, "0"); - TakeOrdersConfigV5 memory config = LibTestTakeOrder.defaultTakeConfig(LibTestTakeOrder.wrapSingle(order)); + TakeOrdersConfigV6 memory config = LibTestTakeOrder.defaultTakeConfig(LibTestTakeOrder.wrapSingle(order)); config.maximumIO = _f(maximumIO); uint256 expected = outputMax < maximumIO ? outputMax : maximumIO; vm.expectCall(address(iToken1), abi.encodeCall(IERC20.transfer, (bob, expected * 1e18)), 1); vm.expectCall(address(iToken0), abi.encodeWithSelector(IERC20.transferFrom.selector), 0); vm.prank(bob); - (Float totalTakerInput, Float totalTakerOutput) = iRaindex.takeOrders4(config); + (Float totalTakerInput, Float totalTakerOutput) = iRaindex.takeOrders5(config); assertTrue(totalTakerInput.eq(_f(expected)), "taker input"); assertTrue(totalTakerOutput.isZero(), "taker output"); @@ -103,7 +103,7 @@ contract RaindexV6TakeOrderZeroRatioTest is RaindexV6ExternalRealTest { maximumIO = bound(maximumIO, 1, VAULT_DEPOSIT * 2); _setUpVaultAndTransfers(); OrderV4 memory order = _order(outputMax, "0"); - TakeOrdersConfigV5 memory config = LibTestTakeOrder.defaultTakeConfig(LibTestTakeOrder.wrapSingle(order)); + TakeOrdersConfigV6 memory config = LibTestTakeOrder.defaultTakeConfig(LibTestTakeOrder.wrapSingle(order)); config.IOIsInput = false; config.maximumIO = _f(maximumIO); @@ -111,8 +111,8 @@ contract RaindexV6TakeOrderZeroRatioTest is RaindexV6ExternalRealTest { vm.expectCall(address(iToken0), abi.encodeWithSelector(IERC20.transferFrom.selector), 0); vm.prank(bob); vm.expectEmit(true, true, true, true); - emit IRaindexV7.TakeOrderV3(bob, config.orders[0], _f(outputMax), LibDecimalFloat.FLOAT_ZERO); - (Float totalTakerInput, Float totalTakerOutput) = iRaindex.takeOrders4(config); + emit IRaindexV7.TakeOrderV4(bob, config.orders[0], _f(outputMax), LibDecimalFloat.FLOAT_ZERO); + (Float totalTakerInput, Float totalTakerOutput) = iRaindex.takeOrders5(config); assertTrue(totalTakerInput.eq(_f(outputMax)), "taker input"); assertTrue(totalTakerOutput.isZero(), "taker output"); @@ -126,7 +126,7 @@ contract RaindexV6TakeOrderZeroRatioTest is RaindexV6ExternalRealTest { outputMax = bound(outputMax, 1, VAULT_DEPOSIT); _setUpVaultAndTransfers(); OrderV4 memory order = _order(outputMax, "0"); - TakeOrdersConfigV5 memory config = LibTestTakeOrder.defaultTakeConfig(LibTestTakeOrder.wrapSingle(order)); + TakeOrdersConfigV6 memory config = LibTestTakeOrder.defaultTakeConfig(LibTestTakeOrder.wrapSingle(order)); config.IOIsInput = ioIsInput; config.maximumIORatio = LibDecimalFloat.packLossless(type(int224).max, 0); config.maximumIO = LibDecimalFloat.packLossless(type(int224).max, 0); @@ -134,7 +134,7 @@ contract RaindexV6TakeOrderZeroRatioTest is RaindexV6ExternalRealTest { vm.expectCall(address(iToken1), abi.encodeCall(IERC20.transfer, (bob, outputMax * 1e18)), 1); vm.expectCall(address(iToken0), abi.encodeWithSelector(IERC20.transferFrom.selector), 0); vm.prank(bob); - (Float totalTakerInput, Float totalTakerOutput) = iRaindex.takeOrders4(config); + (Float totalTakerInput, Float totalTakerOutput) = iRaindex.takeOrders5(config); assertTrue(totalTakerInput.eq(_f(outputMax)), "taker input"); assertTrue(totalTakerOutput.isZero(), "taker output"); @@ -147,14 +147,14 @@ contract RaindexV6TakeOrderZeroRatioTest is RaindexV6ExternalRealTest { _setUpVaultAndTransfers(); OrderV4 memory free = _order(5, "0"); OrderV4 memory priced = _order(10, "2"); - TakeOrdersConfigV5 memory config = LibTestTakeOrder.defaultTakeConfig(_two(free, priced)); + TakeOrdersConfigV6 memory config = LibTestTakeOrder.defaultTakeConfig(_two(free, priced)); config.IOIsInput = false; config.maximumIO = _f(4); vm.expectCall(address(iToken1), abi.encodeCall(IERC20.transfer, (bob, 7e18)), 1); vm.expectCall(address(iToken0), abi.encodeCall(IERC20.transferFrom, (bob, address(iRaindex), 4e18)), 1); vm.prank(bob); - (Float totalTakerInput, Float totalTakerOutput) = iRaindex.takeOrders4(config); + (Float totalTakerInput, Float totalTakerOutput) = iRaindex.takeOrders5(config); // free: 5 for 0. priced: takerOutput min(20, 4) = 4, takerInput 4 / 2 = 2. assertTrue(totalTakerInput.eq(_f(7)), "taker input"); @@ -168,13 +168,13 @@ contract RaindexV6TakeOrderZeroRatioTest is RaindexV6ExternalRealTest { _setUpVaultAndTransfers(); OrderV4 memory free = _order(5, "0"); OrderV4 memory priced = _order(10, "2"); - TakeOrdersConfigV5 memory config = LibTestTakeOrder.defaultTakeConfig(_two(free, priced)); + TakeOrdersConfigV6 memory config = LibTestTakeOrder.defaultTakeConfig(_two(free, priced)); config.maximumIO = _f(8); vm.expectCall(address(iToken1), abi.encodeCall(IERC20.transfer, (bob, 8e18)), 1); vm.expectCall(address(iToken0), abi.encodeCall(IERC20.transferFrom, (bob, address(iRaindex), 6e18)), 1); vm.prank(bob); - (Float totalTakerInput, Float totalTakerOutput) = iRaindex.takeOrders4(config); + (Float totalTakerInput, Float totalTakerOutput) = iRaindex.takeOrders5(config); // free: 5 for 0, remaining 3. priced: takerInput 3, takerOutput 3 * 2 = 6. assertTrue(totalTakerInput.eq(_f(8)), "taker input"); @@ -188,14 +188,14 @@ contract RaindexV6TakeOrderZeroRatioTest is RaindexV6ExternalRealTest { minimumIO = bound(minimumIO, 1, VAULT_DEPOSIT * 2); _setUpVaultAndTransfers(); OrderV4 memory order = _order(outputMax, "0"); - TakeOrdersConfigV5 memory config = LibTestTakeOrder.defaultTakeConfig(LibTestTakeOrder.wrapSingle(order)); + TakeOrdersConfigV6 memory config = LibTestTakeOrder.defaultTakeConfig(LibTestTakeOrder.wrapSingle(order)); config.minimumIO = _f(minimumIO); vm.prank(bob); if (minimumIO > outputMax) { vm.expectRevert(abi.encodeWithSelector(MinimumIO.selector, _f(minimumIO), _f(outputMax))); } - iRaindex.takeOrders4(config); + iRaindex.takeOrders5(config); } /// Market sell: `minimumIO` counts taker output, to which a 0-ratio order @@ -204,13 +204,13 @@ contract RaindexV6TakeOrderZeroRatioTest is RaindexV6ExternalRealTest { minimumIO = bound(minimumIO, 1, VAULT_DEPOSIT); _setUpVaultAndTransfers(); OrderV4 memory order = _order(5, "0"); - TakeOrdersConfigV5 memory config = LibTestTakeOrder.defaultTakeConfig(LibTestTakeOrder.wrapSingle(order)); + TakeOrdersConfigV6 memory config = LibTestTakeOrder.defaultTakeConfig(LibTestTakeOrder.wrapSingle(order)); config.IOIsInput = false; config.minimumIO = _f(minimumIO); vm.prank(bob); vm.expectRevert(abi.encodeWithSelector(MinimumIO.selector, _f(minimumIO), LibDecimalFloat.FLOAT_ZERO)); - iRaindex.takeOrders4(config); + iRaindex.takeOrders5(config); } /// A 0-ratio order with a zero `outputMax` is still skipped with @@ -218,13 +218,13 @@ contract RaindexV6TakeOrderZeroRatioTest is RaindexV6ExternalRealTest { function testZeroRatioZeroOutputMaxSkips(bool ioIsInput) external { _setUpVaultAndTransfers(); OrderV4 memory order = _order(0, "0"); - TakeOrdersConfigV5 memory config = LibTestTakeOrder.defaultTakeConfig(LibTestTakeOrder.wrapSingle(order)); + TakeOrdersConfigV6 memory config = LibTestTakeOrder.defaultTakeConfig(LibTestTakeOrder.wrapSingle(order)); config.IOIsInput = ioIsInput; vm.prank(bob); vm.expectEmit(true, true, true, true); emit IRaindexV7.OrderZeroAmount(bob, alice, LibOrder.hash(order)); - (Float totalTakerInput, Float totalTakerOutput) = iRaindex.takeOrders4(config); + (Float totalTakerInput, Float totalTakerOutput) = iRaindex.takeOrders5(config); assertTrue(totalTakerInput.isZero(), "taker input"); assertTrue(totalTakerOutput.isZero(), "taker output"); @@ -236,7 +236,7 @@ contract RaindexV6TakeOrderZeroRatioTest is RaindexV6ExternalRealTest { _setUpVaultAndTransfers(); RecordingOrderTaker taker = new RecordingOrderTaker(iRaindex); OrderV4 memory order = _order(5, "0"); - TakeOrdersConfigV5 memory config = LibTestTakeOrder.defaultTakeConfig(LibTestTakeOrder.wrapSingle(order)); + TakeOrdersConfigV6 memory config = LibTestTakeOrder.defaultTakeConfig(LibTestTakeOrder.wrapSingle(order)); config.IOIsInput = ioIsInput; config.data = hex"01"; diff --git a/test/concrete/raindex/RaindexV6.vaultBalanceVault0.t.sol b/test/concrete/raindex/RaindexV6.vaultBalanceVault0.t.sol index 1b058724fe..6326656573 100644 --- a/test/concrete/raindex/RaindexV6.vaultBalanceVault0.t.sol +++ b/test/concrete/raindex/RaindexV6.vaultBalanceVault0.t.sol @@ -6,7 +6,7 @@ import {RaindexV6ExternalMockTest} from "test/util/abstract/RaindexV6ExternalMoc import {IERC20} from "@openzeppelin-contracts-5.7.0/token/ERC20/IERC20.sol"; import {IERC20Metadata} from "@openzeppelin-contracts-5.7.0/token/ERC20/extensions/IERC20Metadata.sol"; import {LibDecimalFloat, Float} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; -import {TaskV2} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; +import {TaskV3} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {TOFUOutcome} from "rain-tofu-erc20-decimals-0.1.4/src/lib/LibTOFUTokenDecimals.sol"; import {ITOFUTokenDecimals} from "rain-tofu-erc20-decimals-0.1.4/src/interface/ITOFUTokenDecimals.sol"; @@ -93,7 +93,7 @@ contract RaindexV6VaultBalanceVault0Test is RaindexV6ExternalMockTest { abi.encode(true) ); vm.prank(depositor); - iRaindex.deposit4(address(iToken0), bytes32(uint256(1)), LibDecimalFloat.packLossless(1, -18), new TaskV2[](0)); + iRaindex.deposit5(address(iToken0), bytes32(uint256(1)), LibDecimalFloat.packLossless(1, -18), new TaskV3[](0)); } /// A vault-0 balance read MUST revert `TokenDecimalsReadFailure` when the diff --git a/test/concrete/raindex/RaindexV6.withdraw.entask.t.sol b/test/concrete/raindex/RaindexV6.withdraw.entask.t.sol index 50cfa6a57d..97a3ad81b9 100644 --- a/test/concrete/raindex/RaindexV6.withdraw.entask.t.sol +++ b/test/concrete/raindex/RaindexV6.withdraw.entask.t.sol @@ -6,8 +6,8 @@ import {RaindexV6ExternalRealTest} from "test/util/abstract/RaindexV6ExternalRea import { OrderConfigV4, EvaluableV4, - TaskV2, - SignedContextV1 + TaskV3, + SignedContextV2 } from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {IERC20} from "@openzeppelin-contracts-5.7.0/token/ERC20/IERC20.sol"; import {IERC20Metadata} from "@openzeppelin-contracts-5.7.0/token/ERC20/extensions/IERC20Metadata.sol"; @@ -53,7 +53,7 @@ contract RaindexV6WithdrawEvalTest is RaindexV6ExternalRealTest { bytes memory err ) internal { uint256 withdrawAmount18; - TaskV2[] memory actions; + TaskV3[] memory actions; { uint256 depositAmountAbsolute; { @@ -81,14 +81,14 @@ contract RaindexV6WithdrawEvalTest is RaindexV6ExternalRealTest { vm.startPrank(owner); if (depositAmountAbsolute > 0) { - iRaindex.deposit4(address(iToken0), vaultId, depositAmount, new TaskV2[](0)); + iRaindex.deposit5(address(iToken0), vaultId, depositAmount, new TaskV3[](0)); } } - actions = new TaskV2[](evalStrings.length); + actions = new TaskV3[](evalStrings.length); for (uint256 i = 0; i < evalStrings.length; i++) { - actions[i] = TaskV2( - EvaluableV4(iInterpreter, iStore, iParserV2.parse2(evalStrings[i])), new SignedContextV1[](0) + actions[i] = TaskV3( + EvaluableV4(iInterpreter, iStore, iParserV2.parse2(evalStrings[i])), new SignedContextV2[](0) ); } } @@ -115,7 +115,7 @@ contract RaindexV6WithdrawEvalTest is RaindexV6ExternalRealTest { withdrawAmount18 ); } - iRaindex.withdraw4(address(iToken0), vaultId, targetAmount, actions); + iRaindex.withdraw5(address(iToken0), vaultId, targetAmount, actions); if (err.length == 0) { checkReentrancyRW(6, 3); (bytes32[] memory reads, bytes32[] memory writes) = vm.accesses(address(iStore)); @@ -320,7 +320,7 @@ contract RaindexV6WithdrawEvalTest is RaindexV6ExternalRealTest { abi.encodeWithSelector(IERC20.transferFrom.selector, alice, address(iRaindex), depositAmount18), abi.encode(true) ); - iRaindex.deposit4(address(iToken0), vaultId, depositAmount, new TaskV2[](0)); + iRaindex.deposit5(address(iToken0), vaultId, depositAmount, new TaskV3[](0)); vm.mockCall( address(iToken0), @@ -330,12 +330,12 @@ contract RaindexV6WithdrawEvalTest is RaindexV6ExternalRealTest { bytes[] memory evals = new bytes[](1); evals[0] = bytes(":ensure(0 \"revert in action\");"); - TaskV2[] memory actions = evalsToActions(evals); + TaskV3[] memory actions = evalsToActions(evals); assertTrue(depositAmount.eq(iRaindex.vaultBalance2(alice, address(iToken0), vaultId))); vm.expectRevert("revert in action"); - iRaindex.withdraw4(address(iToken0), vaultId, withdrawAmount, actions); + iRaindex.withdraw5(address(iToken0), vaultId, withdrawAmount, actions); assertTrue(depositAmount.eq(iRaindex.vaultBalance2(alice, address(iToken0), vaultId))); } diff --git a/test/concrete/raindex/RaindexV6.withdraw.t.sol b/test/concrete/raindex/RaindexV6.withdraw.t.sol index 7c68254f09..f8bbb8bef5 100644 --- a/test/concrete/raindex/RaindexV6.withdraw.t.sol +++ b/test/concrete/raindex/RaindexV6.withdraw.t.sol @@ -8,7 +8,7 @@ import {Math} from "@openzeppelin-contracts-5.7.0/utils/math/Math.sol"; import {RaindexV6ExternalMockTest, REVERTING_MOCK_BYTECODE} from "test/util/abstract/RaindexV6ExternalMockTest.sol"; import {Reenteroor, IERC20} from "test/util/concrete/Reenteroor.sol"; -import {TaskV2, IRaindexV7} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; +import {TaskV3, IRaindexV7} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {IERC20Metadata} from "@openzeppelin-contracts-5.7.0/token/ERC20/extensions/IERC20Metadata.sol"; import {Float, LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; @@ -32,7 +32,7 @@ contract RaindexV6WithdrawTest is RaindexV6ExternalMockTest { function testWithdrawZeroVaultId(address alice, address token) external { vm.prank(alice); vm.expectRevert(abi.encodeWithSelector(IRaindexV7.ZeroVaultId.selector, alice, token)); - iRaindex.withdraw4(token, bytes32(0), Float.wrap(0), new TaskV2[](0)); + iRaindex.withdraw5(token, bytes32(0), Float.wrap(0), new TaskV3[](0)); } /// Withdrawing a zero target amount should revert. @@ -41,7 +41,7 @@ contract RaindexV6WithdrawTest is RaindexV6ExternalMockTest { vm.assume(vaultId != bytes32(0)); vm.prank(alice); vm.expectRevert(abi.encodeWithSelector(ZeroWithdrawTargetAmount.selector, alice, token, vaultId)); - iRaindex.withdraw4(token, vaultId, Float.wrap(0), new TaskV2[](0)); + iRaindex.withdraw5(token, vaultId, Float.wrap(0), new TaskV3[](0)); } /// Withdrawing a non-zero amount from an empty vault should be a noop. @@ -54,7 +54,7 @@ contract RaindexV6WithdrawTest is RaindexV6ExternalMockTest { vm.expectEmit(false, false, false, true); emit WithdrawV2(alice, address(iToken0), vaultId, amount, Float.wrap(0), 0); vm.record(); - iRaindex.withdraw4(address(iToken0), vaultId, amount, new TaskV2[](0)); + iRaindex.withdraw5(address(iToken0), vaultId, amount, new TaskV3[](0)); (bytes32[] memory reads, bytes32[] memory writes) = vm.accesses(address(iRaindex)); assertEq(reads.length, 6, "reads"); assertEq(writes.length, 3, "writes"); @@ -78,7 +78,7 @@ contract RaindexV6WithdrawTest is RaindexV6ExternalMockTest { Float depositAmount = LibDecimalFloat.fromFixedDecimalLosslessPacked(depositAmount18, 18); Float withdrawAmount = LibDecimalFloat.fromFixedDecimalLosslessPacked(withdrawAmount18, 18); - iRaindex.deposit4(address(iToken0), vaultId, depositAmount, new TaskV2[](0)); + iRaindex.deposit5(address(iToken0), vaultId, depositAmount, new TaskV3[](0)); assertTrue(iRaindex.vaultBalance2(address(alice), address(iToken0), vaultId).eq(depositAmount)); vm.prank(alice); @@ -87,7 +87,7 @@ contract RaindexV6WithdrawTest is RaindexV6ExternalMockTest { ); vm.expectEmit(false, false, false, true); emit WithdrawV2(alice, address(iToken0), vaultId, withdrawAmount, depositAmount, depositAmount18); - iRaindex.withdraw4(address(iToken0), vaultId, withdrawAmount, new TaskV2[](0)); + iRaindex.withdraw5(address(iToken0), vaultId, withdrawAmount, new TaskV3[](0)); assertTrue(iRaindex.vaultBalance2(address(alice), address(iToken0), vaultId).isZero(), "vault balance"); } @@ -109,7 +109,7 @@ contract RaindexV6WithdrawTest is RaindexV6ExternalMockTest { Float depositAmount = LibDecimalFloat.fromFixedDecimalLosslessPacked(depositAmount18, 18); Float withdrawAmount = LibDecimalFloat.fromFixedDecimalLosslessPacked(withdrawAmount18, 18); - iRaindex.deposit4(address(iToken0), vaultId, depositAmount, new TaskV2[](0)); + iRaindex.deposit5(address(iToken0), vaultId, depositAmount, new TaskV3[](0)); assertTrue(iRaindex.vaultBalance2(address(alice), address(iToken0), vaultId).eq(depositAmount)); vm.prank(alice); @@ -121,7 +121,7 @@ contract RaindexV6WithdrawTest is RaindexV6ExternalMockTest { vm.expectEmit(false, false, false, true); // The full withdraw amount is possible as it's only a partial withdraw. emit WithdrawV2(alice, address(iToken0), vaultId, withdrawAmount, withdrawAmount, withdrawAmount18); - iRaindex.withdraw4(address(iToken0), vaultId, withdrawAmount, new TaskV2[](0)); + iRaindex.withdraw5(address(iToken0), vaultId, withdrawAmount, new TaskV3[](0)); // The vault balance is reduced by the withdraw amount. assertTrue( iRaindex.vaultBalance2(address(alice), address(iToken0), vaultId).eq(depositAmount.sub(withdrawAmount)) @@ -144,13 +144,13 @@ contract RaindexV6WithdrawTest is RaindexV6ExternalMockTest { ); Float depositAmount = LibDecimalFloat.fromFixedDecimalLosslessPacked(depositAmount18, 18); Float withdrawAmount = LibDecimalFloat.fromFixedDecimalLosslessPacked(withdrawAmount18, 18); - iRaindex.deposit4(address(iToken0), vaultId, depositAmount, new TaskV2[](0)); + iRaindex.deposit5(address(iToken0), vaultId, depositAmount, new TaskV3[](0)); assertTrue(iRaindex.vaultBalance2(address(alice), address(iToken0), vaultId).eq(depositAmount)); // The token contract always reverts when not mocked. vm.prank(alice); vm.expectRevert(); - iRaindex.withdraw4(address(iToken0), vaultId, withdrawAmount, new TaskV2[](0)); + iRaindex.withdraw5(address(iToken0), vaultId, withdrawAmount, new TaskV3[](0)); vm.prank(alice); vm.mockCall( @@ -159,7 +159,7 @@ contract RaindexV6WithdrawTest is RaindexV6ExternalMockTest { abi.encode(false) ); vm.expectRevert(abi.encodeWithSelector(SafeERC20.SafeERC20FailedOperation.selector, address(iToken0))); - iRaindex.withdraw4(address(iToken0), vaultId, withdrawAmount, new TaskV2[](0)); + iRaindex.withdraw5(address(iToken0), vaultId, withdrawAmount, new TaskV3[](0)); } /// Defines an action that can be taken in withdrawal tests. @@ -229,7 +229,7 @@ contract RaindexV6WithdrawTest is RaindexV6ExternalMockTest { vm.expectEmit(false, false, false, true); emit DepositV2(action.alice, action.token, action.vaultId, action.amount); - iRaindex.deposit4(action.token, action.vaultId, action.amountFloat, new TaskV2[](0)); + iRaindex.deposit5(action.token, action.vaultId, action.amountFloat, new TaskV3[](0)); assertTrue( iRaindex.vaultBalance2(action.alice, action.token, action.vaultId) .eq(balance.add(action.amountFloat)), @@ -258,7 +258,7 @@ contract RaindexV6WithdrawTest is RaindexV6ExternalMockTest { expectedActualAmount18 ); } - iRaindex.withdraw4(action.token, action.vaultId, action.amountFloat, new TaskV2[](0)); + iRaindex.withdraw5(action.token, action.vaultId, action.amountFloat, new TaskV3[](0)); assertTrue( iRaindex.vaultBalance2(action.alice, action.token, action.vaultId) .eq(balance.sub(expectedActualAmount)), diff --git a/test/lib/LibOrder.t.sol b/test/lib/LibOrder.t.sol index c1fef99621..28e79932f5 100644 --- a/test/lib/LibOrder.t.sol +++ b/test/lib/LibOrder.t.sol @@ -5,7 +5,7 @@ pragma solidity =0.8.25; import {Test} from "forge-std-1.17.0/src/Test.sol"; import {LibOrder, OrderV4} from "../../src/lib/LibOrder.sol"; -import {EvaluableV4} from "rainlang-interface-0.2.13/src/interface/IInterpreterCallerV4.sol"; +import {EvaluableV4} from "rainlang-interface-0.2.14/src/interface/IInterpreterCallerV5.sol"; import {IOV2} from "raindex-interface-0.1.10/src/interface/deprecated/v5/IOrderBookV5.sol"; /// @title LibOrderTest diff --git a/test/lib/LibRaindex.doPost.t.sol b/test/lib/LibRaindex.doPost.t.sol index 4181406f7d..0b04e730ed 100644 --- a/test/lib/LibRaindex.doPost.t.sol +++ b/test/lib/LibRaindex.doPost.t.sol @@ -4,12 +4,12 @@ pragma solidity =0.8.25; import {Test} from "forge-std-1.17.0/src/Test.sol"; import {LibRaindexDoPostHarness} from "test/util/concrete/LibRaindexDoPostHarness.sol"; -import {TaskV2} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; -import {IInterpreterV4, StackItem} from "rainlang-interface-0.2.13/src/interface/IInterpreterV4.sol"; -import {IInterpreterStoreV3} from "rainlang-interface-0.2.13/src/interface/IInterpreterStoreV3.sol"; -import {StateNamespace} from "rainlang-interface-0.2.13/src/interface/deprecated/v2/IInterpreterStoreV2.sol"; -import {EvaluableV4} from "rainlang-interface-0.2.13/src/interface/IInterpreterCallerV4.sol"; -import {SignedContextV1} from "rainlang-interface-0.2.13/src/interface/deprecated/v1/IInterpreterCallerV2.sol"; +import {TaskV3} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; +import {IInterpreterV4, StackItem} from "rainlang-interface-0.2.14/src/interface/IInterpreterV4.sol"; +import {IInterpreterStoreV3} from "rainlang-interface-0.2.14/src/interface/IInterpreterStoreV3.sol"; +import {StateNamespace} from "rainlang-interface-0.2.14/src/interface/deprecated/v2/IInterpreterStoreV2.sol"; +import {EvaluableV4} from "rainlang-interface-0.2.14/src/interface/IInterpreterCallerV5.sol"; +import {SignedContextV2} from "rainlang-interface-0.2.14/src/interface/IInterpreterCallerV5.sol"; /// @title LibRaindexDoPostTest /// @notice Audit GAP-A11-1/2/3 (#2536): `doPost` skips work for an empty post @@ -20,7 +20,7 @@ contract LibRaindexDoPostTest is Test { /// GAP-A11-1: an empty post array is a no-op (no interpreter/store calls). function testDoPostEmptyPostArrayNoOp() external { - iHarness.doPost(new bytes32[][](0), new TaskV2[](0)); + iHarness.doPost(new bytes32[][](0), new TaskV3[](0)); } /// GAP-A11-2: a task with empty bytecode is skipped — neither `eval4` nor @@ -33,10 +33,10 @@ contract LibRaindexDoPostTest is Test { ); vm.mockCallRevert(store, abi.encodeWithSelector(IInterpreterStoreV3.set.selector), bytes("set must be skipped")); - TaskV2[] memory post = new TaskV2[](1); - post[0] = TaskV2({ + TaskV3[] memory post = new TaskV3[](1); + post[0] = TaskV3({ evaluable: EvaluableV4(IInterpreterV4(interpreter), IInterpreterStoreV3(store), hex""), - signedContext: new SignedContextV1[](0) + signedContext: new SignedContextV2[](0) }); iHarness.doPost(new bytes32[][](0), post); } @@ -56,10 +56,10 @@ contract LibRaindexDoPostTest is Test { vm.expectCall(interpreter, abi.encodeWithSelector(IInterpreterV4.eval4.selector)); vm.mockCallRevert(store, abi.encodeWithSelector(IInterpreterStoreV3.set.selector), bytes("set must be skipped")); - TaskV2[] memory post = new TaskV2[](1); - post[0] = TaskV2({ + TaskV3[] memory post = new TaskV3[](1); + post[0] = TaskV3({ evaluable: EvaluableV4(IInterpreterV4(interpreter), IInterpreterStoreV3(store), hex"01"), - signedContext: new SignedContextV1[](0) + signedContext: new SignedContextV2[](0) }); iHarness.doPost(new bytes32[][](0), post); } @@ -87,10 +87,10 @@ contract LibRaindexDoPostTest is Test { abi.encodeCall(IInterpreterStoreV3.set, (StateNamespace.wrap(uint256(uint160(address(this)))), writes)) ); - TaskV2[] memory post = new TaskV2[](1); - post[0] = TaskV2({ + TaskV3[] memory post = new TaskV3[](1); + post[0] = TaskV3({ evaluable: EvaluableV4(IInterpreterV4(interpreter), IInterpreterStoreV3(store), hex"01"), - signedContext: new SignedContextV1[](0) + signedContext: new SignedContextV2[](0) }); iHarness.doPost(new bytes32[][](0), post); } diff --git a/test/lib/LibRaindexArb.finalizeArbGasExtreme.t.sol b/test/lib/LibRaindexArb.finalizeArbGasExtreme.t.sol index 182e0ba623..0cfb353a3a 100644 --- a/test/lib/LibRaindexArb.finalizeArbGasExtreme.t.sol +++ b/test/lib/LibRaindexArb.finalizeArbGasExtreme.t.sol @@ -16,7 +16,7 @@ contract LibRaindexArbFinalizeArbGasExtremeTest is Test { uint256 hugeGas = 1e70; vm.deal(address(this), hugeGas); - // No token profit; hugeGas is sent with arb5, returned by the exchange, + // No token profit; hugeGas is sent with arb6, returned by the exchange, // and swept by finalizeArb. The arb completes (no revert on the pack). ArbResult memory result = LibTestArb.setupAndArb(vm, 100e18, 100e18, 100e18, 100e18, LibTestArb.noopTask(), hugeGas); diff --git a/test/lib/LibRaindexArb.finalizeArbNativeGas.t.sol b/test/lib/LibRaindexArb.finalizeArbNativeGas.t.sol index 2836095d8d..2647e867ce 100644 --- a/test/lib/LibRaindexArb.finalizeArbNativeGas.t.sol +++ b/test/lib/LibRaindexArb.finalizeArbNativeGas.t.sol @@ -11,7 +11,7 @@ contract LibRaindexArbFinalizeArbNativeGasTest is Test { uint256 senderBalanceBefore = address(this).balance; // Raindex has 100e18 output, pulls 100e18 input. Exchange has 100e18 input. - // No token profit. 1 ether sent with arb5, returned by exchange, swept. + // No token profit. 1 ether sent with arb6, returned by exchange, swept. ArbResult memory result = LibTestArb.setupAndArb(vm, 100e18, 100e18, 100e18, 100e18, LibTestArb.noopTask(), 1 ether); diff --git a/test/lib/LibRaindexArb.finalizeArbTaskContext.t.sol b/test/lib/LibRaindexArb.finalizeArbTaskContext.t.sol index 6ba86792aa..b1b26b1fbb 100644 --- a/test/lib/LibRaindexArb.finalizeArbTaskContext.t.sol +++ b/test/lib/LibRaindexArb.finalizeArbTaskContext.t.sol @@ -3,10 +3,10 @@ pragma solidity =0.8.25; import {Test} from "forge-std-1.17.0/src/Test.sol"; -import {EvaluableV4, SignedContextV1, TaskV2} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; -import {IInterpreterV4} from "rainlang-interface-0.2.13/src/interface/IInterpreterV4.sol"; -import {IInterpreterStoreV3} from "rainlang-interface-0.2.13/src/interface/IInterpreterStoreV3.sol"; -import {IParserV2} from "rainlang-interface-0.2.13/src/interface/IParserV2.sol"; +import {EvaluableV4, SignedContextV2, TaskV3} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; +import {IInterpreterV4} from "rainlang-interface-0.2.14/src/interface/IInterpreterV4.sol"; +import {IInterpreterStoreV3} from "rainlang-interface-0.2.14/src/interface/IInterpreterStoreV3.sol"; +import {IParserV2} from "rainlang-interface-0.2.14/src/interface/IParserV2.sol"; import { LibTestInterpreterDeploy, TEST_INTERPRETER_ADDRESS, @@ -39,11 +39,11 @@ contract LibRaindexArbFinalizeArbTaskContextTest is Test { ) ); - TaskV2 memory task = TaskV2({ + TaskV3 memory task = TaskV3({ evaluable: EvaluableV4( IInterpreterV4(TEST_INTERPRETER_ADDRESS), IInterpreterStoreV3(TEST_STORE_ADDRESS), taskBytecode ), - signedContext: new SignedContextV1[](0) + signedContext: new SignedContextV2[](0) }); // Raindex has 100e18 output, pulls 80e18 input. Exchange has 100e18 input. @@ -79,11 +79,11 @@ contract LibRaindexArbFinalizeArbTaskContextTest is Test { ) ); - TaskV2 memory task = TaskV2({ + TaskV3 memory task = TaskV3({ evaluable: EvaluableV4( IInterpreterV4(TEST_INTERPRETER_ADDRESS), IInterpreterStoreV3(TEST_STORE_ADDRESS), taskBytecode ), - signedContext: new SignedContextV1[](0) + signedContext: new SignedContextV2[](0) }); // Raindex has 100e18 output, pulls 80e18 input. Exchange has 80e18 input. diff --git a/test/lib/LibRaindexArb.finalizeArbTaskSignedContext.t.sol b/test/lib/LibRaindexArb.finalizeArbTaskSignedContext.t.sol index b397d1e121..ddd4a8fa38 100644 --- a/test/lib/LibRaindexArb.finalizeArbTaskSignedContext.t.sol +++ b/test/lib/LibRaindexArb.finalizeArbTaskSignedContext.t.sol @@ -3,43 +3,45 @@ pragma solidity =0.8.25; import {Test} from "forge-std-1.17.0/src/Test.sol"; -import {EvaluableV4, SignedContextV1, TaskV2} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; -import {IInterpreterV4} from "rainlang-interface-0.2.13/src/interface/IInterpreterV4.sol"; -import {IInterpreterStoreV3} from "rainlang-interface-0.2.13/src/interface/IInterpreterStoreV3.sol"; -import {IParserV2} from "rainlang-interface-0.2.13/src/interface/IParserV2.sol"; +import {EvaluableV4, SignedContextV2, TaskV3} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; +import {IInterpreterV4} from "rainlang-interface-0.2.14/src/interface/IInterpreterV4.sol"; +import {IInterpreterStoreV3} from "rainlang-interface-0.2.14/src/interface/IInterpreterStoreV3.sol"; +import {IParserV2} from "rainlang-interface-0.2.14/src/interface/IParserV2.sol"; import { LibTestInterpreterDeploy, TEST_INTERPRETER_ADDRESS, TEST_STORE_ADDRESS, TEST_EXPRESSION_DEPLOYER_ADDRESS } from "rainlang-0.2.19/test/lib/deploy/LibTestInterpreterDeploy.sol"; -import {MessageHashUtils} from "@openzeppelin-contracts-5.7.0/utils/cryptography/MessageHashUtils.sol"; +import {LibTestSignedContext} from "test/util/lib/LibTestSignedContext.sol"; import {Strings} from "@openzeppelin-contracts-5.7.0/utils/Strings.sol"; import {LibTestArb} from "test/util/lib/LibTestArb.sol"; import {LibRaindexDeploy} from "src/lib/deploy/LibRaindexDeploy.sol"; import {RUNTIME_CODE as SUB_PARSER_RUNTIME_CODE} from "src/generated/candidate/RaindexV6SubParser.sol"; /// @title LibRaindexArbFinalizeArbTaskSignedContextTest -/// @notice `signer()` and `signed-context()` read the real signers and +/// @notice `signer()`, `signer-domain()` and `signed-context()` read +/// the real signers, domains and signed data in the post-arb task. /// signed data in the post-arb task. contract LibRaindexArbFinalizeArbTaskSignedContextTest is Test { using Strings for address; + using Strings for uint256; uint256 internal constant SIGNER_A_PK = 0xA11CE; uint256 internal constant SIGNER_B_PK = 0xB0B; address internal constant DATA_A = address(0xDA7A0); address internal constant DATA_B = address(0xDA7A1); address internal constant TRUSTED = address(0x7777); + bytes32 internal constant DOMAIN_A = keccak256("domain a"); + bytes32 internal constant DOMAIN_B = keccak256("domain b"); - function signed(uint256 pk, address datum) internal pure returns (SignedContextV1 memory) { + function signed(uint256 pk, bytes32 domain, address datum) internal pure returns (SignedContextV2 memory) { bytes32[] memory ctx = new bytes32[](1); ctx[0] = bytes32(uint256(uint160(datum))); - bytes32 h = MessageHashUtils.toEthSignedMessageHash(keccak256(abi.encodePacked(ctx))); - (uint8 v, bytes32 r, bytes32 s) = vm.sign(pk, h); - return SignedContextV1(vm.addr(pk), ctx, abi.encodePacked(r, s, v)); + return LibTestSignedContext.sign(vm, pk, domain, ctx); } - function task(string memory body, SignedContextV1[] memory sc) internal returns (TaskV2 memory) { + function task(string memory body, SignedContextV2[] memory sc) internal returns (TaskV3 memory) { LibTestInterpreterDeploy.etchTestRainlang(vm); vm.etch(LibRaindexDeploy.SUB_PARSER_DEPLOYED_ADDRESS, SUB_PARSER_RUNTIME_CODE); bytes memory bytecode = IParserV2(TEST_EXPRESSION_DEPLOYER_ADDRESS) @@ -50,7 +52,7 @@ contract LibRaindexArbFinalizeArbTaskSignedContextTest is Test { ) ) ); - return TaskV2({ + return TaskV3({ evaluable: EvaluableV4( IInterpreterV4(TEST_INTERPRETER_ADDRESS), IInterpreterStoreV3(TEST_STORE_ADDRESS), bytecode ), @@ -59,10 +61,10 @@ contract LibRaindexArbFinalizeArbTaskSignedContextTest is Test { } function testFinalizeArbTaskSignerWordsReadRealSigners() external { - SignedContextV1[] memory sc = new SignedContextV1[](2); - sc[0] = signed(SIGNER_A_PK, DATA_A); - sc[1] = signed(SIGNER_B_PK, DATA_B); - TaskV2 memory t = task( + SignedContextV2[] memory sc = new SignedContextV2[](2); + sc[0] = signed(SIGNER_A_PK, DOMAIN_A, DATA_A); + sc[1] = signed(SIGNER_B_PK, DOMAIN_B, DATA_B); + TaskV3 memory t = task( string.concat( ":ensure(equal-to(signer<0>() ", vm.addr(SIGNER_A_PK).toHexString(), @@ -70,6 +72,12 @@ contract LibRaindexArbFinalizeArbTaskSignedContextTest is Test { ":ensure(equal-to(signer<1>() ", vm.addr(SIGNER_B_PK).toHexString(), ") \"signer 1\"),", + ":ensure(equal-to(signer-domain<0>() ", + uint256(DOMAIN_A).toHexString(), + ") \"signer domain 0\"),", + ":ensure(equal-to(signer-domain<1>() ", + uint256(DOMAIN_B).toHexString(), + ") \"signer domain 1\"),", ":ensure(equal-to(signed-context<0 0>() ", DATA_A.toHexString(), ") \"signed context 0\"),", @@ -83,17 +91,17 @@ contract LibRaindexArbFinalizeArbTaskSignedContextTest is Test { } function testFinalizeArbTaskRejectsSignerForgedInSignedData() external { - SignedContextV1[] memory sc = new SignedContextV1[](3); - sc[0] = signed(SIGNER_A_PK, DATA_A); - sc[1] = signed(SIGNER_A_PK, DATA_A); - sc[2] = signed(SIGNER_A_PK, TRUSTED); - TaskV2 memory t = + SignedContextV2[] memory sc = new SignedContextV2[](3); + sc[0] = signed(SIGNER_A_PK, DOMAIN_A, DATA_A); + sc[1] = signed(SIGNER_A_PK, DOMAIN_A, DATA_A); + sc[2] = signed(SIGNER_A_PK, DOMAIN_A, TRUSTED); + TaskV3 memory t = task(string.concat(":ensure(equal-to(signer<0>() ", TRUSTED.toHexString(), ") \"signer trusted\");"), sc); vm.expectRevert("signer trusted"); this.externalArb(t); } - function externalArb(TaskV2 memory t) external { + function externalArb(TaskV3 memory t) external { LibTestArb.setupAndArb(vm, 80e18, 100e18, 100e18, 100e18, t, 0); } } diff --git a/test/util/abstract/ArbTest.sol b/test/util/abstract/ArbTest.sol index 321a95c7e1..95b6375213 100644 --- a/test/util/abstract/ArbTest.sol +++ b/test/util/abstract/ArbTest.sol @@ -9,9 +9,9 @@ import {Refundoor} from "test/util/concrete/Refundoor.sol"; import { FlashLendingMockRaindex, OrderV4, - TakeOrderConfigV4, + TakeOrderConfigV5, IOV2, - SignedContextV1, + SignedContextV2, EvaluableV4 } from "test/util/concrete/FlashLendingMockRaindex.sol"; import {LibTOFUTokenDecimals} from "rain-tofu-erc20-decimals-0.1.4/src/lib/LibTOFUTokenDecimals.sol"; @@ -51,7 +51,7 @@ abstract contract ArbTest is Test { function buildTakeOrderConfig(OrderV4 memory order, uint256 inputIOIndex, uint256 outputIOIndex) internal view - returns (TakeOrderConfigV4[] memory) + returns (TakeOrderConfigV5[] memory) { if (order.validInputs.length == 0) { order.validInputs = new IOV2[](1); @@ -65,8 +65,8 @@ abstract contract ArbTest is Test { order.validInputs[inputIOIndex].token = address(iTakerOutput); order.validOutputs[outputIOIndex].token = address(iTakerInput); - TakeOrderConfigV4[] memory orders = new TakeOrderConfigV4[](1); - orders[0] = TakeOrderConfigV4(order, inputIOIndex, outputIOIndex, new SignedContextV1[](0)); + TakeOrderConfigV5[] memory orders = new TakeOrderConfigV5[](1); + orders[0] = TakeOrderConfigV5(order, inputIOIndex, outputIOIndex, new SignedContextV2[](0)); return orders; } diff --git a/test/util/abstract/IRaindexV7Stub.sol b/test/util/abstract/IRaindexV7Stub.sol index 61522cf3ee..0061b66166 100644 --- a/test/util/abstract/IRaindexV7Stub.sol +++ b/test/util/abstract/IRaindexV7Stub.sol @@ -7,11 +7,11 @@ import { OrderConfigV4, OrderV4, ClearConfigV2, - SignedContextV1, - TakeOrdersConfigV5, + SignedContextV2, + TakeOrdersConfigV6, EvaluableV4, - TaskV2, - QuoteV2, + TaskV3, + QuoteV3, Float } from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {IERC3156FlashLender} from "raindex-interface-0.1.10/src/interface/ierc3156/IERC3156FlashLender.sol"; @@ -19,17 +19,17 @@ import {IERC3156FlashBorrower} from "raindex-interface-0.1.10/src/interface/ierc abstract contract IRaindexV7Stub is IRaindexV7 { /// @inheritdoc IRaindexV7 - function entask2(TaskV2[] calldata) external pure { + function entask3(TaskV3[] calldata) external pure { revert("eval"); } /// @inheritdoc IRaindexV7 - function quote2(QuoteV2 calldata) external pure returns (bool, Float, Float) { + function quote3(QuoteV3 calldata) external pure returns (bool, Float, Float) { revert("quote"); } /// @inheritdoc IRaindexV7 - function addOrder4(OrderConfigV4 calldata, TaskV2[] calldata) external pure returns (bool) { + function addOrder5(OrderConfigV4 calldata, TaskV3[] calldata) external pure returns (bool) { revert("addOrder"); } @@ -39,7 +39,7 @@ abstract contract IRaindexV7Stub is IRaindexV7 { } /// @inheritdoc IRaindexV7 - function removeOrder3(OrderV4 calldata, TaskV2[] calldata) external pure returns (bool) { + function removeOrder4(OrderV4 calldata, TaskV3[] calldata) external pure returns (bool) { revert("removeOrder"); } @@ -48,19 +48,19 @@ abstract contract IRaindexV7Stub is IRaindexV7 { OrderV4 memory, OrderV4 memory, ClearConfigV2 calldata, - SignedContextV1[] memory, - SignedContextV1[] memory + SignedContextV2[] memory, + SignedContextV2[] memory ) external pure { revert("clear"); } /// @inheritdoc IRaindexV7 - function deposit4(address, bytes32, Float, TaskV2[] calldata) external pure { + function deposit5(address, bytes32, Float, TaskV3[] calldata) external pure { revert("deposit"); } /// @inheritdoc IRaindexV7 - function takeOrders4(TakeOrdersConfigV5 calldata) external pure returns (Float, Float) { + function takeOrders5(TakeOrdersConfigV6 calldata) external pure returns (Float, Float) { revert("takeOrders"); } @@ -70,7 +70,7 @@ abstract contract IRaindexV7Stub is IRaindexV7 { } /// @inheritdoc IRaindexV7 - function withdraw4(address, bytes32, Float, TaskV2[] calldata) external pure { + function withdraw5(address, bytes32, Float, TaskV3[] calldata) external pure { revert("withdraw"); } diff --git a/test/util/abstract/MockRaindexBase.sol b/test/util/abstract/MockRaindexBase.sol index 9247940a8c..12680460d8 100644 --- a/test/util/abstract/MockRaindexBase.sol +++ b/test/util/abstract/MockRaindexBase.sol @@ -6,19 +6,19 @@ import {IERC20} from "@openzeppelin-contracts-5.7.0/token/ERC20/IERC20.sol"; import {SafeERC20} from "@openzeppelin-contracts-5.7.0/token/ERC20/utils/SafeERC20.sol"; import { IRaindexV7, - TakeOrdersConfigV5, + TakeOrdersConfigV6, OrderConfigV4, ClearConfigV2, OrderV4, - SignedContextV1, - TaskV2, - QuoteV2, + SignedContextV2, + TaskV3, + QuoteV3, Float } from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {IERC3156FlashBorrower} from "raindex-interface-0.1.10/src/interface/ierc3156/IERC3156FlashBorrower.sol"; /// @dev Base for mock raindex contracts that stub all IRaindexV7 functions. -/// Inheritors override flashLoan and/or takeOrders4 with real token transfers. +/// Inheritors override flashLoan and/or takeOrders5 with real token transfers. abstract contract MockRaindexBase is IRaindexV7 { using SafeERC20 for IERC20; @@ -26,17 +26,17 @@ abstract contract MockRaindexBase is IRaindexV7 { return false; } - function takeOrders4(TakeOrdersConfigV5 calldata) external virtual returns (Float, Float) { + function takeOrders5(TakeOrdersConfigV6 calldata) external virtual returns (Float, Float) { return (Float.wrap(0), Float.wrap(0)); } - function entask2(TaskV2[] calldata) external pure {} + function entask3(TaskV3[] calldata) external pure {} - function quote2(QuoteV2 calldata) external pure returns (bool, Float, Float) { + function quote3(QuoteV3 calldata) external pure returns (bool, Float, Float) { revert("quote"); } - function addOrder4(OrderConfigV4 calldata, TaskV2[] calldata) external pure returns (bool) { + function addOrder5(OrderConfigV4 calldata, TaskV3[] calldata) external pure returns (bool) { return false; } @@ -48,14 +48,14 @@ abstract contract MockRaindexBase is IRaindexV7 { OrderV4 memory, OrderV4 memory, ClearConfigV2 calldata, - SignedContextV1[] memory, - SignedContextV1[] memory + SignedContextV2[] memory, + SignedContextV2[] memory ) external {} - function deposit4(address, bytes32, Float, TaskV2[] calldata) external {} + function deposit5(address, bytes32, Float, TaskV3[] calldata) external {} function flashFee(address, uint256) external view returns (uint256) {} function maxFlashLoan(address) external view returns (uint256) {} - function removeOrder3(OrderV4 calldata, TaskV2[] calldata) external returns (bool) {} + function removeOrder4(OrderV4 calldata, TaskV3[] calldata) external returns (bool) {} function vaultBalance2(address, address, bytes32) external view returns (Float) {} - function withdraw4(address, bytes32, Float, TaskV2[] calldata) external {} + function withdraw5(address, bytes32, Float, TaskV3[] calldata) external {} } diff --git a/test/util/abstract/RaindexV6ExternalMockTest.sol b/test/util/abstract/RaindexV6ExternalMockTest.sol index f6e83730c4..c0103e45be 100644 --- a/test/util/abstract/RaindexV6ExternalMockTest.sol +++ b/test/util/abstract/RaindexV6ExternalMockTest.sol @@ -9,14 +9,14 @@ import {IMetaV1_2} from "rain-metadata-0.1.43/src/lib/LibMeta.sol"; import {REVERTING_MOCK_BYTECODE} from "test/util/lib/LibTestConstants.sol"; import {IRaindexV7Stub} from "test/util/abstract/IRaindexV7Stub.sol"; import {LibTestAddOrder} from "test/util/lib/LibTestAddOrder.sol"; -import {IInterpreterV4} from "rainlang-interface-0.2.13/src/interface/IInterpreterV4.sol"; -import {IInterpreterStoreV3} from "rainlang-interface-0.2.13/src/interface/IInterpreterStoreV3.sol"; -import {IRaindexV7, OrderConfigV4, OrderV4, TaskV2} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; +import {IInterpreterV4} from "rainlang-interface-0.2.14/src/interface/IInterpreterV4.sol"; +import {IInterpreterStoreV3} from "rainlang-interface-0.2.14/src/interface/IInterpreterStoreV3.sol"; +import {IRaindexV7, OrderConfigV4, OrderV4, TaskV3} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {IERC20} from "@openzeppelin-contracts-5.7.0/token/ERC20/IERC20.sol"; import {LibOrder} from "../../../src/lib/LibOrder.sol"; import {LibRaindexDeploy} from "../../../src/lib/deploy/LibRaindexDeploy.sol"; import {LibEtchRaindex} from "test/util/lib/LibEtchRaindex.sol"; -import {EvaluableV4} from "rainlang-interface-0.2.13/src/interface/IInterpreterCallerV4.sol"; +import {EvaluableV4} from "rainlang-interface-0.2.14/src/interface/IInterpreterCallerV5.sol"; import {IERC20Metadata} from "@openzeppelin-contracts-5.7.0/token/ERC20/extensions/IERC20Metadata.sol"; import {LibTOFUTokenDecimals} from "rain-tofu-erc20-decimals-0.1.4/src/lib/LibTOFUTokenDecimals.sol"; import {LibRainDeploy} from "rain-deploy-0.1.22/src/lib/LibRainDeploy.sol"; @@ -79,7 +79,7 @@ abstract contract RaindexV6ExternalMockTest is Test, IMetaV1_2, IRaindexV7Stub { vm.record(); vm.recordLogs(); vm.prank(owner); - assertTrue(iRaindex.addOrder4(config, new TaskV2[](0))); + assertTrue(iRaindex.addOrder5(config, new TaskV3[](0))); // MetaV1 is NOT emitted if the meta is empty. assertEq(vm.getRecordedLogs().length, config.meta.length > 0 ? 2 : 1); (bytes32[] memory reads, bytes32[] memory writes) = vm.accesses(address(iRaindex)); @@ -96,7 +96,7 @@ abstract contract RaindexV6ExternalMockTest is Test, IMetaV1_2, IRaindexV7Stub { vm.record(); vm.recordLogs(); vm.prank(owner); - assertFalse(iRaindex.addOrder4(config, new TaskV2[](0))); + assertFalse(iRaindex.addOrder5(config, new TaskV3[](0))); assertEq(vm.getRecordedLogs().length, 0); (reads, writes) = vm.accesses(address(iRaindex)); // 3x for reentrancy guard, 1x for dead order check. @@ -120,7 +120,7 @@ abstract contract RaindexV6ExternalMockTest is Test, IMetaV1_2, IRaindexV7Stub { vm.recordLogs(); vm.prank(owner); // An order was removed so this is true as there is a state change. - assertTrue(iRaindex.removeOrder3(order, new TaskV2[](0))); + assertTrue(iRaindex.removeOrder4(order, new TaskV3[](0))); assertEq(vm.getRecordedLogs().length, 1); (bytes32[] memory reads, bytes32[] memory writes) = vm.accesses(address(iRaindex)); // 3x for reentrancy guard, 1x for dead order check, 1x for dead write. @@ -134,7 +134,7 @@ abstract contract RaindexV6ExternalMockTest is Test, IMetaV1_2, IRaindexV7Stub { vm.recordLogs(); vm.prank(owner); // There is no state change so this is false. - assertFalse(iRaindex.removeOrder3(order, new TaskV2[](0))); + assertFalse(iRaindex.removeOrder4(order, new TaskV3[](0))); assertEq(vm.getRecordedLogs().length, 0); (reads, writes) = vm.accesses(address(iRaindex)); // 3x for reentrancy guard, 1x for dead order check. diff --git a/test/util/abstract/RaindexV6ExternalRealTest.sol b/test/util/abstract/RaindexV6ExternalRealTest.sol index 4cc5ec452d..b1c4fb6687 100644 --- a/test/util/abstract/RaindexV6ExternalRealTest.sol +++ b/test/util/abstract/RaindexV6ExternalRealTest.sol @@ -5,14 +5,14 @@ pragma solidity =0.8.25; import {Test, Vm, console2} from "forge-std-1.17.0/src/Test.sol"; import {REVERTING_MOCK_BYTECODE} from "test/util/lib/LibTestConstants.sol"; import {IRaindexV7Stub} from "test/util/abstract/IRaindexV7Stub.sol"; -import {IInterpreterStoreV3} from "rainlang-interface-0.2.13/src/interface/IInterpreterStoreV3.sol"; -import {IParserV2} from "rainlang-interface-0.2.13/src/interface/IParserV2.sol"; +import {IInterpreterStoreV3} from "rainlang-interface-0.2.14/src/interface/IInterpreterStoreV3.sol"; +import {IParserV2} from "rainlang-interface-0.2.14/src/interface/IParserV2.sol"; import { IRaindexV7, IInterpreterV4, - TaskV2, + TaskV3, EvaluableV4, - SignedContextV1 + SignedContextV2 } from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {IERC20} from "@openzeppelin-contracts-5.7.0/token/ERC20/IERC20.sol"; import {RaindexV6SubParser} from "../../../src/concrete/parser/RaindexV6SubParser.sol"; @@ -85,10 +85,10 @@ abstract contract RaindexV6ExternalRealTest is Test, IRaindexV7Stub { vm.assume(account != address(0x000000000000000000636F6e736F6c652e6c6f67)); } - function evalsToActions(bytes[] memory evals) internal view returns (TaskV2[] memory) { - TaskV2[] memory actions = new TaskV2[](evals.length); + function evalsToActions(bytes[] memory evals) internal view returns (TaskV3[] memory) { + TaskV3[] memory actions = new TaskV3[](evals.length); for (uint256 i = 0; i < evals.length; i++) { - actions[i] = TaskV2(EvaluableV4(iInterpreter, iStore, iParserV2.parse2(evals[i])), new SignedContextV1[](0)); + actions[i] = TaskV3(EvaluableV4(iInterpreter, iStore, iParserV2.parse2(evals[i])), new SignedContextV2[](0)); } return actions; } diff --git a/test/util/concrete/CalcInterpreter.sol b/test/util/concrete/CalcInterpreter.sol index d79903e3a1..d2d0314e94 100644 --- a/test/util/concrete/CalcInterpreter.sol +++ b/test/util/concrete/CalcInterpreter.sol @@ -2,9 +2,9 @@ // SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd pragma solidity =0.8.25; -import {StackItem} from "rainlang-interface-0.2.13/src/interface/IInterpreterV4.sol"; +import {StackItem} from "rainlang-interface-0.2.14/src/interface/IInterpreterV4.sol"; import {Float} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; -import {EvalV4} from "rainlang-interface-0.2.13/src/interface/IInterpreterV4.sol"; +import {EvalV4} from "rainlang-interface-0.2.14/src/interface/IInterpreterV4.sol"; /// A constructable interpreter mock that returns [ratio, max] for the calculate /// entrypoint and an empty stack for handle IO. diff --git a/test/util/concrete/ChildGatedRaindexV6ArbOrderTaker.sol b/test/util/concrete/ChildGatedRaindexV6ArbOrderTaker.sol index 9de2f4ca65..e04c905922 100644 --- a/test/util/concrete/ChildGatedRaindexV6ArbOrderTaker.sol +++ b/test/util/concrete/ChildGatedRaindexV6ArbOrderTaker.sol @@ -4,17 +4,17 @@ pragma solidity =0.8.25; import {RaindexV6ArbOrderTaker} from "../../../src/abstract/RaindexV6ArbOrderTaker.sol"; import {RaindexV6ArbTaskGated, RaindexV6ArbConfig} from "../../../src/abstract/RaindexV6ArbTaskGated.sol"; -import {TaskV2} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; +import {TaskV3} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; -/// @dev A task-gated arb order taker: combines the `arb5` entrypoint from +/// @dev A task-gated arb order taker: combines the `arb6` entrypoint from /// `RaindexV6ArbOrderTaker` with the task-hash gating mixin /// `RaindexV6ArbTaskGated`, wiring `_beforeArb` to `_checkTaskHash` (the /// documented override mechanism). Used to test that `_beforeArb` runs before -/// the zero-orders check in `arb5`. +/// the zero-orders check in `arb6`. contract ChildGatedRaindexV6ArbOrderTaker is RaindexV6ArbOrderTaker, RaindexV6ArbTaskGated { constructor(RaindexV6ArbConfig memory config) RaindexV6ArbTaskGated(config) {} - function _beforeArb(TaskV2 memory task) internal pure override { + function _beforeArb(TaskV3 memory task) internal pure override { _checkTaskHash(task); } } diff --git a/test/util/concrete/ChildGatedRaindexV6FlashBorrower.sol b/test/util/concrete/ChildGatedRaindexV6FlashBorrower.sol index 543b07a42a..f3d0b5a0a9 100644 --- a/test/util/concrete/ChildGatedRaindexV6FlashBorrower.sol +++ b/test/util/concrete/ChildGatedRaindexV6FlashBorrower.sol @@ -4,17 +4,17 @@ pragma solidity =0.8.25; import {RaindexV6FlashBorrower} from "../../../src/abstract/RaindexV6FlashBorrower.sol"; import {RaindexV6ArbTaskGated, RaindexV6ArbConfig} from "../../../src/abstract/RaindexV6ArbTaskGated.sol"; -import {TaskV2} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; +import {TaskV3} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; -/// @dev A task-gated flash borrower arb: combines the `arb4` entrypoint from +/// @dev A task-gated flash borrower arb: combines the `arb5` entrypoint from /// `RaindexV6FlashBorrower` with the task-hash gating mixin /// `RaindexV6ArbTaskGated`, wiring `_beforeArb` to `_checkTaskHash` (the /// documented override mechanism). Used to test that `_beforeArb` runs before -/// the zero-orders check in `arb4`. +/// the zero-orders check in `arb5`. contract ChildGatedRaindexV6FlashBorrower is RaindexV6FlashBorrower, RaindexV6ArbTaskGated { constructor(RaindexV6ArbConfig memory config) RaindexV6ArbTaskGated(config) {} - function _beforeArb(TaskV2 memory task) internal pure override { + function _beforeArb(TaskV3 memory task) internal pure override { _checkTaskHash(task); } } diff --git a/test/util/concrete/ChildRaindexV6ArbTaskGated.sol b/test/util/concrete/ChildRaindexV6ArbTaskGated.sol index 7f0884cd06..5333630eb5 100644 --- a/test/util/concrete/ChildRaindexV6ArbTaskGated.sol +++ b/test/util/concrete/ChildRaindexV6ArbTaskGated.sol @@ -3,14 +3,14 @@ pragma solidity =0.8.25; import {RaindexV6ArbTaskGated, RaindexV6ArbConfig} from "../../../src/abstract/RaindexV6ArbTaskGated.sol"; -import {TaskV2} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; +import {TaskV3} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; /// @dev We need a contract that is deployable in order to test the abstract /// base contract. Exposes `_checkTaskHash` as an external function. contract ChildRaindexV6ArbTaskGated is RaindexV6ArbTaskGated { constructor(RaindexV6ArbConfig memory config) RaindexV6ArbTaskGated(config) {} - function checkTaskHash(TaskV2 memory task) external pure { + function checkTaskHash(TaskV3 memory task) external pure { _checkTaskHash(task); } } diff --git a/test/util/concrete/FixedStackInterpreter.sol b/test/util/concrete/FixedStackInterpreter.sol index 50afff63b7..c87401923c 100644 --- a/test/util/concrete/FixedStackInterpreter.sol +++ b/test/util/concrete/FixedStackInterpreter.sol @@ -2,7 +2,7 @@ // SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd pragma solidity =0.8.25; -import {EvalV4, StackItem} from "rainlang-interface-0.2.13/src/interface/IInterpreterV4.sol"; +import {EvalV4, StackItem} from "rainlang-interface-0.2.14/src/interface/IInterpreterV4.sol"; /// @dev A fixed-stack interpreter: `eval4` returns the configured stack and no /// KVs. Used to drive `calculateOrderIO`'s read-back of (IORatio, outputMax) diff --git a/test/util/concrete/FlashLendingMockRaindex.sol b/test/util/concrete/FlashLendingMockRaindex.sol index 6e51274466..2c02bc125c 100644 --- a/test/util/concrete/FlashLendingMockRaindex.sol +++ b/test/util/concrete/FlashLendingMockRaindex.sol @@ -3,17 +3,17 @@ pragma solidity =0.8.25; import { - TakeOrderConfigV4, + TakeOrderConfigV5, IOV2, OrderV4, - SignedContextV1, + SignedContextV2, IRaindexV7, - TakeOrdersConfigV5, + TakeOrdersConfigV6, OrderConfigV4, ClearConfigV2, EvaluableV4, - TaskV2, - QuoteV2, + TaskV3, + QuoteV3, Float } from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {IERC3156FlashBorrower} from "raindex-interface-0.1.10/src/interface/ierc3156/IERC3156FlashBorrower.sol"; @@ -27,18 +27,18 @@ contract FlashLendingMockRaindex is IRaindexV7 { return true; } - function entask2(TaskV2[] calldata) external pure {} + function entask3(TaskV3[] calldata) external pure {} /// @inheritdoc IRaindexV7 - function quote2(QuoteV2 calldata) external pure returns (bool, Float, Float) { + function quote3(QuoteV3 calldata) external pure returns (bool, Float, Float) { revert("quote"); } /// @inheritdoc IRaindexV7 - function takeOrders4(TakeOrdersConfigV5 calldata) external pure returns (Float, Float) {} + function takeOrders5(TakeOrdersConfigV6 calldata) external pure returns (Float, Float) {} /// @inheritdoc IRaindexV7 - function addOrder4(OrderConfigV4 calldata, TaskV2[] calldata) external pure returns (bool) { + function addOrder5(OrderConfigV4 calldata, TaskV3[] calldata) external pure returns (bool) { return false; } @@ -51,14 +51,14 @@ contract FlashLendingMockRaindex is IRaindexV7 { OrderV4 memory, OrderV4 memory, ClearConfigV2 calldata, - SignedContextV1[] memory, - SignedContextV1[] memory + SignedContextV2[] memory, + SignedContextV2[] memory ) external {} - function deposit4(address, bytes32, Float, TaskV2[] calldata) external {} + function deposit5(address, bytes32, Float, TaskV3[] calldata) external {} function flashFee(address, uint256) external view returns (uint256) {} function maxFlashLoan(address) external view returns (uint256) {} - function removeOrder3(OrderV4 calldata, TaskV2[] calldata) external returns (bool) {} + function removeOrder4(OrderV4 calldata, TaskV3[] calldata) external returns (bool) {} function vaultBalance2(address, address, bytes32) external view returns (Float) {} - function withdraw4(address, bytes32, Float, TaskV2[] calldata) external {} + function withdraw5(address, bytes32, Float, TaskV3[] calldata) external {} } diff --git a/test/util/concrete/LeftoverFlashLendingMockRaindex.sol b/test/util/concrete/LeftoverFlashLendingMockRaindex.sol index 3cc4799b8f..af0bf93f18 100644 --- a/test/util/concrete/LeftoverFlashLendingMockRaindex.sol +++ b/test/util/concrete/LeftoverFlashLendingMockRaindex.sol @@ -11,7 +11,7 @@ import { import {MockRaindexBase} from "test/util/abstract/MockRaindexBase.sol"; /// @dev Mock raindex whose `flashLoan` performs a real net-neutral ERC3156 -/// transfer of the loaned token (out then back), and whose `takeOrders4` is a +/// transfer of the loaned token (out then back), and whose `takeOrders5` is a /// no-op (the inherited base does nothing). This leaves whatever token balances /// the arb already holds completely untouched, so a test can pre-fund the arb /// with a deterministic leftover of each token and assert exactly how diff --git a/test/util/concrete/LibRaindexArbFinalizeHarness.sol b/test/util/concrete/LibRaindexArbFinalizeHarness.sol index f52aede1b9..65f52f475b 100644 --- a/test/util/concrete/LibRaindexArbFinalizeHarness.sol +++ b/test/util/concrete/LibRaindexArbFinalizeHarness.sol @@ -3,18 +3,18 @@ pragma solidity =0.8.25; import {LibRaindexArb} from "src/lib/LibRaindexArb.sol"; -import {TaskV2, SignedContextV1, EvaluableV4} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; -import {IInterpreterV4} from "rainlang-interface-0.2.13/src/interface/IInterpreterV4.sol"; -import {IInterpreterStoreV3} from "rainlang-interface-0.2.13/src/interface/IInterpreterStoreV3.sol"; +import {TaskV3, SignedContextV2, EvaluableV4} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; +import {IInterpreterV4} from "rainlang-interface-0.2.14/src/interface/IInterpreterV4.sol"; +import {IInterpreterStoreV3} from "rainlang-interface-0.2.14/src/interface/IInterpreterStoreV3.sol"; /// @dev Exposes the internal `finalizeArb` so its zero-balance sweep guards can /// be exercised directly. `finalizeArb` sends to `msg.sender`, which here is the /// caller of `callFinalize` (the test, or a reverting-receiver proxy). contract LibRaindexArbFinalizeHarness { function callFinalize(address inputToken, uint8 inputDecimals, address outputToken, uint8 outputDecimals) external { - TaskV2 memory task = TaskV2({ + TaskV3 memory task = TaskV3({ evaluable: EvaluableV4(IInterpreterV4(address(0)), IInterpreterStoreV3(address(0)), hex""), - signedContext: new SignedContextV1[](0) + signedContext: new SignedContextV2[](0) }); LibRaindexArb.finalizeArb(task, inputToken, inputDecimals, outputToken, outputDecimals); } diff --git a/test/util/concrete/LibRaindexDoPostHarness.sol b/test/util/concrete/LibRaindexDoPostHarness.sol index 53ae10c83c..65b0707192 100644 --- a/test/util/concrete/LibRaindexDoPostHarness.sol +++ b/test/util/concrete/LibRaindexDoPostHarness.sol @@ -3,11 +3,11 @@ pragma solidity =0.8.25; import {LibRaindex} from "src/lib/LibRaindex.sol"; -import {TaskV2} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; +import {TaskV3} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; /// @dev Exposes the internal `LibRaindex.doPost` for direct testing. contract LibRaindexDoPostHarness { - function doPost(bytes32[][] memory context, TaskV2[] memory post) external { + function doPost(bytes32[][] memory context, TaskV3[] memory post) external { LibRaindex.doPost(context, post); } } diff --git a/test/util/concrete/MockInterpreter.sol b/test/util/concrete/MockInterpreter.sol index 42923b61cd..da7bbcb5fe 100644 --- a/test/util/concrete/MockInterpreter.sol +++ b/test/util/concrete/MockInterpreter.sol @@ -2,8 +2,8 @@ // SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd pragma solidity =0.8.25; -import {StackItem} from "rainlang-interface-0.2.13/src/interface/IInterpreterV4.sol"; -import {EvalV4} from "rainlang-interface-0.2.13/src/interface/IInterpreterV4.sol"; +import {StackItem} from "rainlang-interface-0.2.14/src/interface/IInterpreterV4.sol"; +import {EvalV4} from "rainlang-interface-0.2.14/src/interface/IInterpreterV4.sol"; contract MockInterpreter { StackItem[] internal sStack; diff --git a/test/util/concrete/NoExchangeFlashBorrower.sol b/test/util/concrete/NoExchangeFlashBorrower.sol index cf9c2b1b0c..6018ef88a7 100644 --- a/test/util/concrete/NoExchangeFlashBorrower.sol +++ b/test/util/concrete/NoExchangeFlashBorrower.sol @@ -5,7 +5,7 @@ pragma solidity =0.8.25; import {RaindexV6FlashBorrower} from "../../../src/abstract/RaindexV6FlashBorrower.sol"; /// @dev Deployable child of the abstract flash borrower with a no-op `_exchange` -/// so the test exercises ONLY the abstract `arb4` decimals/finalize plumbing, +/// so the test exercises ONLY the abstract `arb5` decimals/finalize plumbing, /// not any concrete swap. contract NoExchangeFlashBorrower is RaindexV6FlashBorrower { constructor() {} diff --git a/test/util/concrete/RaindexV6CalculateOrderIOHarness.sol b/test/util/concrete/RaindexV6CalculateOrderIOHarness.sol index 03a020e238..6c45808755 100644 --- a/test/util/concrete/RaindexV6CalculateOrderIOHarness.sol +++ b/test/util/concrete/RaindexV6CalculateOrderIOHarness.sol @@ -6,7 +6,7 @@ import {RaindexV6} from "src/concrete/raindex/RaindexV6.sol"; import {IRaindexV6CalculateOrderIOHarness} from "test/util/interface/IRaindexV6CalculateOrderIOHarness.sol"; import {OrderIOCalculationV4} from "src/struct/OrderIOCalculationV4.sol"; import {Float} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; -import {OrderV4, SignedContextV1} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; +import {OrderV4, SignedContextV2} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {TOFUOutcome} from "rain-tofu-erc20-decimals-0.1.4/src/interface/ITOFUTokenDecimals.sol"; import {LibTOFUTokenDecimals} from "rain-tofu-erc20-decimals-0.1.4/src/lib/LibTOFUTokenDecimals.sol"; @@ -21,7 +21,7 @@ contract RaindexV6CalculateOrderIOHarness is RaindexV6, IRaindexV6CalculateOrder uint256 inputIOIndex, uint256 outputIOIndex, address counterparty, - SignedContextV1[] memory signedContext + SignedContextV2[] memory signedContext ) external view returns (OrderIOCalculationV4 memory) { return calculateOrderIO(order, inputIOIndex, outputIOIndex, counterparty, signedContext, new bytes32[](0)); } diff --git a/test/util/concrete/RealisticFlashLendingMockRaindex.sol b/test/util/concrete/RealisticFlashLendingMockRaindex.sol index 717098d742..9a4c495d85 100644 --- a/test/util/concrete/RealisticFlashLendingMockRaindex.sol +++ b/test/util/concrete/RealisticFlashLendingMockRaindex.sol @@ -4,7 +4,7 @@ pragma solidity =0.8.25; import {IERC20} from "@openzeppelin-contracts-5.7.0/token/ERC20/IERC20.sol"; import {SafeERC20} from "@openzeppelin-contracts-5.7.0/token/ERC20/utils/SafeERC20.sol"; -import {TakeOrdersConfigV5, Float} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; +import {TakeOrdersConfigV6, Float} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import { IERC3156FlashBorrower, ON_FLASH_LOAN_CALLBACK_SUCCESS @@ -12,7 +12,7 @@ import { import {MockRaindexBase} from "test/util/abstract/MockRaindexBase.sol"; /// @dev Mock raindex with real ERC3156 flash loan transfers and real -/// takeOrders4 transfers (no onTakeOrders2 callback). +/// takeOrders5 transfers (no onTakeOrders2 callback). contract RealisticFlashLendingMockRaindex is MockRaindexBase { using SafeERC20 for IERC20; @@ -31,7 +31,7 @@ contract RealisticFlashLendingMockRaindex is MockRaindexBase { return true; } - function takeOrders4(TakeOrdersConfigV5 calldata config) external override returns (Float, Float) { + function takeOrders5(TakeOrdersConfigV6 calldata config) external override returns (Float, Float) { address inputToken = config.orders[0].order.validInputs[config.orders[0].inputIOIndex].token; address outputToken = config.orders[0].order.validOutputs[config.orders[0].outputIOIndex].token; uint256 inputBalance = IERC20(inputToken).balanceOf(msg.sender); diff --git a/test/util/concrete/RealisticOrderTakerMockRaindex.sol b/test/util/concrete/RealisticOrderTakerMockRaindex.sol index 31e38b7d13..bb657432e8 100644 --- a/test/util/concrete/RealisticOrderTakerMockRaindex.sol +++ b/test/util/concrete/RealisticOrderTakerMockRaindex.sol @@ -4,11 +4,11 @@ pragma solidity =0.8.25; import {IERC20} from "@openzeppelin-contracts-5.7.0/token/ERC20/IERC20.sol"; import {SafeERC20} from "@openzeppelin-contracts-5.7.0/token/ERC20/utils/SafeERC20.sol"; -import {TakeOrdersConfigV5, Float} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; +import {TakeOrdersConfigV6, Float} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {IRaindexV7OrderTaker} from "raindex-interface-0.1.10/src/interface/IRaindexV7OrderTaker.sol"; import {MockRaindexBase} from "test/util/abstract/MockRaindexBase.sol"; -/// @dev Mock raindex with real takeOrders4 transfers and onTakeOrders2 +/// @dev Mock raindex with real takeOrders5 transfers and onTakeOrders2 /// callback. Pulls a configurable amount of inputToken from the taker, /// leaving any surplus as profit for finalizeArb to sweep. contract RealisticOrderTakerMockRaindex is MockRaindexBase { @@ -20,7 +20,7 @@ contract RealisticOrderTakerMockRaindex is MockRaindexBase { iPullAmount = pullAmount; } - function takeOrders4(TakeOrdersConfigV5 calldata config) external override returns (Float, Float) { + function takeOrders5(TakeOrdersConfigV6 calldata config) external override returns (Float, Float) { address ordersInputToken = config.orders[0].order.validInputs[config.orders[0].inputIOIndex].token; address ordersOutputToken = config.orders[0].order.validOutputs[config.orders[0].outputIOIndex].token; diff --git a/test/util/concrete/RecordingFlashLendingMockRaindex.sol b/test/util/concrete/RecordingFlashLendingMockRaindex.sol index 53af249674..98a30a6d17 100644 --- a/test/util/concrete/RecordingFlashLendingMockRaindex.sol +++ b/test/util/concrete/RecordingFlashLendingMockRaindex.sol @@ -4,7 +4,7 @@ pragma solidity =0.8.25; import {IERC20} from "@openzeppelin-contracts-5.7.0/token/ERC20/IERC20.sol"; import {SafeERC20} from "@openzeppelin-contracts-5.7.0/token/ERC20/utils/SafeERC20.sol"; -import {TakeOrdersConfigV5, Float} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; +import {TakeOrdersConfigV6, Float} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import { IERC3156FlashBorrower, ON_FLASH_LOAN_CALLBACK_SUCCESS @@ -12,7 +12,7 @@ import { import {MockRaindexBase} from "test/util/abstract/MockRaindexBase.sol"; /// @dev Mock raindex identical to `RealisticFlashLendingMockRaindex` (real -/// ERC3156 transfers, real `takeOrders4` swap) but additionally records the +/// ERC3156 transfers, real `takeOrders5` swap) but additionally records the /// `token` and `amount` it was asked to flash loan so a test can pin the /// exact base-unit amount the arb requested. contract RecordingFlashLendingMockRaindex is MockRaindexBase { @@ -41,7 +41,7 @@ contract RecordingFlashLendingMockRaindex is MockRaindexBase { return true; } - function takeOrders4(TakeOrdersConfigV5 calldata config) external override returns (Float, Float) { + function takeOrders5(TakeOrdersConfigV6 calldata config) external override returns (Float, Float) { address inputToken = config.orders[0].order.validInputs[config.orders[0].inputIOIndex].token; address outputToken = config.orders[0].order.validOutputs[config.orders[0].outputIOIndex].token; uint256 inputBalance = IERC20(inputToken).balanceOf(msg.sender); diff --git a/test/util/concrete/RecordingOrderTaker.sol b/test/util/concrete/RecordingOrderTaker.sol index 86a783b46b..c439d72419 100644 --- a/test/util/concrete/RecordingOrderTaker.sol +++ b/test/util/concrete/RecordingOrderTaker.sol @@ -2,7 +2,7 @@ // SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd pragma solidity =0.8.25; -import {TakeOrdersConfigV5, IRaindexV7} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; +import {TakeOrdersConfigV6, IRaindexV7} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {IRaindexV7OrderTaker} from "raindex-interface-0.1.10/src/interface/IRaindexV7OrderTaker.sol"; import {Float} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; @@ -16,8 +16,8 @@ contract RecordingOrderTaker is IRaindexV7OrderTaker { iRaindex = raindex; } - function take(TakeOrdersConfigV5 memory config) external returns (Float, Float) { - return iRaindex.takeOrders4(config); + function take(TakeOrdersConfigV6 memory config) external returns (Float, Float) { + return iRaindex.takeOrders5(config); } function onTakeOrders2(address, address, Float, Float, bytes calldata) external { diff --git a/test/util/concrete/RecordingTaker.sol b/test/util/concrete/RecordingTaker.sol index 90cdcb4273..f7dd6dcd97 100644 --- a/test/util/concrete/RecordingTaker.sol +++ b/test/util/concrete/RecordingTaker.sol @@ -2,7 +2,7 @@ // SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd pragma solidity =0.8.25; -import {TakeOrdersConfigV5, IRaindexV7} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; +import {TakeOrdersConfigV6, IRaindexV7} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {IRaindexV7OrderTaker} from "raindex-interface-0.1.10/src/interface/IRaindexV7OrderTaker.sol"; import {Float} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; @@ -22,8 +22,8 @@ contract RecordingTaker is IRaindexV7OrderTaker { iRaindex = raindex; } - function take(TakeOrdersConfigV5 memory config) external returns (Float, Float) { - return iRaindex.takeOrders4(config); + function take(TakeOrdersConfigV6 memory config) external returns (Float, Float) { + return iRaindex.takeOrders5(config); } function onTakeOrders2( diff --git a/test/util/concrete/ReentrantExchange.sol b/test/util/concrete/ReentrantExchange.sol index bf659e9d0d..881e6e7bd7 100644 --- a/test/util/concrete/ReentrantExchange.sol +++ b/test/util/concrete/ReentrantExchange.sol @@ -5,19 +5,19 @@ pragma solidity =0.8.25; import {GenericPoolRaindexV6FlashBorrower} from "../../../src/concrete/arb/GenericPoolRaindexV6FlashBorrower.sol"; import { IRaindexV7, - TakeOrdersConfigV5, - TakeOrderConfigV4, + TakeOrdersConfigV6, + TakeOrderConfigV5, OrderV4, IOV2, EvaluableV4, - SignedContextV1, - TaskV2 + SignedContextV2, + TaskV3 } from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; -import {IInterpreterV4} from "rainlang-interface-0.2.13/src/interface/IInterpreterV4.sol"; -import {IInterpreterStoreV3} from "rainlang-interface-0.2.13/src/interface/IInterpreterStoreV3.sol"; +import {IInterpreterV4} from "rainlang-interface-0.2.14/src/interface/IInterpreterV4.sol"; +import {IInterpreterStoreV3} from "rainlang-interface-0.2.14/src/interface/IInterpreterStoreV3.sol"; import {LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; -/// @dev Exchange that re-enters arb4 when called during _exchange. +/// @dev Exchange that re-enters arb5 when called during _exchange. contract ReentrantExchange { GenericPoolRaindexV6FlashBorrower internal immutable iArb; IRaindexV7 internal immutable iRaindex; @@ -27,7 +27,7 @@ contract ReentrantExchange { iRaindex = raindex; } - /// Called by pool.functionCallWithValue during _exchange. Re-enters arb4. + /// Called by pool.functionCallWithValue during _exchange. Re-enters arb5. fallback() external payable { // Build minimal valid-looking args. The reentrancy guard will revert // before any of this is actually processed. @@ -42,12 +42,12 @@ contract ReentrantExchange { nonce: bytes32(0) }); - TakeOrderConfigV4[] memory orders = new TakeOrderConfigV4[](1); - orders[0] = TakeOrderConfigV4(order, 0, 0, new SignedContextV1[](0)); + TakeOrderConfigV5[] memory orders = new TakeOrderConfigV5[](1); + orders[0] = TakeOrderConfigV5(order, 0, 0, new SignedContextV2[](0)); - iArb.arb4( + iArb.arb5( iRaindex, - TakeOrdersConfigV5({ + TakeOrdersConfigV6({ minimumIO: LibDecimalFloat.packLossless(1, 0), maximumIO: LibDecimalFloat.packLossless(type(int224).max, 0), maximumIORatio: LibDecimalFloat.packLossless(type(int224).max, 0), @@ -56,9 +56,9 @@ contract ReentrantExchange { data: "" }), hex"", - TaskV2({ + TaskV3({ evaluable: EvaluableV4(IInterpreterV4(address(0)), IInterpreterStoreV3(address(0)), hex""), - signedContext: new SignedContextV1[](0) + signedContext: new SignedContextV2[](0) }) ); } diff --git a/test/util/concrete/ReentrantMockRaindex.sol b/test/util/concrete/ReentrantMockRaindex.sol index d919619fe3..d641336e2d 100644 --- a/test/util/concrete/ReentrantMockRaindex.sol +++ b/test/util/concrete/ReentrantMockRaindex.sol @@ -7,23 +7,23 @@ import {SafeERC20} from "@openzeppelin-contracts-5.7.0/token/ERC20/utils/SafeERC import {GenericPoolRaindexV6ArbOrderTaker} from "../../../src/concrete/arb/GenericPoolRaindexV6ArbOrderTaker.sol"; import { IRaindexV7, - TakeOrdersConfigV5, - TaskV2, + TakeOrdersConfigV6, + TaskV3, EvaluableV4, - SignedContextV1, + SignedContextV2, Float } from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; -import {IInterpreterV4} from "rainlang-interface-0.2.13/src/interface/IInterpreterV4.sol"; -import {IInterpreterStoreV3} from "rainlang-interface-0.2.13/src/interface/IInterpreterStoreV3.sol"; +import {IInterpreterV4} from "rainlang-interface-0.2.14/src/interface/IInterpreterV4.sol"; +import {IInterpreterStoreV3} from "rainlang-interface-0.2.14/src/interface/IInterpreterStoreV3.sol"; import {MockRaindexBase} from "test/util/abstract/MockRaindexBase.sol"; -/// @dev Mock Raindex whose takeOrders4 callback re-enters arb5 on the taker. +/// @dev Mock Raindex whose takeOrders5 callback re-enters arb6 on the taker. contract ReentrantMockRaindex is MockRaindexBase { using SafeERC20 for IERC20; bool internal sReentered; - function takeOrders4(TakeOrdersConfigV5 calldata config) external override returns (Float, Float) { + function takeOrders5(TakeOrdersConfigV6 calldata config) external override returns (Float, Float) { address ordersOutputToken = config.orders[0].order.validOutputs[config.orders[0].outputIOIndex].token; // Send output token to taker so callback has tokens to work with. @@ -32,14 +32,14 @@ contract ReentrantMockRaindex is MockRaindexBase { if (!sReentered) { sReentered = true; - // Re-enter arb5 from the Raindex callback. + // Re-enter arb6 from the Raindex callback. GenericPoolRaindexV6ArbOrderTaker(payable(msg.sender)) - .arb5( + .arb6( IRaindexV7(address(this)), config, - TaskV2({ + TaskV3({ evaluable: EvaluableV4(IInterpreterV4(address(0)), IInterpreterStoreV3(address(0)), hex""), - signedContext: new SignedContextV1[](0) + signedContext: new SignedContextV2[](0) }) ); } diff --git a/test/util/concrete/ReentrantOnTakeOrdersStore.sol b/test/util/concrete/ReentrantOnTakeOrdersStore.sol index 787bf95a16..2813344c8e 100644 --- a/test/util/concrete/ReentrantOnTakeOrdersStore.sol +++ b/test/util/concrete/ReentrantOnTakeOrdersStore.sol @@ -3,7 +3,7 @@ pragma solidity =0.8.25; import {GenericPoolRaindexV6ArbOrderTaker} from "../../../src/concrete/arb/GenericPoolRaindexV6ArbOrderTaker.sol"; -import {StateNamespace} from "rainlang-interface-0.2.13/src/interface/IInterpreterV4.sol"; +import {StateNamespace} from "rainlang-interface-0.2.14/src/interface/IInterpreterV4.sol"; import {MockToken} from "./MockToken.sol"; import {Float} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; diff --git a/test/util/fixture/LibRaindexSubParserContextFixture.sol b/test/util/fixture/LibRaindexSubParserContextFixture.sol index f0074e3e25..0678795664 100644 --- a/test/util/fixture/LibRaindexSubParserContextFixture.sol +++ b/test/util/fixture/LibRaindexSubParserContextFixture.sol @@ -43,13 +43,14 @@ import { WORD_OUTPUT_VAULT_BALANCE_BEFORE, WORD_OUTPUT_VAULT_BALANCE_DECREASE, CONTEXT_SIGNED_CONTEXT_SIGNERS_COLUMN, + CONTEXT_SIGNED_CONTEXT_DOMAINS_COLUMN, CONTEXT_SIGNED_CONTEXT_START_COLUMN } from "../../../src/lib/LibRaindexSubParser.sol"; library LibRaindexSubParserContextFixture { function hashedNamesContext() internal pure returns (bytes32[][] memory) { - // Add 3 to account for the signers and 2x signed context columns. - bytes32[][] memory context = new bytes32[][](CONTEXT_COLUMNS + 3); + // Add 4 to account for the signers, domains and 2x signed context columns. + bytes32[][] memory context = new bytes32[][](CONTEXT_COLUMNS + 4); bytes32[] memory contextBase = new bytes32[](CONTEXT_BASE_ROWS); contextBase[CONTEXT_BASE_ROW_SENDER] = keccak256(WORD_ORDER_CLEARER); @@ -82,6 +83,10 @@ library LibRaindexSubParserContextFixture { contextSigners[0] = keccak256("signer-0"); contextSigners[1] = keccak256("signer-1"); + bytes32[] memory contextSignerDomains = new bytes32[](2); + contextSignerDomains[0] = keccak256("signer-domain-0"); + contextSignerDomains[1] = keccak256("signer-domain-1"); + bytes32[] memory contextSignedContext0 = new bytes32[](2); contextSignedContext0[0] = keccak256("signed-context-0-0"); contextSignedContext0[1] = keccak256("signed-context-0-1"); @@ -96,6 +101,7 @@ library LibRaindexSubParserContextFixture { context[CONTEXT_VAULT_INPUTS_COLUMN] = contextVaultInputs; context[CONTEXT_VAULT_OUTPUTS_COLUMN] = contextVaultOutputs; context[CONTEXT_SIGNED_CONTEXT_SIGNERS_COLUMN] = contextSigners; + context[CONTEXT_SIGNED_CONTEXT_DOMAINS_COLUMN] = contextSignerDomains; context[CONTEXT_SIGNED_CONTEXT_START_COLUMN] = contextSignedContext0; context[CONTEXT_SIGNED_CONTEXT_START_COLUMN + 1] = contextSignedContext1; diff --git a/test/util/interface/IRaindexV6CalculateOrderIOHarness.sol b/test/util/interface/IRaindexV6CalculateOrderIOHarness.sol index 9849939d55..91813b6e06 100644 --- a/test/util/interface/IRaindexV6CalculateOrderIOHarness.sol +++ b/test/util/interface/IRaindexV6CalculateOrderIOHarness.sol @@ -2,7 +2,7 @@ // SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd pragma solidity ^0.8.25; -import {IRaindexV7, OrderV4, SignedContextV1, Float} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; +import {IRaindexV7, OrderV4, SignedContextV2, Float} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; import {TOFUOutcome} from "rain-tofu-erc20-decimals-0.1.4/src/interface/ITOFUTokenDecimals.sol"; import {OrderIOCalculationV4} from "src/struct/OrderIOCalculationV4.sol"; @@ -12,7 +12,7 @@ interface IRaindexV6CalculateOrderIOHarness is IRaindexV7 { uint256 inputIOIndex, uint256 outputIOIndex, address counterparty, - SignedContextV1[] memory signedContext + SignedContextV2[] memory signedContext ) external view returns (OrderIOCalculationV4 memory); function seedTofu(address token) external returns (TOFUOutcome, uint8); diff --git a/test/util/lib/LibTestAddOrder.sol b/test/util/lib/LibTestAddOrder.sol index 849185ca67..38b9a60750 100644 --- a/test/util/lib/LibTestAddOrder.sol +++ b/test/util/lib/LibTestAddOrder.sol @@ -5,11 +5,11 @@ pragma solidity ^0.8.19; import {META_MAGIC_NUMBER_V1} from "rain-metadata-0.1.43/src/lib/LibMeta.sol"; import {LibOrder} from "../../../src/lib/LibOrder.sol"; import {OrderConfigV4, OrderV4, IOV2} from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; -import {IInterpreterV4, SourceIndexV2} from "rainlang-interface-0.2.13/src/interface/IInterpreterV4.sol"; -import {IInterpreterStoreV3} from "rainlang-interface-0.2.13/src/interface/IInterpreterStoreV3.sol"; -import {EvaluableV4} from "rainlang-interface-0.2.13/src/interface/IInterpreterCallerV4.sol"; +import {IInterpreterV4, SourceIndexV2} from "rainlang-interface-0.2.14/src/interface/IInterpreterV4.sol"; +import {IInterpreterStoreV3} from "rainlang-interface-0.2.14/src/interface/IInterpreterStoreV3.sol"; +import {EvaluableV4} from "rainlang-interface-0.2.14/src/interface/IInterpreterCallerV5.sol"; import {HANDLE_IO_ENTRYPOINT} from "../../../src/constant/OrderEntrypoints.sol"; -import {LibBytecode} from "rainlang-interface-0.2.13/src/lib/bytecode/LibBytecode.sol"; +import {LibBytecode} from "rainlang-interface-0.2.14/src/lib/bytecode/LibBytecode.sol"; library LibTestAddOrder { /// Serialized parser (parse2) output for "_ _:1e18 1e18;:;": the diff --git a/test/util/lib/LibTestArb.sol b/test/util/lib/LibTestArb.sol index e9f577a63c..e9d5dbf6a6 100644 --- a/test/util/lib/LibTestArb.sol +++ b/test/util/lib/LibTestArb.sol @@ -6,16 +6,16 @@ import {Vm} from "forge-std-1.17.0/src/Vm.sol"; import {IERC20} from "@openzeppelin-contracts-5.7.0/token/ERC20/IERC20.sol"; import { IRaindexV7, - TakeOrdersConfigV5, - TakeOrderConfigV4, + TakeOrdersConfigV6, + TakeOrderConfigV5, OrderV4, IOV2, EvaluableV4, - SignedContextV1, - TaskV2 + SignedContextV2, + TaskV3 } from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; -import {IInterpreterV4} from "rainlang-interface-0.2.13/src/interface/IInterpreterV4.sol"; -import {IInterpreterStoreV3} from "rainlang-interface-0.2.13/src/interface/IInterpreterStoreV3.sol"; +import {IInterpreterV4} from "rainlang-interface-0.2.14/src/interface/IInterpreterV4.sol"; +import {IInterpreterStoreV3} from "rainlang-interface-0.2.14/src/interface/IInterpreterStoreV3.sol"; import {LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; import {LibRainDeploy} from "rain-deploy-0.1.22/src/lib/LibRainDeploy.sol"; import { @@ -44,7 +44,7 @@ struct OrderTakerSetup { MockToken inputToken; MockToken outputToken; IRaindexV7 raindex; - TakeOrdersConfigV5 takeOrdersConfig; + TakeOrdersConfigV6 takeOrdersConfig; } library LibTestArb { @@ -54,17 +54,17 @@ library LibTestArb { LibRainDeploy.deployZoltu(LibTOFUTokenDecimals.TOFU_DECIMALS_EXPECTED_CREATION_CODE); } - /// Build a no-op TaskV2 (empty bytecode, real deploy constants). - function noopTask() internal pure returns (TaskV2 memory) { - return TaskV2({ + /// Build a no-op TaskV3 (empty bytecode, real deploy constants). + function noopTask() internal pure returns (TaskV3 memory) { + return TaskV3({ evaluable: EvaluableV4( IInterpreterV4(TEST_INTERPRETER_ADDRESS), IInterpreterStoreV3(TEST_STORE_ADDRESS), hex"" ), - signedContext: new SignedContextV1[](0) + signedContext: new SignedContextV2[](0) }); } - /// Set up a standard arb scenario and execute arb5. + /// Set up a standard arb scenario and execute arb6. /// /// @param vm The Vm cheatcode handle. /// @param raindexPullAmount How many inputTokens the mock Raindex pulls from arb. @@ -72,14 +72,14 @@ library LibTestArb { /// @param exchangeInputAmount How many inputTokens the exchange has. /// @param swapAmount How many outputTokens the arb swaps at the exchange. /// @param task The post-arb task to run. - /// @param ethValue ETH to send with arb5. + /// @param ethValue ETH to send with arb6. function setupAndArb( Vm vm, uint256 raindexPullAmount, uint256 raindexOutputAmount, uint256 exchangeInputAmount, uint256 swapAmount, - TaskV2 memory task, + TaskV3 memory task, uint256 ethValue ) internal returns (ArbResult memory) { deployPrereqs(vm); @@ -87,7 +87,7 @@ library LibTestArb { MockToken inputToken = new MockToken("Input", "IN", 18); MockToken outputToken = new MockToken("Output", "OUT", 18); - // arb5 only trusts the canonical raindex deployment, so etch the mock's + // arb6 only trusts the canonical raindex deployment, so etch the mock's // runtime code (immutables included) at that address. vm.etch( LibRaindexDeploy.RAINDEX_DEPLOYED_ADDRESS, @@ -105,7 +105,7 @@ library LibTestArb { bytes memory exchangeData = abi.encodeCall(MockExchange.swap, (IERC20(address(outputToken)), IERC20(address(inputToken)), swapAmount)); - TakeOrdersConfigV5 memory takeOrdersConfig; + TakeOrdersConfigV6 memory takeOrdersConfig; { IOV2[] memory validInputs = new IOV2[](1); validInputs[0] = IOV2(address(inputToken), bytes32(0)); @@ -122,10 +122,10 @@ library LibTestArb { nonce: bytes32(0) }); - TakeOrderConfigV4[] memory orders = new TakeOrderConfigV4[](1); - orders[0] = TakeOrderConfigV4(order, 0, 0, new SignedContextV1[](0)); + TakeOrderConfigV5[] memory orders = new TakeOrderConfigV5[](1); + orders[0] = TakeOrderConfigV5(order, 0, 0, new SignedContextV2[](0)); - takeOrdersConfig = TakeOrdersConfigV5({ + takeOrdersConfig = TakeOrdersConfigV6({ minimumIO: LibDecimalFloat.packLossless(0, 0), maximumIO: LibDecimalFloat.packLossless(type(int224).max, 0), maximumIORatio: LibDecimalFloat.packLossless(type(int224).max, 0), @@ -135,7 +135,7 @@ library LibTestArb { }); } - arb.arb5{value: ethValue}(IRaindexV7(address(raindex)), takeOrdersConfig, task); + arb.arb6{value: ethValue}(IRaindexV7(address(raindex)), takeOrdersConfig, task); return ArbResult({ @@ -145,7 +145,7 @@ library LibTestArb { /// Set up an order-taker arb scenario without executing it. /// The caller provides their own exchange. Returns everything needed - /// to call arb5 directly. + /// to call arb6 directly. /// /// @param vm The Vm cheatcode handle. /// @param exchange The exchange contract address. @@ -157,7 +157,7 @@ library LibTestArb { MockToken inputToken = new MockToken("Input", "IN", 18); MockToken outputToken = new MockToken("Output", "OUT", 18); - // arb5 only trusts the canonical raindex deployment, so etch the mock's + // arb6 only trusts the canonical raindex deployment, so etch the mock's // runtime code (immutables included) at that address. vm.etch(LibRaindexDeploy.RAINDEX_DEPLOYED_ADDRESS, address(new RealisticOrderTakerMockRaindex(amount)).code); RealisticOrderTakerMockRaindex raindex = @@ -171,7 +171,7 @@ library LibTestArb { bytes memory exchangeData = abi.encodeCall(MockExchange.swap, (IERC20(address(outputToken)), IERC20(address(inputToken)), amount)); - TakeOrdersConfigV5 memory takeOrdersConfig; + TakeOrdersConfigV6 memory takeOrdersConfig; { IOV2[] memory validInputs = new IOV2[](1); validInputs[0] = IOV2(address(inputToken), bytes32(0)); @@ -188,10 +188,10 @@ library LibTestArb { nonce: bytes32(0) }); - TakeOrderConfigV4[] memory orders = new TakeOrderConfigV4[](1); - orders[0] = TakeOrderConfigV4(order, 0, 0, new SignedContextV1[](0)); + TakeOrderConfigV5[] memory orders = new TakeOrderConfigV5[](1); + orders[0] = TakeOrderConfigV5(order, 0, 0, new SignedContextV2[](0)); - takeOrdersConfig = TakeOrdersConfigV5({ + takeOrdersConfig = TakeOrdersConfigV6({ minimumIO: LibDecimalFloat.packLossless(0, 0), maximumIO: LibDecimalFloat.packLossless(type(int224).max, 0), maximumIORatio: LibDecimalFloat.packLossless(type(int224).max, 0), diff --git a/test/util/lib/LibTestFlashBorrowerArb.sol b/test/util/lib/LibTestFlashBorrowerArb.sol index 42c042c165..e7b778bad7 100644 --- a/test/util/lib/LibTestFlashBorrowerArb.sol +++ b/test/util/lib/LibTestFlashBorrowerArb.sol @@ -6,15 +6,15 @@ import {Vm} from "forge-std-1.17.0/src/Vm.sol"; import {IERC20} from "@openzeppelin-contracts-5.7.0/token/ERC20/IERC20.sol"; import { IRaindexV7, - TakeOrdersConfigV5, - TakeOrderConfigV4, + TakeOrdersConfigV6, + TakeOrderConfigV5, OrderV4, IOV2, EvaluableV4, - SignedContextV1 + SignedContextV2 } from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; -import {IInterpreterV4} from "rainlang-interface-0.2.13/src/interface/IInterpreterV4.sol"; -import {IInterpreterStoreV3} from "rainlang-interface-0.2.13/src/interface/IInterpreterStoreV3.sol"; +import {IInterpreterV4} from "rainlang-interface-0.2.14/src/interface/IInterpreterV4.sol"; +import {IInterpreterStoreV3} from "rainlang-interface-0.2.14/src/interface/IInterpreterStoreV3.sol"; import {LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; import {LibRainDeploy} from "rain-deploy-0.1.22/src/lib/LibRainDeploy.sol"; import {LibTOFUTokenDecimals} from "rain-tofu-erc20-decimals-0.1.4/src/lib/LibTOFUTokenDecimals.sol"; @@ -34,14 +34,14 @@ struct FlashBorrowerSetup { MockToken inputToken; MockToken outputToken; IRaindexV7 raindex; - TakeOrdersConfigV5 takeOrdersConfig; + TakeOrdersConfigV6 takeOrdersConfig; bytes exchangeData; } library LibTestFlashBorrowerArb { /// Set up a flash-borrower arb scenario without executing it. /// The caller provides their own exchange contract. Returns everything - /// needed to call arb4 directly. + /// needed to call arb5 directly. /// /// @param vm The Vm cheatcode handle. /// @param exchange The exchange contract address. @@ -70,7 +70,7 @@ library LibTestFlashBorrowerArb { abi.encodeCall(MockExchange.swap, (IERC20(address(outputToken)), IERC20(address(inputToken)), amount)) ); - TakeOrdersConfigV5 memory takeOrdersConfig; + TakeOrdersConfigV6 memory takeOrdersConfig; { IOV2[] memory validInputs = new IOV2[](1); validInputs[0] = IOV2(address(inputToken), bytes32(0)); @@ -87,10 +87,10 @@ library LibTestFlashBorrowerArb { nonce: bytes32(0) }); - TakeOrderConfigV4[] memory orders = new TakeOrderConfigV4[](1); - orders[0] = TakeOrderConfigV4(order, 0, 0, new SignedContextV1[](0)); + TakeOrderConfigV5[] memory orders = new TakeOrderConfigV5[](1); + orders[0] = TakeOrderConfigV5(order, 0, 0, new SignedContextV2[](0)); - takeOrdersConfig = TakeOrdersConfigV5({ + takeOrdersConfig = TakeOrdersConfigV6({ // Test amounts are always small enough for int256. // forge-lint: disable-next-line(unsafe-typecast) minimumIO: LibDecimalFloat.packLossless(int256(amount), -18), diff --git a/test/util/lib/LibTestSignedContext.sol b/test/util/lib/LibTestSignedContext.sol new file mode 100644 index 0000000000..f290c88088 --- /dev/null +++ b/test/util/lib/LibTestSignedContext.sol @@ -0,0 +1,23 @@ +// SPDX-License-Identifier: LicenseRef-DCL-1.0 +// SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd +pragma solidity =0.8.25; + +import {Vm} from "forge-std-1.17.0/src/Vm.sol"; +import {SignedContextV2} from "rainlang-interface-0.2.14/src/interface/IInterpreterCallerV5.sol"; +import {LibContext} from "rainlang-interface-0.2.14/src/lib/caller/LibContext.sol"; +import {MessageHashUtils} from "@openzeppelin-contracts-5.7.0/utils/cryptography/MessageHashUtils.sol"; + +library LibTestSignedContext { + /// @dev EIP-712 signs `context` by `pk` under `domainSeparator`. + function sign(Vm vm, uint256 pk, bytes32 domainSeparator, bytes32[] memory context) + internal + pure + returns (SignedContextV2 memory) + { + SignedContextV2 memory signedContext = SignedContextV2(vm.addr(pk), domainSeparator, context, ""); + (uint8 v, bytes32 r, bytes32 s) = + vm.sign(pk, MessageHashUtils.toTypedDataHash(domainSeparator, LibContext.hashStruct(signedContext))); + signedContext.signature = abi.encodePacked(r, s, v); + return signedContext; + } +} diff --git a/test/util/lib/LibTestTakeOrder.sol b/test/util/lib/LibTestTakeOrder.sol index fa6255344c..ea4a7072dc 100644 --- a/test/util/lib/LibTestTakeOrder.sol +++ b/test/util/lib/LibTestTakeOrder.sol @@ -5,18 +5,18 @@ pragma solidity ^0.8.19; import {Vm} from "forge-std-1.17.0/src/Vm.sol"; import { OrderV4, - TakeOrderConfigV4, - TakeOrdersConfigV5, + TakeOrderConfigV5, + TakeOrdersConfigV6, IOV2, EvaluableV4, OrderConfigV4, - TaskV2, + TaskV3, IRaindexV7 } from "raindex-interface-0.1.10/src/interface/IRaindexV7.sol"; -import {IInterpreterV4} from "rainlang-interface-0.2.13/src/interface/IInterpreterV4.sol"; -import {IInterpreterStoreV3} from "rainlang-interface-0.2.13/src/interface/IInterpreterStoreV3.sol"; -import {IParserV2} from "rainlang-interface-0.2.13/src/interface/IParserV2.sol"; -import {SignedContextV1} from "rainlang-interface-0.2.13/src/interface/deprecated/v1/IInterpreterCallerV2.sol"; +import {IInterpreterV4} from "rainlang-interface-0.2.14/src/interface/IInterpreterV4.sol"; +import {IInterpreterStoreV3} from "rainlang-interface-0.2.14/src/interface/IInterpreterStoreV3.sol"; +import {IParserV2} from "rainlang-interface-0.2.14/src/interface/IParserV2.sol"; +import {SignedContextV2} from "rainlang-interface-0.2.14/src/interface/IInterpreterCallerV5.sol"; import {Float, LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; import { TEST_INTERPRETER_ADDRESS, @@ -26,7 +26,7 @@ import { import {LibRaindexDeploy} from "../../../src/lib/deploy/LibRaindexDeploy.sol"; library LibTestTakeOrder { - /// Extract OrderV4 from the first log entry emitted by addOrder4. + /// Extract OrderV4 from the first log entry emitted by addOrder5. function extractOrderFromLogs(Vm.Log[] memory entries) internal pure returns (OrderV4 memory) { (,, OrderV4 memory order) = abi.decode(entries[0].data, (address, bytes32, OrderV4)); return order; @@ -59,22 +59,22 @@ library LibTestTakeOrder { vm.prank(owner); vm.recordLogs(); - raindex.addOrder4(orderConfig, new TaskV2[](0)); + raindex.addOrder5(orderConfig, new TaskV3[](0)); return extractOrderFromLogs(vm.getRecordedLogs()); } - /// Wrap a single order into a TakeOrderConfigV4 array with default IO + /// Wrap a single order into a TakeOrderConfigV5 array with default IO /// indices (0, 0) and empty signed context. - function wrapSingle(OrderV4 memory order) internal pure returns (TakeOrderConfigV4[] memory) { - TakeOrderConfigV4[] memory orders = new TakeOrderConfigV4[](1); - orders[0] = TakeOrderConfigV4(order, 0, 0, new SignedContextV1[](0)); + function wrapSingle(OrderV4 memory order) internal pure returns (TakeOrderConfigV5[] memory) { + TakeOrderConfigV5[] memory orders = new TakeOrderConfigV5[](1); + orders[0] = TakeOrderConfigV5(order, 0, 0, new SignedContextV2[](0)); return orders; } - /// Build a TakeOrdersConfigV5 with standard defaults: minimumIO=0, + /// Build a TakeOrdersConfigV6 with standard defaults: minimumIO=0, /// maximumIO=max, maximumIORatio=max, IOIsInput=true, data="". - function defaultTakeConfig(TakeOrderConfigV4[] memory orders) internal pure returns (TakeOrdersConfigV5 memory) { - return TakeOrdersConfigV5({ + function defaultTakeConfig(TakeOrderConfigV5[] memory orders) internal pure returns (TakeOrdersConfigV6 memory) { + return TakeOrdersConfigV6({ minimumIO: LibDecimalFloat.packLossless(0, 0), maximumIO: LibDecimalFloat.packLossless(type(int224).max, 0), maximumIORatio: LibDecimalFloat.packLossless(type(int224).max, 0), From 333e2552170baff27422356e9a45d74da3bfe1a6 Mon Sep 17 00:00:00 2001 From: David Meister Date: Mon, 26 Oct 2026 13:55:09 +0000 Subject: [PATCH 04/15] Build green: regen pointers/meta/candidate, TakeOrderV4 topic via selector Co-Authored-By: Claude Opus 5.5 --- meta/RaindexV6SubParser.rain.meta | Bin 1380 -> 1466 bytes .../RaindexV6SubParserAuthoringMeta.rain.meta | Bin 7584 -> 7936 bytes src/concrete/parser/RaindexV6SubParser.sol | 3 +- src/generated/RaindexV6SubParserPointers.sol | 10 +- .../GenericPoolRaindexV6ArbOrderTaker.sol | 10 +- .../GenericPoolRaindexV6FlashBorrower.sol | 10 +- src/generated/candidate/RaindexV6.sol | 8 +- .../candidate/RaindexV6SubParser.sol | 8 +- .../RouteProcessorRaindexV6ArbOrderTaker.sol | 10 +- subgraph/abis/Raindex.json | 104 +++++++++++++----- .../RaindexV6.takeOrder.freshMutation.t.sol | 23 ++-- 11 files changed, 116 insertions(+), 70 deletions(-) diff --git a/meta/RaindexV6SubParser.rain.meta b/meta/RaindexV6SubParser.rain.meta index 12aea4a7007c37f6b1cf5bedb3a81a78c7feb5dd..e278ebcd692bb5e8b918f1f77b7f353f4bfaca80 100644 GIT binary patch delta 1449 zcmV;a1y=gx3c3q_{|br5bnbX`qySk3h^vPiqd- ze)fCc`}`K$y%+wVi2U=g`1#2C7tX`-7Y`%yi?IBqhhh1D%MtyrMC7lYh2^iIi2PAl z{(40J8;4=}wezt2dSw0ei?IC7v#|WFi2k?F!}50`@^>%7^7r;4@`(QT4|4E{iRP(8I#+!81 zUh-K}A~dkXJXRMUb1dgqf^Xm8GukU~esBG*J3uaS^0Z5V!^f9wO!UU_eb&LBgJ?~r z-hMMac50t>**BJ}FRjS5U{druEs82~J)aQe!UV2~LSmR@yld$ufD9LzE-<8KQsUEu zYqijSYIpwqZTthpwA3YX%3Cz=Bbq{ftHvx`8r=0Pw?=W3#%mG1G(1Sca$g|e?@Qoi z%7KE)FQ_pR0`P=@05m}Cr`!CeJP~F=fA8b||9fN;60}whQRe(8NrQ#l9~Pa_7J z_+2FJ6#spLe}W6lGScOQ58hUn^X&v-a0h8{;^6ijm|kd-hVcU#f?zqsgBbqDHa_To zbP8qJxImf38t@2D6%oB1s`D5ZOT3b3!6j9uAV_YKz0}fhWHQK{y?Db~1)*Y)qZx7K zWl9+?Dt_Ip@%6&hpwR^)#_#Q}{@E;h?fi41bPK)_1tNy;PFH;x0?^|dTOeZierVSR zkE~H3U}VPE3Iwzeg{Fd+=^DP_1t5lh??FfYw?IB?0chcejT%@0V)&o*%Kw%}S5g4r z0tUCP%-q1t#x<>8Z6T0!HuC7+i{HN*`A_Nub4J@=b2tyfarjgj7tBV$6=`!tiB&cy z(jUDGUE2LxRVw`UwH2b7p!v2w=@ch9FX2|Ud;kA4zWj9Wm*ksU2gn(L^n@dSKUQ4G z4zLm}%?-g1YGyAK9fUYto{%O*Znpb^vN`9{)8$s|o4_+)$?3vuin-%st>#eWY%DGS zpgpKM4L77;7vwKbJo=sU_s?(bt%Sf{2!29MyPT{VS?FIkZn~QmX0QYv8zwcAFd4HI zXOJPk`un#%phGle$2EUgX+hk7BSe5B_dorUG}kIgRGp`jOQa$EXGgQ z`$BE9zQ+5J>ix#HinN7q>;WK#?^XxC=6$DnV(>6F9~mlqBO7cC-*@f)+GwnoNH;+? zPTp;NgBxrN-+o7b-Ds>HLuZP%@!8%r0A3W|jji}xn+!o~;Tw6ti{U$e=sMpG3BV;) z^IYKN$Q~KP_kBlxT$-#gRzsT^TuDYIa13AH{HU^VrVt{crF&)oU+rYj19iq%l8m zh?Tn&)#H~3Aj)Gj3v-X#T+Ye_x%+H+sPPtmgvz4ayX5V;1(@MqUcX+`d?Wy1%X zL(Y6NoEefk3jd(%$zP5vf8{(ZzZKDc>oP2V^*AhlEu#N_^@#k9ld$~FQABNYS7n-}CW!EUK%XllJS2_-ou*@|G`28Bq6BH7~W-vDBKPg?4K--Env1Mv7^qk1-g82|H5_3wFfBMkr^VDRcn z^$SdIT+`~!HUdfK1F!C#;`?`_{z+Y6)~Nq)2KQmO4zHDVL2m>+k#<)USfvXh-PJoU z3$tIFN`>1#Um=TNZW>wSUg!7hO93-~SOSmb zY3&P4#%#kG?C@{y{b(+j5RLS-b{eZv5c`PMLu9?wf!FVNT&e|hGLvuiZ~7N$g!V3g zmD8N2=#*?4!ODoqSUxaCV)1EvAJ-=9XQ&&gzCV~&mw0?b53m^DH!Xb4`+D_6b{M;l z=IHbFJ|JRzM=j^W&cWaqT1(XDGrhM5UX<_dUOwCA zLuek~zza%@?|$3;q)!5_s9IzKuLkz`7~hXA^>JmgW~_#GE4Y#jEZ`Vl*ZQq6b{^9; z->?FX@%5_T8nU|F?eg_4;27V%F7;b6;C#1Ew)pxMaE$M(Nd1P;d_ILq1>CE~_Vdoc z`2N>?R`u4Gqpfd7jiS*X=*7m~>Fe>Ui(TU*ROi+EzN-iHz-6?=dA_MWH^?Lszd;Q! U7QfE@Z(jkw06hF86O)w%B>FLdTZ_4ZJ=Ka<<%Z;gN0kTyhcYI=vY%h=*yF z4t&&yCDJBs*Qk3L@`#*%iF!aB)><1*@!dK#9dcYBuP*xLafTcLu|l3KG>tLk$0a%w zpI9TOu=TAsyCY^1Uj|94V_x2~iqAG|z8+%+clQsotIIhwXOL_ah(K{6LFubZo>LY< z$Wz7EO2R7>f96XXG2sD@BwDVS1pY*=W=p~{P+|PPBV?1NQ2|aEb1roYA2pQ=ki7U9 YPDZOF1s3RXlRcNe0WUY)Z8fO7KZ$X8g#Z8m delta 210 zcmW;F%MHRX5QJf^l>|Zn^9mt=AQ!5L1TMv;?1ejs2HZm$a35UK0v+I)%coznmaO;C zzaG-PvzOMqVb1Y`T>r&B{Z6kW+;hM`v(ObF; l=-SZ{?zuM|x{2`MlhX39HefkAI>M8}a~yp3w8O3bmVYxSE&2ce diff --git a/src/concrete/parser/RaindexV6SubParser.sol b/src/concrete/parser/RaindexV6SubParser.sol index c00fe11018..6681b313c3 100644 --- a/src/concrete/parser/RaindexV6SubParser.sol +++ b/src/concrete/parser/RaindexV6SubParser.sol @@ -150,7 +150,8 @@ contract RaindexV6SubParser is BaseRainlangSubParser { function(bytes32[] memory) internal pure returns (OperandV2)[] memory contextSignerDomainsHandlers = new function(bytes32[] memory) internal pure returns (OperandV2)[](CONTEXT_SIGNED_CONTEXT_DOMAINS_ROWS); - contextSignerDomainsHandlers[CONTEXT_SIGNED_CONTEXT_DOMAINS_ROW] = LibParseOperand.handleOperandSingleFullNoDefault; + contextSignerDomainsHandlers[CONTEXT_SIGNED_CONTEXT_DOMAINS_ROW] = + LibParseOperand.handleOperandSingleFullNoDefault; function(bytes32[] memory) internal pure returns (OperandV2)[] memory contextSignedContextHandlers = new function(bytes32[] memory) internal pure returns (OperandV2)[](CONTEXT_SIGNED_CONTEXT_START_ROWS); diff --git a/src/generated/RaindexV6SubParserPointers.sol b/src/generated/RaindexV6SubParserPointers.sol index 9a7b389e4b..6ecc78f608 100644 --- a/src/generated/RaindexV6SubParserPointers.sol +++ b/src/generated/RaindexV6SubParserPointers.sol @@ -5,10 +5,10 @@ pragma solidity ^0.8.25; // THIS FILE IS AUTOGENERATED BY THE BUILD SCRIPT. DO NOT EDIT BY HAND. /// @dev Hash of the known bytecode. -bytes32 constant BYTECODE_HASH = bytes32(0xb5f18596862c369ecb1bc3cf69399785a578427214d9372d94d0fde2ed0ecaeb); +bytes32 constant BYTECODE_HASH = bytes32(0xa97dd44eacfb2527934079d037d4baa6ceffe1e9e12fd5a17d79c3e9cfd9e974); /// @dev The hash of the meta that describes the contract. -bytes32 constant DESCRIBED_BY_META_HASH = bytes32(0xf2d0eca454c544ab10f9991c019349475a416e38494f112a50807174c3000d0b); +bytes32 constant DESCRIBED_BY_META_HASH = bytes32(0x828494fa15dec168f2372c71a11064dc163f7783fb7f3a9a84df40a87861a368); /// @dev The parse meta that is used to lookup word definitions. /// The structure of the parse meta is: @@ -27,7 +27,7 @@ bytes32 constant DESCRIBED_BY_META_HASH = bytes32(0xf2d0eca454c544ab10f9991c0193 /// bit count of the previous bloom filter. If we reach the end of the bloom /// filters then we have a miss. bytes constant PARSE_META = - hex"0101180010800082000100010480300038412a001810000010020004200004002038038ff54900cc66c61ff3dcab0616592209895f0b16fec9301b02e0920c5bfe561d21609201e959460b1974270f844db208bcd3bf1e989376111049db13b934301a0ae9a00af82a7805c138f40d28083f0742ef2104d561fd1415a13317716a6119d260cc107b9bfc0eec7ade15cba2891c6b14a512792bdb02e0f14718565589"; + hex"0101180010800082000100010480300038412a001810000010020004200005002038038ff54900cc66c620f3dcab0616592212c9ec8109895f0b17fec9301c02e0920c5bfe561e21609201e959460b1974270f844db208bcd3bf1f989376111049db14b934301b0ae9a00af82a7805c138f40d28083f0742ef2104d561fd1515a13318716a611ad260cc107b9bfc0eec7ade16cba2891d6b14a513792bdb02e0f14719565589"; /// @dev The build depth of the parser meta. @@ -39,13 +39,13 @@ uint8 constant PARSE_META_BUILD_DEPTH = 1; /// to things that happen entirely on the interpreter such as well known /// constants and references to the context grid. bytes constant SUB_PARSER_WORD_PARSERS = - hex"16cc16e916f8170717161726173517451754176417741783179317a217b217c217d217e117f016cc16f8170717161825183516cc16f817071716182518351845"; + hex"18431860186f187e188d189d18ac18bc18cb18db18eb18fa190a19191929193919491958196719801843186f187e188d19cc19dc1843186f187e188d19cc19dc19ec"; /// @dev Every two bytes is a function pointer for an operand handler. /// These positional indexes all map to the same indexes looked up in the parse /// meta. bytes constant OPERAND_HANDLER_FUNCTION_POINTERS = - hex"1bec1bec1bec1bec1bec1bec1bec1bec1bec1bec1bec1bec1bec1bec1bec1bec1bec1c151cb11bec1bec1bec1bec1bec1bec1bec1bec1bec1bec1bec1bec1bec"; + hex"1d931d931d931d931d931d931d931d931d931d931d931d931d931d931d931d931d931dbc1dbc1e581d931d931d931d931d931d931d931d931d931d931d931d931d93"; /// @dev Every two bytes is a function pointer for a literal parser. /// Literal dispatches are determined by the first byte(s) of the literal diff --git a/src/generated/candidate/GenericPoolRaindexV6ArbOrderTaker.sol b/src/generated/candidate/GenericPoolRaindexV6ArbOrderTaker.sol index 31020f2095..d64ba49a75 100644 --- a/src/generated/candidate/GenericPoolRaindexV6ArbOrderTaker.sol +++ b/src/generated/candidate/GenericPoolRaindexV6ArbOrderTaker.sol @@ -5,23 +5,23 @@ pragma solidity ^0.8.25; // THIS FILE IS AUTOGENERATED BY THE BUILD SCRIPT. DO NOT EDIT BY HAND. /// @dev Hash of the known bytecode. -bytes32 constant BYTECODE_HASH = bytes32(0x3cb4365b759e7b9bdfe38e83a74fbfa814f4cd9f7343546e0e17349f3573ffa1); +bytes32 constant BYTECODE_HASH = bytes32(0x3d272681426308cfc81409a7f24ac97bf379958cb6e348e6e780cd3da7960153); /// @dev The deterministic deploy address of the contract when deployed via /// the Zoltu factory. -address constant DEPLOYED_ADDRESS = address(0xe2212E6c7cD4D714034C160bb2B0424Ee433B140); +address constant DEPLOYED_ADDRESS = address(0x60EC3DaA65cd09Ff01757BC2c8e027F903507565); /// @dev The creation bytecode of the contract. bytes constant CREATION_CODE = - hex"6080604052348015600e575f80fd5b5060017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055612413806100405f395ff3fe608060405260043610610034575f3560e01c806301ffc9a71461003d578063691f9ed714610070578063b17c83c11461008f57005b3661003b57005b005b348015610048575f80fd5b5061005c6100573660046116ad565b6100a2565b604051901515815260200160405180910390f35b34801561007b575f80fd5b5061003b61008a3660046116e8565b6100f3565b61003b61009d36600461178a565b610148565b5f6001600160e01b0319821663691f9ed760e01b14806100d257506001600160e01b0319821663b17c83c160e01b145b806100ed57506301ffc9a760e01b6001600160e01b03198316145b92915050565b61010186868686868661040a565b6101408683838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061046f92505050565b505050505050565b610150610520565b61015f61015c82611a79565b50565b61016c6080830183611b35565b90505f0361018d57604051639c95219f60e01b815260040160405180910390fd5b6001600160a01b03831673c4cf8f35f6fa0a36cbaea5c0a6cea77134c03e2a146101da5760405163516e822d60e01b81526001600160a01b03841660048201526024015b60405180910390fd5b5f6101e86080840184611b35565b5f8181106101f8576101f8611b7b565b905060200281019061020a9190611b8f565b6102149080611bad565b610222906040810190611bc1565b61022f6080860186611b35565b5f81811061023f5761023f611b7b565b90506020028101906102519190611b8f565b6020013581811061026457610264611b7b565b61027a9260206040909202019081019150611c07565b90505f61028a6080850185611b35565b5f81811061029a5761029a611b7b565b90506020028101906102ac9190611b8f565b6102b69080611bad565b6102c4906060810190611bc1565b6102d16080870187611b35565b5f8181106102e1576102e1611b7b565b90506020028101906102f39190611b8f565b6040013581811061030657610306611b7b565b61031c9260206040909202019081019150611c07565b90506103336001600160a01b038316865f1961054e565b6040516334e3942b60e11b81526001600160a01b038616906369c728569061035f908790600401611e6b565b60408051808303815f875af115801561037a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061039e919061206b565b506103b590506001600160a01b038316865f61054e565b6103da6103c184611a79565b836103cb856105c8565b846103d5866105c8565b61064c565b505061040560017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054600214801561044f57503373c4cf8f35f6fa0a36cbaea5c0a6cea77134c03e2a14155b156101405760405163f6688adf60e01b81523360048201526024016101d1565b5f805f83806020019051810190610486919061208d565b919450925090506001600160a01b0383166104b4576040516398521dc560e01b815260040160405180910390fd5b6001600160a01b0382166104db5760405163456ac4c360e11b815260040160405180910390fd5b6104f06001600160a01b038616845f1961054e565b6105046001600160a01b03831682476108eb565b506105196001600160a01b038616845f61054e565b5050505050565b6105286109b8565b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b61055a8383835f6109fc565b6104055761056b83835f60016109fc565b61059357604051635274afe760e01b81526001600160a01b03841660048201526024016101d1565b6105a083838360016109fc565b61040557604051635274afe760e01b81526001600160a01b03841660048201526024016101d1565b5f6105d1610a5e565b6040516354636d2b60e01b81526001600160a01b038316600482015273200e12d10bb0c5e4a17e7018f0f1161919bb9389906354636d2b906024016020604051808303815f875af1158015610628573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100ed9190612128565b6040805160018082528183019092525f91816020015b6060815260200190600190039081610662575050604080516003808252608082019092529192505f919060208201606080368337019050506040516370a0823160e01b81523060048201529091505f906001600160a01b038816906370a0823190602401602060405180830381865afa1580156106e1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107059190612148565b90508015610721576107216001600160a01b0388163383610ae9565b5f61072c8288610af6565b50905080835f8151811061074257610742611b7b565b602090810291909101015250506040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015610793573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107b79190612148565b905080156107d3576107d36001600160a01b0386163383610ae9565b5f6107de8286610af6565b50905080836001815181106107f5576107f5611b7b565b6020908102919091010152504790508015610814576108143382610b37565b5f610820826012610af6565b509050808360028151811061083757610837611b7b565b602002602001018181525050505080825f8151811061085857610858611b7b565b60209081029190910101526040805160018082528183019092525f91816020015b6040805160a0810182525f918101828152606080830193909352608082018390528152602081019190915281526020019060019003908161087957905050905087815f815181106108cc576108cc611b7b565b60200260200101819052506108e18382610b95565b5050505050505050565b6060814710156109175760405163cf47918160e01b8152476004820152602481018390526044016101d1565b5f610923858486610ddd565b905080801561094457505f3d118061094457505f856001600160a01b03163b115b1561095957610951610df2565b9150506109b1565b801561098357604051639996b31560e01b81526001600160a01b03861660048201526024016101d1565b3d1561099657610991610e0b565b6109af565b60405163d6bda27560e01b815260040160405180910390fd5b505b9392505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00546002036109fa57604051633ee5aeb560e01b815260040160405180910390fd5b565b60405163095ea7b360e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610a52578383151615610a46573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b73200e12d10bb0c5e4a17e7018f0f1161919bb93893b1580610ab5575073200e12d10bb0c5e4a17e7018f0f1161919bb93893f7f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d4114155b156109fa576040516373e6d7b360e01b815273200e12d10bb0c5e4a17e7018f0f1161919bb938960048201526024016101d1565b6105a08383836001610e16565b5f805f805f610b058787610e60565b9250925092505f80610b178585610ebc565b9150915081838015610b265750815b9650965050505050505b9250929050565b80471015610b615760405163cf47918160e01b8152476004820152602481018290526044016101d1565b610b7a828260405180602001604052805f815250610ddd565b15610b83575050565b3d1561099657610b91610e0b565b5050565b60408051600480825260a082019092525f91816020015b6060815260200190600190039081610bac5790505090505f5b8351811015610c0d57838181518110610be057610be0611b7b565b6020026020010151828281518110610bfa57610bfa611b7b565b6020908102919091010152600101610bc5565b50335f8181523060209081526040808320815160a0810183528083018581526060808301879052608083018190529082528185015282518581529384018581528484019093529093909291905b8751811015610dd257878181518110610c7557610c75611b7b565b602002602001015193505f845f015160400151511115610dca575f845f01515f01516001600160a01b031663d04dfe236040518060e00160405280885f0151602001516001600160a01b03168152602001898152602001885f01516040015181526020015f8152602001610ced8c8a6020015161112f565b8152602001878152602001868152506040518263ffffffff1660e01b8152600401610d189190612214565b5f60405180830381865afa158015610d32573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610d599190810190612315565b9150505f81511115610dc85784516020015160405163012c676d60e21b81526001600160a01b03909116906304b19db490610d9a908a9085906004016123cb565b5f604051808303815f87803b158015610db1575f80fd5b505af1158015610dc3573d5f803e3d5ffd5b505050505b505b600101610c5a565b505050505050505050565b5f805f83516020850186885af1949350505050565b6040513d81523d5f602083013e3d602001810160405290565b6040513d5f823e3d81fd5b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610a52578383151615610a46573d5f823e3d81fd5b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff861115610eab57600a860460018201600a88065f1493509350935050610eb5565b8593509150600190505b9250925092565b5f808383601b82900b821480611007577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e1000000000000000000870515610f3d577f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000870515610f2e576305f5e10087059650600886019550610f3d565b620186a0870596506005860195505b8687601b0b14610f5857600a87059650856001019550610f3d565b7b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc7b1999999999999999999999999999999999999999999999999999999888820111611001575f600188039050808160030b03610fff5760e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff7b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff60ff8b901d18161795505f9450610b309350505050565b505b5061101e565b865f0361101e57505f935060019250610b30915050565b858660030b146110d5575f82131561107d5761103a8383611411565b156110625760405163d556b11160e01b815260048101849052602481018390526044016101d1565b637ffffffe19909501600a0a82029550637fffffff946110d5565b637fffffff19869003604381131561109f57505f9450849350610b3092505050565b80600a0a88816110b1576110b16123eb565b059750875f036110cb57505f9450849350610b3092505050565b50637fffffff1995505b8186136110e557600193506110fe565b818603600a0a83816110f9576110f96123eb565b071593505b5050507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff841660e084901b1791509250929050565b60605f825167ffffffffffffffff81111561114c5761114c611808565b604051908082528060200260200182016040528015611175578160200160208202803683370190505b5090505f80845111611187575f61118d565b83516001015b85516001010190505f8167ffffffffffffffff8111156111af576111af611808565b6040519080825280602002602001820160405280156111e257816020015b60608152602001906001900390816111cd5790505b5090505f611206604080516002815233602082015230818301526060810190915290565b82828151811061121857611218611b7b565b60200260200101819052505f5b875181101561127557818060010192505087818151811061124857611248611b7b565b602002602001015183838151811061126257611262611b7b565b6020908102919091010152600101611225565b508551156114075780806001019150508382828151811061129857611298611b7b565b60200260200101819052505f5b8651811015611405576113548782815181106112c3576112c3611b7b565b60200260200101515f01516113316112ff8a85815181106112e6576112e6611b7b565b6020026020010151602001518051602090810291012090565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f908152601c91909152603c902090565b89848151811061134357611343611b7b565b60200260200101516040015161142c565b61137457604051630a57f30960e31b8152600481018290526024016101d1565b86818151811061138657611386611b7b565b60200260200101515f01516001600160a01b03165f1b8582815181106113ae576113ae611b7b565b60200260200101818152505081806001019250508681815181106113d4576113d4611b7b565b6020026020010151602001518383815181106113f2576113f2611b7b565b60209081029190910101526001016112a5565b505b5095945050505050565b5f6109b15f84126114225783611426565b835f035b8361149c565b5f836001600160a01b03163b5f0361148a575f8061144a858561153a565b5090925090505f816003811115611463576114636123ff565b1480156114815750856001600160a01b0316826001600160a01b0316145b925050506109b1565b611495848484611580565b90506109b1565b5f637ffffff582136114af57505f6100ed565b637ffffffe19820160438113156114ca5750508115156100ed565b5f811261150a5780600a0a7b80000000000000000000000000000000000000000000000000000001816114ff576114ff6123eb565b0484119150506100ed565b805f03600a0a7b800000000000000000000000000000000000000000000000000000020284101591505092915050565b5f805f8351604103611571576020840151604085015160608601515f1a611563888285856115e5565b955095509550505050610eb5565b505081515f9150600290610eb5565b805160408051630b135d3f60e11b8082526004820186905260248201929092525f92906020820185604483015e5f82606483010152601f820160051c60051b915060205f60648401838a5afa9050825f5114601f3d1116811693505050509392505050565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084111561161e57505f915060039050826116a3565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa15801561166f573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b03811661169a57505f9250600191508290506116a3565b92505f91508190505b9450945094915050565b5f602082840312156116bd575f80fd5b81356001600160e01b0319811681146109b1575f80fd5b6001600160a01b038116811461015c575f80fd5b5f805f805f8060a087890312156116fd575f80fd5b8635611708816116d4565b95506020870135611718816116d4565b94506040870135935060608701359250608087013567ffffffffffffffff80821115611742575f80fd5b818901915089601f830112611755575f80fd5b813581811115611763575f80fd5b8a6020828501011115611774575f80fd5b6020830194508093505050509295509295509295565b5f805f6060848603121561179c575f80fd5b83356117a7816116d4565b9250602084013567ffffffffffffffff808211156117c3575f80fd5b9085019060c082880312156117d6575f80fd5b909250604085013590808211156117eb575f80fd5b508401604081870312156117fd575f80fd5b809150509250925092565b634e487b7160e01b5f52604160045260245ffd5b6040516060810167ffffffffffffffff8111828210171561183f5761183f611808565b60405290565b6040805190810167ffffffffffffffff8111828210171561183f5761183f611808565b604051601f8201601f1916810167ffffffffffffffff8111828210171561189157611891611808565b604052919050565b5f67ffffffffffffffff8211156118b2576118b2611808565b50601f01601f191660200190565b5f82601f8301126118cf575f80fd5b81356118e26118dd82611899565b611868565b8181528460208386010111156118f6575f80fd5b816020850160208301375f918101602001919091529392505050565b5f67ffffffffffffffff82111561192b5761192b611808565b5060051b60200190565b5f82601f830112611944575f80fd5b813560206119546118dd83611912565b82815260059290921b84018101918181019086841115611972575f80fd5b8286015b84811015611a6e57803567ffffffffffffffff80821115611995575f80fd5b908801906060828b03601f190112156119ac575f80fd5b6119b461181c565b868301356119c1816116d4565b8152604083810135838111156119d5575f80fd5b8401603f81018d136119e5575f80fd5b888101356119f56118dd82611912565b81815260059190911b82018301908a8101908f831115611a13575f80fd5b928401925b82841015611a315783358252928b0192908b0190611a18565b858c0152505050606084013583811115611a49575f80fd5b611a578d8a838801016118c0565b918301919091525085525050918301918301611976565b509695505050505050565b5f60408236031215611a89575f80fd5b611a91611845565b823567ffffffffffffffff80821115611aa8575f80fd5b818501915060608236031215611abc575f80fd5b611ac461181c565b8235611acf816116d4565b81526020830135611adf816116d4565b6020820152604083013582811115611af5575f80fd5b611b01368286016118c0565b60408301525083526020850135915080821115611b1c575f80fd5b50611b2936828601611935565b60208301525092915050565b5f808335601e19843603018112611b4a575f80fd5b83018035915067ffffffffffffffff821115611b64575f80fd5b6020019150600581901b3603821315610b30575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235607e19833603018112611ba3575f80fd5b9190910192915050565b5f8235609e19833603018112611ba3575f80fd5b5f808335601e19843603018112611bd6575f80fd5b83018035915067ffffffffffffffff821115611bf0575f80fd5b6020019150600681901b3603821315610b30575f80fd5b5f60208284031215611c17575f80fd5b81356109b1816116d4565b5f808335601e19843603018112611c37575f80fd5b830160208101925035905067ffffffffffffffff811115611c56575f80fd5b8060051b3603821315610b30575f80fd5b5f8235605e19833603018112611c7b575f80fd5b90910192915050565b5f808335601e19843603018112611c99575f80fd5b830160208101925035905067ffffffffffffffff811115611cb8575f80fd5b803603821315610b30575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f808335601e19843603018112611d03575f80fd5b830160208101925035905067ffffffffffffffff811115611d22575f80fd5b8060061b3603821315610b30575f80fd5b8183525f60208085019450825f5b85811015611d79578135611d54816116d4565b6001600160a01b03168752818301358388015260409687019690910190600101611d41565b509495945050505050565b8183526020808401935f91600585811b8301820185855b88811015611e5d57858303601f19018a52611db68289611c67565b60608135611dc3816116d4565b6001600160a01b03168552611dda82880183611c22565b82898801528083880152608092507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811115611e14575f80fd5b871b808288850137860190506040611e2e84820185611c84565b9450838884030182890152611e468484018683611cc6565b9e8a019e9750505093870193505050600101611d9b565b509098975050505050505050565b5f602080835260e08301843582850152604082860135818601526060818701358187015280870135801515808214611ea1575f80fd5b8060808901525050611eb66080880188611c22565b60c060a08901529384905261010093848801600582901b89018601835f5b84811015612032578b830360ff19018452813536879003607e19018112611ef9575f80fd5b8601803536829003609e19018112611f0f575f80fd5b6080855281018035611f20816116d4565b6001600160a01b038082166080880152611f3c8e840184611c67565b915060a0808801528135611f4f816116d4565b8116610120880152818e0135611f64816116d4565b16610140870152611f77818c0182611c84565b91508a610160880152611f8f61018088018383611cc6565b915050611f9e8b830183611cee565b607f19808985030160c08a0152611fb6848385611d33565b9350611fc48d860186611cee565b93509150808985030160e08a015250611fde838383611d33565b9250505060808201358c8701528c8301358d8701528a8301358b8701526120078a840184611c22565b935091508581038a87015261201d818484611d84565b968d019695505050918a019150600101611ed4565b505061204160a08c018c611c84565b8b8303601f190160c08d01529850965061205c818989611cc6565b9b9a5050505050505050505050565b5f806040838503121561207c575f80fd5b505080516020909101519092909150565b5f805f6060848603121561209f575f80fd5b83516120aa816116d4565b60208501519093506120bb816116d4565b604085015190925067ffffffffffffffff8111156120d7575f80fd5b8401601f810186136120e7575f80fd5b80516120f56118dd82611899565b818152876020838501011115612109575f80fd5b8160208401602083015e5f602083830101528093505050509250925092565b5f60208284031215612138575f80fd5b815160ff811681146109b1575f80fd5b5f60208284031215612158575f80fd5b5051919050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f815180845260208085019450602084015f5b83811015611d79578151875295820195908201906001016121a0565b5f8282518085526020808601955060208260051b840101602086015f5b8481101561220757601f198684030189526121f583835161218d565b988401989250908301906001016121d9565b5090979650505050505050565b602081526001600160a01b038251166020820152602082015160408201525f604083015160e0606084015261224d61010084018261215f565b9050606084015160808401526080840151601f19808584030160a086015261227583836121bc565b925060a08601519150808584030160c0860152612292838361218d565b925060c08601519150808584030160e0860152506122b0828261218d565b95945050505050565b5f82601f8301126122c8575f80fd5b815160206122d86118dd83611912565b8083825260208201915060208460051b8701019350868411156122f9575f80fd5b602086015b84811015611a6e57805183529183019183016122fe565b5f8060408385031215612326575f80fd5b825167ffffffffffffffff8082111561233d575f80fd5b818501915085601f830112612350575f80fd5b815160206123606118dd83611912565b82815260059290921b8401810191818101908984111561237e575f80fd5b948201945b8386101561239c57855182529482019490820190612383565b918801519196509093505050808211156123b4575f80fd5b506123c1858286016122b9565b9150509250929050565b828152604060208201525f6123e3604083018461218d565b949350505050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52602160045260245ffd"; + hex"6080604052348015600e575f80fd5b5060017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055612543806100405f395ff3fe608060405260043610610034575f3560e01c806301ffc9a71461003d578063691f9ed714610070578063ea37cc511461008f57005b3661003b57005b005b348015610048575f80fd5b5061005c61005736600461179e565b6100a2565b604051901515815260200160405180910390f35b34801561007b575f80fd5b5061003b61008a3660046117d9565b6100f3565b61003b61009d36600461187b565b610148565b5f6001600160e01b0319821663691f9ed760e01b14806100d257506001600160e01b0319821663ea37cc5160e01b145b806100ed57506301ffc9a760e01b6001600160e01b03198316145b92915050565b61010186868686868661040a565b6101408683838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061046f92505050565b505050505050565b610150610520565b61015f61015c82611b8c565b50565b61016c6080830183611c48565b90505f0361018d57604051639c95219f60e01b815260040160405180910390fd5b6001600160a01b038316732eb98f9489cff4a429368e389f5ffc6f8d9c5ede146101da5760405163516e822d60e01b81526001600160a01b03841660048201526024015b60405180910390fd5b5f6101e86080840184611c48565b5f8181106101f8576101f8611c8e565b905060200281019061020a9190611ca2565b6102149080611cc0565b610222906040810190611cd4565b61022f6080860186611c48565b5f81811061023f5761023f611c8e565b90506020028101906102519190611ca2565b6020013581811061026457610264611c8e565b61027a9260206040909202019081019150611d1a565b90505f61028a6080850185611c48565b5f81811061029a5761029a611c8e565b90506020028101906102ac9190611ca2565b6102b69080611cc0565b6102c4906060810190611cd4565b6102d16080870187611c48565b5f8181106102e1576102e1611c8e565b90506020028101906102f39190611ca2565b6040013581811061030657610306611c8e565b61031c9260206040909202019081019150611d1a565b90506103336001600160a01b038316865f1961054e565b60405163b0460f0760e01b81526001600160a01b0386169063b0460f079061035f908790600401611fe2565b60408051808303815f875af115801561037a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061039e91906121a4565b506103b590506001600160a01b038316865f61054e565b6103da6103c184611b8c565b836103cb856105c8565b846103d5866105c8565b61064c565b505061040560017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054600214801561044f575033732eb98f9489cff4a429368e389f5ffc6f8d9c5ede14155b156101405760405163f6688adf60e01b81523360048201526024016101d1565b5f805f8380602001905181019061048691906121c6565b919450925090506001600160a01b0383166104b4576040516398521dc560e01b815260040160405180910390fd5b6001600160a01b0382166104db5760405163456ac4c360e11b815260040160405180910390fd5b6104f06001600160a01b038616845f1961054e565b6105046001600160a01b03831682476108eb565b506105196001600160a01b038616845f61054e565b5050505050565b6105286109b8565b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b61055a8383835f6109fc565b6104055761056b83835f60016109fc565b61059357604051635274afe760e01b81526001600160a01b03841660048201526024016101d1565b6105a083838360016109fc565b61040557604051635274afe760e01b81526001600160a01b03841660048201526024016101d1565b5f6105d1610a5e565b6040516354636d2b60e01b81526001600160a01b038316600482015273200e12d10bb0c5e4a17e7018f0f1161919bb9389906354636d2b906024016020604051808303815f875af1158015610628573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100ed9190612261565b6040805160018082528183019092525f91816020015b6060815260200190600190039081610662575050604080516003808252608082019092529192505f919060208201606080368337019050506040516370a0823160e01b81523060048201529091505f906001600160a01b038816906370a0823190602401602060405180830381865afa1580156106e1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107059190612281565b90508015610721576107216001600160a01b0388163383610ae9565b5f61072c8288610af6565b50905080835f8151811061074257610742611c8e565b602090810291909101015250506040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015610793573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107b79190612281565b905080156107d3576107d36001600160a01b0386163383610ae9565b5f6107de8286610af6565b50905080836001815181106107f5576107f5611c8e565b6020908102919091010152504790508015610814576108143382610b37565b5f610820826012610af6565b509050808360028151811061083757610837611c8e565b602002602001018181525050505080825f8151811061085857610858611c8e565b60209081029190910101526040805160018082528183019092525f91816020015b6040805160a0810182525f918101828152606080830193909352608082018390528152602081019190915281526020019060019003908161087957905050905087815f815181106108cc576108cc611c8e565b60200260200101819052506108e18382610b95565b5050505050505050565b6060814710156109175760405163cf47918160e01b8152476004820152602481018390526044016101d1565b5f610923858486610ddd565b905080801561094457505f3d118061094457505f856001600160a01b03163b115b1561095957610951610df2565b9150506109b1565b801561098357604051639996b31560e01b81526001600160a01b03861660048201526024016101d1565b3d1561099657610991610e0b565b6109af565b60405163d6bda27560e01b815260040160405180910390fd5b505b9392505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00546002036109fa57604051633ee5aeb560e01b815260040160405180910390fd5b565b60405163095ea7b360e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610a52578383151615610a46573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b73200e12d10bb0c5e4a17e7018f0f1161919bb93893b1580610ab5575073200e12d10bb0c5e4a17e7018f0f1161919bb93893f7f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d4114155b156109fa576040516373e6d7b360e01b815273200e12d10bb0c5e4a17e7018f0f1161919bb938960048201526024016101d1565b6105a08383836001610e16565b5f805f805f610b058787610e60565b9250925092505f80610b178585610ebc565b9150915081838015610b265750815b9650965050505050505b9250929050565b80471015610b615760405163cf47918160e01b8152476004820152602481018290526044016101d1565b610b7a828260405180602001604052805f815250610ddd565b15610b83575050565b3d1561099657610b91610e0b565b5050565b60408051600480825260a082019092525f91816020015b6060815260200190600190039081610bac5790505090505f5b8351811015610c0d57838181518110610be057610be0611c8e565b6020026020010151828281518110610bfa57610bfa611c8e565b6020908102919091010152600101610bc5565b50335f8181523060209081526040808320815160a0810183528083018581526060808301879052608083018190529082528185015282518581529384018581528484019093529093909291905b8751811015610dd257878181518110610c7557610c75611c8e565b602002602001015193505f845f015160400151511115610dca575f845f01515f01516001600160a01b031663d04dfe236040518060e00160405280885f0151602001516001600160a01b03168152602001898152602001885f01516040015181526020015f8152602001610ced8c8a6020015161112f565b8152602001878152602001868152506040518263ffffffff1660e01b8152600401610d18919061234d565b5f60405180830381865afa158015610d32573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610d599190810190612445565b9150505f81511115610dc85784516020015160405163012c676d60e21b81526001600160a01b03909116906304b19db490610d9a908a9085906004016124fb565b5f604051808303815f87803b158015610db1575f80fd5b505af1158015610dc3573d5f803e3d5ffd5b505050505b505b600101610c5a565b505050505050505050565b5f805f83516020850186885af1949350505050565b6040513d81523d5f602083013e3d602001810160405290565b6040513d5f823e3d81fd5b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610a52578383151615610a46573d5f823e3d81fd5b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff861115610eab57600a860460018201600a88065f1493509350935050610eb5565b8593509150600190505b9250925092565b5f808383601b82900b821480611007577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e1000000000000000000870515610f3d577f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000870515610f2e576305f5e10087059650600886019550610f3d565b620186a0870596506005860195505b8687601b0b14610f5857600a87059650856001019550610f3d565b7b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc7b1999999999999999999999999999999999999999999999999999999888820111611001575f600188039050808160030b03610fff5760e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff7b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff60ff8b901d18161795505f9450610b309350505050565b505b5061101e565b865f0361101e57505f935060019250610b30915050565b858660030b146110d5575f82131561107d5761103a8383611502565b156110625760405163d556b11160e01b815260048101849052602481018390526044016101d1565b637ffffffe19909501600a0a82029550637fffffff946110d5565b637fffffff19869003604381131561109f57505f9450849350610b3092505050565b80600a0a88816110b1576110b161251b565b059750875f036110cb57505f9450849350610b3092505050565b50637fffffff1995505b8186136110e557600193506110fe565b818603600a0a83816110f9576110f961251b565b071593505b5050507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff841660e084901b1791509250929050565b60605f825167ffffffffffffffff81111561114c5761114c6118f9565b604051908082528060200260200182016040528015611175578160200160208202803683370190505b5090505f835167ffffffffffffffff811115611193576111936118f9565b6040519080825280602002602001820160405280156111bc578160200160208202803683370190505b5090505f808551116111ce575f6111d4565b84516002015b86516001010190505f8167ffffffffffffffff8111156111f6576111f66118f9565b60405190808252806020026020018201604052801561122957816020015b60608152602001906001900390816112145790505b5090505f61124d604080516002815233602082015230818301526060810190915290565b82828151811061125f5761125f611c8e565b60200260200101819052505f5b88518110156112bc57818060010192505088818151811061128f5761128f611c8e565b60200260200101518383815181106112a9576112a9611c8e565b602090810291909101015260010161126c565b508651156114f7578080600101915050848282815181106112df576112df611c8e565b602002602001018190525080806001019150508382828151811061130557611305611c8e565b60200260200101819052505f5b87518110156114f55761140888828151811061133057611330611c8e565b60200260200101515f01516113e58a848151811061135057611350611c8e565b6020026020010151602001516113c68c868151811061137157611371611c8e565b60200260200101518051604091820151805160209081029181019190912083517f6ec4dff745ec96dbde88c5d41f8aa5ac13aa1664afb47b8406b44fa945a650c8815291820192909252918201526060902090565b60405161190160f01b8152600281019290925260228201526042902090565b8a84815181106113f7576113f7611c8e565b60200260200101516060015161151d565b61142857604051630a57f30960e31b8152600481018290526024016101d1565b87818151811061143a5761143a611c8e565b60200260200101515f01516001600160a01b03165f1b86828151811061146257611462611c8e565b60200260200101818152505087818151811061148057611480611c8e565b60200260200101516020015185828151811061149e5761149e611c8e565b60200260200101818152505081806001019250508781815181106114c4576114c4611c8e565b6020026020010151604001518383815181106114e2576114e2611c8e565b6020908102919091010152600101611312565b505b509695505050505050565b5f6109b15f84126115135783611517565b835f035b8361158d565b5f836001600160a01b03163b5f0361157b575f8061153b858561162b565b5090925090505f8160038111156115545761155461252f565b1480156115725750856001600160a01b0316826001600160a01b0316145b925050506109b1565b611586848484611671565b90506109b1565b5f637ffffff582136115a057505f6100ed565b637ffffffe19820160438113156115bb5750508115156100ed565b5f81126115fb5780600a0a7b80000000000000000000000000000000000000000000000000000001816115f0576115f061251b565b0484119150506100ed565b805f03600a0a7b800000000000000000000000000000000000000000000000000000020284101591505092915050565b5f805f8351604103611662576020840151604085015160608601515f1a611654888285856116d6565b955095509550505050610eb5565b505081515f9150600290610eb5565b805160408051630b135d3f60e11b8082526004820186905260248201929092525f92906020820185604483015e5f82606483010152601f820160051c60051b915060205f60648401838a5afa9050825f5114601f3d1116811693505050509392505050565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084111561170f57505f91506003905082611794565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015611760573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b03811661178b57505f925060019150829050611794565b92505f91508190505b9450945094915050565b5f602082840312156117ae575f80fd5b81356001600160e01b0319811681146109b1575f80fd5b6001600160a01b038116811461015c575f80fd5b5f805f805f8060a087890312156117ee575f80fd5b86356117f9816117c5565b95506020870135611809816117c5565b94506040870135935060608701359250608087013567ffffffffffffffff80821115611833575f80fd5b818901915089601f830112611846575f80fd5b813581811115611854575f80fd5b8a6020828501011115611865575f80fd5b6020830194508093505050509295509295509295565b5f805f6060848603121561188d575f80fd5b8335611898816117c5565b9250602084013567ffffffffffffffff808211156118b4575f80fd5b9085019060c082880312156118c7575f80fd5b909250604085013590808211156118dc575f80fd5b508401604081870312156118ee575f80fd5b809150509250925092565b634e487b7160e01b5f52604160045260245ffd5b6040516080810167ffffffffffffffff81118282101715611930576119306118f9565b60405290565b6040805190810167ffffffffffffffff81118282101715611930576119306118f9565b6040516060810167ffffffffffffffff81118282101715611930576119306118f9565b604051601f8201601f1916810167ffffffffffffffff811182821017156119a5576119a56118f9565b604052919050565b5f67ffffffffffffffff8211156119c6576119c66118f9565b50601f01601f191660200190565b5f82601f8301126119e3575f80fd5b81356119f66119f1826119ad565b61197c565b818152846020838601011115611a0a575f80fd5b816020850160208301375f918101602001919091529392505050565b5f67ffffffffffffffff821115611a3f57611a3f6118f9565b5060051b60200190565b5f82601f830112611a58575f80fd5b81356020611a686119f183611a26565b82815260059290921b84018101918181019086841115611a86575f80fd5b8286015b848110156114f757803567ffffffffffffffff80821115611aa9575f80fd5b908801906080828b03601f19011215611ac0575f80fd5b611ac861190d565b86830135611ad5816117c5565b815260408381013588830152606084013583811115611af2575f80fd5b8401603f81018d13611b02575f80fd5b88810135611b126119f182611a26565b81815260059190911b82018301908a8101908f831115611b30575f80fd5b928401925b82841015611b4e5783358252928b0192908b0190611b35565b80858701525050505050608083013582811115611b69575f80fd5b611b778c89838701016119d4565b60608301525085525050918301918301611a8a565b5f60408236031215611b9c575f80fd5b611ba4611936565b823567ffffffffffffffff80821115611bbb575f80fd5b818501915060608236031215611bcf575f80fd5b611bd7611959565b8235611be2816117c5565b81526020830135611bf2816117c5565b6020820152604083013582811115611c08575f80fd5b611c14368286016119d4565b60408301525083526020850135915080821115611c2f575f80fd5b50611c3c36828601611a49565b60208301525092915050565b5f808335601e19843603018112611c5d575f80fd5b83018035915067ffffffffffffffff821115611c77575f80fd5b6020019150600581901b3603821315610b30575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235607e19833603018112611cb6575f80fd5b9190910192915050565b5f8235609e19833603018112611cb6575f80fd5b5f808335601e19843603018112611ce9575f80fd5b83018035915067ffffffffffffffff821115611d03575f80fd5b6020019150600681901b3603821315610b30575f80fd5b5f60208284031215611d2a575f80fd5b81356109b1816117c5565b5f808335601e19843603018112611d4a575f80fd5b830160208101925035905067ffffffffffffffff811115611d69575f80fd5b8060051b3603821315610b30575f80fd5b5f808335601e19843603018112611d8f575f80fd5b830160208101925035905067ffffffffffffffff811115611dae575f80fd5b803603821315610b30575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f8135611df0816117c5565b6001600160a01b039081168452602083013590611e0c826117c5565b166020840152611e1f6040830183611d7a565b60606040860152611e34606086018284611dbc565b95945050505050565b5f808335601e19843603018112611e52575f80fd5b830160208101925035905067ffffffffffffffff811115611e71575f80fd5b8060061b3603821315610b30575f80fd5b8183525f60208085019450825f5b85811015611ec8578135611ea3816117c5565b6001600160a01b03168752818301358388015260409687019690910190600101611e90565b509495945050505050565b5f8235607e19833603018112611ee7575f80fd5b90910192915050565b8183526020808401935f91600585811b8301820185855b88811015611fd457858303601f19018a52611f228289611ed3565b60808135611f2f816117c5565b6001600160a01b0316855281870135878601526040611f5081840184611d35565b8383890152808489015260a093507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811115611f8a575f80fd5b881b91508181888501375085016060611fa584820185611d7a565b9450838884030182890152611fbd8484018683611dbc565b9e8a019e9750505093870193505050600101611f07565b509098975050505050505050565b5f602080835260e08301843582850152818501356040850152606060408601356060860152606086013580151580821461201a575f80fd5b60809150806080880152506120326080880188611d35565b60c060a08901529384905261010093848801600582901b89018601835f5b8481101561216b578b830360ff1901845261206b8287611ed3565b8035609e1982360301811261207e575f80fd5b8885528101803561208e816117c5565b6001600160a01b0316858a0152808c013536829003605e190181126120b1575f80fd5b60a0808701526120c76101208701838301611de4565b90506120d66040830183611e3d565b607f19808985030160c08a01526120ee848385611e82565b93506120fc8e860186611e3d565b93509150808985030160e08a015250612116838383611e82565b92505050898201358c8701528c8301358d870152604083013560408701526121408b840184611d35565b935091508581038b870152612156818484611ef0565b968d019695505050918a019150600101612050565b505061217a60a08c018c611d7a565b8b8303601f190160c08d015298509650612195818989611dbc565b9b9a5050505050505050505050565b5f80604083850312156121b5575f80fd5b505080516020909101519092909150565b5f805f606084860312156121d8575f80fd5b83516121e3816117c5565b60208501519093506121f4816117c5565b604085015190925067ffffffffffffffff811115612210575f80fd5b8401601f81018613612220575f80fd5b805161222e6119f1826119ad565b818152876020838501011115612242575f80fd5b8160208401602083015e5f602083830101528093505050509250925092565b5f60208284031215612271575f80fd5b815160ff811681146109b1575f80fd5b5f60208284031215612291575f80fd5b5051919050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f815180845260208085019450602084015f5b83811015611ec8578151875295820195908201906001016122d9565b5f8282518085526020808601955060208260051b840101602086015f5b8481101561234057601f1986840301895261232e8383516122c6565b98840198925090830190600101612312565b5090979650505050505050565b602081526001600160a01b038251166020820152602082015160408201525f604083015160e06060840152612386610100840182612298565b9050606084015160808401526080840151601f19808584030160a08601526123ae83836122f5565b925060a08601519150808584030160c08601526123cb83836122c6565b925060c08601519150808584030160e086015250611e3482826122c6565b5f82601f8301126123f8575f80fd5b815160206124086119f183611a26565b8083825260208201915060208460051b870101935086841115612429575f80fd5b602086015b848110156114f7578051835291830191830161242e565b5f8060408385031215612456575f80fd5b825167ffffffffffffffff8082111561246d575f80fd5b818501915085601f830112612480575f80fd5b815160206124906119f183611a26565b82815260059290921b840181019181810190898411156124ae575f80fd5b948201945b838610156124cc578551825294820194908201906124b3565b918801519196509093505050808211156124e4575f80fd5b506124f1858286016123e9565b9150509250929050565b828152604060208201525f61251360408301846122c6565b949350505050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52602160045260245ffd"; /// @dev The runtime bytecode of the contract. bytes constant RUNTIME_CODE = - hex"608060405260043610610034575f3560e01c806301ffc9a71461003d578063691f9ed714610070578063b17c83c11461008f57005b3661003b57005b005b348015610048575f80fd5b5061005c6100573660046116ad565b6100a2565b604051901515815260200160405180910390f35b34801561007b575f80fd5b5061003b61008a3660046116e8565b6100f3565b61003b61009d36600461178a565b610148565b5f6001600160e01b0319821663691f9ed760e01b14806100d257506001600160e01b0319821663b17c83c160e01b145b806100ed57506301ffc9a760e01b6001600160e01b03198316145b92915050565b61010186868686868661040a565b6101408683838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061046f92505050565b505050505050565b610150610520565b61015f61015c82611a79565b50565b61016c6080830183611b35565b90505f0361018d57604051639c95219f60e01b815260040160405180910390fd5b6001600160a01b03831673c4cf8f35f6fa0a36cbaea5c0a6cea77134c03e2a146101da5760405163516e822d60e01b81526001600160a01b03841660048201526024015b60405180910390fd5b5f6101e86080840184611b35565b5f8181106101f8576101f8611b7b565b905060200281019061020a9190611b8f565b6102149080611bad565b610222906040810190611bc1565b61022f6080860186611b35565b5f81811061023f5761023f611b7b565b90506020028101906102519190611b8f565b6020013581811061026457610264611b7b565b61027a9260206040909202019081019150611c07565b90505f61028a6080850185611b35565b5f81811061029a5761029a611b7b565b90506020028101906102ac9190611b8f565b6102b69080611bad565b6102c4906060810190611bc1565b6102d16080870187611b35565b5f8181106102e1576102e1611b7b565b90506020028101906102f39190611b8f565b6040013581811061030657610306611b7b565b61031c9260206040909202019081019150611c07565b90506103336001600160a01b038316865f1961054e565b6040516334e3942b60e11b81526001600160a01b038616906369c728569061035f908790600401611e6b565b60408051808303815f875af115801561037a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061039e919061206b565b506103b590506001600160a01b038316865f61054e565b6103da6103c184611a79565b836103cb856105c8565b846103d5866105c8565b61064c565b505061040560017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054600214801561044f57503373c4cf8f35f6fa0a36cbaea5c0a6cea77134c03e2a14155b156101405760405163f6688adf60e01b81523360048201526024016101d1565b5f805f83806020019051810190610486919061208d565b919450925090506001600160a01b0383166104b4576040516398521dc560e01b815260040160405180910390fd5b6001600160a01b0382166104db5760405163456ac4c360e11b815260040160405180910390fd5b6104f06001600160a01b038616845f1961054e565b6105046001600160a01b03831682476108eb565b506105196001600160a01b038616845f61054e565b5050505050565b6105286109b8565b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b61055a8383835f6109fc565b6104055761056b83835f60016109fc565b61059357604051635274afe760e01b81526001600160a01b03841660048201526024016101d1565b6105a083838360016109fc565b61040557604051635274afe760e01b81526001600160a01b03841660048201526024016101d1565b5f6105d1610a5e565b6040516354636d2b60e01b81526001600160a01b038316600482015273200e12d10bb0c5e4a17e7018f0f1161919bb9389906354636d2b906024016020604051808303815f875af1158015610628573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100ed9190612128565b6040805160018082528183019092525f91816020015b6060815260200190600190039081610662575050604080516003808252608082019092529192505f919060208201606080368337019050506040516370a0823160e01b81523060048201529091505f906001600160a01b038816906370a0823190602401602060405180830381865afa1580156106e1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107059190612148565b90508015610721576107216001600160a01b0388163383610ae9565b5f61072c8288610af6565b50905080835f8151811061074257610742611b7b565b602090810291909101015250506040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015610793573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107b79190612148565b905080156107d3576107d36001600160a01b0386163383610ae9565b5f6107de8286610af6565b50905080836001815181106107f5576107f5611b7b565b6020908102919091010152504790508015610814576108143382610b37565b5f610820826012610af6565b509050808360028151811061083757610837611b7b565b602002602001018181525050505080825f8151811061085857610858611b7b565b60209081029190910101526040805160018082528183019092525f91816020015b6040805160a0810182525f918101828152606080830193909352608082018390528152602081019190915281526020019060019003908161087957905050905087815f815181106108cc576108cc611b7b565b60200260200101819052506108e18382610b95565b5050505050505050565b6060814710156109175760405163cf47918160e01b8152476004820152602481018390526044016101d1565b5f610923858486610ddd565b905080801561094457505f3d118061094457505f856001600160a01b03163b115b1561095957610951610df2565b9150506109b1565b801561098357604051639996b31560e01b81526001600160a01b03861660048201526024016101d1565b3d1561099657610991610e0b565b6109af565b60405163d6bda27560e01b815260040160405180910390fd5b505b9392505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00546002036109fa57604051633ee5aeb560e01b815260040160405180910390fd5b565b60405163095ea7b360e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610a52578383151615610a46573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b73200e12d10bb0c5e4a17e7018f0f1161919bb93893b1580610ab5575073200e12d10bb0c5e4a17e7018f0f1161919bb93893f7f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d4114155b156109fa576040516373e6d7b360e01b815273200e12d10bb0c5e4a17e7018f0f1161919bb938960048201526024016101d1565b6105a08383836001610e16565b5f805f805f610b058787610e60565b9250925092505f80610b178585610ebc565b9150915081838015610b265750815b9650965050505050505b9250929050565b80471015610b615760405163cf47918160e01b8152476004820152602481018290526044016101d1565b610b7a828260405180602001604052805f815250610ddd565b15610b83575050565b3d1561099657610b91610e0b565b5050565b60408051600480825260a082019092525f91816020015b6060815260200190600190039081610bac5790505090505f5b8351811015610c0d57838181518110610be057610be0611b7b565b6020026020010151828281518110610bfa57610bfa611b7b565b6020908102919091010152600101610bc5565b50335f8181523060209081526040808320815160a0810183528083018581526060808301879052608083018190529082528185015282518581529384018581528484019093529093909291905b8751811015610dd257878181518110610c7557610c75611b7b565b602002602001015193505f845f015160400151511115610dca575f845f01515f01516001600160a01b031663d04dfe236040518060e00160405280885f0151602001516001600160a01b03168152602001898152602001885f01516040015181526020015f8152602001610ced8c8a6020015161112f565b8152602001878152602001868152506040518263ffffffff1660e01b8152600401610d189190612214565b5f60405180830381865afa158015610d32573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610d599190810190612315565b9150505f81511115610dc85784516020015160405163012c676d60e21b81526001600160a01b03909116906304b19db490610d9a908a9085906004016123cb565b5f604051808303815f87803b158015610db1575f80fd5b505af1158015610dc3573d5f803e3d5ffd5b505050505b505b600101610c5a565b505050505050505050565b5f805f83516020850186885af1949350505050565b6040513d81523d5f602083013e3d602001810160405290565b6040513d5f823e3d81fd5b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610a52578383151615610a46573d5f823e3d81fd5b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff861115610eab57600a860460018201600a88065f1493509350935050610eb5565b8593509150600190505b9250925092565b5f808383601b82900b821480611007577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e1000000000000000000870515610f3d577f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000870515610f2e576305f5e10087059650600886019550610f3d565b620186a0870596506005860195505b8687601b0b14610f5857600a87059650856001019550610f3d565b7b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc7b1999999999999999999999999999999999999999999999999999999888820111611001575f600188039050808160030b03610fff5760e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff7b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff60ff8b901d18161795505f9450610b309350505050565b505b5061101e565b865f0361101e57505f935060019250610b30915050565b858660030b146110d5575f82131561107d5761103a8383611411565b156110625760405163d556b11160e01b815260048101849052602481018390526044016101d1565b637ffffffe19909501600a0a82029550637fffffff946110d5565b637fffffff19869003604381131561109f57505f9450849350610b3092505050565b80600a0a88816110b1576110b16123eb565b059750875f036110cb57505f9450849350610b3092505050565b50637fffffff1995505b8186136110e557600193506110fe565b818603600a0a83816110f9576110f96123eb565b071593505b5050507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff841660e084901b1791509250929050565b60605f825167ffffffffffffffff81111561114c5761114c611808565b604051908082528060200260200182016040528015611175578160200160208202803683370190505b5090505f80845111611187575f61118d565b83516001015b85516001010190505f8167ffffffffffffffff8111156111af576111af611808565b6040519080825280602002602001820160405280156111e257816020015b60608152602001906001900390816111cd5790505b5090505f611206604080516002815233602082015230818301526060810190915290565b82828151811061121857611218611b7b565b60200260200101819052505f5b875181101561127557818060010192505087818151811061124857611248611b7b565b602002602001015183838151811061126257611262611b7b565b6020908102919091010152600101611225565b508551156114075780806001019150508382828151811061129857611298611b7b565b60200260200101819052505f5b8651811015611405576113548782815181106112c3576112c3611b7b565b60200260200101515f01516113316112ff8a85815181106112e6576112e6611b7b565b6020026020010151602001518051602090810291012090565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f908152601c91909152603c902090565b89848151811061134357611343611b7b565b60200260200101516040015161142c565b61137457604051630a57f30960e31b8152600481018290526024016101d1565b86818151811061138657611386611b7b565b60200260200101515f01516001600160a01b03165f1b8582815181106113ae576113ae611b7b565b60200260200101818152505081806001019250508681815181106113d4576113d4611b7b565b6020026020010151602001518383815181106113f2576113f2611b7b565b60209081029190910101526001016112a5565b505b5095945050505050565b5f6109b15f84126114225783611426565b835f035b8361149c565b5f836001600160a01b03163b5f0361148a575f8061144a858561153a565b5090925090505f816003811115611463576114636123ff565b1480156114815750856001600160a01b0316826001600160a01b0316145b925050506109b1565b611495848484611580565b90506109b1565b5f637ffffff582136114af57505f6100ed565b637ffffffe19820160438113156114ca5750508115156100ed565b5f811261150a5780600a0a7b80000000000000000000000000000000000000000000000000000001816114ff576114ff6123eb565b0484119150506100ed565b805f03600a0a7b800000000000000000000000000000000000000000000000000000020284101591505092915050565b5f805f8351604103611571576020840151604085015160608601515f1a611563888285856115e5565b955095509550505050610eb5565b505081515f9150600290610eb5565b805160408051630b135d3f60e11b8082526004820186905260248201929092525f92906020820185604483015e5f82606483010152601f820160051c60051b915060205f60648401838a5afa9050825f5114601f3d1116811693505050509392505050565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084111561161e57505f915060039050826116a3565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa15801561166f573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b03811661169a57505f9250600191508290506116a3565b92505f91508190505b9450945094915050565b5f602082840312156116bd575f80fd5b81356001600160e01b0319811681146109b1575f80fd5b6001600160a01b038116811461015c575f80fd5b5f805f805f8060a087890312156116fd575f80fd5b8635611708816116d4565b95506020870135611718816116d4565b94506040870135935060608701359250608087013567ffffffffffffffff80821115611742575f80fd5b818901915089601f830112611755575f80fd5b813581811115611763575f80fd5b8a6020828501011115611774575f80fd5b6020830194508093505050509295509295509295565b5f805f6060848603121561179c575f80fd5b83356117a7816116d4565b9250602084013567ffffffffffffffff808211156117c3575f80fd5b9085019060c082880312156117d6575f80fd5b909250604085013590808211156117eb575f80fd5b508401604081870312156117fd575f80fd5b809150509250925092565b634e487b7160e01b5f52604160045260245ffd5b6040516060810167ffffffffffffffff8111828210171561183f5761183f611808565b60405290565b6040805190810167ffffffffffffffff8111828210171561183f5761183f611808565b604051601f8201601f1916810167ffffffffffffffff8111828210171561189157611891611808565b604052919050565b5f67ffffffffffffffff8211156118b2576118b2611808565b50601f01601f191660200190565b5f82601f8301126118cf575f80fd5b81356118e26118dd82611899565b611868565b8181528460208386010111156118f6575f80fd5b816020850160208301375f918101602001919091529392505050565b5f67ffffffffffffffff82111561192b5761192b611808565b5060051b60200190565b5f82601f830112611944575f80fd5b813560206119546118dd83611912565b82815260059290921b84018101918181019086841115611972575f80fd5b8286015b84811015611a6e57803567ffffffffffffffff80821115611995575f80fd5b908801906060828b03601f190112156119ac575f80fd5b6119b461181c565b868301356119c1816116d4565b8152604083810135838111156119d5575f80fd5b8401603f81018d136119e5575f80fd5b888101356119f56118dd82611912565b81815260059190911b82018301908a8101908f831115611a13575f80fd5b928401925b82841015611a315783358252928b0192908b0190611a18565b858c0152505050606084013583811115611a49575f80fd5b611a578d8a838801016118c0565b918301919091525085525050918301918301611976565b509695505050505050565b5f60408236031215611a89575f80fd5b611a91611845565b823567ffffffffffffffff80821115611aa8575f80fd5b818501915060608236031215611abc575f80fd5b611ac461181c565b8235611acf816116d4565b81526020830135611adf816116d4565b6020820152604083013582811115611af5575f80fd5b611b01368286016118c0565b60408301525083526020850135915080821115611b1c575f80fd5b50611b2936828601611935565b60208301525092915050565b5f808335601e19843603018112611b4a575f80fd5b83018035915067ffffffffffffffff821115611b64575f80fd5b6020019150600581901b3603821315610b30575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235607e19833603018112611ba3575f80fd5b9190910192915050565b5f8235609e19833603018112611ba3575f80fd5b5f808335601e19843603018112611bd6575f80fd5b83018035915067ffffffffffffffff821115611bf0575f80fd5b6020019150600681901b3603821315610b30575f80fd5b5f60208284031215611c17575f80fd5b81356109b1816116d4565b5f808335601e19843603018112611c37575f80fd5b830160208101925035905067ffffffffffffffff811115611c56575f80fd5b8060051b3603821315610b30575f80fd5b5f8235605e19833603018112611c7b575f80fd5b90910192915050565b5f808335601e19843603018112611c99575f80fd5b830160208101925035905067ffffffffffffffff811115611cb8575f80fd5b803603821315610b30575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f808335601e19843603018112611d03575f80fd5b830160208101925035905067ffffffffffffffff811115611d22575f80fd5b8060061b3603821315610b30575f80fd5b8183525f60208085019450825f5b85811015611d79578135611d54816116d4565b6001600160a01b03168752818301358388015260409687019690910190600101611d41565b509495945050505050565b8183526020808401935f91600585811b8301820185855b88811015611e5d57858303601f19018a52611db68289611c67565b60608135611dc3816116d4565b6001600160a01b03168552611dda82880183611c22565b82898801528083880152608092507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811115611e14575f80fd5b871b808288850137860190506040611e2e84820185611c84565b9450838884030182890152611e468484018683611cc6565b9e8a019e9750505093870193505050600101611d9b565b509098975050505050505050565b5f602080835260e08301843582850152604082860135818601526060818701358187015280870135801515808214611ea1575f80fd5b8060808901525050611eb66080880188611c22565b60c060a08901529384905261010093848801600582901b89018601835f5b84811015612032578b830360ff19018452813536879003607e19018112611ef9575f80fd5b8601803536829003609e19018112611f0f575f80fd5b6080855281018035611f20816116d4565b6001600160a01b038082166080880152611f3c8e840184611c67565b915060a0808801528135611f4f816116d4565b8116610120880152818e0135611f64816116d4565b16610140870152611f77818c0182611c84565b91508a610160880152611f8f61018088018383611cc6565b915050611f9e8b830183611cee565b607f19808985030160c08a0152611fb6848385611d33565b9350611fc48d860186611cee565b93509150808985030160e08a015250611fde838383611d33565b9250505060808201358c8701528c8301358d8701528a8301358b8701526120078a840184611c22565b935091508581038a87015261201d818484611d84565b968d019695505050918a019150600101611ed4565b505061204160a08c018c611c84565b8b8303601f190160c08d01529850965061205c818989611cc6565b9b9a5050505050505050505050565b5f806040838503121561207c575f80fd5b505080516020909101519092909150565b5f805f6060848603121561209f575f80fd5b83516120aa816116d4565b60208501519093506120bb816116d4565b604085015190925067ffffffffffffffff8111156120d7575f80fd5b8401601f810186136120e7575f80fd5b80516120f56118dd82611899565b818152876020838501011115612109575f80fd5b8160208401602083015e5f602083830101528093505050509250925092565b5f60208284031215612138575f80fd5b815160ff811681146109b1575f80fd5b5f60208284031215612158575f80fd5b5051919050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f815180845260208085019450602084015f5b83811015611d79578151875295820195908201906001016121a0565b5f8282518085526020808601955060208260051b840101602086015f5b8481101561220757601f198684030189526121f583835161218d565b988401989250908301906001016121d9565b5090979650505050505050565b602081526001600160a01b038251166020820152602082015160408201525f604083015160e0606084015261224d61010084018261215f565b9050606084015160808401526080840151601f19808584030160a086015261227583836121bc565b925060a08601519150808584030160c0860152612292838361218d565b925060c08601519150808584030160e0860152506122b0828261218d565b95945050505050565b5f82601f8301126122c8575f80fd5b815160206122d86118dd83611912565b8083825260208201915060208460051b8701019350868411156122f9575f80fd5b602086015b84811015611a6e57805183529183019183016122fe565b5f8060408385031215612326575f80fd5b825167ffffffffffffffff8082111561233d575f80fd5b818501915085601f830112612350575f80fd5b815160206123606118dd83611912565b82815260059290921b8401810191818101908984111561237e575f80fd5b948201945b8386101561239c57855182529482019490820190612383565b918801519196509093505050808211156123b4575f80fd5b506123c1858286016122b9565b9150509250929050565b828152604060208201525f6123e3604083018461218d565b949350505050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52602160045260245ffd"; + hex"608060405260043610610034575f3560e01c806301ffc9a71461003d578063691f9ed714610070578063ea37cc511461008f57005b3661003b57005b005b348015610048575f80fd5b5061005c61005736600461179e565b6100a2565b604051901515815260200160405180910390f35b34801561007b575f80fd5b5061003b61008a3660046117d9565b6100f3565b61003b61009d36600461187b565b610148565b5f6001600160e01b0319821663691f9ed760e01b14806100d257506001600160e01b0319821663ea37cc5160e01b145b806100ed57506301ffc9a760e01b6001600160e01b03198316145b92915050565b61010186868686868661040a565b6101408683838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061046f92505050565b505050505050565b610150610520565b61015f61015c82611b8c565b50565b61016c6080830183611c48565b90505f0361018d57604051639c95219f60e01b815260040160405180910390fd5b6001600160a01b038316732eb98f9489cff4a429368e389f5ffc6f8d9c5ede146101da5760405163516e822d60e01b81526001600160a01b03841660048201526024015b60405180910390fd5b5f6101e86080840184611c48565b5f8181106101f8576101f8611c8e565b905060200281019061020a9190611ca2565b6102149080611cc0565b610222906040810190611cd4565b61022f6080860186611c48565b5f81811061023f5761023f611c8e565b90506020028101906102519190611ca2565b6020013581811061026457610264611c8e565b61027a9260206040909202019081019150611d1a565b90505f61028a6080850185611c48565b5f81811061029a5761029a611c8e565b90506020028101906102ac9190611ca2565b6102b69080611cc0565b6102c4906060810190611cd4565b6102d16080870187611c48565b5f8181106102e1576102e1611c8e565b90506020028101906102f39190611ca2565b6040013581811061030657610306611c8e565b61031c9260206040909202019081019150611d1a565b90506103336001600160a01b038316865f1961054e565b60405163b0460f0760e01b81526001600160a01b0386169063b0460f079061035f908790600401611fe2565b60408051808303815f875af115801561037a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061039e91906121a4565b506103b590506001600160a01b038316865f61054e565b6103da6103c184611b8c565b836103cb856105c8565b846103d5866105c8565b61064c565b505061040560017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054600214801561044f575033732eb98f9489cff4a429368e389f5ffc6f8d9c5ede14155b156101405760405163f6688adf60e01b81523360048201526024016101d1565b5f805f8380602001905181019061048691906121c6565b919450925090506001600160a01b0383166104b4576040516398521dc560e01b815260040160405180910390fd5b6001600160a01b0382166104db5760405163456ac4c360e11b815260040160405180910390fd5b6104f06001600160a01b038616845f1961054e565b6105046001600160a01b03831682476108eb565b506105196001600160a01b038616845f61054e565b5050505050565b6105286109b8565b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b61055a8383835f6109fc565b6104055761056b83835f60016109fc565b61059357604051635274afe760e01b81526001600160a01b03841660048201526024016101d1565b6105a083838360016109fc565b61040557604051635274afe760e01b81526001600160a01b03841660048201526024016101d1565b5f6105d1610a5e565b6040516354636d2b60e01b81526001600160a01b038316600482015273200e12d10bb0c5e4a17e7018f0f1161919bb9389906354636d2b906024016020604051808303815f875af1158015610628573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100ed9190612261565b6040805160018082528183019092525f91816020015b6060815260200190600190039081610662575050604080516003808252608082019092529192505f919060208201606080368337019050506040516370a0823160e01b81523060048201529091505f906001600160a01b038816906370a0823190602401602060405180830381865afa1580156106e1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107059190612281565b90508015610721576107216001600160a01b0388163383610ae9565b5f61072c8288610af6565b50905080835f8151811061074257610742611c8e565b602090810291909101015250506040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015610793573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107b79190612281565b905080156107d3576107d36001600160a01b0386163383610ae9565b5f6107de8286610af6565b50905080836001815181106107f5576107f5611c8e565b6020908102919091010152504790508015610814576108143382610b37565b5f610820826012610af6565b509050808360028151811061083757610837611c8e565b602002602001018181525050505080825f8151811061085857610858611c8e565b60209081029190910101526040805160018082528183019092525f91816020015b6040805160a0810182525f918101828152606080830193909352608082018390528152602081019190915281526020019060019003908161087957905050905087815f815181106108cc576108cc611c8e565b60200260200101819052506108e18382610b95565b5050505050505050565b6060814710156109175760405163cf47918160e01b8152476004820152602481018390526044016101d1565b5f610923858486610ddd565b905080801561094457505f3d118061094457505f856001600160a01b03163b115b1561095957610951610df2565b9150506109b1565b801561098357604051639996b31560e01b81526001600160a01b03861660048201526024016101d1565b3d1561099657610991610e0b565b6109af565b60405163d6bda27560e01b815260040160405180910390fd5b505b9392505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00546002036109fa57604051633ee5aeb560e01b815260040160405180910390fd5b565b60405163095ea7b360e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610a52578383151615610a46573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b73200e12d10bb0c5e4a17e7018f0f1161919bb93893b1580610ab5575073200e12d10bb0c5e4a17e7018f0f1161919bb93893f7f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d4114155b156109fa576040516373e6d7b360e01b815273200e12d10bb0c5e4a17e7018f0f1161919bb938960048201526024016101d1565b6105a08383836001610e16565b5f805f805f610b058787610e60565b9250925092505f80610b178585610ebc565b9150915081838015610b265750815b9650965050505050505b9250929050565b80471015610b615760405163cf47918160e01b8152476004820152602481018290526044016101d1565b610b7a828260405180602001604052805f815250610ddd565b15610b83575050565b3d1561099657610b91610e0b565b5050565b60408051600480825260a082019092525f91816020015b6060815260200190600190039081610bac5790505090505f5b8351811015610c0d57838181518110610be057610be0611c8e565b6020026020010151828281518110610bfa57610bfa611c8e565b6020908102919091010152600101610bc5565b50335f8181523060209081526040808320815160a0810183528083018581526060808301879052608083018190529082528185015282518581529384018581528484019093529093909291905b8751811015610dd257878181518110610c7557610c75611c8e565b602002602001015193505f845f015160400151511115610dca575f845f01515f01516001600160a01b031663d04dfe236040518060e00160405280885f0151602001516001600160a01b03168152602001898152602001885f01516040015181526020015f8152602001610ced8c8a6020015161112f565b8152602001878152602001868152506040518263ffffffff1660e01b8152600401610d18919061234d565b5f60405180830381865afa158015610d32573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610d599190810190612445565b9150505f81511115610dc85784516020015160405163012c676d60e21b81526001600160a01b03909116906304b19db490610d9a908a9085906004016124fb565b5f604051808303815f87803b158015610db1575f80fd5b505af1158015610dc3573d5f803e3d5ffd5b505050505b505b600101610c5a565b505050505050505050565b5f805f83516020850186885af1949350505050565b6040513d81523d5f602083013e3d602001810160405290565b6040513d5f823e3d81fd5b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610a52578383151615610a46573d5f823e3d81fd5b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff861115610eab57600a860460018201600a88065f1493509350935050610eb5565b8593509150600190505b9250925092565b5f808383601b82900b821480611007577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e1000000000000000000870515610f3d577f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000870515610f2e576305f5e10087059650600886019550610f3d565b620186a0870596506005860195505b8687601b0b14610f5857600a87059650856001019550610f3d565b7b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc7b1999999999999999999999999999999999999999999999999999999888820111611001575f600188039050808160030b03610fff5760e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff7b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff60ff8b901d18161795505f9450610b309350505050565b505b5061101e565b865f0361101e57505f935060019250610b30915050565b858660030b146110d5575f82131561107d5761103a8383611502565b156110625760405163d556b11160e01b815260048101849052602481018390526044016101d1565b637ffffffe19909501600a0a82029550637fffffff946110d5565b637fffffff19869003604381131561109f57505f9450849350610b3092505050565b80600a0a88816110b1576110b161251b565b059750875f036110cb57505f9450849350610b3092505050565b50637fffffff1995505b8186136110e557600193506110fe565b818603600a0a83816110f9576110f961251b565b071593505b5050507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff841660e084901b1791509250929050565b60605f825167ffffffffffffffff81111561114c5761114c6118f9565b604051908082528060200260200182016040528015611175578160200160208202803683370190505b5090505f835167ffffffffffffffff811115611193576111936118f9565b6040519080825280602002602001820160405280156111bc578160200160208202803683370190505b5090505f808551116111ce575f6111d4565b84516002015b86516001010190505f8167ffffffffffffffff8111156111f6576111f66118f9565b60405190808252806020026020018201604052801561122957816020015b60608152602001906001900390816112145790505b5090505f61124d604080516002815233602082015230818301526060810190915290565b82828151811061125f5761125f611c8e565b60200260200101819052505f5b88518110156112bc57818060010192505088818151811061128f5761128f611c8e565b60200260200101518383815181106112a9576112a9611c8e565b602090810291909101015260010161126c565b508651156114f7578080600101915050848282815181106112df576112df611c8e565b602002602001018190525080806001019150508382828151811061130557611305611c8e565b60200260200101819052505f5b87518110156114f55761140888828151811061133057611330611c8e565b60200260200101515f01516113e58a848151811061135057611350611c8e565b6020026020010151602001516113c68c868151811061137157611371611c8e565b60200260200101518051604091820151805160209081029181019190912083517f6ec4dff745ec96dbde88c5d41f8aa5ac13aa1664afb47b8406b44fa945a650c8815291820192909252918201526060902090565b60405161190160f01b8152600281019290925260228201526042902090565b8a84815181106113f7576113f7611c8e565b60200260200101516060015161151d565b61142857604051630a57f30960e31b8152600481018290526024016101d1565b87818151811061143a5761143a611c8e565b60200260200101515f01516001600160a01b03165f1b86828151811061146257611462611c8e565b60200260200101818152505087818151811061148057611480611c8e565b60200260200101516020015185828151811061149e5761149e611c8e565b60200260200101818152505081806001019250508781815181106114c4576114c4611c8e565b6020026020010151604001518383815181106114e2576114e2611c8e565b6020908102919091010152600101611312565b505b509695505050505050565b5f6109b15f84126115135783611517565b835f035b8361158d565b5f836001600160a01b03163b5f0361157b575f8061153b858561162b565b5090925090505f8160038111156115545761155461252f565b1480156115725750856001600160a01b0316826001600160a01b0316145b925050506109b1565b611586848484611671565b90506109b1565b5f637ffffff582136115a057505f6100ed565b637ffffffe19820160438113156115bb5750508115156100ed565b5f81126115fb5780600a0a7b80000000000000000000000000000000000000000000000000000001816115f0576115f061251b565b0484119150506100ed565b805f03600a0a7b800000000000000000000000000000000000000000000000000000020284101591505092915050565b5f805f8351604103611662576020840151604085015160608601515f1a611654888285856116d6565b955095509550505050610eb5565b505081515f9150600290610eb5565b805160408051630b135d3f60e11b8082526004820186905260248201929092525f92906020820185604483015e5f82606483010152601f820160051c60051b915060205f60648401838a5afa9050825f5114601f3d1116811693505050509392505050565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084111561170f57505f91506003905082611794565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015611760573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b03811661178b57505f925060019150829050611794565b92505f91508190505b9450945094915050565b5f602082840312156117ae575f80fd5b81356001600160e01b0319811681146109b1575f80fd5b6001600160a01b038116811461015c575f80fd5b5f805f805f8060a087890312156117ee575f80fd5b86356117f9816117c5565b95506020870135611809816117c5565b94506040870135935060608701359250608087013567ffffffffffffffff80821115611833575f80fd5b818901915089601f830112611846575f80fd5b813581811115611854575f80fd5b8a6020828501011115611865575f80fd5b6020830194508093505050509295509295509295565b5f805f6060848603121561188d575f80fd5b8335611898816117c5565b9250602084013567ffffffffffffffff808211156118b4575f80fd5b9085019060c082880312156118c7575f80fd5b909250604085013590808211156118dc575f80fd5b508401604081870312156118ee575f80fd5b809150509250925092565b634e487b7160e01b5f52604160045260245ffd5b6040516080810167ffffffffffffffff81118282101715611930576119306118f9565b60405290565b6040805190810167ffffffffffffffff81118282101715611930576119306118f9565b6040516060810167ffffffffffffffff81118282101715611930576119306118f9565b604051601f8201601f1916810167ffffffffffffffff811182821017156119a5576119a56118f9565b604052919050565b5f67ffffffffffffffff8211156119c6576119c66118f9565b50601f01601f191660200190565b5f82601f8301126119e3575f80fd5b81356119f66119f1826119ad565b61197c565b818152846020838601011115611a0a575f80fd5b816020850160208301375f918101602001919091529392505050565b5f67ffffffffffffffff821115611a3f57611a3f6118f9565b5060051b60200190565b5f82601f830112611a58575f80fd5b81356020611a686119f183611a26565b82815260059290921b84018101918181019086841115611a86575f80fd5b8286015b848110156114f757803567ffffffffffffffff80821115611aa9575f80fd5b908801906080828b03601f19011215611ac0575f80fd5b611ac861190d565b86830135611ad5816117c5565b815260408381013588830152606084013583811115611af2575f80fd5b8401603f81018d13611b02575f80fd5b88810135611b126119f182611a26565b81815260059190911b82018301908a8101908f831115611b30575f80fd5b928401925b82841015611b4e5783358252928b0192908b0190611b35565b80858701525050505050608083013582811115611b69575f80fd5b611b778c89838701016119d4565b60608301525085525050918301918301611a8a565b5f60408236031215611b9c575f80fd5b611ba4611936565b823567ffffffffffffffff80821115611bbb575f80fd5b818501915060608236031215611bcf575f80fd5b611bd7611959565b8235611be2816117c5565b81526020830135611bf2816117c5565b6020820152604083013582811115611c08575f80fd5b611c14368286016119d4565b60408301525083526020850135915080821115611c2f575f80fd5b50611c3c36828601611a49565b60208301525092915050565b5f808335601e19843603018112611c5d575f80fd5b83018035915067ffffffffffffffff821115611c77575f80fd5b6020019150600581901b3603821315610b30575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235607e19833603018112611cb6575f80fd5b9190910192915050565b5f8235609e19833603018112611cb6575f80fd5b5f808335601e19843603018112611ce9575f80fd5b83018035915067ffffffffffffffff821115611d03575f80fd5b6020019150600681901b3603821315610b30575f80fd5b5f60208284031215611d2a575f80fd5b81356109b1816117c5565b5f808335601e19843603018112611d4a575f80fd5b830160208101925035905067ffffffffffffffff811115611d69575f80fd5b8060051b3603821315610b30575f80fd5b5f808335601e19843603018112611d8f575f80fd5b830160208101925035905067ffffffffffffffff811115611dae575f80fd5b803603821315610b30575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f8135611df0816117c5565b6001600160a01b039081168452602083013590611e0c826117c5565b166020840152611e1f6040830183611d7a565b60606040860152611e34606086018284611dbc565b95945050505050565b5f808335601e19843603018112611e52575f80fd5b830160208101925035905067ffffffffffffffff811115611e71575f80fd5b8060061b3603821315610b30575f80fd5b8183525f60208085019450825f5b85811015611ec8578135611ea3816117c5565b6001600160a01b03168752818301358388015260409687019690910190600101611e90565b509495945050505050565b5f8235607e19833603018112611ee7575f80fd5b90910192915050565b8183526020808401935f91600585811b8301820185855b88811015611fd457858303601f19018a52611f228289611ed3565b60808135611f2f816117c5565b6001600160a01b0316855281870135878601526040611f5081840184611d35565b8383890152808489015260a093507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811115611f8a575f80fd5b881b91508181888501375085016060611fa584820185611d7a565b9450838884030182890152611fbd8484018683611dbc565b9e8a019e9750505093870193505050600101611f07565b509098975050505050505050565b5f602080835260e08301843582850152818501356040850152606060408601356060860152606086013580151580821461201a575f80fd5b60809150806080880152506120326080880188611d35565b60c060a08901529384905261010093848801600582901b89018601835f5b8481101561216b578b830360ff1901845261206b8287611ed3565b8035609e1982360301811261207e575f80fd5b8885528101803561208e816117c5565b6001600160a01b0316858a0152808c013536829003605e190181126120b1575f80fd5b60a0808701526120c76101208701838301611de4565b90506120d66040830183611e3d565b607f19808985030160c08a01526120ee848385611e82565b93506120fc8e860186611e3d565b93509150808985030160e08a015250612116838383611e82565b92505050898201358c8701528c8301358d870152604083013560408701526121408b840184611d35565b935091508581038b870152612156818484611ef0565b968d019695505050918a019150600101612050565b505061217a60a08c018c611d7a565b8b8303601f190160c08d015298509650612195818989611dbc565b9b9a5050505050505050505050565b5f80604083850312156121b5575f80fd5b505080516020909101519092909150565b5f805f606084860312156121d8575f80fd5b83516121e3816117c5565b60208501519093506121f4816117c5565b604085015190925067ffffffffffffffff811115612210575f80fd5b8401601f81018613612220575f80fd5b805161222e6119f1826119ad565b818152876020838501011115612242575f80fd5b8160208401602083015e5f602083830101528093505050509250925092565b5f60208284031215612271575f80fd5b815160ff811681146109b1575f80fd5b5f60208284031215612291575f80fd5b5051919050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f815180845260208085019450602084015f5b83811015611ec8578151875295820195908201906001016122d9565b5f8282518085526020808601955060208260051b840101602086015f5b8481101561234057601f1986840301895261232e8383516122c6565b98840198925090830190600101612312565b5090979650505050505050565b602081526001600160a01b038251166020820152602082015160408201525f604083015160e06060840152612386610100840182612298565b9050606084015160808401526080840151601f19808584030160a08601526123ae83836122f5565b925060a08601519150808584030160c08601526123cb83836122c6565b925060c08601519150808584030160e086015250611e3482826122c6565b5f82601f8301126123f8575f80fd5b815160206124086119f183611a26565b8083825260208201915060208460051b870101935086841115612429575f80fd5b602086015b848110156114f7578051835291830191830161242e565b5f8060408385031215612456575f80fd5b825167ffffffffffffffff8082111561246d575f80fd5b818501915085601f830112612480575f80fd5b815160206124906119f183611a26565b82815260059290921b840181019181810190898411156124ae575f80fd5b948201945b838610156124cc578551825294820194908201906124b3565b918801519196509093505050808211156124e4575f80fd5b506124f1858286016123e9565b9150509250929050565b828152604060208201525f61251360408301846122c6565b949350505050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52602160045260245ffd"; /// @dev What MUST already be on a network before this release can be /// broadcast there: an address, and the runtime code that belongs at it. /// `abi.encode`d as a `DeployDependency[]` because Solidity has no /// file-scope constant of dynamic array type. bytes constant DEPENDENCIES = - hex"0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000005220000000000000000000000000c4cf8f35f6fa0a36cbaea5c0a6cea77134c03e2a000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000051806080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a7146117cf575080631f69cb75146115725780632cb77e9f146115465780632fbc4ba0146113fc57806341d1514f146113c55780635cffe9de1461126957806360746119146110e5578063613255ab1461106257806369c7285614610771578063709fb8a5146104375780639235084d146103e3578063ac9650d814610295578063d7e442ec14610237578063d9d98ce4146101865763fa501182146100c1575f80fd5b34610182576101403660031901126101825767ffffffffffffffff600435818111610182576100f4903690600401611b64565b6024358281116101825761010c903690600401611b64565b60c0366043190112610182576101043583811161018257610131903690600401611d0a565b90610124359384116101825761014e61015c943690600401611d0a565b926101576126ea565b612230565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b5f80fd5b34610182576040366003190112610182576001600160a01b036101a7611853565b166040516370a0823160e01b8152306004820152602081602481855afa90811561022c575f916101fa575b50156101e25760206040515f8152f35b60249060405190633c5bf76960e21b82526004820152fd5b90506020813d602011610224575b81610215602093836119d3565b810103126101825751826101d2565b3d9150610208565b6040513d5f823e3d90fd5b346101825760203660031901126101825760043567ffffffffffffffff81116101825761028f61026e61015c923690600401611822565b91906102786126ea565b60405192610285846119b7565b5f84523691611dde565b90612b82565b34610182576020806003193601126101825760043567ffffffffffffffff8111610182576102c7903690600401611822565b9190604051926102d6846119b7565b5f84528284016102e582611ab7565b946102f360405196876119d3565b8286526102ff83611ab7565b9361031186880195601f190186612214565b5f5b84811061037557604080518881528951818a018190525f92600582901b83018101918a918c9085015b8287106103495785850386f35b909192938280610365600193603f198a820301865288516118df565b960192019601959291909261033c565b806103c4886103be61039160019560059d9c9d1b8701876120f4565b929089846040519586938585013782018381015f81528b519283915e015f838201520380845201826119d3565b306139f0565b6103ce828a611fda565b526103d98189611fda565b5001969596610313565b3461018257600319602036820112610182576004359067ffffffffffffffff82116101825760809082360301126101825761042260609160040161213c565b90604051921515835260208301526040820152f35b34610182576003196040368201126101825760043567ffffffffffffffff8082116101825760c0826004019383360301126101825760243590811161018257610484903690600401611822565b9061048d6126ea565b6104be6104b96104b46104ad6104a38880612127565b60408101906120f4565b36916119f5565b613986565b6139db565b801561075f576001101561074d57602483016104da8186611f47565b90501561073b5760448401946104f08682611f47565b9050156107295761055661051e9661054a61051561050e8580612127565b9585611f47565b99909285611f47565b91909261053b6040519761053189611903565b3389523690611a59565b9a60209b8c8901523691611acf565b60408601523691611acf565b60608301526064850135608083015261056e8261272c565b91825f525f875260405f209586541596876105b2575b888860017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055604051908152f35b6001905560a46001600160a01b03917f87491344dfbcf91f6cbbc610cbbeedc85313d37a02df0c93527f7ea5f8db717f83855116604051908152878c82015260606040820152806106066060820188612042565b0390a1019161061583856120f4565b9050610679575b5050505061066d929161066561064e61028f933390919060405192600284526020840152604083015260608201604052565b906040519160018352602083015260408201604052565b923691611dde565b82808080808080610584565b6106866104ad84866120f4565b61068f81614777565b156107025750937fd46c2c56b35c8210e9e712ec3f02242d5fc90187c0ac8ed80cc33626846ec3698961066d9897956106f56106d86106659761064e9761028f9b5116936120f4565b866040519586958652850152606060408501526060840191611d39565b0390a1938395965061061c565b89610725604051928392630c89984b60e31b8452600484015260248301906118df565b0390fd5b60405163540e5f0b60e01b8152600490fd5b604051636c44ef8f60e01b8152600490fd5b604051633c8270bd60e21b8152600490fd5b604051632cff108b60e21b8152600490fd5b34610182576003196020368201126101825767ffffffffffffffff600435116101825760c09060043536030112610182576107aa6126ea565b5f80806107bf60048035608481019101611e90565b9050156110505760246004350135926107d784612791565b1561103e576060806040516107eb8161196b565b6107f3611ee5565b81525f60208201525f6040820152015261080b611ee5565b5061086b61086661084561083b61083561082f608460043501600435600401611e90565b90611f17565b80611f32565b6040810190611f47565b602061085e61082f608460043501600435600401611e90565b013591611f7d565b611d25565b936001600160a01b036108ba6108666108a161089761083561082f608460043501600435600401611e90565b6060810190611f47565b604061085e61082f608460043501600435600401611e90565b81604051976108c889611933565b16875216602086015260408501526108ea608460043501600435600401611e90565b9490506001604051955f87520160051b85016040525f905f5b610917608460043501600435600401611e90565b905081108061102b575b15610e785761093a608460043501600435600401611e90565b821015610e64578160051b810135607e1982360301811215610182576080818301360312610182576040519161096f8361196b565b8181013567ffffffffffffffff81116101825761099190369084840101611b64565b835280820160208181013590850152604080820135908501526060013567ffffffffffffffff8111610182576109ca9236920101611d0a565b606082015280516001600160a01b036109ec6040830151602085015190611fda565b5151166001600160a01b0385511614801590610e30575b610e1e57610a1b6020830151604084015190836130d2565b610a248161272c565b91825f525f60205260405f2054155f14610a88575051604080513381526001600160a01b039092166020830152810191909152600191907fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f390606090a15b01610903565b9190610ab9602084979597015160408501519060608601519060405192610aae846119b7565b5f8452339186613107565b925f93610ad1606082015160446004350135906127b4565b15610b3857505051604080513381526001600160a01b03909216602083015281019190915260019291907fe3151dc8cb7a54ffc4baabd28c1f241c94d510b5e5b502491ac3cad6c16316d590606090a15b8115610b30575b5092610a82565b905088610b29565b610b456040820151612791565b158015610e0b575b15610ba257505051604080513381526001600160a01b03909216602083015281019190915260019291907f500b713857325f9e6dcb52ae832eca9109d107ed1aae9cb4928b4c1e13f051aa90606090a1610b22565b9250925050600196959691610bbb606460043501611fee565b15610d785796610c2b97610c3b60408401516040880151610bdc8183613460565b15610d705750925b610c35848592610c1e610c1860608a01516001600160e01b03601b918660e01d92828816810b928260e01d9216900b613e30565b90613feb565b9d8e9260408d015161352b565b60408c0152613555565b99613555565b98610c46848461357f565b610c5084826135dd565b60405192338452608060208501526060610c768451608080880152610100870190612042565b93602081015160a0870152604081015160c0870152015192607f198582030160e0860152835180825260208201906020808260051b8501019601925f5b828110610d1257505050505092806001979695937f194f1feb3b4d7076a2c272e774e792e0c48bb8c7aa1a9a3671c1cd6da9e6b4c193610d0d96604084015260608301520390a180858c5101808d5260051b8c01526136ef565b610b22565b9091929396602080610d63600193601f198782030189528b51906001600160a01b0382511681526040610d528584015160608785015260608401906120c1565b9201519060408184039101526118df565b9901950193929101610cb3565b905092610be4565b610c2b90610c3b6060840151610c35610db6610c1860408801516001600160e01b0394601b90868360e01d9316820b91878260e01d9216900b613e30565b60408a0151610dc58183613460565b15610e035750915b829c8d916060890151908116155f14610df4575060408801515b96879460408d015161352b565b610dfe9085613487565b610de7565b905091610dcd565b50610e19606082015161343d565b610b4d565b60405163936bb5ad60e01b8152600490fd5b506001600160a01b03610e4c6060830151604085015190611fda565b5151166001600160a01b036020860151161415610a03565b634e487b7160e01b5f52603260045260245ffd5b50919390610e8a606460043501611fee565b1561102557835b6004356004013590610ea38282613460565b6110075750508490610ec3856001600160a01b0360208701511633613069565b505060a46004350190610edb826004356004016120f4565b905015159081610fff575b50610f5e575b506001600160a01b03610f0292935116336127db565b50505b8351811015610f2a5780610f24610f1e60019387611fda565b516138c8565b01610f05565b5060409160017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005582519182526020820152f35b90506001600160a01b03602084015116610f886001600160a01b03855116926004356004016120f4565b929091333b1561018257610fd05f93604051958694859463691f9ed760e01b8652600486015260248501528960448501528a606485015260a0608485015260a4840191611d39565b038183335af190811561022c57859115610eec579050610ff09150611987565b5f836001600160a01b03610eec565b905088610ee6565b604492506040519163573b6f4160e01b835260048301526024820152fd5b84610e91565b506110396040830151612791565b610921565b60405163315f9e2360e21b8152600490fd5b604051639c95219f60e01b8152600490fd5b3461018257602080600319360112610182576024816001600160a01b03611087611853565b16604051928380926370a0823160e01b82523060048301525afa90811561022c575f916110b8575b50604051908152f35b90508181813d83116110de575b6110cf81836119d3565b810103126101825751826110af565b503d6110c5565b34610182576110f336611893565b92916111009491946126ea565b61110b83833361275d565b61111481612791565b15611238578160ff9161112c856111ef969533612d9c565b6111368183613460565b15611232575080935b61114b8582853361300b565b917f8045c25080b0868951141ed0a91720bcad09a8364a2b3109ee1fd49c1f0bc8b860c061117a898833613069565b97906001600160a01b0360405192338452169a8b6020840152856040840152886060840152608083015260a0820152a16040519660068852602088015260408701526060860152608085015260a08401521660c082015260e08101604052906040519160018352602083015260408201604052565b908061121b5760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b61122a9261028f913691611dde565b80808061015c565b9361113f565b50604051623a3a4d60e21b81523360048201526001600160a01b039190911660248201526044810191909152606490fd5b34610182576080366003190112610182576004356001600160a01b039081811680910361018257611298611869565b6044359167ffffffffffffffff916064358381116101825736602382011215610182578060040135938411610182573660248583010111610182576113259560209216936112e7868587612f2c565b60405196879283926323e30c8b60e01b84523360048501528760248501528860448501525f606485015260a06084850152602460a485019201611d39565b03815f855af193841561022c575f94611391575b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd984036113785761136d93503091612fa5565b602060405160018152f35b604051630b6c58a960e31b815260048101859052602490fd5b9093506020813d6020116113bd575b816113ad602093836119d3565b8101031261018257519284611339565b3d91506113a0565b346101825760603660031901126101825760206113f46113e3611853565b6113eb611869565b60443591612d9c565b604051908152f35b346101825761140a36611893565b928094926114166126ea565b61142182853361275d565b61142a81612791565b15611516578061143e61148d9286336127db565b9790957f7f9dfa19cf1cc2f806f2f860fbc9c056b601fb1afc0e9b843dfe5c63616268e660806040513381526001600160a01b038416998a60208301528560408301526060820152a133612881565b939091856114bb5760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b61150a9661028f956106659460ff93604051956005875260208701526040860152606085015260808401521660a082015260c08101604052906040519160018352602083015260408201604052565b8080808080808061015c565b506040516306dde9c360e41b81523360048201526001600160a01b03841660248201526044810191909152606490fd5b34610182576020366003190112610182576004355f525f6020526020600160405f205414604051908152f35b34610182576003196040368201126101825767ffffffffffffffff9060043582811161018257806004019160a08236039182011261018257602435848111610182576115c2903690600401611822565b90936115cc6126ea565b5f946001600160a01b0394856115e184611d25565b1633036117ad576115fa6115f53685611b64565b61272c565b805f525f60205260405f20966001885414611641575b60208960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556040519015158152f35b9091929394959697505f6001985560405196338852826020890152606060408901528161166d8761187f565b166060890152602484013590606219018112156101825783019060a060808901528061169b6004840161187f565b166101008901526116ae6024830161187f565b16610120880152604481013560221982360301811215610182570190602460048301359201988211610182578136038913610182577f09d18501db0080ca2d6cd7c17fa7255daff4b2d503ea93b76ff68b6752ea8e63878061066595608461177661028f9a60209f611735906117a09f9a606061014061064e9d0152610160880191611d39565b61176761175c6117486044880185611d59565b605f198a8603810160a08c01529491611d8e565b926064870190611d59565b918784030160c0880152611d8e565b91013560e08301520390a13390919060405192600284526020840152604083015260608201604052565b8280808080808080611610565b6024866117b985611d25565b6040516335252be360e01b815291166004820152fd5b34610182576020366003190112610182576004359063ffffffff60e01b82168092036101825760209163e414309160e01b8114908115611811575b5015158152f35b6301ffc9a760e01b1490508361180a565b9181601f840112156101825782359167ffffffffffffffff8311610182576020808501948460051b01011161018257565b600435906001600160a01b038216820361018257565b602435906001600160a01b038216820361018257565b35906001600160a01b038216820361018257565b906080600319830112610182576004356001600160a01b0381168103610182579160243591604435916064359067ffffffffffffffff8211610182576118db91600401611822565b9091565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b60a0810190811067ffffffffffffffff82111761191f57604052565b634e487b7160e01b5f52604160045260245ffd5b6060810190811067ffffffffffffffff82111761191f57604052565b6040810190811067ffffffffffffffff82111761191f57604052565b6080810190811067ffffffffffffffff82111761191f57604052565b67ffffffffffffffff811161191f57604052565b60e0810190811067ffffffffffffffff82111761191f57604052565b6020810190811067ffffffffffffffff82111761191f57604052565b90601f8019910116810190811067ffffffffffffffff82111761191f57604052565b92919267ffffffffffffffff821161191f5760405191611a1f601f8201601f1916602001846119d3565b829481845281830111610182578281602093845f960137010152565b9080601f8301121561018257816020611a56933591016119f5565b90565b91906060838203126101825760405190611a7282611933565b8193611a7d8161187f565b8352611a8b6020820161187f565b602084015260408101359167ffffffffffffffff831161018257604092611ab29201611a3b565b910152565b67ffffffffffffffff811161191f5760051b60200190565b929192611adb82611ab7565b604092611aeb60405192836119d3565b819581835260208093019160061b84019381851161018257915b848310611b1457505050505050565b8583830312610182578386918251611b2b8161194f565b611b348661187f565b81528286013583820152815201920191611b05565b9080601f8301121561018257816020611a5693359101611acf565b91909160a0818403126101825760405190611b7e82611903565b8193611b898261187f565b835267ffffffffffffffff9160208101358381116101825782611bad918301611a59565b602085015260408101358381116101825782611bca918301611b49565b6040850152606081013592831161018257611beb6080939284938301611b49565b60608501520135910152565b909291611c0384611ab7565b916040611c1360405194856119d3565b839580855260208095019160059160051b8401948086116101825784935b868510611c42575050505050505050565b67ffffffffffffffff90853582811161018257870190606082850312610182578451611c6d81611933565b611c768361187f565b81528a83013584811161018257830185601f8201121561018257803590611c9c82611ab7565b91611ca9895193846119d3565b8083528d808401918b1b83010191888311610182578e809101915b838310611cfa57509150508201528583013593841161018257611ceb858c95869501611a3b565b86820152815201940193611c31565b82358152918101918f9101611cc4565b9080601f8301121561018257816020611a5693359101611bf7565b356001600160a01b03811681036101825790565b908060209392818452848401375f828201840152601f01601f1916010190565b9035601e198236030181121561018257016020813591019167ffffffffffffffff8211610182578160061b3603831361018257565b9190808252602080920192915f905b828210611dab575050505090565b909192936001906001600160a01b03611dc38761187f565b16815285830135838201526040908101950193920190611d9d565b90929192611deb81611ab7565b91604091611dfc60405194856119d3565b839581855260208095019160051b8301938185116101825783925b858410611e275750505050505050565b67ffffffffffffffff908435828111610182578601908382860312610182578351611e518161194f565b82358481116101825786611e66918501611a59565b81528983013593841161018257611e81868b95869501611d0a565b83820152815201930192611e17565b903590601e1981360301821215610182570180359067ffffffffffffffff821161018257602001918160051b3603831361018257565b60405190611ed382611933565b60606040835f81525f60208201520152565b60405190611ef282611903565b5f608083828152611f01611ec6565b6020820152606060408201526060808201520152565b9015610e6457803590607e1981360301821215610182570190565b903590609e1981360301821215610182570190565b903590601e1981360301821215610182570180359067ffffffffffffffff821161018257602001918160061b3603831361018257565b9190811015610e645760061b0190565b805115610e645760200190565b805160011015610e645760400190565b805160021015610e645760600190565b805160031015610e645760800190565b805160041015610e645760a00190565b8051821015610e645760209160051b010190565b3580151581036101825790565b9081518082526020808093019301915f5b82811061201a575050505090565b835180516001600160a01b03168652820151858301526040909401939281019260010161200c565b906080806120b86120a661209460406001600160a01b0380895116885260208901519060a060208a01528082511660a08a015260208201511660c08901520151606060e08801526101008701906118df565b60408701518682036040880152611ffb565b60608601518582036060870152611ffb565b93015191015290565b9081518082526020808093019301915f5b8281106120e0575050505090565b8351855293810193928101926001016120d2565b903590601e1981360301821215610182570180359067ffffffffffffffff82116101825760200191813603831361018257565b903590605e1981360301821215610182570190565b6121536115f561214c8380611f32565b3690611b64565b5f525f602052600160405f2054036121ef5780612173816121df93611f32565b6121d76121926121976020850135938460408701359384923690611b64565b6130d2565b6121af6121a48580611f32565b946060810190611e90565b92906121cf604051966121c1886119b7565b5f88525f3681373690611b64565b933691611bf7565b923392613107565b6040810151606090910151600192565b505f905f905f90565b5f5b60808110612206575050565b6060828201526020016121fa565b5f5b82811061222257505050565b606082820152602001612216565b926001600160a01b038451166001600160a01b03835116146126d8576001600160a01b03612265606086015160643590611fda565b515116906040830151916001600160a01b036122846084358095611fda565b51511614801590612698575b610e1e576040850151906001600160a01b036122af6044358094611fda565b5151166001600160a01b036122ca60643560608a0151611fda565b51511614612686576122db8661272c565b805f525f60205260405f20541561263357506122f68461272c565b805f525f60205260405f2054156125df57506123d992916123b3917f6fa7f4c28634b0a9d6831401c45ae468195fb63aed07308935c35374ff5d9e396040518061235e61235061012033845280602085015283018d612042565b82810360408401528a612042565b85606083015260643560808301528760a083015260a43560c083015260c43560e083015260e4356101008301520390a16001600160a01b03865116604051926123a6846119b7565b5f8452606435908a613107565b936001600160a01b03865116604051926123cc846119b7565b5f845260a4359086613107565b916123e76040820151612791565b1580156125cb575b80156125b8575b80156125a5575b612593576040519161240e8361196b565b5f83525f60208401525f60408401525f606084015261242d848361479b565b84526040840152612453612441838661479b565b6020860152806060860152845161352b565b94612467602085015160408601519061352b565b936124718761343d565b8015612584575b6125725761253961256b957fd9fa84dd790c969daa5c33d8050dc06b4a9b59d5b42e2be5f5e8ae20447f618d9461251b6125709a60a0966124ba8a885161357f565b6124c88c602089015161357f565b6124d68a60408901516135dd565b6124e48c60608901516135dd565b6124ed8a6138c8565b6124f68c6138c8565b6001600160a01b0361251260c435926060606435910151611fda565b51511633612881565b50506001600160a01b0361251260e43592606060a435910151611fda565b5050606060405191338352805160208401526020810151604084015260408101518284015201516080820152a16136ef565b6136ef565b565b604051630d86822160e01b8152600490fd5b5061258e8561343d565b612478565b6040516321badf1f60e01b8152600490fd5b506125b3606084015161343d565b6123fd565b506125c6606082015161343d565b6123f6565b506125d96040840151612791565b156123ef565b9351604080513381526001600160a01b039092166020830152810194909452507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f3945091925082915050606081015b0390a1565b9551604080513381526001600160a01b039092166020830152810196909652507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f39493508392505060608201905061262e565b604051631cd2f1c760e21b8152600490fd5b506001600160a01b036126b2606085015160a43590611fda565b5151166001600160a01b036126ce604088015160443590611fda565b5151161415612290565b604051630a98f1f360e21b8152600490fd5b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00600281541461271a5760029055565b604051633ee5aeb560e01b8152600490fd5b604051612757816127496020820194602086526040830190612042565b03601f1981018352826119d3565b51902090565b909115612768575050565b6040516305dbdfd960e41b81526001600160a01b03918216600482015291166024820152604490fd5b6127b0905f60e01d906001600160e01b038160e01d9116601b0b6147fe565b1290565b906127b0916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b61487f565b9291926127e782613ac3565b936127f18161343d565b61286f5784816001600160e01b036128109360e01d9116601b0b6148fe565b9290809315612846575b5082908161282a575b5050509190565b61283e926001600160a01b03309216612fa5565b5f8181612823565b9092505f19811461285b57600101915f61281a565b634e487b7160e01b5f52601160045260245ffd5b604051632eaefac360e21b8152600490fd5b9392919361288e8361343d565b61292c57846128aa576128a2939450613069565b50505f905f90565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f5281526128e7835f20549485613555565b956128f18761343d565b612914575f97885260018252838820908852815282872091875252909320829055565b835163c5e12af560e01b815260048101889052602490fd5b60405163793a8f5560e01b815260048101849052602490fd5b919060408382031261018257825167ffffffffffffffff908181116101825784019082601f8301121561018257815160209261298082611ab7565b9161298e60405193846119d3565b808352848084019160051b830101918683116101825785809101915b838310612a1d5750505050948281015191821161018257019180601f840112156101825782516129d981611ab7565b936129e760405195866119d3565b818552838086019260051b820101928311610182578301905b828210612a0e575050505090565b81518152908301908301612a00565b82518152918101918691016129aa565b90808251908181526020809101926020808460051b8301019501935f915b848310612a5b5750505050505090565b9091929394958480612a79600193601f198682030187528a516120c1565b9801930193019194939290612a4b565b91906020928381526001600160a01b0382511684820152838201516040820152612ac3604083015160e060608401526101008301906118df565b9060608301516080820152612aea608084015192601f1993848483030160a0850152612a2d565b9260a081015193838382030160c08401528680865192838152019501905f5b818110612b2d57505050611a5694955060c060e091015192828503019101526120c1565b825187529588019591880191600101612b09565b90604082019082526020606081936040838201528551809452019301915f5b828110612b6e575050505090565b835185529381019392810192600101612b60565b916040805191612b9183611903565b60048084526020612ba38186016121f8565b5f5b8751811015612bd85780612bbb6001928a611fda565b51612bc68289611fda565b52612bd18188611fda565b5001612ba5565b5092955092939093335f52308352855f2091865190612bf68261194f565b612bfe611ec6565b8252606085819301528751612c12816119b7565b5f8152885191612c21836119b7565b5f83525f3681375f5b8151811015612d8f57612c3d8183611fda565b5190888c8b84519189818401518d8d8251612c65575b50505050505050506001915001612c2a565b5f612cd497948197948c9794612c928c956001600160a01b039d8e81818d51169c0151169b015190613ba2565b94865199612c9f8b61199b565b8a528901528488015286015260808501528a60a08501528b60c08501525180958194829363d04dfe2360e01b84528301612a89565b03915afa938415612d85578b915f95612d5f575b508451612cfd575b50908b8e89838d8d612c53565b51015116803b1561018257612d2c925f918c8f84905180978195829463012c676d60e21b845233908401612b41565b03925af1918215612d5557600192612d46575b8981612cf0565b612d4f90611987565b5f612d3f565b8c513d5f823e3d90fd5b612d7c9195503d805f833e612d7481836119d3565b810190612945565b9050935f612ce8565b8e513d5f823e3d90fd5b5050505050505050509050565b8215612dd1576001600160a01b038091165f52600160205260405f2091165f5260205260405f20905f5260205260405f205490565b909150612ddd82613dd4565b6001600160a01b03809316906040918251946370a0823160e01b86528416938460048701526020928387602481865afa968715612ef3575f97612efd575b5083612e34612e2d83612e649a614ab3565b509061423e565b508651636eb1769f60e11b81526001600160a01b0390941660048501523060248501529297889081906044820190565b0381865afa968715612ef3575f97612ec2575b50612e2d612e8891611a5698614ab3565b50612e938183613460565b15612eba5750935b5f5260018252825f20905f528152815f20905f8052525f205490613555565b905093612e9b565b96508387813d8311612eec575b612ed981836119d3565b8101031261018257955195612e2d612e77565b503d612ecf565b85513d5f823e3d90fd5b96508387813d8311612f25575b612f1481836119d3565b810103126101825795519583612e1b565b503d612f0a565b6040519263a9059cbb60e01b5f526001600160a01b0380931660045260245260205f60448180855af160015f5114811615612f86575b8360405215612f7057505050565b635274afe760e01b835216600482015260249150fd5b6001811516612f9c57813b15153d151616612f62565b833d5f823e3d90fd5b9092604051936323b872dd60e01b5f526001600160a01b0393848092166004521660245260445260205f60648180855af160015f5114811615612ff5575b836040525f60605215612f7057505050565b6001811516612f9c57813b15153d151616612fe3565b939291936130188361343d565b61292c578461302c576128a29394506127db565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f5281526128e7835f2054948561352b565b9092919261307681613ac3565b936130808161343d565b6130c05784816001600160e01b0361309f9360e01d9116601b0b6148fe565b508092816130ae575050509190565b6001600160a01b0361283e9316612f2c565b604051632d1671a360e11b8152600490fd5b916130fd9060606130f2936001600160a01b039485916040880151611fda565b515116940151611fda565b5151161461268657565b949193613346919360c0915f6132cd6040928351946131258661199b565b61312d611ee5565b86526020958487820152848682015260609781868a809401528260808201528660a0820152015261327d85519161316383611903565b600483526131728884016121f8565b8d61317c8161272c565b9c896001600160a01b039e8f94859182865116908d5194600386528501528c840152168c820152608081018a526131b286611f8d565b526131bc85611f8d565b5088516131c881611933565b6002815289368c8301376131db86611f9a565b526131e585611f9a565b5060ff8a6132488b8501936132328761320b81613203858a51611fda565b515116613dd4565b9751168861321a848951611fda565b51511685613229858a51611fda565b51015191612d9c565b9661323e828751611fda565b5151169451611fda565b51015192169093929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b61328682611faa565b5261329081611faa565b506132b48a8d8d60ff8a6132488d8501936132328761320b81613203858a51611fda565b6132bd82611fba565b526132c781611fba565b50613ba2565b95878a511697848b0191825191868184511693015116928a855230875285808620915101518651916132fe836119b7565b86835287519561330d8761199b565b86528886015286850152848885015289608085015260a084015260c08301528351808098819463d04dfe2360e01b835260048301612a89565b03915afa968715613433575f945f98613411575b508451600281106133fa5750818386015195015161338061337a88611fca565b51611fba565b5161338b8183613460565b156133f25750925b6133b58685919060405192600284526020840152604083015260608201604052565b6133be88611faa565b526133c887611faa565b508251996133d58b61199b565b8a52890152870152850152608084015260a083015260c082015290565b905092613393565b602490835190630fbb8e5560e21b82526004820152fd5b9097506134299194503d805f833e612d7481836119d3565b939093965f61335a565b50513d5f823e3d90fd5b61345c905f60e01d906001600160e01b038160e01d9116601b0b6147fe565b1390565b9061345c916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b61487f565b6134ae6001600160e01b0392838316601b0b9260e01d938160e01d9116601b0b8484613ff5565b90637ffffff582136134fe575b906134c59161423e565b92909215806134f6575b6134d857505090565b6044925060405191638eba4d0760e01b835260048301526024820152fd5b5082156134cf565b6135088282614ede565b156134bb57604483856040519163d556b11160e01b835260048301526024820152fd5b611a5691610c18916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614444565b611a5691610c18916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614608565b6135d991608081018261359b6135958351611fca565b51611fca565b526135d26135cc6001600160a01b038094515116936135c36135bd8551611fca565b51611f8d565b51169251611fca565b51611faa565b519161300b565b5050565b906080810191806135f16135958551611fba565b526001600160a01b0380925151169161360d6135bd8551611fba565b511661361c6135cc8551611fba565b5190816136b75761362c8361343d565b61292c579183917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a959361262e955f5260209060018252613682604094855f20835f528452855f20855f528452855f2054613555565b945f5260018252835f20905f528152825f20915f52525f20555b51604051918291338352604060208401526040830190612a2d565b916136e8917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a959361262e95612881565b505061369c565b60c0810151908151915f92613863575b506137a46020918281510151926001600160a01b039081818187511696015116928660a082019485518252308452604097888320898686510151015160808601518b519161374c836119b7565b8683528c519361375b856119b7565b8785528d519661376a8861199b565b8752898701528c86015260016060860152608085015260a084015260c08301528851808099819463d04dfe2360e01b835260048301612a89565b03915afa94851561385957879561383b575b5084516137c7575b50505050505050565b81905101510151169051813b15613837579184918493836137fc965180978195829463012c676d60e21b845260048401612b41565b03925af190811561382e5750613817575b80808080806137be565b6138218291611987565b61382b578061380d565b80fd5b513d84823e3d90fd5b8480fd5b6138509195503d8089833e612d7481836119d3565b9050935f6137b6565b86513d89823e3d90fd5b6001600160a01b03602080845101510151169060a083015190823b15610182576138a6925f928360405180968195829463012c676d60e21b845260048401612b41565b03925af1801561022c57156136ff576138c0919250611987565b5f905f6136ff565b608081016138d96135cc8251611fba565b519182156138e657505050565b6139006135bd6001600160a01b0380935151169351611fba565b5116815f5260209160018352604092835f20835f528152835f20855f528152835f2054936001600160e01b03851661393b575b505050505050565b61395f955f9284845260018152828420868552815282842091845252812055613069565b5f808080613933565b8115613972570490565b634e487b7160e01b5f52601260045260245ffd5b60408151106139ce576020810151908051603f19810190811161285b5760051c82116139ba5760016020920160051b010190565b50506040516139c8816119b7565b5f815290565b506040516139c8816119b7565b8051156139eb57602001515f1a90565b505f90565b905f8091602081519101845af48080613a6e575b15613a245750506040513d81523d5f602083013e60203d82010160405290565b15613a4b57604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b3d15613a5c576040513d5f823e3d90fd5b60405163d6bda27560e01b8152600490fd5b503d151580613a045750813b1515613a04565b60041115613a8b57565b634e487b7160e01b5f52602160045260245ffd5b602090939291936001600160a01b036040820195168152613abf83613a81565b0152565b613acb614fcc565b6040805163b7bad1b160e01b81526001600160a01b0383166004820152909182826024815f73200e12d10bb0c5e4a17e7018f0f1161919bb93895af1928315613b99575f925f94613b64575b50613b2183613a81565b600183141580613b52575b613b365750505090565b5163ee07877f60e01b8152918291610725919060048401613a9f565b50613b5c83613a81565b821515613b2c565b90809450613b889293503d8511613b92575b613b8081836119d3565b8101906148d4565b919091925f613b17565b503d613b76565b513d5f823e3d90fd5b90805191613baf83611ab7565b91613bca604094613bc2865195866119d3565b808552611ab7565b601f199460209186013686840137835183519095908015613dc9576001613c209101965b6001978891010197613c17613c028a611ab7565b99613c0f86519b8c6119d3565b808b52611ab7565b01848901612214565b85805f9684516002815233878201523086820152606081018652613c438b611f8d565b52613c4d8a611f8d565b505f925b613d85575b5050508351613c69575b50505050505090565b85809598979692980181613c7d8289611fda565b52613c888188611fda565b505f925b613c9b575b5085969750613c60565b8451831015613d80576001600160a01b03613d1281613cba8689611fda565b51511686613cc8878a611fda565b51015187815160051b9101207f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f52601c52603c5f208c613d09888b611fda565b51015191614a2a565b15613d6857868098999a928192613d29878a611fda565b515116613d368787611fda565b52019385613d448289611fda565b510151613d51868c611fda565b52613d5c858b611fda565b50019290989796613c8c565b8951630a57f30960e31b815260048101859052602490fd5b613c91565b9091968151881015613dc0578280910197613da08184611fda565b51613dab8a8d611fda565b52613db6898c611fda565b5001919081613c51565b96829150613c56565b50613c205f96613bee565b613ddc614fcc565b60408051630782d7e160e01b81526001600160a01b03831660048201529091828260248173200e12d10bb0c5e4a17e7018f0f1161919bb93895afa928315613b99575f925f94613b645750613b2183613a81565b9091939284158215175f14613e4a5750505090505f905f90565b82810192600160fd1b8082019083011760fe1c613f81575b5050613e6d81614ba3565b93613e7781614ba3565b94613e828682614bc3565b90918215613f72575f9083986f0785ee10d5da46d900f436a000000000808611613f64575b50670de0b6b3a7640000808b11613f55575b50633b9aca00808b11613f46575b50612710808b11613f38575b5098805b613f27575081906118db989982600a0a9109960195817fcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccd0a93838211900382610100031b9203901c170291614bd6565b60019290920191600a900480613ed7565b60049a04998a930192613ed3565b600991939a049901915f613ec7565b601291939a049901915f613eb9565b85049950602592505f613ea7565b509290506118db949550614bd6565b5f821215613fd557808413613fc7575b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb2841315613e62579092506118db939491614ae1565b9092506118db939491614b48565b80841215613f91579092506118db939491614ae1565b6134c5828261423e565b9290918061401b576044848460405191637a97930f60e01b835260048301526024820152fd5b90919280155f1461403057505050505f905f90565b6140499361403d91614c90565b92919490938492614c90565b909391928461405788614ba3565b9161406186614ba3565b947f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000094604c91868810614208575b030191600160ff1b98838a018112155f146141d5575050035b5f955f8212806141cc575b6141ae575b5f81128061419c575b61417e5786820103966001600160ff1b0388149081614174575b508061416b575b80614162575b6141445750906140f89291614e3c565b915f811361410b575b506118db93614bd6565b9091604c82136141395761412291600a0a90613968565b90811561412f575f614101565b505050505f905f90565b50505050505f905f90565b876044916040519163d556b11160e01b835260048301526024820152fd5b505f85126140e8565b508284146140e2565b905088145f6140db565b604489836040519163d556b11160e01b835260048301526024820152fd5b50806001600160ff1b030182136140c1565b95508087018613156141c65786818703015b956140b8565b5f6141c0565b505f81136140b3565b89985090920390506001600160ff1b03819003870182136141f957018601946140a8565b5050505050505050505f905f90565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009650604b925061408f565b8115613972570590565b8082601b82810b8314614433577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e100000000000000000084056143df575b8380820b036143ce57507b199999999999999999999999999999999999999999999999999999987b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc8401111561437f575b838060030b03614303575b8084136142e75750506001600160e01b036001925b60e01b91161791565b8303600a0a8015613972576001600160e01b03910715926142de565b92915f8413156143535750906143198383614ede565b61433557637ffffffe1901600a0a810290637fffffff926142c9565b506044916040519163d556b11160e01b835260048301526024820152fd5b637fffffff1992830390604382136141395761437291600a0a90614234565b91821561412f57926142c9565b5f198401808060030b1461439357506142be565b90506001600160e01b039293507b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff915060e01b9260ff1d181617905f90565b600190940193600a90930592614271565b937f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000840515614420576305f5e100600894058094819201955b915050614271565b620186a060059405809481920195614418565b50826142be57505050505f90600190565b919291600160ff1b840161445c576118db9350614ef7565b906118db935f0391614608565b919291600160ff1b91908015806145f657509061448591614c90565b9490929091905f8685858582821380156145ed575b6145d0575b505050508682841860ff1c94860391039081604c0381116145b55701600a0a80820591908461459b575b505081019182821860ff1c111561459357826001600160ff1b031461457557905f600192135f1461454657600a9004915b01925b8115811761450a57509190565b80614523575b50801561451b579190565b505f91508190565b91926145399203600160ff1b01600a0a90614234565b600160ff1b91905f614510565b600a60037fe66666666666666666666666666666666666666666666666666666666666666792010401916144fa565b604490836040519163d556b11160e01b835260048301526024820152fd5b5090926144fd565b81076145a8575b806144c9565b60ff1d600117015f6145a2565b5050509193506145c3579190565b60018160ff1d1790039190565b5f9a50909750909550600160ff1b9450925090508680808061449f565b50835f1261449a565b156146015750509190565b9350919050565b93929193841581158181176147595750509061462391614c90565b919490829561463482958294614c90565b8096929491969387868482138015614750575b614737575b5050505050508682841860ff1c94860391039081604c0381116145b55701600a0a80820591908461471d575b505081019182821860ff1c111561471557826001600160ff1b031461457557905f600192135f146146e657600a9004915b01925b811581176146b957509190565b806146c95750801561451b579190565b600160ff1b936146e09291038401600a0a90614234565b5f614510565b600a60037fe66666666666666666666666666666666666666666666666666666666666666792010401916146a9565b5090926146ac565b810761472a575b80614678565b60ff1d600117015f614724565b929b5098509196509450925090505f808080808061464c565b50858412614647565b939593909291901561476f57505061451b579190565b945092915050565b60088151106139eb576008015167ffffffffffffffff1667ff0a89c674ee78741490565b91604083019260406147d5610c18606087519401938451906001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b613e30565b945193016147e48151866127b4565b6147ec575050565b909350611a5691925051925183613487565b92915f9060018184145f87128715171717614878575f9280821361486a575b03604c81135f82121761485e57600a0a908461483c8382029384614234565b146148515750501561484d575f9190565b5f90565b9093509015611a56579190565b50501561484d575f9190565b5f956001945092509061481d565b5050505f90565b93929190918083145f83125f871218831587151717176148ce575f928082136148c15703604c81135f82121761485e57600a0a908461483c8382029384614234565b919460019350919061481d565b50919050565b919082604091031261018257815160048110156101825760209092015160ff811681036101825790565b91925f831215614926576044838360405191634a7d166b60e01b835260048301526024820152fd5b91928361493857505090505f90600190565b60ff8116820191808312614a00575f831215614970575050604c19811261451b575f03600a0a916149698382613968565b9283021490565b909293915f81135f146149f657604d81136149cb57600a0a92831561397257835f190483116149a25750500290600190565b60405163c849483b60e01b815260048101849052602481019290925260ff166044820152606490fd5b5060405163c849483b60e01b81526004810192909252602482015260ff919091166044820152606490fd5b5050905090600190565b60405163c849483b60e01b815260048101869052602481019190915260ff82166044820152606490fd5b9091813b614a6557614a3c9192615035565b50614a4681613a81565b159182614a5257505090565b6001600160a01b03918216911614919050565b6020918160645f935160405192630b135d3f60e11b9788855260048501526040602485015286820190604485015e8281018201859052601f01601f191601915afa905f5114601f3d11161690565b9060ff165f03916001600160ff1b0382115f14614ad957600a6001818404940192061590565b909190600190565b909392915f614af1918184613e30565b9490945f8483019182019412159081614b3e575b8115614b34575b50614b1657505090565b604492506040519163d556b11160e01b835260048301526024820152fd5b905083125f614b0c565b8281129150614b05565b614b5d93600160fe1b90810193920190613e30565b9081815f821215614b94575050604b1982126128a257614b82915f03600a0a90614234565b9081614b8c575f90565b600160ff1b90565b93600160ff1b90910192509050565b5f811215611a5657600160ff1b90808203614bbc575090565b90505f0390565b905f198183099102908180821091030391565b92939291905f8184181215614c6b576001600160ff1b039283831115614c5557600160ff1b93838503614c0b57505050509190565b90919293508514614c25575050600a600191045f03920190565b604051630ed8062160e21b8152600481019190915260248101919091526044810182905260648101849052608490fd5b5090915050600160ff1b811461285b575f039190565b90916001600160ff1b0380841115612823578514614c25575050600a60019104920190565b9190918015614e3257827f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000080830515614d40575b507f19999999999999999999999999999999999999999999999999999999999999997f0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc830110614d31575b8313614d1b5791905f90565b919060018060ff1b926001600160ff1b03030190565b9290600a02905f190192614d0f565b6f4b3b4ca85a86c47a098a22400000000080840515614e20575b507728c87cb5c89a2571ebfdcb54864ada834a00000000000000830515614e09575b7b097edd871cfda3a5697758bf0e3cbb5ac5741c640000000000000000830515614df5575b7e3899162693736ac531a5a58f1fbb4b746504382ca7e4000000000000000000830515614de557820515614dd6575b5f614cc4565b9290600a02905f190192614dd0565b9391606402916001190193614da1565b93916402540be40002916009190193614da1565b9391678ac7230489e8000002916012190193614d7c565b6025198301955092909202915f614d5a565b505f915081908190565b90915f198383099280830292838086109503948086039584871015614eba5714614eb2579082910960018219018216809204600280826003021880830282030280830282030280830282030280830282030280830282030280920290030293600183805f03040190848311900302920304170290565b505091500490565b60648386866040519263362ced0960e11b8452600484015260248301526044820152fd5b611a5691905f811215614ef2575f0361506f565b61506f565b909291600160ff1b91828101614f895750808414614f7f57808413918215614f77578185035b604c811115614f665750505f915b15614f5757507f8000000000000000000000000000000000000000000000000000000000000001019190565b92506001600160ff1b03039190565b600a0a908115613972570491614f2b565b848203614f1d565b505090505f905f90565b93614f9692945f03614469565b80939180928114614faa575b50505f039190565b915092506001600160ff1b03831461457557600a600191059201915f80614fa2565b73200e12d10bb0c5e4a17e7018f0f1161919bb9389803b15801561500a575b614ff25750565b602490604051906373e6d7b360e01b82526004820152fd5b507f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d41813f1415614feb565b81519190604183036150655761505e9250602082015190606060408401519301515f1a906150fe565b9192909190565b50505f9160029190565b90637ffffff58113156150f857637ffffffe19810190604382136150f1575f8212156150c557637fffffff91505f0301600a0a7b8000000000000000000000000000000000000000000000000000000202111590565b50600a0a8015613972577b80000000000000000000000000000000000000000000000000000001041090565b5050151590565b50505f90565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411615175579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa1561022c575f516001600160a01b0381161561516b57905f905f90565b505f906001905f90565b5050505f916003919056000000000000000000000000200e12d10bb0c5e4a17e7018f0f1161919bb93890000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000044b608060405234801561000f575f80fd5b506004361061004a575f3560e01c80630782d7e11461004e57806354636d2b14610078578063b7bad1b11461009d578063f5c36eaf146100b0575b5f80fd5b61006161005c366004610363565b6100c3565b60405161006f929190610403565b60405180910390f35b61008b610086366004610363565b6100d8565b60405160ff909116815260200161006f565b6100616100ab366004610363565b6100e9565b61008b6100be366004610363565b6100f5565b5f806100cf5f84610100565b91509150915091565b5f6100e35f836101f0565b92915050565b5f806100cf5f84610281565b5f6100e35f83610356565b73ffffffffffffffffffffffffffffffffffffffff81165f9081526020838152604080832081518083019092525460ff8082161515835261010090910416818301527f313ce56700000000000000000000000000000000000000000000000000000000808452839283908190816004818a5afa915060203d1015610182575f91505b811561019857505f5160ff811115610198575f91505b816101af57505050602001516003925090506101e9565b83516101c3575f955093506101e992505050565b836020015160ff1681146101d85760026101db565b60015b846020015195509550505050505b9250929050565b5f805f6101fd8585610281565b909250905060018260038111156102165761021661039d565b1415801561023557505f8260038111156102325761023261039d565b14155b156102795783826040517fee07877f000000000000000000000000000000000000000000000000000000008152600401610270929190610421565b60405180910390fd5b949350505050565b5f805f8061028f8686610100565b90925090505f8260038111156102a7576102a761039d565b0361034b576040805180820182526001815260ff838116602080840191825273ffffffffffffffffffffffffffffffffffffffff8a165f908152908b9052939093209151825493517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009094169015157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff161761010093909116929092029190911790555b909590945092505050565b5f805f6101fd8585610100565b5f60208284031215610373575f80fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114610396575f80fd5b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b600481106103ff577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b9052565b6040810161041182856103ca565b60ff831660208301529392505050565b73ffffffffffffffffffffffffffffffffffffffff831681526040810161039660208301846103ca56000000000000000000000000000000000000000000"; + hex"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000052c00000000000000000000000002eb98f9489cff4a429368e389f5ffc6f8d9c5ede000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000052046080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a7146117b4575080632cb77e9f1461178857806341d1514f146117515780635343c1b7146116b65780635cffe9de1461155a5780635d003c44146113d6578063613255ab14611353578063687cf02a1461103c578063ac9650d814610eee578063b0460f07146105f3578063b845b83e1461059b578063ca9109ba1461044c578063d9d98ce41461039b578063ddebc96f146103475763df6db3c2146100c1575f80fd5b34610321576003196040368201126103215767ffffffffffffffff9060043582811161032157806004019160a0823603918201126103215760243584811161032157610111903690600401611c76565b909361011b61289f565b5f946001600160a01b0394856101308461257a565b163303610325576101496101443685611aa8565b6128e1565b805f525f60205260405f20966001885414610190575b60208960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556040519015158152f35b9091929394959697505f600198556040519633885282602089015260606040890152816101bc87611833565b166060890152602484013590606219018112156103215783019060a06080890152806101ea60048401611833565b166101008901526101fd60248301611833565b16610120880152604481013560221982360301811215610321570190602460048301359201988211610321578136038913610321577f09d18501db0080ca2d6cd7c17fa7255daff4b2d503ea93b76ff68b6752ea8e6387806103069560846102c561030e9a60209f610284906103149f9a60606101406102ef9d015261016088019161232b565b6102b66102ab610297604488018561268a565b605f198a8603810160a08c015294916126bf565b92606487019061268a565b918784030160c08801526126bf565b91013560e08301520390a13390919060405192600284526020840152604083015260608201604052565b906040519160018352602083015260408201604052565b92369161234b565b906135db565b5f8080808080808061015f565b5f80fd5b6024866103318561257a565b6040516335252be360e01b815291166004820152fd5b3461032157600319602036820112610321576004359067ffffffffffffffff8211610321576080908236030112610321576103866060916004016125ce565b90604051921515835260208301526040820152f35b34610321576040366003190112610321576001600160a01b036103bc611807565b166040516370a0823160e01b8152306004820152602081602481855afa908115610441575f9161040f575b50156103f75760206040515f8152f35b60249060405190633c5bf76960e21b82526004820152fd5b90506020813d602011610439575b8161042a60209383611917565b810103126103215751826103e7565b3d915061041d565b6040513d5f823e3d90fd5b346103215761045a36611ca7565b9280949261046661289f565b6104718285336134d7565b61047a81612e4c565b15610567578061048e6104dd928633613a1d565b9790957f7f9dfa19cf1cc2f806f2f860fbc9c056b601fb1afc0e9b843dfe5c63616268e660806040513381526001600160a01b038416998a60208301528560408301526060820152a133613133565b9390918561050c575b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b61055b9661030e956103069460ff93604051956005875260208701526040860152606085015260808401521660a082015260c08101604052906040519160018352602083015260408201604052565b808080808080806104e6565b506040516306dde9c360e41b81523360048201526001600160a01b03841660248201526044810191909152606490fd5b0390fd5b346103215760203660031901126103215760043567ffffffffffffffff81116103215761030e6105d26104e6923690600401611c76565b91906105dc61289f565b604051926105e9846118fb565b5f8452369161234b565b34610321576003196020368201126103215767ffffffffffffffff600435116103215760c090600435360301126103215761062c61289f565b5f8080610641600480356084810191016124b3565b905015610edc57602460043501359261065984612e4c565b15610eca5760608060405161066d816118af565b610675612508565b81525f60208201525f6040820152015261068d612508565b506106ed6106e86106c76106bd6106b76106b16084600435016004356004016124b3565b9061253a565b80612555565b6040810190612445565b60206106e06106b16084600435016004356004016124b3565b01359161256a565b61257a565b936001600160a01b0361073c6106e86107236107196106b76106b16084600435016004356004016124b3565b6060810190612445565b60406106e06106b16084600435016004356004016124b3565b816040519761074a89611877565b168752166020860152604085015261076c6084600435016004356004016124b3565b9490506001604051955f87520160051b85016040525f905f5b6107996084600435016004356004016124b3565b9050811080610eb7575b15610d04576107bc6084600435016004356004016124b3565b821015610cf0578160051b810135607e198236030181121561032157608081830136031261032157604051916107f1836118af565b8181013567ffffffffffffffff81116103215761081390369084840101611aa8565b835280820160208181013590850152604080820135908501526060013567ffffffffffffffff81116103215761084c9236920101611c5b565b606082015280516001600160a01b0361086e6040830151602085015190611d64565b5151166001600160a01b0385511614801590610cbc575b610caa5761089d60208301516040840151908361391a565b6108a6816128e1565b91825f525f60205260405f2054155f1461090a575051604080513381526001600160a01b039092166020830152810191909152600191907fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f390606090a15b01610785565b919061093b602084979597015160408501519060608601519060405192610930846118fb565b5f8452339186612b0e565b925f9361095360608201516044600435013590612e6f565b156109ba57505051604080513381526001600160a01b03909216602083015281019190915260019291907fe3151dc8cb7a54ffc4baabd28c1f241c94d510b5e5b502491ac3cad6c16316d590606090a15b81156109b2575b5092610904565b9050886109ab565b6109c76040820151612e4c565b158015610c97575b15610a2457505051604080513381526001600160a01b03909216602083015281019190915260019291907f500b713857325f9e6dcb52ae832eca9109d107ed1aae9cb4928b4c1e13f051aa90606090a16109a4565b9250925050600196959691610a3d60646004350161258e565b15610c045796610aad97610abd60408401516040880151610a5e8183612eb9565b15610bfc5750925b610ab7848592610aa0610a9a60608a01516001600160e01b03601b918660e01d92828816810b928260e01d9216900b613f6a565b90613edf565b9d8e9260408d0151612ee0565b60408c01526139f3565b996139f3565b98610ac88484612f0a565b610ad28482612f68565b60405192338452608060208501526060610af88451608080880152610100870190611dbf565b93602081015160a0870152604081015160c0870152015192607f198582030160e0860152835180825260208201906020808260051b8501019601925f5b828110610b9457505050505092806001979695937fbae4dbf76931c547f765e9def16d693d86daaa596f491de979008831789185ae93610b8f96604084015260608301520390a180858c5101808d5260051b8c015261321f565b6109a4565b9091929396602080610bef600193601f198782030189528b51906001600160a01b03825116815283820151848201526060610bde604084015160806040850152608084019061259b565b920151906060818403910152611cf3565b9901950193929101610b35565b905092610a66565b610aad90610abd6060840151610ab7610c42610a9a60408801516001600160e01b0394601b90868360e01d9316820b91878260e01d9216900b613f6a565b60408a0151610c518183612eb9565b15610c8f5750915b829c8d916060890151908116155f14610c80575060408801515b96879460408d0151612ee0565b610c8a908561394f565b610c73565b905091610c59565b50610ca56060820151612e96565b6109cf565b60405163936bb5ad60e01b8152600490fd5b506001600160a01b03610cd86060830151604085015190611d64565b5151166001600160a01b036020860151161415610885565b634e487b7160e01b5f52603260045260245ffd5b50919390610d1660646004350161258e565b15610eb157835b6004356004013590610d2f8282612eb9565b610e935750508490610d4f856001600160a01b0360208701511633613569565b505060a46004350190610d6782600435600401612412565b905015159081610e8b575b50610dea575b506001600160a01b03610d8e9293511633613a1d565b50505b8351811015610db65780610db0610daa60019387611d64565b51613093565b01610d91565b5060409160017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005582519182526020820152f35b90506001600160a01b03602084015116610e146001600160a01b0385511692600435600401612412565b929091333b1561032157610e5c5f93604051958694859463691f9ed760e01b8652600486015260248501528960448501528a606485015260a0608485015260a484019161232b565b038183335af190811561044157859115610d78579050610e7c91506118cb565b5f836001600160a01b03610d78565b905088610d72565b604492506040519163573b6f4160e01b835260048301526024820152fd5b84610d1d565b50610ec56040830151612e4c565b6107a3565b60405163315f9e2360e21b8152600490fd5b604051639c95219f60e01b8152600490fd5b34610321576020806003193601126103215760043567ffffffffffffffff811161032157610f20903690600401611c76565b919060405192610f2f846118fb565b5f8452828401610f3e826119fb565b94610f4c6040519687611917565b828652610f58836119fb565b93610f6a86880195601f190186612497565b5f5b848110610fce57604080518881528951818a018190525f92600582901b83018101918a918c9085015b828710610fa25785850386f35b909192938280610fbe600193603f198a82030186528851611cf3565b9601920196019592919092610f95565b8061101d88611017610fea60019560059d9c9d1b870187612412565b929089846040519586938585013782018381015f81528b519283915e015f83820152038084520182611917565b30613889565b611027828a611d64565b526110328189611d64565b5001969596610f6c565b34610321576003196040368201126103215760043567ffffffffffffffff8082116103215760c0826004019383360301126103215760243590811161032157611089903690600401611c76565b9061109261289f565b6110c36110be6110b96110b26110a888806123fd565b6040810190612412565b3691611939565b61380b565b613874565b8015611341576001101561132f57602483016110df8186612445565b90501561131d5760448401946110f58682612445565b90501561130b5761115b6111239661114f61111a61111385806123fd565b9585612445565b99909285612445565b9190926111406040519761113689611847565b338952369061199d565b9a60209b8c8901523691611a13565b60408601523691611a13565b606083015260648501356080830152611173826128e1565b91825f525f875260405f209586541596876111b7575b888860017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055604051908152f35b6001905560a46001600160a01b03917f87491344dfbcf91f6cbbc610cbbeedc85313d37a02df0c93527f7ea5f8db717f83855116604051908152878c820152606060408201528061120b6060820188611dbf565b0390a1019161121a8385612412565b905061125f575b5050505061125392916103066102ef61030e933390919060405192600284526020840152604083015260608201604052565b82808080808080611189565b61126c6110b28486612412565b61127581613f46565b156112e85750937fd46c2c56b35c8210e9e712ec3f02242d5fc90187c0ac8ed80cc33626846ec369896112539897956112db6112be610306976102ef9761030e9b511693612412565b86604051958695865285015260606040850152606084019161232b565b0390a19383959650611221565b89610597604051928392630c89984b60e31b845260048401526024830190611cf3565b60405163540e5f0b60e01b8152600490fd5b604051636c44ef8f60e01b8152600490fd5b604051633c8270bd60e21b8152600490fd5b604051632cff108b60e21b8152600490fd5b3461032157602080600319360112610321576024816001600160a01b03611378611807565b16604051928380926370a0823160e01b82523060048301525afa908115610441575f916113a9575b50604051908152f35b90508181813d83116113cf575b6113c08183611917565b810103126103215751826113a0565b503d6113b6565b34610321576113e436611ca7565b92916113f194919461289f565b6113fc8383336134d7565b61140581612e4c565b15611529578160ff9161141d856114e096953361270f565b6114278183612eb9565b15611523575080935b61143c8582853361350b565b917f8045c25080b0868951141ed0a91720bcad09a8364a2b3109ee1fd49c1f0bc8b860c061146b898833613569565b97906001600160a01b0360405192338452169a8b6020840152856040840152886060840152608083015260a0820152a16040519660068852602088015260408701526060860152608085015260a08401521660c082015260e08101604052906040519160018352602083015260408201604052565b908061150c5760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b61151b9261030e91369161234b565b8080806104e6565b93611430565b50604051623a3a4d60e21b81523360048201526001600160a01b039190911660248201526044810191909152606490fd5b34610321576080366003190112610321576004356001600160a01b03908181168091036103215761158961181d565b6044359167ffffffffffffffff916064358381116103215736602382011215610321578060040135938411610321573660248583010111610321576116169560209216936115d88685876133f8565b60405196879283926323e30c8b60e01b84523360048501528760248501528860448501525f606485015260a06084850152602460a48501920161232b565b03815f855af1938415610441575f94611682575b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd984036116695761165e93503091613471565b602060405160018152f35b604051630b6c58a960e31b815260048101859052602490fd5b9093506020813d6020116116ae575b8161169e60209383611917565b810103126103215751928461162a565b3d9150611691565b34610321576101403660031901126103215767ffffffffffffffff600435818111610321576116e9903690600401611aa8565b60243582811161032157611701903690600401611aa8565b60c0366043190112610321576101043583811161032157611726903690600401611c5b565b9061012435938411610321576117436104e6943690600401611c5b565b9261174c61289f565b611e70565b3461032157606036600319011261032157602061178061176f611807565b61177761181d565b6044359161270f565b604051908152f35b34610321576020366003190112610321576004355f525f6020526020600160405f205414604051908152f35b34610321576020366003190112610321576004359063ffffffff60e01b82168092036103215760209163e414309160e01b81149081156117f6575b5015158152f35b6301ffc9a760e01b149050836117ef565b600435906001600160a01b038216820361032157565b602435906001600160a01b038216820361032157565b35906001600160a01b038216820361032157565b60a0810190811067ffffffffffffffff82111761186357604052565b634e487b7160e01b5f52604160045260245ffd5b6060810190811067ffffffffffffffff82111761186357604052565b6040810190811067ffffffffffffffff82111761186357604052565b6080810190811067ffffffffffffffff82111761186357604052565b67ffffffffffffffff811161186357604052565b60e0810190811067ffffffffffffffff82111761186357604052565b6020810190811067ffffffffffffffff82111761186357604052565b90601f8019910116810190811067ffffffffffffffff82111761186357604052565b92919267ffffffffffffffff82116118635760405191611963601f8201601f191660200184611917565b829481845281830111610321578281602093845f960137010152565b9080601f830112156103215781602061199a93359101611939565b90565b919060608382031261032157604051906119b682611877565b81936119c181611833565b83526119cf60208201611833565b602084015260408101359167ffffffffffffffff8311610321576040926119f6920161197f565b910152565b67ffffffffffffffff81116118635760051b60200190565b929192611a1f826119fb565b604092611a2f6040519283611917565b819581835260208093019160061b84019381851161032157915b848310611a5857505050505050565b8583830312610321578386918251611a6f81611893565b611a7886611833565b81528286013583820152815201920191611a49565b9080601f830112156103215781602061199a93359101611a13565b91909160a0818403126103215760405190611ac282611847565b8193611acd82611833565b835267ffffffffffffffff9160208101358381116103215782611af191830161199d565b602085015260408101358381116103215782611b0e918301611a8d565b6040850152606081013592831161032157611b2f6080939284938301611a8d565b60608501520135910152565b90929192611b48816119fb565b91604094611b596040519485611917565b839583855260208095019160059460051b8401948186116103215784935b868510611b88575050505050505050565b67ffffffffffffffff90853582811161032157870190608082860312610321578551611bb3816118af565b611bbc83611833565b81528a8301358b8201528683013584811161032157830186601f8201121561032157803590611bea826119fb565b91611bf78a519384611917565b8083528d80840191891b83010191898311610321578e809101915b838310611c4b57505050508782015260608084013594851161032157611c3c878d9687960161197f565b90820152815201940193611b77565b82358152918101918f9101611c12565b9080601f830112156103215781602061199a93359101611b3b565b9181601f840112156103215782359167ffffffffffffffff8311610321576020808501948460051b01011161032157565b906080600319830112610321576004356001600160a01b0381168103610321579160243591604435916064359067ffffffffffffffff821161032157611cef91600401611c76565b9091565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b805115610cf05760200190565b805160011015610cf05760400190565b805160021015610cf05760600190565b805160031015610cf05760800190565b805160041015610cf05760a00190565b8051821015610cf05760209160051b010190565b9081518082526020808093019301915f5b828110611d97575050505090565b835180516001600160a01b031686528201518583015260409094019392810192600101611d89565b90608080611e35611e23611e1160406001600160a01b0380895116885260208901519060a060208a01528082511660a08a015260208201511660c08901520151606060e0880152610100870190611cf3565b60408701518682036040880152611d78565b60608601518582036060870152611d78565b93015191015290565b90611e48826119fb565b611e556040519182611917565b8281528092611e66601f19916119fb565b0190602036910137565b92916001600160a01b038451166001600160a01b0383511614612319576001600160a01b03611ea6606086015160643590611d64565b515116906040830151916001600160a01b03611ec56084358095611d64565b515116148015906122d9575b610caa576040850151906001600160a01b03611ef06044358094611d64565b5151166001600160a01b03611f0b60643560608a0151611d64565b515116146122c757611f1c866128e1565b805f525f60205260405f2054156122745750611f37846128e1565b805f525f60205260405f205415612220575061201a9291611ff4917f6fa7f4c28634b0a9d6831401c45ae468195fb63aed07308935c35374ff5d9e3960405180611f9f611f9161012033845280602085015283018d611dbf565b82810360408401528a611dbf565b85606083015260643560808301528760a083015260a43560c083015260c43560e083015260e4356101008301520390a16001600160a01b0386511660405192611fe7846118fb565b5f8452606435908a612b0e565b936001600160a01b038651166040519261200d846118fb565b5f845260a4359086612b0e565b916120286040820151612e4c565b15801561220c575b80156121f9575b80156121e6575b6121d4576040519161204f836118af565b5f83525f60208401525f60408401525f606084015261206e8483613e57565b845260408401526120946120828386613e57565b60208601528060608601528451612ee0565b946120a86020850151604086015190612ee0565b936120b287612e96565b80156121c5575b6121b35761217a6121ac957fd9fa84dd790c969daa5c33d8050dc06b4a9b59d5b42e2be5f5e8ae20447f618d9461215c6121b19a60a0966120fb8a8851612f0a565b6121098c6020890151612f0a565b6121178a6040890151612f68565b6121258c6060890151612f68565b61212e8a613093565b6121378c613093565b6001600160a01b0361215360c435926060606435910151611d64565b51511633613133565b50506001600160a01b0361215360e43592606060a435910151611d64565b5050606060405191338352805160208401526020810151604084015260408101518284015201516080820152a161321f565b61321f565b565b604051630d86822160e01b8152600490fd5b506121cf85612e96565b6120b9565b6040516321badf1f60e01b8152600490fd5b506121f46060840151612e96565b61203e565b506122076060820151612e96565b612037565b5061221a6040840151612e4c565b15612030565b9351604080513381526001600160a01b039092166020830152810194909452507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f3945091925082915050606081015b0390a1565b9551604080513381526001600160a01b039092166020830152810196909652507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f39493508392505060608201905061226f565b604051631cd2f1c760e21b8152600490fd5b506001600160a01b036122f3606085015160a43590611d64565b5151166001600160a01b0361230f604088015160443590611d64565b5151161415611ed1565b604051630a98f1f360e21b8152600490fd5b908060209392818452848401375f828201840152601f01601f1916010190565b90929192612358816119fb565b916040916123696040519485611917565b839581855260208095019160051b8301938185116103215783925b8584106123945750505050505050565b67ffffffffffffffff9084358281116103215786019083828603126103215783516123be81611893565b823584811161032157866123d391850161199d565b815289830135938411610321576123ee868b95869501611c5b565b83820152815201930192612384565b903590605e1981360301821215610321570190565b903590601e1981360301821215610321570180359067ffffffffffffffff82116103215760200191813603831361032157565b903590601e1981360301821215610321570180359067ffffffffffffffff821161032157602001918160061b3603831361032157565b5f5b60808110612489575050565b60608282015260200161247d565b5f5b8281106124a557505050565b606082820152602001612499565b903590601e1981360301821215610321570180359067ffffffffffffffff821161032157602001918160051b3603831361032157565b604051906124f682611877565b60606040835f81525f60208201520152565b6040519061251582611847565b5f6080838281526125246124e9565b6020820152606060408201526060808201520152565b9015610cf057803590607e1981360301821215610321570190565b903590609e1981360301821215610321570190565b9190811015610cf05760061b0190565b356001600160a01b03811681036103215790565b3580151581036103215790565b9081518082526020808093019301915f5b8281106125ba575050505090565b8351855293810193928101926001016125ac565b6125e56101446125de8380612555565b3690611aa8565b5f525f602052600160405f20540361268157806126058161267193612555565b6126696126246126296020850135938460408701359384923690611aa8565b61391a565b6126416126368580612555565b9460608101906124b3565b929061266160405196612653886118fb565b5f88525f3681373690611aa8565b933691611b3b565b923392612b0e565b6040810151606090910151600192565b505f905f905f90565b9035601e198236030181121561032157016020813591019167ffffffffffffffff8211610321578160061b3603831361032157565b9190808252602080920192915f905b8282106126dc575050505090565b909192936001906001600160a01b036126f487611833565b168152858301358382015260409081019501939201906126ce565b8215612744576001600160a01b038091165f52600160205260405f2091165f5260205260405f20905f5260205260405f205490565b90915061275082613ae8565b6001600160a01b03809316906040918251946370a0823160e01b86528416938460048701526020928387602481865afa968715612866575f97612870575b50836127a76127a0836127d79a6148ac565b509061436e565b508651636eb1769f60e11b81526001600160a01b0390941660048501523060248501529297889081906044820190565b0381865afa968715612866575f97612835575b506127a06127fb9161199a986148ac565b506128068183612eb9565b1561282d5750935b5f5260018252825f20905f528152815f20905f8052525f2054906139f3565b90509361280e565b96508387813d831161285f575b61284c8183611917565b81010312610321579551956127a06127ea565b503d612842565b85513d5f823e3d90fd5b96508387813d8311612898575b6128878183611917565b81010312610321579551958361278e565b503d61287d565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0060028154146128cf5760029055565b604051633ee5aeb560e01b8152600490fd5b60405161290c816128fe6020820194602086526040830190611dbf565b03601f198101835282611917565b51902090565b919060408382031261032157825167ffffffffffffffff908181116103215784019082601f8301121561032157815160209261294d826119fb565b9161295b6040519384611917565b808352848084019160051b830101918683116103215785809101915b8383106129ea5750505050948281015191821161032157019180601f840112156103215782516129a6816119fb565b936129b46040519586611917565b818552838086019260051b820101928311610321578301905b8282106129db575050505090565b815181529083019083016129cd565b8251815291810191869101612977565b90808251908181526020809101926020808460051b8301019501935f915b848310612a285750505050505090565b9091929394958480612a46600193601f198682030187528a5161259b565b9801930193019194939290612a18565b91906020928381526001600160a01b0382511684820152838201516040820152612a90604083015160e06060840152610100830190611cf3565b9060608301516080820152612ab7608084015192601f1993848483030160a08501526129fa565b9260a081015193838382030160c08401528680865192838152019501905f5b818110612afa5750505061199a94955060c060e0910151928285030191015261259b565b825187529588019591880191600101612ad6565b949193612d4d919360c0915f612cd4604092835194612b2c866118df565b612b34612508565b86526020958487820152848682015260609781868a809401528260808201528660a08201520152612c84855191612b6a83611847565b60048352612b7988840161247b565b8d612b83816128e1565b9c896001600160a01b039e8f94859182865116908d5194600386528501528c840152168c820152608081018a52612bb986611d17565b52612bc385611d17565b508851612bcf81611877565b6002815289368c830137612be286611d24565b52612bec85611d24565b5060ff8a612c4f8b850193612c3987612c1281612c0a858a51611d64565b515116613ae8565b97511688612c21848951611d64565b51511685612c30858a51611d64565b5101519161270f565b96612c45828751611d64565b5151169451611d64565b51015192169093929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b612c8d82611d34565b52612c9781611d34565b50612cbb8a8d8d60ff8a612c4f8d850193612c3987612c1281612c0a858a51611d64565b612cc482611d44565b52612cce81611d44565b50613bc6565b95878a511697848b0191825191868184511693015116928a85523087528580862091510151865191612d05836118fb565b868352875195612d14876118df565b86528886015286850152848885015289608085015260a084015260c08301528351808098819463d04dfe2360e01b835260048301612a56565b03915afa968715612e42575f945f98612e18575b50845160028110612e0157508183860151950151612d87612d8188611d54565b51611d44565b51612d928183612eb9565b15612df95750925b612dbc8685919060405192600284526020840152604083015260608201604052565b612dc588611d34565b52612dcf87611d34565b50825199612ddc8b6118df565b8a52890152870152850152608084015260a083015260c082015290565b905092612d9a565b602490835190630fbb8e5560e21b82526004820152fd5b909750612e389194503d805f833e612e308183611917565b810190612912565b939093965f612d61565b50513d5f823e3d90fd5b612e6b905f60e01d906001600160e01b038160e01d9116601b0b614963565b1290565b90612e6b916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6149e4565b612eb5905f60e01d906001600160e01b038160e01d9116601b0b614963565b1390565b90612eb5916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6149e4565b61199a91610a9a916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b613eba565b612f64916080810182612f26612f208351611d54565b51611d54565b52612f5d612f576001600160a01b03809451511693612f4e612f488551611d54565b51611d17565b51169251611d54565b51611d34565b519161350b565b5050565b90608081019180612f7c612f208551611d44565b526001600160a01b03809251511691612f98612f488551611d44565b5116612fa7612f578551611d44565b51908161305b57612fb783612e96565b613042579183917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a959361226f955f526020906001825261300d604094855f20835f528452855f20855f528452855f20546139f3565b945f5260018252835f20905f528152825f20915f52525f20555b516040519182913383526040602084015260408301906129fa565b60405163793a8f5560e01b815260048101849052602490fd5b9161308c917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a959361226f95613133565b5050613027565b608081016130a4612f578251611d44565b519182156130b157505050565b6130cb612f486001600160a01b0380935151169351611d44565b5116815f5260209160018352604092835f20835f528152835f20855f528152835f2054936001600160e01b038516613106575b505050505050565b61312a955f9284845260018152828420868552815282842091845252812055613569565b5f8080806130fe565b9392919361314083612e96565b613042578461315c57613154939450613569565b50505f905f90565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f528152613199835f205494856139f3565b956131a387612e96565b6131c6575f97885260018252838820908852815282872091875252909320829055565b835163c5e12af560e01b815260048101889052602490fd5b90604082019082526020606081936040838201528551809452019301915f5b82811061320b575050505090565b8351855293810193928101926001016131fd565b60c0810151908151915f92613393575b506132d46020918281510151926001600160a01b039081818187511696015116928660a082019485518252308452604097888320898686510151015160808601518b519161327c836118fb565b8683528c519361328b856118fb565b8785528d519661329a886118df565b8752898701528c86015260016060860152608085015260a084015260c08301528851808099819463d04dfe2360e01b835260048301612a56565b03915afa94851561338957879561336b575b5084516132f7575b50505050505050565b81905101510151169051813b156133675791849184938361332c965180978195829463012c676d60e21b8452600484016131de565b03925af190811561335e5750613347575b80808080806132ee565b61335182916118cb565b61335b578061333d565b80fd5b513d84823e3d90fd5b8480fd5b6133809195503d8089833e612e308183611917565b9050935f6132e6565b86513d89823e3d90fd5b6001600160a01b03602080845101510151169060a083015190823b15610321576133d6925f928360405180968195829463012c676d60e21b8452600484016131de565b03925af18015610441571561322f576133f09192506118cb565b5f905f61322f565b6040519263a9059cbb60e01b5f526001600160a01b0380931660045260245260205f60448180855af160015f5114811615613452575b836040521561343c57505050565b635274afe760e01b835216600482015260249150fd5b600181151661346857813b15153d15161661342e565b833d5f823e3d90fd5b9092604051936323b872dd60e01b5f526001600160a01b0393848092166004521660245260445260205f60648180855af160015f51148116156134c1575b836040525f6060521561343c57505050565b600181151661346857813b15153d1516166134af565b9091156134e2575050565b6040516305dbdfd960e41b81526001600160a01b03918216600482015291166024820152604490fd5b9392919361351883612e96565b613042578461352c57613154939450613a1d565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f528152613199835f20549485612ee0565b9092919261357681613ee9565b9361358081612e96565b6135c95784816001600160e01b0361359f9360e01d9116601b0b614b0e565b508092816135af575b5050509190565b6001600160a01b036135c193166133f8565b5f81816135a8565b604051632d1671a360e11b8152600490fd5b9160408051916135ea83611847565b600480845260206135fc81860161247b565b5f5b875181101561363157806136146001928a611d64565b5161361f8289611d64565b5261362a8188611d64565b50016135fe565b5092955092939093335f52308352855f209186519061364f82611893565b6136576124e9565b825260608581930152875161366b816118fb565b5f815288519161367a836118fb565b5f83525f3681375f5b81518110156137e0576136968183611d64565b5190888c8b84519189818401518d8d82516136be575b50505050505050506001915001613683565b5f61372d97948197948c97946136eb8c956001600160a01b039d8e81818d51169c0151169b015190613bc6565b948651996136f88b6118df565b8a528901528488015286015260808501528a60a08501528b60c08501525180958194829363d04dfe2360e01b84528301612a56565b03915afa9384156137d6578b915f956137b8575b508451613756575b50908b8e89838d8d6136ac565b51015116803b1561032157613785925f918c8f84905180978195829463012c676d60e21b8452339084016131de565b03925af19182156137ae5760019261379f575b8981613749565b6137a8906118cb565b5f613798565b8c513d5f823e3d90fd5b6137cd9195503d805f833e612e308183611917565b9050935f613741565b8e513d5f823e3d90fd5b5050505050505050509050565b81156137f7570490565b634e487b7160e01b5f52601260045260245ffd5b6040815110613867576020810151908051603f1981019081116138535760051c821161383f5760016020920160051b010190565b505060405161384d816118fb565b5f815290565b634e487b7160e01b5f52601160045260245ffd5b5060405161384d816118fb565b80511561388457602001515f1a90565b505f90565b905f8091602081519101845af48080613907575b156138bd5750506040513d81523d5f602083013e60203d82010160405290565b156138e457604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b3d156138f5576040513d5f823e3d90fd5b60405163d6bda27560e01b8152600490fd5b503d15158061389d5750813b151561389d565b9161394590606061393a936001600160a01b039485916040880151611d64565b515116940151611d64565b515116146122c757565b6139766001600160e01b0392838316601b0b9260e01d938160e01d9116601b0b8484614125565b90637ffffff582136139c6575b9061398d9161436e565b92909215806139be575b6139a057505090565b6044925060405191638eba4d0760e01b835260048301526024820152fd5b508215613997565b6139d08282615037565b1561398357604483856040519163d556b11160e01b835260048301526024820152fd5b61199a91610a9a916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614713565b929192613a2982613ee9565b93613a3381612e96565b613a945784816001600160e01b03613a529360e01d9116601b0b614b0e565b9290809315613a7f575b50829081613a6b575050509190565b6135c1926001600160a01b03309216613471565b9092505f19811461385357600101915f613a5c565b604051632eaefac360e21b8152600490fd5b60041115613ab057565b634e487b7160e01b5f52602160045260245ffd5b602090939291936001600160a01b036040820195168152613ae483613aa6565b0152565b613af0615050565b60408051630782d7e160e01b81526001600160a01b03831660048201529091828260248173200e12d10bb0c5e4a17e7018f0f1161919bb93895afa928315613bbd575f925f94613b88575b50613b4583613aa6565b600183141580613b76575b613b5a5750505090565b5163ee07877f60e01b8152918291610597919060048401613ac4565b50613b8083613aa6565b821515613b50565b90809450613bac9293503d8511613bb6575b613ba48183611917565b810190614882565b919091925f613b3b565b503d613b9a565b513d5f823e3d90fd5b613bd08251611e3e565b613bda8351611e3e565b9282519281518015155f14613e4f57600201935b60019401840190613bfe826119fb565b95613c19604093613c118551998a611917565b8089526119fb565b613c2b602091601f1901828a01612497565b5f9584519389896002926002885233868901523089890152606097606081018a52613c5584611d17565b52613c5f83611d17565b505f825b613e0f575b505050508651613c7f575b50505050505050505090565b90919293600288613ca28c86613c9b8e809c9d9e018093611d64565b528d611d64565b500185613caf828d611d64565b52613cba818c611d64565b505f965b613cc9575b50613c73565b8851871015613e0a576001600160a01b03613d75898b85613d6c8c60428c88613cf28488611d64565b515116968582613d02868a611d64565b51015192613d10868a611d64565b51838d82511691015182815160051b910120908451927f6ec4dff745ec96dbde88c5d41f8aa5ac13aa1664afb47b8406b44fa945a650c88452830152838201522090519161190160f01b83528d83015260228201522093611d64565b510151916148da565b15613df25787613de18b8e8c8f9e9d9c9b9a999897968f613dce918d613dc4898f8f613db083889f613da7828f611d64565b51511692611d64565b52613dbb828b611d64565b51015192611d64565b52019c8d94611d64565b510151613ddb8383611d64565b52611d64565b500196979895909192939495613cbe565b8851630a57f30960e31b815260048101899052602490fd5b613cc3565b9091929a8251821015613e475790613e3b84809301809d613e308487611d64565b51613ddb8383611d64565b50019082918d93613c63565b9a9291613c68565b505f93613bee565b9160408301926040613e91610a9a606087519401938451906001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b613f6a565b94519301613ea0815186612e6f565b613ea8575050565b90935061199a9192505192518361394f565b919291600160ff1b8401613ed257611cef9350614a39565b90611cef935f0391614713565b61398d828261436e565b613ef1615050565b6040805163b7bad1b160e01b81526001600160a01b0383166004820152909182826024815f73200e12d10bb0c5e4a17e7018f0f1161919bb93895af1928315613bbd575f925f94613b885750613b4583613aa6565b6008815110613884576008015167ffffffffffffffff1667ff0a89c674ee78741490565b9091939284158215175f14613f845750505090505f905f90565b82810192600160fd1b8082019083011760fe1c6140bb575b5050613fa781614cfc565b93613fb181614cfc565b94613fbc8682614d1c565b909182156140ac575f9083986f0785ee10d5da46d900f436a00000000080861161409e575b50670de0b6b3a7640000808b1161408f575b50633b9aca00808b11614080575b50612710808b11614072575b5098805b61406157508190611cef989982600a0a9109960195817fcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccd0a93838211900382610100031b9203901c170291614d2f565b60019290920191600a900480614011565b60049a04998a93019261400d565b600991939a049901915f614001565b601291939a049901915f613ff3565b85049950602592505f613fe1565b50929050611cef949550614d2f565b5f82121561410f57808413614101575b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb2841315613f9c57909250611cef939491614c3a565b909250611cef939491614ca1565b808412156140cb57909250611cef939491614c3a565b9290918061414b576044848460405191637a97930f60e01b835260048301526024820152fd5b90919280155f1461416057505050505f905f90565b6141799361416d91614de9565b92919490938492614de9565b909391928461418788614cfc565b9161419186614cfc565b947f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000094604c91868810614338575b030191600160ff1b98838a018112155f14614305575050035b5f955f8212806142fc575b6142de575b5f8112806142cc575b6142ae5786820103966001600160ff1b03881490816142a4575b508061429b575b80614292575b6142745750906142289291614f95565b915f811361423b575b50611cef93614d2f565b9091604c82136142695761425291600a0a906137ed565b90811561425f575f614231565b505050505f905f90565b50505050505f905f90565b876044916040519163d556b11160e01b835260048301526024820152fd5b505f8512614218565b50828414614212565b905088145f61420b565b604489836040519163d556b11160e01b835260048301526024820152fd5b50806001600160ff1b030182136141f1565b95508087018613156142f65786818703015b956141e8565b5f6142f0565b505f81136141e3565b89985090920390506001600160ff1b038190038701821361432957018601946141d8565b5050505050505050505f905f90565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009650604b92506141bf565b81156137f7570590565b8082601b82810b8314614563577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e1000000000000000000840561450f575b8380820b036144fe57507b199999999999999999999999999999999999999999999999999999987b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc840111156144af575b838060030b03614433575b8084136144175750506001600160e01b036001925b60e01b91161791565b8303600a0a80156137f7576001600160e01b039107159261440e565b92915f8413156144835750906144498383615037565b61446557637ffffffe1901600a0a810290637fffffff926143f9565b506044916040519163d556b11160e01b835260048301526024820152fd5b637fffffff199283039060438213614269576144a291600a0a90614364565b91821561425f57926143f9565b5f198401808060030b146144c357506143ee565b90506001600160e01b039293507b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff915060e01b9260ff1d181617905f90565b600190940193600a909305926143a1565b937f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000840515614550576305f5e100600894058094819201955b9150506143a1565b620186a060059405809481920195614548565b50826143ee57505050505f90600190565b919291600160ff1b919080158061470157509061459091614de9565b9490929091905f8685858582821380156146f8575b6146db575b505050508682841860ff1c94860391039081604c0381116146c05701600a0a8082059190846146a6575b505081019182821860ff1c111561469e57826001600160ff1b031461468057905f600192135f1461465157600a9004915b01925b8115811761461557509190565b8061462e575b508015614626579190565b505f91508190565b91926146449203600160ff1b01600a0a90614364565b600160ff1b91905f61461b565b600a60037fe6666666666666666666666666666666666666666666666666666666666666679201040191614605565b604490836040519163d556b11160e01b835260048301526024820152fd5b509092614608565b81076146b3575b806145d4565b60ff1d600117015f6146ad565b5050509193506146ce579190565b60018160ff1d1790039190565b5f9a50909750909550600160ff1b945092509050868080806145aa565b50835f126145a5565b1561470c5750509190565b9350919050565b93929193841581158181176148645750509061472e91614de9565b919490829561473f82958294614de9565b809692949196938786848213801561485b575b614842575b5050505050508682841860ff1c94860391039081604c0381116146c05701600a0a808205919084614828575b505081019182821860ff1c111561482057826001600160ff1b031461468057905f600192135f146147f157600a9004915b01925b811581176147c457509190565b806147d457508015614626579190565b600160ff1b936147eb9291038401600a0a90614364565b5f61461b565b600a60037fe66666666666666666666666666666666666666666666666666666666666666792010401916147b4565b5090926147b7565b8107614835575b80614783565b60ff1d600117015f61482f565b929b5098509196509450925090505f8080808080614757565b50858412614752565b939593909291901561487a575050614626579190565b945092915050565b919082604091031261032157815160048110156103215760209092015160ff811681036103215790565b9060ff165f03916001600160ff1b0382115f146148d257600a6001818404940192061590565b909190600190565b9091813b614915576148ec91926150b9565b506148f681613aa6565b15918261490257505090565b6001600160a01b03918216911614919050565b6020918160645f935160405192630b135d3f60e11b9788855260048501526040602485015286820190604485015e8281018201859052601f01601f191601915afa905f5114601f3d11161690565b92915f9060018184145f871287151717176149dd575f928082136149cf575b03604c81135f8212176149c357600a0a90846149a18382029384614364565b146149b6575050156149b2575f9190565b5f90565b909350901561199a579190565b5050156149b2575f9190565b5f9560019450925090614982565b5050505f90565b93929190918083145f83125f87121883158715171717614a33575f92808213614a265703604c81135f8212176149c357600a0a90846149a18382029384614364565b9194600193509190614982565b50919050565b909291600160ff1b91828101614acb5750808414614ac157808413918215614ab9578185035b604c811115614aa85750505f915b15614a9957507f8000000000000000000000000000000000000000000000000000000000000001019190565b92506001600160ff1b03039190565b600a0a9081156137f7570491614a6d565b848203614a5f565b505090505f905f90565b93614ad892945f03614574565b80939180928114614aec575b50505f039190565b915092506001600160ff1b03831461468057600a600191059201915f80614ae4565b91925f831215614b36576044838360405191634a7d166b60e01b835260048301526024820152fd5b919283614b4857505090505f90600190565b60ff8116820191808312614c10575f831215614b80575050604c198112614626575f03600a0a91614b7983826137ed565b9283021490565b909293915f81135f14614c0657604d8113614bdb57600a0a9283156137f757835f19048311614bb25750500290600190565b60405163c849483b60e01b815260048101849052602481019290925260ff166044820152606490fd5b5060405163c849483b60e01b81526004810192909252602482015260ff919091166044820152606490fd5b5050905090600190565b60405163c849483b60e01b815260048101869052602481019190915260ff82166044820152606490fd5b909392915f614c4a918184613f6a565b9490945f8483019182019412159081614c97575b8115614c8d575b50614c6f57505090565b604492506040519163d556b11160e01b835260048301526024820152fd5b905083125f614c65565b8281129150614c5e565b614cb693600160fe1b90810193920190613f6a565b9081815f821215614ced575050604b19821261315457614cdb915f03600a0a90614364565b9081614ce5575f90565b600160ff1b90565b93600160ff1b90910192509050565b5f81121561199a57600160ff1b90808203614d15575090565b90505f0390565b905f198183099102908180821091030391565b92939291905f8184181215614dc4576001600160ff1b039283831115614dae57600160ff1b93838503614d6457505050509190565b90919293508514614d7e575050600a600191045f03920190565b604051630ed8062160e21b8152600481019190915260248101919091526044810182905260648101849052608490fd5b5090915050600160ff1b8114613853575f039190565b90916001600160ff1b03808411156135a8578514614d7e575050600a60019104920190565b9190918015614f8b57827f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000080830515614e99575b507f19999999999999999999999999999999999999999999999999999999999999997f0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc830110614e8a575b8313614e745791905f90565b919060018060ff1b926001600160ff1b03030190565b9290600a02905f190192614e68565b6f4b3b4ca85a86c47a098a22400000000080840515614f79575b507728c87cb5c89a2571ebfdcb54864ada834a00000000000000830515614f62575b7b097edd871cfda3a5697758bf0e3cbb5ac5741c640000000000000000830515614f4e575b7e3899162693736ac531a5a58f1fbb4b746504382ca7e4000000000000000000830515614f3e57820515614f2f575b5f614e1d565b9290600a02905f190192614f29565b9391606402916001190193614efa565b93916402540be40002916009190193614efa565b9391678ac7230489e8000002916012190193614ed5565b6025198301955092909202915f614eb3565b505f915081908190565b90915f198383099280830292838086109503948086039584871015615013571461500b579082910960018219018216809204600280826003021880830282030280830282030280830282030280830282030280830282030280920290030293600183805f03040190848311900302920304170290565b505091500490565b60648386866040519263362ced0960e11b8452600484015260248301526044820152fd5b61199a91905f81121561504b575f036150f3565b6150f3565b73200e12d10bb0c5e4a17e7018f0f1161919bb9389803b15801561508e575b6150765750565b602490604051906373e6d7b360e01b82526004820152fd5b507f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d41813f141561506f565b81519190604183036150e9576150e29250602082015190606060408401519301515f1a90615182565b9192909190565b50505f9160029190565b90637ffffff581131561517c57637ffffffe1981019060438213615175575f82121561514957637fffffff91505f0301600a0a7b8000000000000000000000000000000000000000000000000000000202111590565b50600a0a80156137f7577b80000000000000000000000000000000000000000000000000000001041090565b5050151590565b50505f90565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084116151f9579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa15610441575f516001600160a01b038116156151ef57905f905f90565b505f906001905f90565b5050505f91600391905600000000000000000000000000000000000000000000000000000000000000000000000000000000200e12d10bb0c5e4a17e7018f0f1161919bb93890000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000044b608060405234801561000f575f80fd5b506004361061004a575f3560e01c80630782d7e11461004e57806354636d2b14610078578063b7bad1b11461009d578063f5c36eaf146100b0575b5f80fd5b61006161005c366004610363565b6100c3565b60405161006f929190610403565b60405180910390f35b61008b610086366004610363565b6100d8565b60405160ff909116815260200161006f565b6100616100ab366004610363565b6100e9565b61008b6100be366004610363565b6100f5565b5f806100cf5f84610100565b91509150915091565b5f6100e35f836101f0565b92915050565b5f806100cf5f84610281565b5f6100e35f83610356565b73ffffffffffffffffffffffffffffffffffffffff81165f9081526020838152604080832081518083019092525460ff8082161515835261010090910416818301527f313ce56700000000000000000000000000000000000000000000000000000000808452839283908190816004818a5afa915060203d1015610182575f91505b811561019857505f5160ff811115610198575f91505b816101af57505050602001516003925090506101e9565b83516101c3575f955093506101e992505050565b836020015160ff1681146101d85760026101db565b60015b846020015195509550505050505b9250929050565b5f805f6101fd8585610281565b909250905060018260038111156102165761021661039d565b1415801561023557505f8260038111156102325761023261039d565b14155b156102795783826040517fee07877f000000000000000000000000000000000000000000000000000000008152600401610270929190610421565b60405180910390fd5b949350505050565b5f805f8061028f8686610100565b90925090505f8260038111156102a7576102a761039d565b0361034b576040805180820182526001815260ff838116602080840191825273ffffffffffffffffffffffffffffffffffffffff8a165f908152908b9052939093209151825493517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009094169015157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff161761010093909116929092029190911790555b909590945092505050565b5f805f6101fd8585610100565b5f60208284031215610373575f80fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114610396575f80fd5b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b600481106103ff577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b9052565b6040810161041182856103ca565b60ff831660208301529392505050565b73ffffffffffffffffffffffffffffffffffffffff831681526040810161039660208301846103ca56000000000000000000000000000000000000000000"; diff --git a/src/generated/candidate/GenericPoolRaindexV6FlashBorrower.sol b/src/generated/candidate/GenericPoolRaindexV6FlashBorrower.sol index 3b10dbfb09..5a19c7bee4 100644 --- a/src/generated/candidate/GenericPoolRaindexV6FlashBorrower.sol +++ b/src/generated/candidate/GenericPoolRaindexV6FlashBorrower.sol @@ -5,23 +5,23 @@ pragma solidity ^0.8.25; // THIS FILE IS AUTOGENERATED BY THE BUILD SCRIPT. DO NOT EDIT BY HAND. /// @dev Hash of the known bytecode. -bytes32 constant BYTECODE_HASH = bytes32(0x45b0aa707f74bbe440533fed9436e95b98f4709126e7560684b0291c837bff0f); +bytes32 constant BYTECODE_HASH = bytes32(0x77003929ddb191e517202325c3ad94a49c8c1c51aaecf7b3b850f63015f2c1a5); /// @dev The deterministic deploy address of the contract when deployed via /// the Zoltu factory. -address constant DEPLOYED_ADDRESS = address(0x105E99F4Ba7Aa80C8c74Ec8a85EAc6bc82DA1c18); +address constant DEPLOYED_ADDRESS = address(0xd15F480b60CbF0bC03Ba7D42DbcD75532feb8953); /// @dev The creation bytecode of the contract. bytes constant CREATION_CODE = - hex"6080604052348015600e575f80fd5b5060017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055612da7806100405f395ff3fe608060405260043610610034575f3560e01c806301ffc9a71461003d57806323e30c8b146100715780638c18e4ba1461009e57005b3661003b57005b005b348015610048575f80fd5b5061005c6100573660046119d4565b6100b1565b60405190151581526020015b60405180910390f35b34801561007c575f80fd5b5061009061008b366004611a5d565b6100e7565b604051908152602001610068565b61003b6100ac366004611ad4565b610204565b5f6001600160e01b031982166323e30c8b60e01b14806100e157506301ffc9a760e01b6001600160e01b03198316145b92915050565b5f3373c4cf8f35f6fa0a36cbaea5c0a6cea77134c03e2a1461012257604051625e1e6f60e51b81523360048201526024015b60405180910390fd5b6001600160a01b0387163014610156576040516322c7df1960e21b81526001600160a01b0388166004820152602401610119565b5f80610164848601866120d8565b91509150610172828261057c565b6040516334e3942b60e11b815233906369c72856906101959085906004016122f1565b60408051808303815f875af11580156101b0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101d4919061246f565b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd99a9950505050505050505050565b61020c6105f0565b61021b61021882612491565b50565b61022860808501856124fa565b90505f0361024957604051639c95219f60e01b815260040160405180910390fd5b6001600160a01b03851673c4cf8f35f6fa0a36cbaea5c0a6cea77134c03e2a146102915760405163516e822d60e01b81526001600160a01b0386166004820152602401610119565b6102a16080850160608601612540565b6102be57604051636d3a9fe560e01b815260040160405180910390fd5b5f8484846040516020016102d493929190612799565b60408051601f1981840301815291905290505f6102f460808701876124fa565b5f818110610304576103046129ab565b905060200281019061031691906129bf565b61032090806129dd565b61032e9060608101906129f1565b61033b60808901896124fa565b5f81811061034b5761034b6129ab565b905060200281019061035d91906129bf565b60400135818110610370576103706129ab565b6103869260206040909202019081019150612a37565b90505f61039660808801886124fa565b5f8181106103a6576103a66129ab565b90506020028101906103b891906129bf565b6103c290806129dd565b6103d09060408101906129f1565b6103dd60808a018a6124fa565b5f8181106103ed576103ed6129ab565b90506020028101906103ff91906129bf565b60200135818110610412576104126129ab565b6104289260206040909202019081019150612a37565b90505f6104348261061e565b90505f6104408461061e565b90505f61044e8a35836106a2565b90506104656001600160a01b0385168c5f196106c9565b61047a6001600160a01b0386168c5f196106c9565b604051632e7ff4ef60e11b81526001600160a01b038c1690635cffe9de906104ac903090899086908c90600401612a52565b6020604051808303815f875af11580156104c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104ec9190612a83565b610509576040516349088f5960e11b815260040160405180910390fd5b61051d6001600160a01b0386168c5f6106c9565b6105316001600160a01b0385168c5f6106c9565b61054661053d88612491565b85858886610743565b50505050505061057560017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5050505050565b5f82608001515f81518110610593576105936129ab565b60200260200101515f01516060015183608001515f815181106105b8576105b86129ab565b602002602001015160400151815181106105d4576105d46129ab565b60200260200101515f015190506105eb81836109e2565b505050565b6105f8610a8c565b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f610627610ad0565b6040516354636d2b60e01b81526001600160a01b038316600482015273200e12d10bb0c5e4a17e7018f0f1161919bb9389906354636d2b906024016020604051808303815f875af115801561067e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100e19190612a9e565b5f6001600160e01b038316601b0b60e084901d6106c0828286610b5b565b95945050505050565b6106d58383835f610b9f565b6105eb576106e683835f6001610b9f565b61070e57604051635274afe760e01b81526001600160a01b0384166004820152602401610119565b61071b8383836001610b9f565b6105eb57604051635274afe760e01b81526001600160a01b0384166004820152602401610119565b6040805160018082528183019092525f91816020015b6060815260200190600190039081610759575050604080516003808252608082019092529192505f919060208201606080368337019050506040516370a0823160e01b81523060048201529091505f906001600160a01b038816906370a0823190602401602060405180830381865afa1580156107d8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107fc9190612abe565b90508015610818576108186001600160a01b0388163383610c01565b5f6108238288610c0e565b50905080835f81518110610839576108396129ab565b602090810291909101015250506040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa15801561088a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108ae9190612abe565b905080156108ca576108ca6001600160a01b0386163383610c01565b5f6108d58286610c0e565b50905080836001815181106108ec576108ec6129ab565b602090810291909101015250479050801561090b5761090b3382610c4f565b5f610917826012610c0e565b509050808360028151811061092e5761092e6129ab565b602002602001018181525050505080825f8151811061094f5761094f6129ab565b60209081029190910101526040805160018082528183019092525f91816020015b6040805160a0810182525f918101828152606080830193909352608082018390528152602081019190915281526020019060019003908161097057905050905087815f815181106109c3576109c36129ab565b60200260200101819052506109d88382610cc6565b5050505050505050565b5f805f838060200190518101906109f99190612ad5565b919450925090506001600160a01b038316610a27576040516398521dc560e01b815260040160405180910390fd5b6001600160a01b038216610a4e5760405163456ac4c360e11b815260040160405180910390fd5b610a636001600160a01b038616845f196106c9565b610a776001600160a01b0383168247610f0e565b506105756001600160a01b038616845f6106c9565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054600203610ace57604051633ee5aeb560e01b815260040160405180910390fd5b565b73200e12d10bb0c5e4a17e7018f0f1161919bb93893b1580610b27575073200e12d10bb0c5e4a17e7018f0f1161919bb93893f7f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d4114155b15610ace576040516373e6d7b360e01b815273200e12d10bb0c5e4a17e7018f0f1161919bb93896004820152602401610119565b5f805f610b69868686610fbc565b9150915080610b945760405162bc8ecf60e31b81526004810187905260248101869052604401610119565b5090505b9392505050565b60405163095ea7b360e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610bf5578383151615610be9573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b61071b838383600161112e565b5f805f805f610c1d8787611178565b9250925092505f80610c2f85856111d4565b9150915081838015610c3e5750815b9650965050505050505b9250929050565b80471015610c795760405163cf47918160e01b815247600482015260248101829052604401610119565b610c92828260405180602001604052805f81525061141d565b15610c9b575050565b3d15610cad57610ca9611432565b5050565b60405163d6bda27560e01b815260040160405180910390fd5b60408051600480825260a082019092525f91816020015b6060815260200190600190039081610cdd5790505090505f5b8351811015610d3e57838181518110610d1157610d116129ab565b6020026020010151828281518110610d2b57610d2b6129ab565b6020908102919091010152600101610cf6565b50335f8181523060209081526040808320815160a0810183528083018581526060808301879052608083018190529082528185015282518581529384018581528484019093529093909291905b8751811015610f0357878181518110610da657610da66129ab565b602002602001015193505f845f015160400151511115610efb575f845f01515f01516001600160a01b031663d04dfe236040518060e00160405280885f0151602001516001600160a01b03168152602001898152602001885f01516040015181526020015f8152602001610e1e8c8a6020015161143d565b8152602001878152602001868152506040518263ffffffff1660e01b8152600401610e499190612bbb565b5f60405180830381865afa158015610e63573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610e8a9190810190612cb3565b9150505f81511115610ef95784516020015160405163012c676d60e21b81526001600160a01b03909116906304b19db490610ecb908a908590600401612d5f565b5f604051808303815f87803b158015610ee2575f80fd5b505af1158015610ef4573d5f803e3d5ffd5b505050505b505b600101610d8b565b505050505050505050565b606081471015610f3a5760405163cf47918160e01b815247600482015260248101839052604401610119565b5f610f4685848661141d565b9050808015610f6757505f3d1180610f6757505f856001600160a01b03163b115b15610f7c57610f7461171f565b915050610b98565b8015610fa657604051639996b31560e01b81526001600160a01b0386166004820152602401610119565b3d15610cad57610fb4611432565b509392505050565b5f805f851215610fe957604051634a7d166b60e01b81526004810186905260248101859052604401610119565b845f03610ffb57505f90506001611126565b8460ff84168501858112156110365760405163c849483b60e01b8152600481018890526024810187905260ff86166044820152606401610119565b5f805f83121561108257604c19831215611059575f809550955050505050611126565b825f03600a0a915081848161107057611070612d7f565b04955050840290911491506111269050565b5f83131561111b57604d8313156110bf5760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610119565b82600a0a9150815f19816110d5576110d5612d7f565b048411156111095760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610119565b50919091029250600191506111269050565b509193506001925050505b935093915050565b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610bf5578383151615610be9573d5f823e3d81fd5b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8611156111c357600a860460018201600a88065f14935093509350506111cd565b8593509150600190505b9250925092565b5f808383601b82900b82148061130a577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e1000000000000000000870515611255577f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000870515611246576305f5e10087059650600886019550611255565b620186a0870596506005860195505b8687601b0b1461127057600a87059650856001019550611255565b7b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc7b1999999999999999999999999999999999999999999999999999999888820111611304575f600188039050808160030b036113025760e01b6001600160e01b037b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff60ff8b901d18161795505f9450610c489350505050565b505b50611321565b865f0361132157505f935060019250610c48915050565b858660030b146113d8575f8213156113805761133d8383611738565b156113655760405163d556b11160e01b81526004810184905260248101839052604401610119565b637ffffffe19909501600a0a82029550637fffffff946113d8565b637fffffff1986900360438113156113a257505f9450849350610c4892505050565b80600a0a88816113b4576113b4612d7f565b059750875f036113ce57505f9450849350610c4892505050565b50637fffffff1995505b8186136113e85760019350611401565b818603600a0a83816113fc576113fc612d7f565b071593505b5050506001600160e01b03841660e084901b1791509250929050565b5f805f83516020850186885af1949350505050565b6040513d5f823e3d81fd5b60605f825167ffffffffffffffff81111561145a5761145a611b7b565b604051908082528060200260200182016040528015611483578160200160208202803683370190505b5090505f80845111611495575f61149b565b83516001015b85516001010190505f8167ffffffffffffffff8111156114bd576114bd611b7b565b6040519080825280602002602001820160405280156114f057816020015b60608152602001906001900390816114db5790505b5090505f611514604080516002815233602082015230818301526060810190915290565b828281518110611526576115266129ab565b60200260200101819052505f5b8751811015611583578180600101925050878181518110611556576115566129ab565b6020026020010151838381518110611570576115706129ab565b6020908102919091010152600101611533565b50855115611715578080600101915050838282815181106115a6576115a66129ab565b60200260200101819052505f5b8651811015611713576116628782815181106115d1576115d16129ab565b60200260200101515f015161163f61160d8a85815181106115f4576115f46129ab565b6020026020010151602001518051602090810291012090565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f908152601c91909152603c902090565b898481518110611651576116516129ab565b602002602001015160400151611753565b61168257604051630a57f30960e31b815260048101829052602401610119565b868181518110611694576116946129ab565b60200260200101515f01516001600160a01b03165f1b8582815181106116bc576116bc6129ab565b60200260200101818152505081806001019250508681815181106116e2576116e26129ab565b602002602001015160200151838381518110611700576117006129ab565b60209081029190910101526001016115b3565b505b5095945050505050565b6040513d81523d5f602083013e3d602001810160405290565b5f610b985f8412611749578361174d565b835f035b836117c3565b5f836001600160a01b03163b5f036117b1575f806117718585611861565b5090925090505f81600381111561178a5761178a612d93565b1480156117a85750856001600160a01b0316826001600160a01b0316145b92505050610b98565b6117bc8484846118a7565b9050610b98565b5f637ffffff582136117d657505f6100e1565b637ffffffe19820160438113156117f15750508115156100e1565b5f81126118315780600a0a7b800000000000000000000000000000000000000000000000000000018161182657611826612d7f565b0484119150506100e1565b805f03600a0a7b800000000000000000000000000000000000000000000000000000020284101591505092915050565b5f805f8351604103611898576020840151604085015160608601515f1a61188a8882858561190c565b9550955095505050506111cd565b505081515f91506002906111cd565b805160408051630b135d3f60e11b8082526004820186905260248201929092525f92906020820185604483015e5f82606483010152601f820160051c60051b915060205f60648401838a5afa9050825f5114601f3d1116811693505050509392505050565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084111561194557505f915060039050826119ca565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015611996573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b0381166119c157505f9250600191508290506119ca565b92505f91508190505b9450945094915050565b5f602082840312156119e4575f80fd5b81356001600160e01b031981168114610b98575f80fd5b6001600160a01b0381168114610218575f80fd5b8035611a1a816119fb565b919050565b5f8083601f840112611a2f575f80fd5b50813567ffffffffffffffff811115611a46575f80fd5b602083019150836020828501011115610c48575f80fd5b5f805f805f8060a08789031215611a72575f80fd5b8635611a7d816119fb565b95506020870135611a8d816119fb565b94506040870135935060608701359250608087013567ffffffffffffffff811115611ab6575f80fd5b611ac289828a01611a1f565b979a9699509497509295939492505050565b5f805f805f60808688031215611ae8575f80fd5b8535611af3816119fb565b9450602086013567ffffffffffffffff80821115611b0f575f80fd5b9087019060c0828a031215611b22575f80fd5b90945060408701359080821115611b37575f80fd5b611b4389838a01611a1f565b90955093506060880135915080821115611b5b575f80fd5b50860160408189031215611b6d575f80fd5b809150509295509295909350565b634e487b7160e01b5f52604160045260245ffd5b6040516060810167ffffffffffffffff81118282101715611bb257611bb2611b7b565b60405290565b6040805190810167ffffffffffffffff81118282101715611bb257611bb2611b7b565b6040516080810167ffffffffffffffff81118282101715611bb257611bb2611b7b565b60405160a0810167ffffffffffffffff81118282101715611bb257611bb2611b7b565b60405160c0810167ffffffffffffffff81118282101715611bb257611bb2611b7b565b604051601f8201601f1916810167ffffffffffffffff81118282101715611c6d57611c6d611b7b565b604052919050565b8015158114610218575f80fd5b8035611a1a81611c75565b5f67ffffffffffffffff821115611ca657611ca6611b7b565b5060051b60200190565b5f67ffffffffffffffff821115611cc957611cc9611b7b565b50601f01601f191660200190565b5f82601f830112611ce6575f80fd5b8135611cf9611cf482611cb0565b611c44565b818152846020838601011115611d0d575f80fd5b816020850160208301375f918101602001919091529392505050565b5f60608284031215611d39575f80fd5b611d41611b8f565b90508135611d4e816119fb565b81526020820135611d5e816119fb565b6020820152604082013567ffffffffffffffff811115611d7c575f80fd5b611d8884828501611cd7565b60408301525092915050565b5f82601f830112611da3575f80fd5b81356020611db3611cf483611c8d565b82815260069290921b84018101918181019086841115611dd1575f80fd5b8286015b84811015611e175760408189031215611dec575f80fd5b611df4611bb8565b8135611dff816119fb565b81528185013585820152835291830191604001611dd5565b509695505050505050565b5f82601f830112611e31575f80fd5b81356020611e41611cf483611c8d565b82815260059290921b84018101918181019086841115611e5f575f80fd5b8286015b84811015611e1757803567ffffffffffffffff80821115611e82575f80fd5b908801906060828b03601f19011215611e99575f80fd5b611ea1611b8f565b86830135611eae816119fb565b815260408381013583811115611ec2575f80fd5b8401603f81018d13611ed2575f80fd5b88810135611ee2611cf482611c8d565b81815260059190911b82018301908a8101908f831115611f00575f80fd5b928401925b82841015611f1e5783358252928b0192908b0190611f05565b858c0152505050606084013583811115611f36575f80fd5b611f448d8a83880101611cd7565b918301919091525085525050918301918301611e63565b5f82601f830112611f6a575f80fd5b81356020611f7a611cf483611c8d565b82815260059290921b84018101918181019086841115611f98575f80fd5b8286015b84811015611e1757803567ffffffffffffffff80821115611fbb575f80fd5b90880190601f196080838c0382011215611fd3575f80fd5b611fdb611bdb565b8784013583811115611feb575f80fd5b840160a0818e0384011215611ffe575f80fd5b612006611bfe565b9250612013898201611a0f565b8352604081013584811115612026575f80fd5b6120348e8b83850101611d29565b8a850152506060808201358581111561204b575f80fd5b6120598f8c83860101611d94565b604086015250608082013585811115612070575f80fd5b61207e8f8c83860101611d94565b828601525060a0820135608085015283835260408601358a84015280860135604084015260808601359350848411156120b5575f80fd5b6120c38e8b86890101611e22565b90830152508652505050918301918301611f9c565b5f80604083850312156120e9575f80fd5b823567ffffffffffffffff80821115612100575f80fd5b9084019060c08287031215612113575f80fd5b61211b611c21565b82358152602083013560208201526040830135604082015261213f60608401611c82565b6060820152608083013582811115612155575f80fd5b61216188828601611f5b565b60808301525060a083013582811115612178575f80fd5b61218488828601611cd7565b60a0830152509350602085013591508082111561219f575f80fd5b506121ac85828601611cd7565b9150509250929050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f815180845260208085019450602084015f5b8381101561222757815180516001600160a01b0316885283015183880152604090960195908201906001016121f7565b509495945050505050565b5f815180845260208085019450602084015f5b8381101561222757815187529582019590820190600101612245565b5f82825180855260208086019550808260051b8401018186015f5b848110156122e457601f19868403018952815160606001600160a01b0382511685528582015181878701526122b382870182612232565b915050604080830151925085820381870152506122d081836121b6565b9a86019a945050509083019060010161227c565b5090979650505050505050565b5f602080835260e08301845182850152818501516040818187015280870151915060608281880152808801519250608083151560808901526080890151935060a060c060a08a01528585518088526101009750878b019150878160051b8c010189880197505f5b82811015612440578c820360ff190184528851805187845280516001600160a01b03908116898601528d82015188860189905280518216610120870152808f01519091166101408601528a015161016085018a90526123bb6101808601826121b6565b90508a820151607f19808784030160c08801526123d883836121e4565b92508b8401519150808784030160e0880152506123f582826121e4565b915050888201518d8601528d8301518e8601528a8301518b8601528983015192508481038a8601526124278184612261565b9b8e019b968e0196945050506001919091019050612358565b5060a08d01518c8203601f190160c08e0152995061245e818b6121b6565b9d9c50505050505050505050505050565b5f8060408385031215612480575f80fd5b505080516020909101519092909150565b5f604082360312156124a1575f80fd5b6124a9611bb8565b823567ffffffffffffffff808211156124c0575f80fd5b6124cc36838701611d29565b835260208501359150808211156124e1575f80fd5b506124ee36828601611e22565b60208301525092915050565b5f808335601e1984360301811261250f575f80fd5b83018035915067ffffffffffffffff821115612529575f80fd5b6020019150600581901b3603821315610c48575f80fd5b5f60208284031215612550575f80fd5b8135610b9881611c75565b5f808335601e19843603018112612570575f80fd5b830160208101925035905067ffffffffffffffff81111561258f575f80fd5b8060051b3603821315610c48575f80fd5b5f8235605e198336030181126125b4575f80fd5b90910192915050565b5f808335601e198436030181126125d2575f80fd5b830160208101925035905067ffffffffffffffff8111156125f1575f80fd5b803603821315610c48575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f808335601e1984360301811261263c575f80fd5b830160208101925035905067ffffffffffffffff81111561265b575f80fd5b8060061b3603821315610c48575f80fd5b8183525f60208085019450825f5b8581101561222757813561268d816119fb565b6001600160a01b0316875281830135838801526040968701969091019060010161267a565b8183526020808401935f91600585811b8301820185855b8881101561278b57858303601f19018a526126e482896125a0565b606081356126f1816119fb565b6001600160a01b031685526127088288018361255b565b82898801528083880152608092507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811115612742575f80fd5b871b80828885013786019050604061275c848201856125bd565b945083888403018289015261277484840186836125ff565b9e8a019e97505050938701935050506001016126c9565b509098975050505050505050565b5f604080835261010080840187358386015260206060818a013581880152848a01356080880152808a01356127cd81611c75565b151560a08801526127e160808b018b61255b565b60c0898101529384905261012093848901600582901b8a018601835f5b8481101561295b578c830361011f19018452813536879003607e19018112612824575f80fd5b8601803536829003609e1901811261283a575f80fd5b608085528101803561284b816119fb565b6001600160a01b0380821660808801526128678c8401846125a0565b915060a080880152813561287a816119fb565b8116878e0152818c013561288d816119fb565b166101408701526128a0818f01826125bd565b91508a6101608801526128b8610180880183836125ff565b9150506128c78e830183612627565b607f19808985030160c08a01526128df84838561266c565b93506128ed8d860186612627565b93509150808985030160e08a01525061290783838361266c565b9250505060808201358d8701528a8301358b8701528d8301358e8701526129308a84018461255b565b935091508581038a8701526129468184846126b2565b968b01969550505091880191506001016127fe565b505061296a60a08f018f6125bd565b8c8303603f190160e08e015299509750612985818a8a6125ff565b98505050505050858403818701525050506129a18185876125ff565b9695505050505050565b634e487b7160e01b5f52603260045260245ffd5b5f8235607e198336030181126129d3575f80fd5b9190910192915050565b5f8235609e198336030181126129d3575f80fd5b5f808335601e19843603018112612a06575f80fd5b83018035915067ffffffffffffffff821115612a20575f80fd5b6020019150600681901b3603821315610c48575f80fd5b5f60208284031215612a47575f80fd5b8135610b98816119fb565b5f6001600160a01b038087168352808616602084015250836040830152608060608301526129a160808301846121b6565b5f60208284031215612a93575f80fd5b8151610b9881611c75565b5f60208284031215612aae575f80fd5b815160ff81168114610b98575f80fd5b5f60208284031215612ace575f80fd5b5051919050565b5f805f60608486031215612ae7575f80fd5b8351612af2816119fb565b6020850151909350612b03816119fb565b604085015190925067ffffffffffffffff811115612b1f575f80fd5b8401601f81018613612b2f575f80fd5b8051612b3d611cf482611cb0565b818152876020838501011115612b51575f80fd5b8160208401602083015e5f602083830101528093505050509250925092565b5f8282518085526020808601955060208260051b840101602086015f5b848110156122e457601f19868403018952612ba9838351612232565b98840198925090830190600101612b8d565b602081526001600160a01b038251166020820152602082015160408201525f604083015160e06060840152612bf46101008401826121b6565b9050606084015160808401526080840151601f19808584030160a0860152612c1c8383612b70565b925060a08601519150808584030160c0860152612c398383612232565b925060c08601519150808584030160e0860152506106c08282612232565b5f82601f830112612c66575f80fd5b81516020612c76611cf483611c8d565b8083825260208201915060208460051b870101935086841115612c97575f80fd5b602086015b84811015611e175780518352918301918301612c9c565b5f8060408385031215612cc4575f80fd5b825167ffffffffffffffff80821115612cdb575f80fd5b818501915085601f830112612cee575f80fd5b81516020612cfe611cf483611c8d565b82815260059290921b84018101918181019089841115612d1c575f80fd5b948201945b83861015612d3a57855182529482019490820190612d21565b91880151919650909350505080821115612d52575f80fd5b506121ac85828601612c57565b828152604060208201525f612d776040830184612232565b949350505050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52602160045260245ffd"; + hex"6080604052348015600e575f80fd5b5060017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055612ebb806100405f395ff3fe608060405260043610610034575f3560e01c806301ffc9a71461003d57806323e30c8b146100715780634bacdc9d1461009e57005b3661003b57005b005b348015610048575f80fd5b5061005c610057366004611ac5565b6100b1565b60405190151581526020015b60405180910390f35b34801561007c575f80fd5b5061009061008b366004611b4e565b6100e7565b604051908152602001610068565b61003b6100ac366004611bc5565b610204565b5f6001600160e01b031982166323e30c8b60e01b14806100e157506301ffc9a760e01b6001600160e01b03198316145b92915050565b5f33732eb98f9489cff4a429368e389f5ffc6f8d9c5ede1461012257604051625e1e6f60e51b81523360048201526024015b60405180910390fd5b6001600160a01b0387163014610156576040516322c7df1960e21b81526001600160a01b0388166004820152602401610119565b5f80610164848601866121c7565b91509150610172828261057c565b60405163b0460f0760e01b8152339063b0460f07906101959085906004016123eb565b60408051808303815f875af11580156101b0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101d49190612569565b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd99a9950505050505050505050565b61020c6105f0565b61021b6102188261258b565b50565b61022860808501856125f4565b90505f0361024957604051639c95219f60e01b815260040160405180910390fd5b6001600160a01b038516732eb98f9489cff4a429368e389f5ffc6f8d9c5ede146102915760405163516e822d60e01b81526001600160a01b0386166004820152602401610119565b6102a1608085016060860161263a565b6102be57604051636d3a9fe560e01b815260040160405180910390fd5b5f8484846040516020016102d4939291906128ee565b60408051601f1981840301815291905290505f6102f460808701876125f4565b5f81811061030457610304612abf565b90506020028101906103169190612ad3565b6103209080612af1565b61032e906060810190612b05565b61033b60808901896125f4565b5f81811061034b5761034b612abf565b905060200281019061035d9190612ad3565b6040013581811061037057610370612abf565b6103869260206040909202019081019150612b4b565b90505f61039660808801886125f4565b5f8181106103a6576103a6612abf565b90506020028101906103b89190612ad3565b6103c29080612af1565b6103d0906040810190612b05565b6103dd60808a018a6125f4565b5f8181106103ed576103ed612abf565b90506020028101906103ff9190612ad3565b6020013581811061041257610412612abf565b6104289260206040909202019081019150612b4b565b90505f6104348261061e565b90505f6104408461061e565b90505f61044e8a35836106a2565b90506104656001600160a01b0385168c5f196106c9565b61047a6001600160a01b0386168c5f196106c9565b604051632e7ff4ef60e11b81526001600160a01b038c1690635cffe9de906104ac903090899086908c90600401612b66565b6020604051808303815f875af11580156104c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104ec9190612b97565b610509576040516349088f5960e11b815260040160405180910390fd5b61051d6001600160a01b0386168c5f6106c9565b6105316001600160a01b0385168c5f6106c9565b61054661053d8861258b565b85858886610743565b50505050505061057560017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5050505050565b5f82608001515f8151811061059357610593612abf565b60200260200101515f01516060015183608001515f815181106105b8576105b8612abf565b602002602001015160400151815181106105d4576105d4612abf565b60200260200101515f015190506105eb81836109e2565b505050565b6105f8610a8c565b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f610627610ad0565b6040516354636d2b60e01b81526001600160a01b038316600482015273200e12d10bb0c5e4a17e7018f0f1161919bb9389906354636d2b906024016020604051808303815f875af115801561067e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100e19190612bb2565b5f6001600160e01b038316601b0b60e084901d6106c0828286610b5b565b95945050505050565b6106d58383835f610b9f565b6105eb576106e683835f6001610b9f565b61070e57604051635274afe760e01b81526001600160a01b0384166004820152602401610119565b61071b8383836001610b9f565b6105eb57604051635274afe760e01b81526001600160a01b0384166004820152602401610119565b6040805160018082528183019092525f91816020015b6060815260200190600190039081610759575050604080516003808252608082019092529192505f919060208201606080368337019050506040516370a0823160e01b81523060048201529091505f906001600160a01b038816906370a0823190602401602060405180830381865afa1580156107d8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107fc9190612bd2565b90508015610818576108186001600160a01b0388163383610c01565b5f6108238288610c0e565b50905080835f8151811061083957610839612abf565b602090810291909101015250506040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa15801561088a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108ae9190612bd2565b905080156108ca576108ca6001600160a01b0386163383610c01565b5f6108d58286610c0e565b50905080836001815181106108ec576108ec612abf565b602090810291909101015250479050801561090b5761090b3382610c4f565b5f610917826012610c0e565b509050808360028151811061092e5761092e612abf565b602002602001018181525050505080825f8151811061094f5761094f612abf565b60209081029190910101526040805160018082528183019092525f91816020015b6040805160a0810182525f918101828152606080830193909352608082018390528152602081019190915281526020019060019003908161097057905050905087815f815181106109c3576109c3612abf565b60200260200101819052506109d88382610cc6565b5050505050505050565b5f805f838060200190518101906109f99190612be9565b919450925090506001600160a01b038316610a27576040516398521dc560e01b815260040160405180910390fd5b6001600160a01b038216610a4e5760405163456ac4c360e11b815260040160405180910390fd5b610a636001600160a01b038616845f196106c9565b610a776001600160a01b0383168247610f0e565b506105756001600160a01b038616845f6106c9565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054600203610ace57604051633ee5aeb560e01b815260040160405180910390fd5b565b73200e12d10bb0c5e4a17e7018f0f1161919bb93893b1580610b27575073200e12d10bb0c5e4a17e7018f0f1161919bb93893f7f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d4114155b15610ace576040516373e6d7b360e01b815273200e12d10bb0c5e4a17e7018f0f1161919bb93896004820152602401610119565b5f805f610b69868686610fbc565b9150915080610b945760405162bc8ecf60e31b81526004810187905260248101869052604401610119565b5090505b9392505050565b60405163095ea7b360e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610bf5578383151615610be9573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b61071b838383600161112e565b5f805f805f610c1d8787611178565b9250925092505f80610c2f85856111d4565b9150915081838015610c3e5750815b9650965050505050505b9250929050565b80471015610c795760405163cf47918160e01b815247600482015260248101829052604401610119565b610c92828260405180602001604052805f81525061141d565b15610c9b575050565b3d15610cad57610ca9611432565b5050565b60405163d6bda27560e01b815260040160405180910390fd5b60408051600480825260a082019092525f91816020015b6060815260200190600190039081610cdd5790505090505f5b8351811015610d3e57838181518110610d1157610d11612abf565b6020026020010151828281518110610d2b57610d2b612abf565b6020908102919091010152600101610cf6565b50335f8181523060209081526040808320815160a0810183528083018581526060808301879052608083018190529082528185015282518581529384018581528484019093529093909291905b8751811015610f0357878181518110610da657610da6612abf565b602002602001015193505f845f015160400151511115610efb575f845f01515f01516001600160a01b031663d04dfe236040518060e00160405280885f0151602001516001600160a01b03168152602001898152602001885f01516040015181526020015f8152602001610e1e8c8a6020015161143d565b8152602001878152602001868152506040518263ffffffff1660e01b8152600401610e499190612ccf565b5f60405180830381865afa158015610e63573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610e8a9190810190612dc7565b9150505f81511115610ef95784516020015160405163012c676d60e21b81526001600160a01b03909116906304b19db490610ecb908a908590600401612e73565b5f604051808303815f87803b158015610ee2575f80fd5b505af1158015610ef4573d5f803e3d5ffd5b505050505b505b600101610d8b565b505050505050505050565b606081471015610f3a5760405163cf47918160e01b815247600482015260248101839052604401610119565b5f610f4685848661141d565b9050808015610f6757505f3d1180610f6757505f856001600160a01b03163b115b15610f7c57610f74611810565b915050610b98565b8015610fa657604051639996b31560e01b81526001600160a01b0386166004820152602401610119565b3d15610cad57610fb4611432565b509392505050565b5f805f851215610fe957604051634a7d166b60e01b81526004810186905260248101859052604401610119565b845f03610ffb57505f90506001611126565b8460ff84168501858112156110365760405163c849483b60e01b8152600481018890526024810187905260ff86166044820152606401610119565b5f805f83121561108257604c19831215611059575f809550955050505050611126565b825f03600a0a915081848161107057611070612e93565b04955050840290911491506111269050565b5f83131561111b57604d8313156110bf5760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610119565b82600a0a9150815f19816110d5576110d5612e93565b048411156111095760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610119565b50919091029250600191506111269050565b509193506001925050505b935093915050565b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610bf5578383151615610be9573d5f823e3d81fd5b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8611156111c357600a860460018201600a88065f14935093509350506111cd565b8593509150600190505b9250925092565b5f808383601b82900b82148061130a577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e1000000000000000000870515611255577f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000870515611246576305f5e10087059650600886019550611255565b620186a0870596506005860195505b8687601b0b1461127057600a87059650856001019550611255565b7b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc7b1999999999999999999999999999999999999999999999999999999888820111611304575f600188039050808160030b036113025760e01b6001600160e01b037b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff60ff8b901d18161795505f9450610c489350505050565b505b50611321565b865f0361132157505f935060019250610c48915050565b858660030b146113d8575f8213156113805761133d8383611829565b156113655760405163d556b11160e01b81526004810184905260248101839052604401610119565b637ffffffe19909501600a0a82029550637fffffff946113d8565b637fffffff1986900360438113156113a257505f9450849350610c4892505050565b80600a0a88816113b4576113b4612e93565b059750875f036113ce57505f9450849350610c4892505050565b50637fffffff1995505b8186136113e85760019350611401565b818603600a0a83816113fc576113fc612e93565b071593505b5050506001600160e01b03841660e084901b1791509250929050565b5f805f83516020850186885af1949350505050565b6040513d5f823e3d81fd5b60605f825167ffffffffffffffff81111561145a5761145a611c6c565b604051908082528060200260200182016040528015611483578160200160208202803683370190505b5090505f835167ffffffffffffffff8111156114a1576114a1611c6c565b6040519080825280602002602001820160405280156114ca578160200160208202803683370190505b5090505f808551116114dc575f6114e2565b84516002015b86516001010190505f8167ffffffffffffffff81111561150457611504611c6c565b60405190808252806020026020018201604052801561153757816020015b60608152602001906001900390816115225790505b5090505f61155b604080516002815233602082015230818301526060810190915290565b82828151811061156d5761156d612abf565b60200260200101819052505f5b88518110156115ca57818060010192505088818151811061159d5761159d612abf565b60200260200101518383815181106115b7576115b7612abf565b602090810291909101015260010161157a565b50865115611805578080600101915050848282815181106115ed576115ed612abf565b602002602001018190525080806001019150508382828151811061161357611613612abf565b60200260200101819052505f5b87518110156118035761171688828151811061163e5761163e612abf565b60200260200101515f01516116f38a848151811061165e5761165e612abf565b6020026020010151602001516116d48c868151811061167f5761167f612abf565b60200260200101518051604091820151805160209081029181019190912083517f6ec4dff745ec96dbde88c5d41f8aa5ac13aa1664afb47b8406b44fa945a650c8815291820192909252918201526060902090565b60405161190160f01b8152600281019290925260228201526042902090565b8a848151811061170557611705612abf565b602002602001015160600151611844565b61173657604051630a57f30960e31b815260048101829052602401610119565b87818151811061174857611748612abf565b60200260200101515f01516001600160a01b03165f1b86828151811061177057611770612abf565b60200260200101818152505087818151811061178e5761178e612abf565b6020026020010151602001518582815181106117ac576117ac612abf565b60200260200101818152505081806001019250508781815181106117d2576117d2612abf565b6020026020010151604001518383815181106117f0576117f0612abf565b6020908102919091010152600101611620565b505b509695505050505050565b6040513d81523d5f602083013e3d602001810160405290565b5f610b985f841261183a578361183e565b835f035b836118b4565b5f836001600160a01b03163b5f036118a2575f806118628585611952565b5090925090505f81600381111561187b5761187b612ea7565b1480156118995750856001600160a01b0316826001600160a01b0316145b92505050610b98565b6118ad848484611998565b9050610b98565b5f637ffffff582136118c757505f6100e1565b637ffffffe19820160438113156118e25750508115156100e1565b5f81126119225780600a0a7b800000000000000000000000000000000000000000000000000000018161191757611917612e93565b0484119150506100e1565b805f03600a0a7b800000000000000000000000000000000000000000000000000000020284101591505092915050565b5f805f8351604103611989576020840151604085015160608601515f1a61197b888285856119fd565b9550955095505050506111cd565b505081515f91506002906111cd565b805160408051630b135d3f60e11b8082526004820186905260248201929092525f92906020820185604483015e5f82606483010152601f820160051c60051b915060205f60648401838a5afa9050825f5114601f3d1116811693505050509392505050565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841115611a3657505f91506003905082611abb565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015611a87573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b038116611ab257505f925060019150829050611abb565b92505f91508190505b9450945094915050565b5f60208284031215611ad5575f80fd5b81356001600160e01b031981168114610b98575f80fd5b6001600160a01b0381168114610218575f80fd5b8035611b0b81611aec565b919050565b5f8083601f840112611b20575f80fd5b50813567ffffffffffffffff811115611b37575f80fd5b602083019150836020828501011115610c48575f80fd5b5f805f805f8060a08789031215611b63575f80fd5b8635611b6e81611aec565b95506020870135611b7e81611aec565b94506040870135935060608701359250608087013567ffffffffffffffff811115611ba7575f80fd5b611bb389828a01611b10565b979a9699509497509295939492505050565b5f805f805f60808688031215611bd9575f80fd5b8535611be481611aec565b9450602086013567ffffffffffffffff80821115611c00575f80fd5b9087019060c0828a031215611c13575f80fd5b90945060408701359080821115611c28575f80fd5b611c3489838a01611b10565b90955093506060880135915080821115611c4c575f80fd5b50860160408189031215611c5e575f80fd5b809150509295509295909350565b634e487b7160e01b5f52604160045260245ffd5b6040805190810167ffffffffffffffff81118282101715611ca357611ca3611c6c565b60405290565b6040516080810167ffffffffffffffff81118282101715611ca357611ca3611c6c565b60405160a0810167ffffffffffffffff81118282101715611ca357611ca3611c6c565b60405160c0810167ffffffffffffffff81118282101715611ca357611ca3611c6c565b604051601f8201601f1916810167ffffffffffffffff81118282101715611d3b57611d3b611c6c565b604052919050565b8015158114610218575f80fd5b8035611b0b81611d43565b5f67ffffffffffffffff821115611d7457611d74611c6c565b5060051b60200190565b5f67ffffffffffffffff821115611d9757611d97611c6c565b50601f01601f191660200190565b5f82601f830112611db4575f80fd5b8135611dc7611dc282611d7e565b611d12565b818152846020838601011115611ddb575f80fd5b816020850160208301375f918101602001919091529392505050565b5f60608284031215611e07575f80fd5b6040516060810167ffffffffffffffff8282108183111715611e2b57611e2b611c6c565b8160405282935084359150611e3f82611aec565b908252602084013590611e5182611aec565b8160208401526040850135915080821115611e6a575f80fd5b50611e7785828601611da5565b6040830152505092915050565b5f82601f830112611e93575f80fd5b81356020611ea3611dc283611d5b565b82815260069290921b84018101918181019086841115611ec1575f80fd5b8286015b848110156118055760408189031215611edc575f80fd5b611ee4611c80565b8135611eef81611aec565b81528185013585820152835291830191604001611ec5565b5f82601f830112611f16575f80fd5b81356020611f26611dc283611d5b565b82815260059290921b84018101918181019086841115611f44575f80fd5b8286015b8481101561180557803567ffffffffffffffff80821115611f67575f80fd5b908801906080828b03601f19011215611f7e575f80fd5b611f86611ca9565b86830135611f9381611aec565b815260408381013588830152606084013583811115611fb0575f80fd5b8401603f81018d13611fc0575f80fd5b88810135611fd0611dc282611d5b565b81815260059190911b82018301908a8101908f831115611fee575f80fd5b928401925b8284101561200c5783358252928b0192908b0190611ff3565b80858701525050505050608083013582811115612027575f80fd5b6120358c8983870101611da5565b60608301525085525050918301918301611f48565b5f82601f830112612059575f80fd5b81356020612069611dc283611d5b565b82815260059290921b84018101918181019086841115612087575f80fd5b8286015b8481101561180557803567ffffffffffffffff808211156120aa575f80fd5b90880190601f196080838c03820112156120c2575f80fd5b6120ca611ca9565b87840135838111156120da575f80fd5b840160a0818e03840112156120ed575f80fd5b6120f5611ccc565b9250612102898201611b00565b8352604081013584811115612115575f80fd5b6121238e8b83850101611df7565b8a850152506060808201358581111561213a575f80fd5b6121488f8c83860101611e84565b60408601525060808201358581111561215f575f80fd5b61216d8f8c83860101611e84565b828601525060a0820135608085015283835260408601358a84015280860135604084015260808601359350848411156121a4575f80fd5b6121b28e8b86890101611f07565b9083015250865250505091830191830161208b565b5f80604083850312156121d8575f80fd5b823567ffffffffffffffff808211156121ef575f80fd5b9084019060c08287031215612202575f80fd5b61220a611cef565b82358152602083013560208201526040830135604082015261222e60608401611d50565b6060820152608083013582811115612244575f80fd5b6122508882860161204a565b60808301525060a083013582811115612267575f80fd5b61227388828601611da5565b60a0830152509350602085013591508082111561228e575f80fd5b5061229b85828601611da5565b9150509250929050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f815180845260208085019450602084015f5b8381101561231657815180516001600160a01b0316885283015183880152604090960195908201906001016122e6565b509495945050505050565b5f815180845260208085019450602084015f5b8381101561231657815187529582019590820190600101612334565b5f82825180855260208086019550808260051b8401018186015f5b848110156123de57601f19868403018952815160806001600160a01b038251168552858201518686015260408083015182828801526123ac83880182612321565b92505050606080830151925085820381870152506123ca81836122a5565b9a86019a945050509083019060010161236b565b5090979650505050505050565b5f602080835260e08301845182850152818501516040818187015280870151915060608281880152808801519250608083151560808901526080890151935060a060c060a08a01528585518088526101009750878b019150878160051b8c010189880197505f5b8281101561253a578c820360ff190184528851805187845280516001600160a01b03908116898601528d82015188860189905280518216610120870152808f01519091166101408601528a015161016085018a90526124b56101808601826122a5565b90508a820151607f19808784030160c08801526124d283836122d3565b92508b8401519150808784030160e0880152506124ef82826122d3565b915050888201518d8601528d8301518e8601528a8301518b8601528983015192508481038a8601526125218184612350565b9b8e019b968e0196945050506001919091019050612452565b5060a08d01518c8203601f190160c08e01529950612558818b6122a5565b9d9c50505050505050505050505050565b5f806040838503121561257a575f80fd5b505080516020909101519092909150565b5f6040823603121561259b575f80fd5b6125a3611c80565b823567ffffffffffffffff808211156125ba575f80fd5b6125c636838701611df7565b835260208501359150808211156125db575f80fd5b506125e836828601611f07565b60208301525092915050565b5f808335601e19843603018112612609575f80fd5b83018035915067ffffffffffffffff821115612623575f80fd5b6020019150600581901b3603821315610c48575f80fd5b5f6020828403121561264a575f80fd5b8135610b9881611d43565b5f808335601e1984360301811261266a575f80fd5b830160208101925035905067ffffffffffffffff811115612689575f80fd5b8060051b3603821315610c48575f80fd5b5f808335601e198436030181126126af575f80fd5b830160208101925035905067ffffffffffffffff8111156126ce575f80fd5b803603821315610c48575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f813561271081611aec565b6001600160a01b03908116845260208301359061272c82611aec565b16602084015261273f604083018361269a565b606060408601526106c06060860182846126dc565b5f808335601e19843603018112612769575f80fd5b830160208101925035905067ffffffffffffffff811115612788575f80fd5b8060061b3603821315610c48575f80fd5b8183525f60208085019450825f5b858110156123165781356127ba81611aec565b6001600160a01b031687528183013583880152604096870196909101906001016127a7565b5f8235607e198336030181126127f3575f80fd5b90910192915050565b8183526020808401935f91600585811b8301820185855b888110156128e057858303601f19018a5261282e82896127df565b6080813561283b81611aec565b6001600160a01b031685528187013587860152604061285c81840184612655565b8383890152808489015260a093507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811115612896575f80fd5b881b915081818885013750850160606128b18482018561269a565b94508388840301828901526128c984840186836126dc565b9e8a019e9750505093870193505050600101612813565b509098975050505050505050565b5f604080835261010080840187358386015260208089013560608701526080848a0135608088015260608a013561292481611d43565b151560a088015261293860808b018b612655565b60c0898101529384905261012093848901600582901b8a018601835f5b84811015612a6f578c830361011f1901845261297182876127df565b8035609e19823603018112612984575f80fd5b8885528101803561299481611aec565b6001600160a01b0316858a0152808a013536829003605e190181126129b7575f80fd5b60a0808701526129cb8c8701838301612704565b90506129d98e830183612754565b607f19808985030160c08a01526129f1848385612799565b9350612a006060860186612754565b93509150808985030160e08a015250612a1a838383612799565b92505050898201358d8701528a8301358b8701528d8301358e870152612a436060840184612655565b935091508581036060870152612a5a8184846127fc565b968b0196955050509188019150600101612955565b5050612a7e60a08f018f61269a565b8c8303603f190160e08e015299509750612a99818a8a6126dc565b9850505050505085840381870152505050612ab58185876126dc565b9695505050505050565b634e487b7160e01b5f52603260045260245ffd5b5f8235607e19833603018112612ae7575f80fd5b9190910192915050565b5f8235609e19833603018112612ae7575f80fd5b5f808335601e19843603018112612b1a575f80fd5b83018035915067ffffffffffffffff821115612b34575f80fd5b6020019150600681901b3603821315610c48575f80fd5b5f60208284031215612b5b575f80fd5b8135610b9881611aec565b5f6001600160a01b03808716835280861660208401525083604083015260806060830152612ab560808301846122a5565b5f60208284031215612ba7575f80fd5b8151610b9881611d43565b5f60208284031215612bc2575f80fd5b815160ff81168114610b98575f80fd5b5f60208284031215612be2575f80fd5b5051919050565b5f805f60608486031215612bfb575f80fd5b8351612c0681611aec565b6020850151909350612c1781611aec565b604085015190925067ffffffffffffffff811115612c33575f80fd5b8401601f81018613612c43575f80fd5b8051612c51611dc282611d7e565b818152876020838501011115612c65575f80fd5b8160208401602083015e5f602083830101528093505050509250925092565b5f8282518085526020808601955060208260051b840101602086015f5b848110156123de57601f19868403018952612cbd838351612321565b98840198925090830190600101612ca1565b602081526001600160a01b038251166020820152602082015160408201525f604083015160e06060840152612d086101008401826122a5565b9050606084015160808401526080840151601f19808584030160a0860152612d308383612c84565b925060a08601519150808584030160c0860152612d4d8383612321565b925060c08601519150808584030160e0860152506106c08282612321565b5f82601f830112612d7a575f80fd5b81516020612d8a611dc283611d5b565b8083825260208201915060208460051b870101935086841115612dab575f80fd5b602086015b848110156118055780518352918301918301612db0565b5f8060408385031215612dd8575f80fd5b825167ffffffffffffffff80821115612def575f80fd5b818501915085601f830112612e02575f80fd5b81516020612e12611dc283611d5b565b82815260059290921b84018101918181019089841115612e30575f80fd5b948201945b83861015612e4e57855182529482019490820190612e35565b91880151919650909350505080821115612e66575f80fd5b5061229b85828601612d6b565b828152604060208201525f612e8b6040830184612321565b949350505050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52602160045260245ffd"; /// @dev The runtime bytecode of the contract. bytes constant RUNTIME_CODE = - hex"608060405260043610610034575f3560e01c806301ffc9a71461003d57806323e30c8b146100715780638c18e4ba1461009e57005b3661003b57005b005b348015610048575f80fd5b5061005c6100573660046119d4565b6100b1565b60405190151581526020015b60405180910390f35b34801561007c575f80fd5b5061009061008b366004611a5d565b6100e7565b604051908152602001610068565b61003b6100ac366004611ad4565b610204565b5f6001600160e01b031982166323e30c8b60e01b14806100e157506301ffc9a760e01b6001600160e01b03198316145b92915050565b5f3373c4cf8f35f6fa0a36cbaea5c0a6cea77134c03e2a1461012257604051625e1e6f60e51b81523360048201526024015b60405180910390fd5b6001600160a01b0387163014610156576040516322c7df1960e21b81526001600160a01b0388166004820152602401610119565b5f80610164848601866120d8565b91509150610172828261057c565b6040516334e3942b60e11b815233906369c72856906101959085906004016122f1565b60408051808303815f875af11580156101b0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101d4919061246f565b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd99a9950505050505050505050565b61020c6105f0565b61021b61021882612491565b50565b61022860808501856124fa565b90505f0361024957604051639c95219f60e01b815260040160405180910390fd5b6001600160a01b03851673c4cf8f35f6fa0a36cbaea5c0a6cea77134c03e2a146102915760405163516e822d60e01b81526001600160a01b0386166004820152602401610119565b6102a16080850160608601612540565b6102be57604051636d3a9fe560e01b815260040160405180910390fd5b5f8484846040516020016102d493929190612799565b60408051601f1981840301815291905290505f6102f460808701876124fa565b5f818110610304576103046129ab565b905060200281019061031691906129bf565b61032090806129dd565b61032e9060608101906129f1565b61033b60808901896124fa565b5f81811061034b5761034b6129ab565b905060200281019061035d91906129bf565b60400135818110610370576103706129ab565b6103869260206040909202019081019150612a37565b90505f61039660808801886124fa565b5f8181106103a6576103a66129ab565b90506020028101906103b891906129bf565b6103c290806129dd565b6103d09060408101906129f1565b6103dd60808a018a6124fa565b5f8181106103ed576103ed6129ab565b90506020028101906103ff91906129bf565b60200135818110610412576104126129ab565b6104289260206040909202019081019150612a37565b90505f6104348261061e565b90505f6104408461061e565b90505f61044e8a35836106a2565b90506104656001600160a01b0385168c5f196106c9565b61047a6001600160a01b0386168c5f196106c9565b604051632e7ff4ef60e11b81526001600160a01b038c1690635cffe9de906104ac903090899086908c90600401612a52565b6020604051808303815f875af11580156104c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104ec9190612a83565b610509576040516349088f5960e11b815260040160405180910390fd5b61051d6001600160a01b0386168c5f6106c9565b6105316001600160a01b0385168c5f6106c9565b61054661053d88612491565b85858886610743565b50505050505061057560017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5050505050565b5f82608001515f81518110610593576105936129ab565b60200260200101515f01516060015183608001515f815181106105b8576105b86129ab565b602002602001015160400151815181106105d4576105d46129ab565b60200260200101515f015190506105eb81836109e2565b505050565b6105f8610a8c565b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f610627610ad0565b6040516354636d2b60e01b81526001600160a01b038316600482015273200e12d10bb0c5e4a17e7018f0f1161919bb9389906354636d2b906024016020604051808303815f875af115801561067e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100e19190612a9e565b5f6001600160e01b038316601b0b60e084901d6106c0828286610b5b565b95945050505050565b6106d58383835f610b9f565b6105eb576106e683835f6001610b9f565b61070e57604051635274afe760e01b81526001600160a01b0384166004820152602401610119565b61071b8383836001610b9f565b6105eb57604051635274afe760e01b81526001600160a01b0384166004820152602401610119565b6040805160018082528183019092525f91816020015b6060815260200190600190039081610759575050604080516003808252608082019092529192505f919060208201606080368337019050506040516370a0823160e01b81523060048201529091505f906001600160a01b038816906370a0823190602401602060405180830381865afa1580156107d8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107fc9190612abe565b90508015610818576108186001600160a01b0388163383610c01565b5f6108238288610c0e565b50905080835f81518110610839576108396129ab565b602090810291909101015250506040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa15801561088a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108ae9190612abe565b905080156108ca576108ca6001600160a01b0386163383610c01565b5f6108d58286610c0e565b50905080836001815181106108ec576108ec6129ab565b602090810291909101015250479050801561090b5761090b3382610c4f565b5f610917826012610c0e565b509050808360028151811061092e5761092e6129ab565b602002602001018181525050505080825f8151811061094f5761094f6129ab565b60209081029190910101526040805160018082528183019092525f91816020015b6040805160a0810182525f918101828152606080830193909352608082018390528152602081019190915281526020019060019003908161097057905050905087815f815181106109c3576109c36129ab565b60200260200101819052506109d88382610cc6565b5050505050505050565b5f805f838060200190518101906109f99190612ad5565b919450925090506001600160a01b038316610a27576040516398521dc560e01b815260040160405180910390fd5b6001600160a01b038216610a4e5760405163456ac4c360e11b815260040160405180910390fd5b610a636001600160a01b038616845f196106c9565b610a776001600160a01b0383168247610f0e565b506105756001600160a01b038616845f6106c9565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054600203610ace57604051633ee5aeb560e01b815260040160405180910390fd5b565b73200e12d10bb0c5e4a17e7018f0f1161919bb93893b1580610b27575073200e12d10bb0c5e4a17e7018f0f1161919bb93893f7f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d4114155b15610ace576040516373e6d7b360e01b815273200e12d10bb0c5e4a17e7018f0f1161919bb93896004820152602401610119565b5f805f610b69868686610fbc565b9150915080610b945760405162bc8ecf60e31b81526004810187905260248101869052604401610119565b5090505b9392505050565b60405163095ea7b360e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610bf5578383151615610be9573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b61071b838383600161112e565b5f805f805f610c1d8787611178565b9250925092505f80610c2f85856111d4565b9150915081838015610c3e5750815b9650965050505050505b9250929050565b80471015610c795760405163cf47918160e01b815247600482015260248101829052604401610119565b610c92828260405180602001604052805f81525061141d565b15610c9b575050565b3d15610cad57610ca9611432565b5050565b60405163d6bda27560e01b815260040160405180910390fd5b60408051600480825260a082019092525f91816020015b6060815260200190600190039081610cdd5790505090505f5b8351811015610d3e57838181518110610d1157610d116129ab565b6020026020010151828281518110610d2b57610d2b6129ab565b6020908102919091010152600101610cf6565b50335f8181523060209081526040808320815160a0810183528083018581526060808301879052608083018190529082528185015282518581529384018581528484019093529093909291905b8751811015610f0357878181518110610da657610da66129ab565b602002602001015193505f845f015160400151511115610efb575f845f01515f01516001600160a01b031663d04dfe236040518060e00160405280885f0151602001516001600160a01b03168152602001898152602001885f01516040015181526020015f8152602001610e1e8c8a6020015161143d565b8152602001878152602001868152506040518263ffffffff1660e01b8152600401610e499190612bbb565b5f60405180830381865afa158015610e63573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610e8a9190810190612cb3565b9150505f81511115610ef95784516020015160405163012c676d60e21b81526001600160a01b03909116906304b19db490610ecb908a908590600401612d5f565b5f604051808303815f87803b158015610ee2575f80fd5b505af1158015610ef4573d5f803e3d5ffd5b505050505b505b600101610d8b565b505050505050505050565b606081471015610f3a5760405163cf47918160e01b815247600482015260248101839052604401610119565b5f610f4685848661141d565b9050808015610f6757505f3d1180610f6757505f856001600160a01b03163b115b15610f7c57610f7461171f565b915050610b98565b8015610fa657604051639996b31560e01b81526001600160a01b0386166004820152602401610119565b3d15610cad57610fb4611432565b509392505050565b5f805f851215610fe957604051634a7d166b60e01b81526004810186905260248101859052604401610119565b845f03610ffb57505f90506001611126565b8460ff84168501858112156110365760405163c849483b60e01b8152600481018890526024810187905260ff86166044820152606401610119565b5f805f83121561108257604c19831215611059575f809550955050505050611126565b825f03600a0a915081848161107057611070612d7f565b04955050840290911491506111269050565b5f83131561111b57604d8313156110bf5760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610119565b82600a0a9150815f19816110d5576110d5612d7f565b048411156111095760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610119565b50919091029250600191506111269050565b509193506001925050505b935093915050565b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610bf5578383151615610be9573d5f823e3d81fd5b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8611156111c357600a860460018201600a88065f14935093509350506111cd565b8593509150600190505b9250925092565b5f808383601b82900b82148061130a577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e1000000000000000000870515611255577f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000870515611246576305f5e10087059650600886019550611255565b620186a0870596506005860195505b8687601b0b1461127057600a87059650856001019550611255565b7b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc7b1999999999999999999999999999999999999999999999999999999888820111611304575f600188039050808160030b036113025760e01b6001600160e01b037b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff60ff8b901d18161795505f9450610c489350505050565b505b50611321565b865f0361132157505f935060019250610c48915050565b858660030b146113d8575f8213156113805761133d8383611738565b156113655760405163d556b11160e01b81526004810184905260248101839052604401610119565b637ffffffe19909501600a0a82029550637fffffff946113d8565b637fffffff1986900360438113156113a257505f9450849350610c4892505050565b80600a0a88816113b4576113b4612d7f565b059750875f036113ce57505f9450849350610c4892505050565b50637fffffff1995505b8186136113e85760019350611401565b818603600a0a83816113fc576113fc612d7f565b071593505b5050506001600160e01b03841660e084901b1791509250929050565b5f805f83516020850186885af1949350505050565b6040513d5f823e3d81fd5b60605f825167ffffffffffffffff81111561145a5761145a611b7b565b604051908082528060200260200182016040528015611483578160200160208202803683370190505b5090505f80845111611495575f61149b565b83516001015b85516001010190505f8167ffffffffffffffff8111156114bd576114bd611b7b565b6040519080825280602002602001820160405280156114f057816020015b60608152602001906001900390816114db5790505b5090505f611514604080516002815233602082015230818301526060810190915290565b828281518110611526576115266129ab565b60200260200101819052505f5b8751811015611583578180600101925050878181518110611556576115566129ab565b6020026020010151838381518110611570576115706129ab565b6020908102919091010152600101611533565b50855115611715578080600101915050838282815181106115a6576115a66129ab565b60200260200101819052505f5b8651811015611713576116628782815181106115d1576115d16129ab565b60200260200101515f015161163f61160d8a85815181106115f4576115f46129ab565b6020026020010151602001518051602090810291012090565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f908152601c91909152603c902090565b898481518110611651576116516129ab565b602002602001015160400151611753565b61168257604051630a57f30960e31b815260048101829052602401610119565b868181518110611694576116946129ab565b60200260200101515f01516001600160a01b03165f1b8582815181106116bc576116bc6129ab565b60200260200101818152505081806001019250508681815181106116e2576116e26129ab565b602002602001015160200151838381518110611700576117006129ab565b60209081029190910101526001016115b3565b505b5095945050505050565b6040513d81523d5f602083013e3d602001810160405290565b5f610b985f8412611749578361174d565b835f035b836117c3565b5f836001600160a01b03163b5f036117b1575f806117718585611861565b5090925090505f81600381111561178a5761178a612d93565b1480156117a85750856001600160a01b0316826001600160a01b0316145b92505050610b98565b6117bc8484846118a7565b9050610b98565b5f637ffffff582136117d657505f6100e1565b637ffffffe19820160438113156117f15750508115156100e1565b5f81126118315780600a0a7b800000000000000000000000000000000000000000000000000000018161182657611826612d7f565b0484119150506100e1565b805f03600a0a7b800000000000000000000000000000000000000000000000000000020284101591505092915050565b5f805f8351604103611898576020840151604085015160608601515f1a61188a8882858561190c565b9550955095505050506111cd565b505081515f91506002906111cd565b805160408051630b135d3f60e11b8082526004820186905260248201929092525f92906020820185604483015e5f82606483010152601f820160051c60051b915060205f60648401838a5afa9050825f5114601f3d1116811693505050509392505050565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084111561194557505f915060039050826119ca565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015611996573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b0381166119c157505f9250600191508290506119ca565b92505f91508190505b9450945094915050565b5f602082840312156119e4575f80fd5b81356001600160e01b031981168114610b98575f80fd5b6001600160a01b0381168114610218575f80fd5b8035611a1a816119fb565b919050565b5f8083601f840112611a2f575f80fd5b50813567ffffffffffffffff811115611a46575f80fd5b602083019150836020828501011115610c48575f80fd5b5f805f805f8060a08789031215611a72575f80fd5b8635611a7d816119fb565b95506020870135611a8d816119fb565b94506040870135935060608701359250608087013567ffffffffffffffff811115611ab6575f80fd5b611ac289828a01611a1f565b979a9699509497509295939492505050565b5f805f805f60808688031215611ae8575f80fd5b8535611af3816119fb565b9450602086013567ffffffffffffffff80821115611b0f575f80fd5b9087019060c0828a031215611b22575f80fd5b90945060408701359080821115611b37575f80fd5b611b4389838a01611a1f565b90955093506060880135915080821115611b5b575f80fd5b50860160408189031215611b6d575f80fd5b809150509295509295909350565b634e487b7160e01b5f52604160045260245ffd5b6040516060810167ffffffffffffffff81118282101715611bb257611bb2611b7b565b60405290565b6040805190810167ffffffffffffffff81118282101715611bb257611bb2611b7b565b6040516080810167ffffffffffffffff81118282101715611bb257611bb2611b7b565b60405160a0810167ffffffffffffffff81118282101715611bb257611bb2611b7b565b60405160c0810167ffffffffffffffff81118282101715611bb257611bb2611b7b565b604051601f8201601f1916810167ffffffffffffffff81118282101715611c6d57611c6d611b7b565b604052919050565b8015158114610218575f80fd5b8035611a1a81611c75565b5f67ffffffffffffffff821115611ca657611ca6611b7b565b5060051b60200190565b5f67ffffffffffffffff821115611cc957611cc9611b7b565b50601f01601f191660200190565b5f82601f830112611ce6575f80fd5b8135611cf9611cf482611cb0565b611c44565b818152846020838601011115611d0d575f80fd5b816020850160208301375f918101602001919091529392505050565b5f60608284031215611d39575f80fd5b611d41611b8f565b90508135611d4e816119fb565b81526020820135611d5e816119fb565b6020820152604082013567ffffffffffffffff811115611d7c575f80fd5b611d8884828501611cd7565b60408301525092915050565b5f82601f830112611da3575f80fd5b81356020611db3611cf483611c8d565b82815260069290921b84018101918181019086841115611dd1575f80fd5b8286015b84811015611e175760408189031215611dec575f80fd5b611df4611bb8565b8135611dff816119fb565b81528185013585820152835291830191604001611dd5565b509695505050505050565b5f82601f830112611e31575f80fd5b81356020611e41611cf483611c8d565b82815260059290921b84018101918181019086841115611e5f575f80fd5b8286015b84811015611e1757803567ffffffffffffffff80821115611e82575f80fd5b908801906060828b03601f19011215611e99575f80fd5b611ea1611b8f565b86830135611eae816119fb565b815260408381013583811115611ec2575f80fd5b8401603f81018d13611ed2575f80fd5b88810135611ee2611cf482611c8d565b81815260059190911b82018301908a8101908f831115611f00575f80fd5b928401925b82841015611f1e5783358252928b0192908b0190611f05565b858c0152505050606084013583811115611f36575f80fd5b611f448d8a83880101611cd7565b918301919091525085525050918301918301611e63565b5f82601f830112611f6a575f80fd5b81356020611f7a611cf483611c8d565b82815260059290921b84018101918181019086841115611f98575f80fd5b8286015b84811015611e1757803567ffffffffffffffff80821115611fbb575f80fd5b90880190601f196080838c0382011215611fd3575f80fd5b611fdb611bdb565b8784013583811115611feb575f80fd5b840160a0818e0384011215611ffe575f80fd5b612006611bfe565b9250612013898201611a0f565b8352604081013584811115612026575f80fd5b6120348e8b83850101611d29565b8a850152506060808201358581111561204b575f80fd5b6120598f8c83860101611d94565b604086015250608082013585811115612070575f80fd5b61207e8f8c83860101611d94565b828601525060a0820135608085015283835260408601358a84015280860135604084015260808601359350848411156120b5575f80fd5b6120c38e8b86890101611e22565b90830152508652505050918301918301611f9c565b5f80604083850312156120e9575f80fd5b823567ffffffffffffffff80821115612100575f80fd5b9084019060c08287031215612113575f80fd5b61211b611c21565b82358152602083013560208201526040830135604082015261213f60608401611c82565b6060820152608083013582811115612155575f80fd5b61216188828601611f5b565b60808301525060a083013582811115612178575f80fd5b61218488828601611cd7565b60a0830152509350602085013591508082111561219f575f80fd5b506121ac85828601611cd7565b9150509250929050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f815180845260208085019450602084015f5b8381101561222757815180516001600160a01b0316885283015183880152604090960195908201906001016121f7565b509495945050505050565b5f815180845260208085019450602084015f5b8381101561222757815187529582019590820190600101612245565b5f82825180855260208086019550808260051b8401018186015f5b848110156122e457601f19868403018952815160606001600160a01b0382511685528582015181878701526122b382870182612232565b915050604080830151925085820381870152506122d081836121b6565b9a86019a945050509083019060010161227c565b5090979650505050505050565b5f602080835260e08301845182850152818501516040818187015280870151915060608281880152808801519250608083151560808901526080890151935060a060c060a08a01528585518088526101009750878b019150878160051b8c010189880197505f5b82811015612440578c820360ff190184528851805187845280516001600160a01b03908116898601528d82015188860189905280518216610120870152808f01519091166101408601528a015161016085018a90526123bb6101808601826121b6565b90508a820151607f19808784030160c08801526123d883836121e4565b92508b8401519150808784030160e0880152506123f582826121e4565b915050888201518d8601528d8301518e8601528a8301518b8601528983015192508481038a8601526124278184612261565b9b8e019b968e0196945050506001919091019050612358565b5060a08d01518c8203601f190160c08e0152995061245e818b6121b6565b9d9c50505050505050505050505050565b5f8060408385031215612480575f80fd5b505080516020909101519092909150565b5f604082360312156124a1575f80fd5b6124a9611bb8565b823567ffffffffffffffff808211156124c0575f80fd5b6124cc36838701611d29565b835260208501359150808211156124e1575f80fd5b506124ee36828601611e22565b60208301525092915050565b5f808335601e1984360301811261250f575f80fd5b83018035915067ffffffffffffffff821115612529575f80fd5b6020019150600581901b3603821315610c48575f80fd5b5f60208284031215612550575f80fd5b8135610b9881611c75565b5f808335601e19843603018112612570575f80fd5b830160208101925035905067ffffffffffffffff81111561258f575f80fd5b8060051b3603821315610c48575f80fd5b5f8235605e198336030181126125b4575f80fd5b90910192915050565b5f808335601e198436030181126125d2575f80fd5b830160208101925035905067ffffffffffffffff8111156125f1575f80fd5b803603821315610c48575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f808335601e1984360301811261263c575f80fd5b830160208101925035905067ffffffffffffffff81111561265b575f80fd5b8060061b3603821315610c48575f80fd5b8183525f60208085019450825f5b8581101561222757813561268d816119fb565b6001600160a01b0316875281830135838801526040968701969091019060010161267a565b8183526020808401935f91600585811b8301820185855b8881101561278b57858303601f19018a526126e482896125a0565b606081356126f1816119fb565b6001600160a01b031685526127088288018361255b565b82898801528083880152608092507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811115612742575f80fd5b871b80828885013786019050604061275c848201856125bd565b945083888403018289015261277484840186836125ff565b9e8a019e97505050938701935050506001016126c9565b509098975050505050505050565b5f604080835261010080840187358386015260206060818a013581880152848a01356080880152808a01356127cd81611c75565b151560a08801526127e160808b018b61255b565b60c0898101529384905261012093848901600582901b8a018601835f5b8481101561295b578c830361011f19018452813536879003607e19018112612824575f80fd5b8601803536829003609e1901811261283a575f80fd5b608085528101803561284b816119fb565b6001600160a01b0380821660808801526128678c8401846125a0565b915060a080880152813561287a816119fb565b8116878e0152818c013561288d816119fb565b166101408701526128a0818f01826125bd565b91508a6101608801526128b8610180880183836125ff565b9150506128c78e830183612627565b607f19808985030160c08a01526128df84838561266c565b93506128ed8d860186612627565b93509150808985030160e08a01525061290783838361266c565b9250505060808201358d8701528a8301358b8701528d8301358e8701526129308a84018461255b565b935091508581038a8701526129468184846126b2565b968b01969550505091880191506001016127fe565b505061296a60a08f018f6125bd565b8c8303603f190160e08e015299509750612985818a8a6125ff565b98505050505050858403818701525050506129a18185876125ff565b9695505050505050565b634e487b7160e01b5f52603260045260245ffd5b5f8235607e198336030181126129d3575f80fd5b9190910192915050565b5f8235609e198336030181126129d3575f80fd5b5f808335601e19843603018112612a06575f80fd5b83018035915067ffffffffffffffff821115612a20575f80fd5b6020019150600681901b3603821315610c48575f80fd5b5f60208284031215612a47575f80fd5b8135610b98816119fb565b5f6001600160a01b038087168352808616602084015250836040830152608060608301526129a160808301846121b6565b5f60208284031215612a93575f80fd5b8151610b9881611c75565b5f60208284031215612aae575f80fd5b815160ff81168114610b98575f80fd5b5f60208284031215612ace575f80fd5b5051919050565b5f805f60608486031215612ae7575f80fd5b8351612af2816119fb565b6020850151909350612b03816119fb565b604085015190925067ffffffffffffffff811115612b1f575f80fd5b8401601f81018613612b2f575f80fd5b8051612b3d611cf482611cb0565b818152876020838501011115612b51575f80fd5b8160208401602083015e5f602083830101528093505050509250925092565b5f8282518085526020808601955060208260051b840101602086015f5b848110156122e457601f19868403018952612ba9838351612232565b98840198925090830190600101612b8d565b602081526001600160a01b038251166020820152602082015160408201525f604083015160e06060840152612bf46101008401826121b6565b9050606084015160808401526080840151601f19808584030160a0860152612c1c8383612b70565b925060a08601519150808584030160c0860152612c398383612232565b925060c08601519150808584030160e0860152506106c08282612232565b5f82601f830112612c66575f80fd5b81516020612c76611cf483611c8d565b8083825260208201915060208460051b870101935086841115612c97575f80fd5b602086015b84811015611e175780518352918301918301612c9c565b5f8060408385031215612cc4575f80fd5b825167ffffffffffffffff80821115612cdb575f80fd5b818501915085601f830112612cee575f80fd5b81516020612cfe611cf483611c8d565b82815260059290921b84018101918181019089841115612d1c575f80fd5b948201945b83861015612d3a57855182529482019490820190612d21565b91880151919650909350505080821115612d52575f80fd5b506121ac85828601612c57565b828152604060208201525f612d776040830184612232565b949350505050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52602160045260245ffd"; + hex"608060405260043610610034575f3560e01c806301ffc9a71461003d57806323e30c8b146100715780634bacdc9d1461009e57005b3661003b57005b005b348015610048575f80fd5b5061005c610057366004611ac5565b6100b1565b60405190151581526020015b60405180910390f35b34801561007c575f80fd5b5061009061008b366004611b4e565b6100e7565b604051908152602001610068565b61003b6100ac366004611bc5565b610204565b5f6001600160e01b031982166323e30c8b60e01b14806100e157506301ffc9a760e01b6001600160e01b03198316145b92915050565b5f33732eb98f9489cff4a429368e389f5ffc6f8d9c5ede1461012257604051625e1e6f60e51b81523360048201526024015b60405180910390fd5b6001600160a01b0387163014610156576040516322c7df1960e21b81526001600160a01b0388166004820152602401610119565b5f80610164848601866121c7565b91509150610172828261057c565b60405163b0460f0760e01b8152339063b0460f07906101959085906004016123eb565b60408051808303815f875af11580156101b0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101d49190612569565b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd99a9950505050505050505050565b61020c6105f0565b61021b6102188261258b565b50565b61022860808501856125f4565b90505f0361024957604051639c95219f60e01b815260040160405180910390fd5b6001600160a01b038516732eb98f9489cff4a429368e389f5ffc6f8d9c5ede146102915760405163516e822d60e01b81526001600160a01b0386166004820152602401610119565b6102a1608085016060860161263a565b6102be57604051636d3a9fe560e01b815260040160405180910390fd5b5f8484846040516020016102d4939291906128ee565b60408051601f1981840301815291905290505f6102f460808701876125f4565b5f81811061030457610304612abf565b90506020028101906103169190612ad3565b6103209080612af1565b61032e906060810190612b05565b61033b60808901896125f4565b5f81811061034b5761034b612abf565b905060200281019061035d9190612ad3565b6040013581811061037057610370612abf565b6103869260206040909202019081019150612b4b565b90505f61039660808801886125f4565b5f8181106103a6576103a6612abf565b90506020028101906103b89190612ad3565b6103c29080612af1565b6103d0906040810190612b05565b6103dd60808a018a6125f4565b5f8181106103ed576103ed612abf565b90506020028101906103ff9190612ad3565b6020013581811061041257610412612abf565b6104289260206040909202019081019150612b4b565b90505f6104348261061e565b90505f6104408461061e565b90505f61044e8a35836106a2565b90506104656001600160a01b0385168c5f196106c9565b61047a6001600160a01b0386168c5f196106c9565b604051632e7ff4ef60e11b81526001600160a01b038c1690635cffe9de906104ac903090899086908c90600401612b66565b6020604051808303815f875af11580156104c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104ec9190612b97565b610509576040516349088f5960e11b815260040160405180910390fd5b61051d6001600160a01b0386168c5f6106c9565b6105316001600160a01b0385168c5f6106c9565b61054661053d8861258b565b85858886610743565b50505050505061057560017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5050505050565b5f82608001515f8151811061059357610593612abf565b60200260200101515f01516060015183608001515f815181106105b8576105b8612abf565b602002602001015160400151815181106105d4576105d4612abf565b60200260200101515f015190506105eb81836109e2565b505050565b6105f8610a8c565b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f610627610ad0565b6040516354636d2b60e01b81526001600160a01b038316600482015273200e12d10bb0c5e4a17e7018f0f1161919bb9389906354636d2b906024016020604051808303815f875af115801561067e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100e19190612bb2565b5f6001600160e01b038316601b0b60e084901d6106c0828286610b5b565b95945050505050565b6106d58383835f610b9f565b6105eb576106e683835f6001610b9f565b61070e57604051635274afe760e01b81526001600160a01b0384166004820152602401610119565b61071b8383836001610b9f565b6105eb57604051635274afe760e01b81526001600160a01b0384166004820152602401610119565b6040805160018082528183019092525f91816020015b6060815260200190600190039081610759575050604080516003808252608082019092529192505f919060208201606080368337019050506040516370a0823160e01b81523060048201529091505f906001600160a01b038816906370a0823190602401602060405180830381865afa1580156107d8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107fc9190612bd2565b90508015610818576108186001600160a01b0388163383610c01565b5f6108238288610c0e565b50905080835f8151811061083957610839612abf565b602090810291909101015250506040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa15801561088a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108ae9190612bd2565b905080156108ca576108ca6001600160a01b0386163383610c01565b5f6108d58286610c0e565b50905080836001815181106108ec576108ec612abf565b602090810291909101015250479050801561090b5761090b3382610c4f565b5f610917826012610c0e565b509050808360028151811061092e5761092e612abf565b602002602001018181525050505080825f8151811061094f5761094f612abf565b60209081029190910101526040805160018082528183019092525f91816020015b6040805160a0810182525f918101828152606080830193909352608082018390528152602081019190915281526020019060019003908161097057905050905087815f815181106109c3576109c3612abf565b60200260200101819052506109d88382610cc6565b5050505050505050565b5f805f838060200190518101906109f99190612be9565b919450925090506001600160a01b038316610a27576040516398521dc560e01b815260040160405180910390fd5b6001600160a01b038216610a4e5760405163456ac4c360e11b815260040160405180910390fd5b610a636001600160a01b038616845f196106c9565b610a776001600160a01b0383168247610f0e565b506105756001600160a01b038616845f6106c9565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054600203610ace57604051633ee5aeb560e01b815260040160405180910390fd5b565b73200e12d10bb0c5e4a17e7018f0f1161919bb93893b1580610b27575073200e12d10bb0c5e4a17e7018f0f1161919bb93893f7f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d4114155b15610ace576040516373e6d7b360e01b815273200e12d10bb0c5e4a17e7018f0f1161919bb93896004820152602401610119565b5f805f610b69868686610fbc565b9150915080610b945760405162bc8ecf60e31b81526004810187905260248101869052604401610119565b5090505b9392505050565b60405163095ea7b360e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610bf5578383151615610be9573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b61071b838383600161112e565b5f805f805f610c1d8787611178565b9250925092505f80610c2f85856111d4565b9150915081838015610c3e5750815b9650965050505050505b9250929050565b80471015610c795760405163cf47918160e01b815247600482015260248101829052604401610119565b610c92828260405180602001604052805f81525061141d565b15610c9b575050565b3d15610cad57610ca9611432565b5050565b60405163d6bda27560e01b815260040160405180910390fd5b60408051600480825260a082019092525f91816020015b6060815260200190600190039081610cdd5790505090505f5b8351811015610d3e57838181518110610d1157610d11612abf565b6020026020010151828281518110610d2b57610d2b612abf565b6020908102919091010152600101610cf6565b50335f8181523060209081526040808320815160a0810183528083018581526060808301879052608083018190529082528185015282518581529384018581528484019093529093909291905b8751811015610f0357878181518110610da657610da6612abf565b602002602001015193505f845f015160400151511115610efb575f845f01515f01516001600160a01b031663d04dfe236040518060e00160405280885f0151602001516001600160a01b03168152602001898152602001885f01516040015181526020015f8152602001610e1e8c8a6020015161143d565b8152602001878152602001868152506040518263ffffffff1660e01b8152600401610e499190612ccf565b5f60405180830381865afa158015610e63573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610e8a9190810190612dc7565b9150505f81511115610ef95784516020015160405163012c676d60e21b81526001600160a01b03909116906304b19db490610ecb908a908590600401612e73565b5f604051808303815f87803b158015610ee2575f80fd5b505af1158015610ef4573d5f803e3d5ffd5b505050505b505b600101610d8b565b505050505050505050565b606081471015610f3a5760405163cf47918160e01b815247600482015260248101839052604401610119565b5f610f4685848661141d565b9050808015610f6757505f3d1180610f6757505f856001600160a01b03163b115b15610f7c57610f74611810565b915050610b98565b8015610fa657604051639996b31560e01b81526001600160a01b0386166004820152602401610119565b3d15610cad57610fb4611432565b509392505050565b5f805f851215610fe957604051634a7d166b60e01b81526004810186905260248101859052604401610119565b845f03610ffb57505f90506001611126565b8460ff84168501858112156110365760405163c849483b60e01b8152600481018890526024810187905260ff86166044820152606401610119565b5f805f83121561108257604c19831215611059575f809550955050505050611126565b825f03600a0a915081848161107057611070612e93565b04955050840290911491506111269050565b5f83131561111b57604d8313156110bf5760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610119565b82600a0a9150815f19816110d5576110d5612e93565b048411156111095760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610119565b50919091029250600191506111269050565b509193506001925050505b935093915050565b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610bf5578383151615610be9573d5f823e3d81fd5b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8611156111c357600a860460018201600a88065f14935093509350506111cd565b8593509150600190505b9250925092565b5f808383601b82900b82148061130a577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e1000000000000000000870515611255577f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000870515611246576305f5e10087059650600886019550611255565b620186a0870596506005860195505b8687601b0b1461127057600a87059650856001019550611255565b7b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc7b1999999999999999999999999999999999999999999999999999999888820111611304575f600188039050808160030b036113025760e01b6001600160e01b037b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff60ff8b901d18161795505f9450610c489350505050565b505b50611321565b865f0361132157505f935060019250610c48915050565b858660030b146113d8575f8213156113805761133d8383611829565b156113655760405163d556b11160e01b81526004810184905260248101839052604401610119565b637ffffffe19909501600a0a82029550637fffffff946113d8565b637fffffff1986900360438113156113a257505f9450849350610c4892505050565b80600a0a88816113b4576113b4612e93565b059750875f036113ce57505f9450849350610c4892505050565b50637fffffff1995505b8186136113e85760019350611401565b818603600a0a83816113fc576113fc612e93565b071593505b5050506001600160e01b03841660e084901b1791509250929050565b5f805f83516020850186885af1949350505050565b6040513d5f823e3d81fd5b60605f825167ffffffffffffffff81111561145a5761145a611c6c565b604051908082528060200260200182016040528015611483578160200160208202803683370190505b5090505f835167ffffffffffffffff8111156114a1576114a1611c6c565b6040519080825280602002602001820160405280156114ca578160200160208202803683370190505b5090505f808551116114dc575f6114e2565b84516002015b86516001010190505f8167ffffffffffffffff81111561150457611504611c6c565b60405190808252806020026020018201604052801561153757816020015b60608152602001906001900390816115225790505b5090505f61155b604080516002815233602082015230818301526060810190915290565b82828151811061156d5761156d612abf565b60200260200101819052505f5b88518110156115ca57818060010192505088818151811061159d5761159d612abf565b60200260200101518383815181106115b7576115b7612abf565b602090810291909101015260010161157a565b50865115611805578080600101915050848282815181106115ed576115ed612abf565b602002602001018190525080806001019150508382828151811061161357611613612abf565b60200260200101819052505f5b87518110156118035761171688828151811061163e5761163e612abf565b60200260200101515f01516116f38a848151811061165e5761165e612abf565b6020026020010151602001516116d48c868151811061167f5761167f612abf565b60200260200101518051604091820151805160209081029181019190912083517f6ec4dff745ec96dbde88c5d41f8aa5ac13aa1664afb47b8406b44fa945a650c8815291820192909252918201526060902090565b60405161190160f01b8152600281019290925260228201526042902090565b8a848151811061170557611705612abf565b602002602001015160600151611844565b61173657604051630a57f30960e31b815260048101829052602401610119565b87818151811061174857611748612abf565b60200260200101515f01516001600160a01b03165f1b86828151811061177057611770612abf565b60200260200101818152505087818151811061178e5761178e612abf565b6020026020010151602001518582815181106117ac576117ac612abf565b60200260200101818152505081806001019250508781815181106117d2576117d2612abf565b6020026020010151604001518383815181106117f0576117f0612abf565b6020908102919091010152600101611620565b505b509695505050505050565b6040513d81523d5f602083013e3d602001810160405290565b5f610b985f841261183a578361183e565b835f035b836118b4565b5f836001600160a01b03163b5f036118a2575f806118628585611952565b5090925090505f81600381111561187b5761187b612ea7565b1480156118995750856001600160a01b0316826001600160a01b0316145b92505050610b98565b6118ad848484611998565b9050610b98565b5f637ffffff582136118c757505f6100e1565b637ffffffe19820160438113156118e25750508115156100e1565b5f81126119225780600a0a7b800000000000000000000000000000000000000000000000000000018161191757611917612e93565b0484119150506100e1565b805f03600a0a7b800000000000000000000000000000000000000000000000000000020284101591505092915050565b5f805f8351604103611989576020840151604085015160608601515f1a61197b888285856119fd565b9550955095505050506111cd565b505081515f91506002906111cd565b805160408051630b135d3f60e11b8082526004820186905260248201929092525f92906020820185604483015e5f82606483010152601f820160051c60051b915060205f60648401838a5afa9050825f5114601f3d1116811693505050509392505050565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841115611a3657505f91506003905082611abb565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015611a87573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b038116611ab257505f925060019150829050611abb565b92505f91508190505b9450945094915050565b5f60208284031215611ad5575f80fd5b81356001600160e01b031981168114610b98575f80fd5b6001600160a01b0381168114610218575f80fd5b8035611b0b81611aec565b919050565b5f8083601f840112611b20575f80fd5b50813567ffffffffffffffff811115611b37575f80fd5b602083019150836020828501011115610c48575f80fd5b5f805f805f8060a08789031215611b63575f80fd5b8635611b6e81611aec565b95506020870135611b7e81611aec565b94506040870135935060608701359250608087013567ffffffffffffffff811115611ba7575f80fd5b611bb389828a01611b10565b979a9699509497509295939492505050565b5f805f805f60808688031215611bd9575f80fd5b8535611be481611aec565b9450602086013567ffffffffffffffff80821115611c00575f80fd5b9087019060c0828a031215611c13575f80fd5b90945060408701359080821115611c28575f80fd5b611c3489838a01611b10565b90955093506060880135915080821115611c4c575f80fd5b50860160408189031215611c5e575f80fd5b809150509295509295909350565b634e487b7160e01b5f52604160045260245ffd5b6040805190810167ffffffffffffffff81118282101715611ca357611ca3611c6c565b60405290565b6040516080810167ffffffffffffffff81118282101715611ca357611ca3611c6c565b60405160a0810167ffffffffffffffff81118282101715611ca357611ca3611c6c565b60405160c0810167ffffffffffffffff81118282101715611ca357611ca3611c6c565b604051601f8201601f1916810167ffffffffffffffff81118282101715611d3b57611d3b611c6c565b604052919050565b8015158114610218575f80fd5b8035611b0b81611d43565b5f67ffffffffffffffff821115611d7457611d74611c6c565b5060051b60200190565b5f67ffffffffffffffff821115611d9757611d97611c6c565b50601f01601f191660200190565b5f82601f830112611db4575f80fd5b8135611dc7611dc282611d7e565b611d12565b818152846020838601011115611ddb575f80fd5b816020850160208301375f918101602001919091529392505050565b5f60608284031215611e07575f80fd5b6040516060810167ffffffffffffffff8282108183111715611e2b57611e2b611c6c565b8160405282935084359150611e3f82611aec565b908252602084013590611e5182611aec565b8160208401526040850135915080821115611e6a575f80fd5b50611e7785828601611da5565b6040830152505092915050565b5f82601f830112611e93575f80fd5b81356020611ea3611dc283611d5b565b82815260069290921b84018101918181019086841115611ec1575f80fd5b8286015b848110156118055760408189031215611edc575f80fd5b611ee4611c80565b8135611eef81611aec565b81528185013585820152835291830191604001611ec5565b5f82601f830112611f16575f80fd5b81356020611f26611dc283611d5b565b82815260059290921b84018101918181019086841115611f44575f80fd5b8286015b8481101561180557803567ffffffffffffffff80821115611f67575f80fd5b908801906080828b03601f19011215611f7e575f80fd5b611f86611ca9565b86830135611f9381611aec565b815260408381013588830152606084013583811115611fb0575f80fd5b8401603f81018d13611fc0575f80fd5b88810135611fd0611dc282611d5b565b81815260059190911b82018301908a8101908f831115611fee575f80fd5b928401925b8284101561200c5783358252928b0192908b0190611ff3565b80858701525050505050608083013582811115612027575f80fd5b6120358c8983870101611da5565b60608301525085525050918301918301611f48565b5f82601f830112612059575f80fd5b81356020612069611dc283611d5b565b82815260059290921b84018101918181019086841115612087575f80fd5b8286015b8481101561180557803567ffffffffffffffff808211156120aa575f80fd5b90880190601f196080838c03820112156120c2575f80fd5b6120ca611ca9565b87840135838111156120da575f80fd5b840160a0818e03840112156120ed575f80fd5b6120f5611ccc565b9250612102898201611b00565b8352604081013584811115612115575f80fd5b6121238e8b83850101611df7565b8a850152506060808201358581111561213a575f80fd5b6121488f8c83860101611e84565b60408601525060808201358581111561215f575f80fd5b61216d8f8c83860101611e84565b828601525060a0820135608085015283835260408601358a84015280860135604084015260808601359350848411156121a4575f80fd5b6121b28e8b86890101611f07565b9083015250865250505091830191830161208b565b5f80604083850312156121d8575f80fd5b823567ffffffffffffffff808211156121ef575f80fd5b9084019060c08287031215612202575f80fd5b61220a611cef565b82358152602083013560208201526040830135604082015261222e60608401611d50565b6060820152608083013582811115612244575f80fd5b6122508882860161204a565b60808301525060a083013582811115612267575f80fd5b61227388828601611da5565b60a0830152509350602085013591508082111561228e575f80fd5b5061229b85828601611da5565b9150509250929050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f815180845260208085019450602084015f5b8381101561231657815180516001600160a01b0316885283015183880152604090960195908201906001016122e6565b509495945050505050565b5f815180845260208085019450602084015f5b8381101561231657815187529582019590820190600101612334565b5f82825180855260208086019550808260051b8401018186015f5b848110156123de57601f19868403018952815160806001600160a01b038251168552858201518686015260408083015182828801526123ac83880182612321565b92505050606080830151925085820381870152506123ca81836122a5565b9a86019a945050509083019060010161236b565b5090979650505050505050565b5f602080835260e08301845182850152818501516040818187015280870151915060608281880152808801519250608083151560808901526080890151935060a060c060a08a01528585518088526101009750878b019150878160051b8c010189880197505f5b8281101561253a578c820360ff190184528851805187845280516001600160a01b03908116898601528d82015188860189905280518216610120870152808f01519091166101408601528a015161016085018a90526124b56101808601826122a5565b90508a820151607f19808784030160c08801526124d283836122d3565b92508b8401519150808784030160e0880152506124ef82826122d3565b915050888201518d8601528d8301518e8601528a8301518b8601528983015192508481038a8601526125218184612350565b9b8e019b968e0196945050506001919091019050612452565b5060a08d01518c8203601f190160c08e01529950612558818b6122a5565b9d9c50505050505050505050505050565b5f806040838503121561257a575f80fd5b505080516020909101519092909150565b5f6040823603121561259b575f80fd5b6125a3611c80565b823567ffffffffffffffff808211156125ba575f80fd5b6125c636838701611df7565b835260208501359150808211156125db575f80fd5b506125e836828601611f07565b60208301525092915050565b5f808335601e19843603018112612609575f80fd5b83018035915067ffffffffffffffff821115612623575f80fd5b6020019150600581901b3603821315610c48575f80fd5b5f6020828403121561264a575f80fd5b8135610b9881611d43565b5f808335601e1984360301811261266a575f80fd5b830160208101925035905067ffffffffffffffff811115612689575f80fd5b8060051b3603821315610c48575f80fd5b5f808335601e198436030181126126af575f80fd5b830160208101925035905067ffffffffffffffff8111156126ce575f80fd5b803603821315610c48575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f813561271081611aec565b6001600160a01b03908116845260208301359061272c82611aec565b16602084015261273f604083018361269a565b606060408601526106c06060860182846126dc565b5f808335601e19843603018112612769575f80fd5b830160208101925035905067ffffffffffffffff811115612788575f80fd5b8060061b3603821315610c48575f80fd5b8183525f60208085019450825f5b858110156123165781356127ba81611aec565b6001600160a01b031687528183013583880152604096870196909101906001016127a7565b5f8235607e198336030181126127f3575f80fd5b90910192915050565b8183526020808401935f91600585811b8301820185855b888110156128e057858303601f19018a5261282e82896127df565b6080813561283b81611aec565b6001600160a01b031685528187013587860152604061285c81840184612655565b8383890152808489015260a093507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811115612896575f80fd5b881b915081818885013750850160606128b18482018561269a565b94508388840301828901526128c984840186836126dc565b9e8a019e9750505093870193505050600101612813565b509098975050505050505050565b5f604080835261010080840187358386015260208089013560608701526080848a0135608088015260608a013561292481611d43565b151560a088015261293860808b018b612655565b60c0898101529384905261012093848901600582901b8a018601835f5b84811015612a6f578c830361011f1901845261297182876127df565b8035609e19823603018112612984575f80fd5b8885528101803561299481611aec565b6001600160a01b0316858a0152808a013536829003605e190181126129b7575f80fd5b60a0808701526129cb8c8701838301612704565b90506129d98e830183612754565b607f19808985030160c08a01526129f1848385612799565b9350612a006060860186612754565b93509150808985030160e08a015250612a1a838383612799565b92505050898201358d8701528a8301358b8701528d8301358e870152612a436060840184612655565b935091508581036060870152612a5a8184846127fc565b968b0196955050509188019150600101612955565b5050612a7e60a08f018f61269a565b8c8303603f190160e08e015299509750612a99818a8a6126dc565b9850505050505085840381870152505050612ab58185876126dc565b9695505050505050565b634e487b7160e01b5f52603260045260245ffd5b5f8235607e19833603018112612ae7575f80fd5b9190910192915050565b5f8235609e19833603018112612ae7575f80fd5b5f808335601e19843603018112612b1a575f80fd5b83018035915067ffffffffffffffff821115612b34575f80fd5b6020019150600681901b3603821315610c48575f80fd5b5f60208284031215612b5b575f80fd5b8135610b9881611aec565b5f6001600160a01b03808716835280861660208401525083604083015260806060830152612ab560808301846122a5565b5f60208284031215612ba7575f80fd5b8151610b9881611d43565b5f60208284031215612bc2575f80fd5b815160ff81168114610b98575f80fd5b5f60208284031215612be2575f80fd5b5051919050565b5f805f60608486031215612bfb575f80fd5b8351612c0681611aec565b6020850151909350612c1781611aec565b604085015190925067ffffffffffffffff811115612c33575f80fd5b8401601f81018613612c43575f80fd5b8051612c51611dc282611d7e565b818152876020838501011115612c65575f80fd5b8160208401602083015e5f602083830101528093505050509250925092565b5f8282518085526020808601955060208260051b840101602086015f5b848110156123de57601f19868403018952612cbd838351612321565b98840198925090830190600101612ca1565b602081526001600160a01b038251166020820152602082015160408201525f604083015160e06060840152612d086101008401826122a5565b9050606084015160808401526080840151601f19808584030160a0860152612d308383612c84565b925060a08601519150808584030160c0860152612d4d8383612321565b925060c08601519150808584030160e0860152506106c08282612321565b5f82601f830112612d7a575f80fd5b81516020612d8a611dc283611d5b565b8083825260208201915060208460051b870101935086841115612dab575f80fd5b602086015b848110156118055780518352918301918301612db0565b5f8060408385031215612dd8575f80fd5b825167ffffffffffffffff80821115612def575f80fd5b818501915085601f830112612e02575f80fd5b81516020612e12611dc283611d5b565b82815260059290921b84018101918181019089841115612e30575f80fd5b948201945b83861015612e4e57855182529482019490820190612e35565b91880151919650909350505080821115612e66575f80fd5b5061229b85828601612d6b565b828152604060208201525f612e8b6040830184612321565b949350505050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52602160045260245ffd"; /// @dev What MUST already be on a network before this release can be /// broadcast there: an address, and the runtime code that belongs at it. /// `abi.encode`d as a `DeployDependency[]` because Solidity has no /// file-scope constant of dynamic array type. bytes constant DEPENDENCIES = - hex"0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000005220000000000000000000000000c4cf8f35f6fa0a36cbaea5c0a6cea77134c03e2a000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000051806080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a7146117cf575080631f69cb75146115725780632cb77e9f146115465780632fbc4ba0146113fc57806341d1514f146113c55780635cffe9de1461126957806360746119146110e5578063613255ab1461106257806369c7285614610771578063709fb8a5146104375780639235084d146103e3578063ac9650d814610295578063d7e442ec14610237578063d9d98ce4146101865763fa501182146100c1575f80fd5b34610182576101403660031901126101825767ffffffffffffffff600435818111610182576100f4903690600401611b64565b6024358281116101825761010c903690600401611b64565b60c0366043190112610182576101043583811161018257610131903690600401611d0a565b90610124359384116101825761014e61015c943690600401611d0a565b926101576126ea565b612230565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b5f80fd5b34610182576040366003190112610182576001600160a01b036101a7611853565b166040516370a0823160e01b8152306004820152602081602481855afa90811561022c575f916101fa575b50156101e25760206040515f8152f35b60249060405190633c5bf76960e21b82526004820152fd5b90506020813d602011610224575b81610215602093836119d3565b810103126101825751826101d2565b3d9150610208565b6040513d5f823e3d90fd5b346101825760203660031901126101825760043567ffffffffffffffff81116101825761028f61026e61015c923690600401611822565b91906102786126ea565b60405192610285846119b7565b5f84523691611dde565b90612b82565b34610182576020806003193601126101825760043567ffffffffffffffff8111610182576102c7903690600401611822565b9190604051926102d6846119b7565b5f84528284016102e582611ab7565b946102f360405196876119d3565b8286526102ff83611ab7565b9361031186880195601f190186612214565b5f5b84811061037557604080518881528951818a018190525f92600582901b83018101918a918c9085015b8287106103495785850386f35b909192938280610365600193603f198a820301865288516118df565b960192019601959291909261033c565b806103c4886103be61039160019560059d9c9d1b8701876120f4565b929089846040519586938585013782018381015f81528b519283915e015f838201520380845201826119d3565b306139f0565b6103ce828a611fda565b526103d98189611fda565b5001969596610313565b3461018257600319602036820112610182576004359067ffffffffffffffff82116101825760809082360301126101825761042260609160040161213c565b90604051921515835260208301526040820152f35b34610182576003196040368201126101825760043567ffffffffffffffff8082116101825760c0826004019383360301126101825760243590811161018257610484903690600401611822565b9061048d6126ea565b6104be6104b96104b46104ad6104a38880612127565b60408101906120f4565b36916119f5565b613986565b6139db565b801561075f576001101561074d57602483016104da8186611f47565b90501561073b5760448401946104f08682611f47565b9050156107295761055661051e9661054a61051561050e8580612127565b9585611f47565b99909285611f47565b91909261053b6040519761053189611903565b3389523690611a59565b9a60209b8c8901523691611acf565b60408601523691611acf565b60608301526064850135608083015261056e8261272c565b91825f525f875260405f209586541596876105b2575b888860017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055604051908152f35b6001905560a46001600160a01b03917f87491344dfbcf91f6cbbc610cbbeedc85313d37a02df0c93527f7ea5f8db717f83855116604051908152878c82015260606040820152806106066060820188612042565b0390a1019161061583856120f4565b9050610679575b5050505061066d929161066561064e61028f933390919060405192600284526020840152604083015260608201604052565b906040519160018352602083015260408201604052565b923691611dde565b82808080808080610584565b6106866104ad84866120f4565b61068f81614777565b156107025750937fd46c2c56b35c8210e9e712ec3f02242d5fc90187c0ac8ed80cc33626846ec3698961066d9897956106f56106d86106659761064e9761028f9b5116936120f4565b866040519586958652850152606060408501526060840191611d39565b0390a1938395965061061c565b89610725604051928392630c89984b60e31b8452600484015260248301906118df565b0390fd5b60405163540e5f0b60e01b8152600490fd5b604051636c44ef8f60e01b8152600490fd5b604051633c8270bd60e21b8152600490fd5b604051632cff108b60e21b8152600490fd5b34610182576003196020368201126101825767ffffffffffffffff600435116101825760c09060043536030112610182576107aa6126ea565b5f80806107bf60048035608481019101611e90565b9050156110505760246004350135926107d784612791565b1561103e576060806040516107eb8161196b565b6107f3611ee5565b81525f60208201525f6040820152015261080b611ee5565b5061086b61086661084561083b61083561082f608460043501600435600401611e90565b90611f17565b80611f32565b6040810190611f47565b602061085e61082f608460043501600435600401611e90565b013591611f7d565b611d25565b936001600160a01b036108ba6108666108a161089761083561082f608460043501600435600401611e90565b6060810190611f47565b604061085e61082f608460043501600435600401611e90565b81604051976108c889611933565b16875216602086015260408501526108ea608460043501600435600401611e90565b9490506001604051955f87520160051b85016040525f905f5b610917608460043501600435600401611e90565b905081108061102b575b15610e785761093a608460043501600435600401611e90565b821015610e64578160051b810135607e1982360301811215610182576080818301360312610182576040519161096f8361196b565b8181013567ffffffffffffffff81116101825761099190369084840101611b64565b835280820160208181013590850152604080820135908501526060013567ffffffffffffffff8111610182576109ca9236920101611d0a565b606082015280516001600160a01b036109ec6040830151602085015190611fda565b5151166001600160a01b0385511614801590610e30575b610e1e57610a1b6020830151604084015190836130d2565b610a248161272c565b91825f525f60205260405f2054155f14610a88575051604080513381526001600160a01b039092166020830152810191909152600191907fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f390606090a15b01610903565b9190610ab9602084979597015160408501519060608601519060405192610aae846119b7565b5f8452339186613107565b925f93610ad1606082015160446004350135906127b4565b15610b3857505051604080513381526001600160a01b03909216602083015281019190915260019291907fe3151dc8cb7a54ffc4baabd28c1f241c94d510b5e5b502491ac3cad6c16316d590606090a15b8115610b30575b5092610a82565b905088610b29565b610b456040820151612791565b158015610e0b575b15610ba257505051604080513381526001600160a01b03909216602083015281019190915260019291907f500b713857325f9e6dcb52ae832eca9109d107ed1aae9cb4928b4c1e13f051aa90606090a1610b22565b9250925050600196959691610bbb606460043501611fee565b15610d785796610c2b97610c3b60408401516040880151610bdc8183613460565b15610d705750925b610c35848592610c1e610c1860608a01516001600160e01b03601b918660e01d92828816810b928260e01d9216900b613e30565b90613feb565b9d8e9260408d015161352b565b60408c0152613555565b99613555565b98610c46848461357f565b610c5084826135dd565b60405192338452608060208501526060610c768451608080880152610100870190612042565b93602081015160a0870152604081015160c0870152015192607f198582030160e0860152835180825260208201906020808260051b8501019601925f5b828110610d1257505050505092806001979695937f194f1feb3b4d7076a2c272e774e792e0c48bb8c7aa1a9a3671c1cd6da9e6b4c193610d0d96604084015260608301520390a180858c5101808d5260051b8c01526136ef565b610b22565b9091929396602080610d63600193601f198782030189528b51906001600160a01b0382511681526040610d528584015160608785015260608401906120c1565b9201519060408184039101526118df565b9901950193929101610cb3565b905092610be4565b610c2b90610c3b6060840151610c35610db6610c1860408801516001600160e01b0394601b90868360e01d9316820b91878260e01d9216900b613e30565b60408a0151610dc58183613460565b15610e035750915b829c8d916060890151908116155f14610df4575060408801515b96879460408d015161352b565b610dfe9085613487565b610de7565b905091610dcd565b50610e19606082015161343d565b610b4d565b60405163936bb5ad60e01b8152600490fd5b506001600160a01b03610e4c6060830151604085015190611fda565b5151166001600160a01b036020860151161415610a03565b634e487b7160e01b5f52603260045260245ffd5b50919390610e8a606460043501611fee565b1561102557835b6004356004013590610ea38282613460565b6110075750508490610ec3856001600160a01b0360208701511633613069565b505060a46004350190610edb826004356004016120f4565b905015159081610fff575b50610f5e575b506001600160a01b03610f0292935116336127db565b50505b8351811015610f2a5780610f24610f1e60019387611fda565b516138c8565b01610f05565b5060409160017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005582519182526020820152f35b90506001600160a01b03602084015116610f886001600160a01b03855116926004356004016120f4565b929091333b1561018257610fd05f93604051958694859463691f9ed760e01b8652600486015260248501528960448501528a606485015260a0608485015260a4840191611d39565b038183335af190811561022c57859115610eec579050610ff09150611987565b5f836001600160a01b03610eec565b905088610ee6565b604492506040519163573b6f4160e01b835260048301526024820152fd5b84610e91565b506110396040830151612791565b610921565b60405163315f9e2360e21b8152600490fd5b604051639c95219f60e01b8152600490fd5b3461018257602080600319360112610182576024816001600160a01b03611087611853565b16604051928380926370a0823160e01b82523060048301525afa90811561022c575f916110b8575b50604051908152f35b90508181813d83116110de575b6110cf81836119d3565b810103126101825751826110af565b503d6110c5565b34610182576110f336611893565b92916111009491946126ea565b61110b83833361275d565b61111481612791565b15611238578160ff9161112c856111ef969533612d9c565b6111368183613460565b15611232575080935b61114b8582853361300b565b917f8045c25080b0868951141ed0a91720bcad09a8364a2b3109ee1fd49c1f0bc8b860c061117a898833613069565b97906001600160a01b0360405192338452169a8b6020840152856040840152886060840152608083015260a0820152a16040519660068852602088015260408701526060860152608085015260a08401521660c082015260e08101604052906040519160018352602083015260408201604052565b908061121b5760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b61122a9261028f913691611dde565b80808061015c565b9361113f565b50604051623a3a4d60e21b81523360048201526001600160a01b039190911660248201526044810191909152606490fd5b34610182576080366003190112610182576004356001600160a01b039081811680910361018257611298611869565b6044359167ffffffffffffffff916064358381116101825736602382011215610182578060040135938411610182573660248583010111610182576113259560209216936112e7868587612f2c565b60405196879283926323e30c8b60e01b84523360048501528760248501528860448501525f606485015260a06084850152602460a485019201611d39565b03815f855af193841561022c575f94611391575b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd984036113785761136d93503091612fa5565b602060405160018152f35b604051630b6c58a960e31b815260048101859052602490fd5b9093506020813d6020116113bd575b816113ad602093836119d3565b8101031261018257519284611339565b3d91506113a0565b346101825760603660031901126101825760206113f46113e3611853565b6113eb611869565b60443591612d9c565b604051908152f35b346101825761140a36611893565b928094926114166126ea565b61142182853361275d565b61142a81612791565b15611516578061143e61148d9286336127db565b9790957f7f9dfa19cf1cc2f806f2f860fbc9c056b601fb1afc0e9b843dfe5c63616268e660806040513381526001600160a01b038416998a60208301528560408301526060820152a133612881565b939091856114bb5760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b61150a9661028f956106659460ff93604051956005875260208701526040860152606085015260808401521660a082015260c08101604052906040519160018352602083015260408201604052565b8080808080808061015c565b506040516306dde9c360e41b81523360048201526001600160a01b03841660248201526044810191909152606490fd5b34610182576020366003190112610182576004355f525f6020526020600160405f205414604051908152f35b34610182576003196040368201126101825767ffffffffffffffff9060043582811161018257806004019160a08236039182011261018257602435848111610182576115c2903690600401611822565b90936115cc6126ea565b5f946001600160a01b0394856115e184611d25565b1633036117ad576115fa6115f53685611b64565b61272c565b805f525f60205260405f20966001885414611641575b60208960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556040519015158152f35b9091929394959697505f6001985560405196338852826020890152606060408901528161166d8761187f565b166060890152602484013590606219018112156101825783019060a060808901528061169b6004840161187f565b166101008901526116ae6024830161187f565b16610120880152604481013560221982360301811215610182570190602460048301359201988211610182578136038913610182577f09d18501db0080ca2d6cd7c17fa7255daff4b2d503ea93b76ff68b6752ea8e63878061066595608461177661028f9a60209f611735906117a09f9a606061014061064e9d0152610160880191611d39565b61176761175c6117486044880185611d59565b605f198a8603810160a08c01529491611d8e565b926064870190611d59565b918784030160c0880152611d8e565b91013560e08301520390a13390919060405192600284526020840152604083015260608201604052565b8280808080808080611610565b6024866117b985611d25565b6040516335252be360e01b815291166004820152fd5b34610182576020366003190112610182576004359063ffffffff60e01b82168092036101825760209163e414309160e01b8114908115611811575b5015158152f35b6301ffc9a760e01b1490508361180a565b9181601f840112156101825782359167ffffffffffffffff8311610182576020808501948460051b01011161018257565b600435906001600160a01b038216820361018257565b602435906001600160a01b038216820361018257565b35906001600160a01b038216820361018257565b906080600319830112610182576004356001600160a01b0381168103610182579160243591604435916064359067ffffffffffffffff8211610182576118db91600401611822565b9091565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b60a0810190811067ffffffffffffffff82111761191f57604052565b634e487b7160e01b5f52604160045260245ffd5b6060810190811067ffffffffffffffff82111761191f57604052565b6040810190811067ffffffffffffffff82111761191f57604052565b6080810190811067ffffffffffffffff82111761191f57604052565b67ffffffffffffffff811161191f57604052565b60e0810190811067ffffffffffffffff82111761191f57604052565b6020810190811067ffffffffffffffff82111761191f57604052565b90601f8019910116810190811067ffffffffffffffff82111761191f57604052565b92919267ffffffffffffffff821161191f5760405191611a1f601f8201601f1916602001846119d3565b829481845281830111610182578281602093845f960137010152565b9080601f8301121561018257816020611a56933591016119f5565b90565b91906060838203126101825760405190611a7282611933565b8193611a7d8161187f565b8352611a8b6020820161187f565b602084015260408101359167ffffffffffffffff831161018257604092611ab29201611a3b565b910152565b67ffffffffffffffff811161191f5760051b60200190565b929192611adb82611ab7565b604092611aeb60405192836119d3565b819581835260208093019160061b84019381851161018257915b848310611b1457505050505050565b8583830312610182578386918251611b2b8161194f565b611b348661187f565b81528286013583820152815201920191611b05565b9080601f8301121561018257816020611a5693359101611acf565b91909160a0818403126101825760405190611b7e82611903565b8193611b898261187f565b835267ffffffffffffffff9160208101358381116101825782611bad918301611a59565b602085015260408101358381116101825782611bca918301611b49565b6040850152606081013592831161018257611beb6080939284938301611b49565b60608501520135910152565b909291611c0384611ab7565b916040611c1360405194856119d3565b839580855260208095019160059160051b8401948086116101825784935b868510611c42575050505050505050565b67ffffffffffffffff90853582811161018257870190606082850312610182578451611c6d81611933565b611c768361187f565b81528a83013584811161018257830185601f8201121561018257803590611c9c82611ab7565b91611ca9895193846119d3565b8083528d808401918b1b83010191888311610182578e809101915b838310611cfa57509150508201528583013593841161018257611ceb858c95869501611a3b565b86820152815201940193611c31565b82358152918101918f9101611cc4565b9080601f8301121561018257816020611a5693359101611bf7565b356001600160a01b03811681036101825790565b908060209392818452848401375f828201840152601f01601f1916010190565b9035601e198236030181121561018257016020813591019167ffffffffffffffff8211610182578160061b3603831361018257565b9190808252602080920192915f905b828210611dab575050505090565b909192936001906001600160a01b03611dc38761187f565b16815285830135838201526040908101950193920190611d9d565b90929192611deb81611ab7565b91604091611dfc60405194856119d3565b839581855260208095019160051b8301938185116101825783925b858410611e275750505050505050565b67ffffffffffffffff908435828111610182578601908382860312610182578351611e518161194f565b82358481116101825786611e66918501611a59565b81528983013593841161018257611e81868b95869501611d0a565b83820152815201930192611e17565b903590601e1981360301821215610182570180359067ffffffffffffffff821161018257602001918160051b3603831361018257565b60405190611ed382611933565b60606040835f81525f60208201520152565b60405190611ef282611903565b5f608083828152611f01611ec6565b6020820152606060408201526060808201520152565b9015610e6457803590607e1981360301821215610182570190565b903590609e1981360301821215610182570190565b903590601e1981360301821215610182570180359067ffffffffffffffff821161018257602001918160061b3603831361018257565b9190811015610e645760061b0190565b805115610e645760200190565b805160011015610e645760400190565b805160021015610e645760600190565b805160031015610e645760800190565b805160041015610e645760a00190565b8051821015610e645760209160051b010190565b3580151581036101825790565b9081518082526020808093019301915f5b82811061201a575050505090565b835180516001600160a01b03168652820151858301526040909401939281019260010161200c565b906080806120b86120a661209460406001600160a01b0380895116885260208901519060a060208a01528082511660a08a015260208201511660c08901520151606060e08801526101008701906118df565b60408701518682036040880152611ffb565b60608601518582036060870152611ffb565b93015191015290565b9081518082526020808093019301915f5b8281106120e0575050505090565b8351855293810193928101926001016120d2565b903590601e1981360301821215610182570180359067ffffffffffffffff82116101825760200191813603831361018257565b903590605e1981360301821215610182570190565b6121536115f561214c8380611f32565b3690611b64565b5f525f602052600160405f2054036121ef5780612173816121df93611f32565b6121d76121926121976020850135938460408701359384923690611b64565b6130d2565b6121af6121a48580611f32565b946060810190611e90565b92906121cf604051966121c1886119b7565b5f88525f3681373690611b64565b933691611bf7565b923392613107565b6040810151606090910151600192565b505f905f905f90565b5f5b60808110612206575050565b6060828201526020016121fa565b5f5b82811061222257505050565b606082820152602001612216565b926001600160a01b038451166001600160a01b03835116146126d8576001600160a01b03612265606086015160643590611fda565b515116906040830151916001600160a01b036122846084358095611fda565b51511614801590612698575b610e1e576040850151906001600160a01b036122af6044358094611fda565b5151166001600160a01b036122ca60643560608a0151611fda565b51511614612686576122db8661272c565b805f525f60205260405f20541561263357506122f68461272c565b805f525f60205260405f2054156125df57506123d992916123b3917f6fa7f4c28634b0a9d6831401c45ae468195fb63aed07308935c35374ff5d9e396040518061235e61235061012033845280602085015283018d612042565b82810360408401528a612042565b85606083015260643560808301528760a083015260a43560c083015260c43560e083015260e4356101008301520390a16001600160a01b03865116604051926123a6846119b7565b5f8452606435908a613107565b936001600160a01b03865116604051926123cc846119b7565b5f845260a4359086613107565b916123e76040820151612791565b1580156125cb575b80156125b8575b80156125a5575b612593576040519161240e8361196b565b5f83525f60208401525f60408401525f606084015261242d848361479b565b84526040840152612453612441838661479b565b6020860152806060860152845161352b565b94612467602085015160408601519061352b565b936124718761343d565b8015612584575b6125725761253961256b957fd9fa84dd790c969daa5c33d8050dc06b4a9b59d5b42e2be5f5e8ae20447f618d9461251b6125709a60a0966124ba8a885161357f565b6124c88c602089015161357f565b6124d68a60408901516135dd565b6124e48c60608901516135dd565b6124ed8a6138c8565b6124f68c6138c8565b6001600160a01b0361251260c435926060606435910151611fda565b51511633612881565b50506001600160a01b0361251260e43592606060a435910151611fda565b5050606060405191338352805160208401526020810151604084015260408101518284015201516080820152a16136ef565b6136ef565b565b604051630d86822160e01b8152600490fd5b5061258e8561343d565b612478565b6040516321badf1f60e01b8152600490fd5b506125b3606084015161343d565b6123fd565b506125c6606082015161343d565b6123f6565b506125d96040840151612791565b156123ef565b9351604080513381526001600160a01b039092166020830152810194909452507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f3945091925082915050606081015b0390a1565b9551604080513381526001600160a01b039092166020830152810196909652507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f39493508392505060608201905061262e565b604051631cd2f1c760e21b8152600490fd5b506001600160a01b036126b2606085015160a43590611fda565b5151166001600160a01b036126ce604088015160443590611fda565b5151161415612290565b604051630a98f1f360e21b8152600490fd5b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00600281541461271a5760029055565b604051633ee5aeb560e01b8152600490fd5b604051612757816127496020820194602086526040830190612042565b03601f1981018352826119d3565b51902090565b909115612768575050565b6040516305dbdfd960e41b81526001600160a01b03918216600482015291166024820152604490fd5b6127b0905f60e01d906001600160e01b038160e01d9116601b0b6147fe565b1290565b906127b0916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b61487f565b9291926127e782613ac3565b936127f18161343d565b61286f5784816001600160e01b036128109360e01d9116601b0b6148fe565b9290809315612846575b5082908161282a575b5050509190565b61283e926001600160a01b03309216612fa5565b5f8181612823565b9092505f19811461285b57600101915f61281a565b634e487b7160e01b5f52601160045260245ffd5b604051632eaefac360e21b8152600490fd5b9392919361288e8361343d565b61292c57846128aa576128a2939450613069565b50505f905f90565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f5281526128e7835f20549485613555565b956128f18761343d565b612914575f97885260018252838820908852815282872091875252909320829055565b835163c5e12af560e01b815260048101889052602490fd5b60405163793a8f5560e01b815260048101849052602490fd5b919060408382031261018257825167ffffffffffffffff908181116101825784019082601f8301121561018257815160209261298082611ab7565b9161298e60405193846119d3565b808352848084019160051b830101918683116101825785809101915b838310612a1d5750505050948281015191821161018257019180601f840112156101825782516129d981611ab7565b936129e760405195866119d3565b818552838086019260051b820101928311610182578301905b828210612a0e575050505090565b81518152908301908301612a00565b82518152918101918691016129aa565b90808251908181526020809101926020808460051b8301019501935f915b848310612a5b5750505050505090565b9091929394958480612a79600193601f198682030187528a516120c1565b9801930193019194939290612a4b565b91906020928381526001600160a01b0382511684820152838201516040820152612ac3604083015160e060608401526101008301906118df565b9060608301516080820152612aea608084015192601f1993848483030160a0850152612a2d565b9260a081015193838382030160c08401528680865192838152019501905f5b818110612b2d57505050611a5694955060c060e091015192828503019101526120c1565b825187529588019591880191600101612b09565b90604082019082526020606081936040838201528551809452019301915f5b828110612b6e575050505090565b835185529381019392810192600101612b60565b916040805191612b9183611903565b60048084526020612ba38186016121f8565b5f5b8751811015612bd85780612bbb6001928a611fda565b51612bc68289611fda565b52612bd18188611fda565b5001612ba5565b5092955092939093335f52308352855f2091865190612bf68261194f565b612bfe611ec6565b8252606085819301528751612c12816119b7565b5f8152885191612c21836119b7565b5f83525f3681375f5b8151811015612d8f57612c3d8183611fda565b5190888c8b84519189818401518d8d8251612c65575b50505050505050506001915001612c2a565b5f612cd497948197948c9794612c928c956001600160a01b039d8e81818d51169c0151169b015190613ba2565b94865199612c9f8b61199b565b8a528901528488015286015260808501528a60a08501528b60c08501525180958194829363d04dfe2360e01b84528301612a89565b03915afa938415612d85578b915f95612d5f575b508451612cfd575b50908b8e89838d8d612c53565b51015116803b1561018257612d2c925f918c8f84905180978195829463012c676d60e21b845233908401612b41565b03925af1918215612d5557600192612d46575b8981612cf0565b612d4f90611987565b5f612d3f565b8c513d5f823e3d90fd5b612d7c9195503d805f833e612d7481836119d3565b810190612945565b9050935f612ce8565b8e513d5f823e3d90fd5b5050505050505050509050565b8215612dd1576001600160a01b038091165f52600160205260405f2091165f5260205260405f20905f5260205260405f205490565b909150612ddd82613dd4565b6001600160a01b03809316906040918251946370a0823160e01b86528416938460048701526020928387602481865afa968715612ef3575f97612efd575b5083612e34612e2d83612e649a614ab3565b509061423e565b508651636eb1769f60e11b81526001600160a01b0390941660048501523060248501529297889081906044820190565b0381865afa968715612ef3575f97612ec2575b50612e2d612e8891611a5698614ab3565b50612e938183613460565b15612eba5750935b5f5260018252825f20905f528152815f20905f8052525f205490613555565b905093612e9b565b96508387813d8311612eec575b612ed981836119d3565b8101031261018257955195612e2d612e77565b503d612ecf565b85513d5f823e3d90fd5b96508387813d8311612f25575b612f1481836119d3565b810103126101825795519583612e1b565b503d612f0a565b6040519263a9059cbb60e01b5f526001600160a01b0380931660045260245260205f60448180855af160015f5114811615612f86575b8360405215612f7057505050565b635274afe760e01b835216600482015260249150fd5b6001811516612f9c57813b15153d151616612f62565b833d5f823e3d90fd5b9092604051936323b872dd60e01b5f526001600160a01b0393848092166004521660245260445260205f60648180855af160015f5114811615612ff5575b836040525f60605215612f7057505050565b6001811516612f9c57813b15153d151616612fe3565b939291936130188361343d565b61292c578461302c576128a29394506127db565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f5281526128e7835f2054948561352b565b9092919261307681613ac3565b936130808161343d565b6130c05784816001600160e01b0361309f9360e01d9116601b0b6148fe565b508092816130ae575050509190565b6001600160a01b0361283e9316612f2c565b604051632d1671a360e11b8152600490fd5b916130fd9060606130f2936001600160a01b039485916040880151611fda565b515116940151611fda565b5151161461268657565b949193613346919360c0915f6132cd6040928351946131258661199b565b61312d611ee5565b86526020958487820152848682015260609781868a809401528260808201528660a0820152015261327d85519161316383611903565b600483526131728884016121f8565b8d61317c8161272c565b9c896001600160a01b039e8f94859182865116908d5194600386528501528c840152168c820152608081018a526131b286611f8d565b526131bc85611f8d565b5088516131c881611933565b6002815289368c8301376131db86611f9a565b526131e585611f9a565b5060ff8a6132488b8501936132328761320b81613203858a51611fda565b515116613dd4565b9751168861321a848951611fda565b51511685613229858a51611fda565b51015191612d9c565b9661323e828751611fda565b5151169451611fda565b51015192169093929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b61328682611faa565b5261329081611faa565b506132b48a8d8d60ff8a6132488d8501936132328761320b81613203858a51611fda565b6132bd82611fba565b526132c781611fba565b50613ba2565b95878a511697848b0191825191868184511693015116928a855230875285808620915101518651916132fe836119b7565b86835287519561330d8761199b565b86528886015286850152848885015289608085015260a084015260c08301528351808098819463d04dfe2360e01b835260048301612a89565b03915afa968715613433575f945f98613411575b508451600281106133fa5750818386015195015161338061337a88611fca565b51611fba565b5161338b8183613460565b156133f25750925b6133b58685919060405192600284526020840152604083015260608201604052565b6133be88611faa565b526133c887611faa565b508251996133d58b61199b565b8a52890152870152850152608084015260a083015260c082015290565b905092613393565b602490835190630fbb8e5560e21b82526004820152fd5b9097506134299194503d805f833e612d7481836119d3565b939093965f61335a565b50513d5f823e3d90fd5b61345c905f60e01d906001600160e01b038160e01d9116601b0b6147fe565b1390565b9061345c916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b61487f565b6134ae6001600160e01b0392838316601b0b9260e01d938160e01d9116601b0b8484613ff5565b90637ffffff582136134fe575b906134c59161423e565b92909215806134f6575b6134d857505090565b6044925060405191638eba4d0760e01b835260048301526024820152fd5b5082156134cf565b6135088282614ede565b156134bb57604483856040519163d556b11160e01b835260048301526024820152fd5b611a5691610c18916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614444565b611a5691610c18916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614608565b6135d991608081018261359b6135958351611fca565b51611fca565b526135d26135cc6001600160a01b038094515116936135c36135bd8551611fca565b51611f8d565b51169251611fca565b51611faa565b519161300b565b5050565b906080810191806135f16135958551611fba565b526001600160a01b0380925151169161360d6135bd8551611fba565b511661361c6135cc8551611fba565b5190816136b75761362c8361343d565b61292c579183917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a959361262e955f5260209060018252613682604094855f20835f528452855f20855f528452855f2054613555565b945f5260018252835f20905f528152825f20915f52525f20555b51604051918291338352604060208401526040830190612a2d565b916136e8917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a959361262e95612881565b505061369c565b60c0810151908151915f92613863575b506137a46020918281510151926001600160a01b039081818187511696015116928660a082019485518252308452604097888320898686510151015160808601518b519161374c836119b7565b8683528c519361375b856119b7565b8785528d519661376a8861199b565b8752898701528c86015260016060860152608085015260a084015260c08301528851808099819463d04dfe2360e01b835260048301612a89565b03915afa94851561385957879561383b575b5084516137c7575b50505050505050565b81905101510151169051813b15613837579184918493836137fc965180978195829463012c676d60e21b845260048401612b41565b03925af190811561382e5750613817575b80808080806137be565b6138218291611987565b61382b578061380d565b80fd5b513d84823e3d90fd5b8480fd5b6138509195503d8089833e612d7481836119d3565b9050935f6137b6565b86513d89823e3d90fd5b6001600160a01b03602080845101510151169060a083015190823b15610182576138a6925f928360405180968195829463012c676d60e21b845260048401612b41565b03925af1801561022c57156136ff576138c0919250611987565b5f905f6136ff565b608081016138d96135cc8251611fba565b519182156138e657505050565b6139006135bd6001600160a01b0380935151169351611fba565b5116815f5260209160018352604092835f20835f528152835f20855f528152835f2054936001600160e01b03851661393b575b505050505050565b61395f955f9284845260018152828420868552815282842091845252812055613069565b5f808080613933565b8115613972570490565b634e487b7160e01b5f52601260045260245ffd5b60408151106139ce576020810151908051603f19810190811161285b5760051c82116139ba5760016020920160051b010190565b50506040516139c8816119b7565b5f815290565b506040516139c8816119b7565b8051156139eb57602001515f1a90565b505f90565b905f8091602081519101845af48080613a6e575b15613a245750506040513d81523d5f602083013e60203d82010160405290565b15613a4b57604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b3d15613a5c576040513d5f823e3d90fd5b60405163d6bda27560e01b8152600490fd5b503d151580613a045750813b1515613a04565b60041115613a8b57565b634e487b7160e01b5f52602160045260245ffd5b602090939291936001600160a01b036040820195168152613abf83613a81565b0152565b613acb614fcc565b6040805163b7bad1b160e01b81526001600160a01b0383166004820152909182826024815f73200e12d10bb0c5e4a17e7018f0f1161919bb93895af1928315613b99575f925f94613b64575b50613b2183613a81565b600183141580613b52575b613b365750505090565b5163ee07877f60e01b8152918291610725919060048401613a9f565b50613b5c83613a81565b821515613b2c565b90809450613b889293503d8511613b92575b613b8081836119d3565b8101906148d4565b919091925f613b17565b503d613b76565b513d5f823e3d90fd5b90805191613baf83611ab7565b91613bca604094613bc2865195866119d3565b808552611ab7565b601f199460209186013686840137835183519095908015613dc9576001613c209101965b6001978891010197613c17613c028a611ab7565b99613c0f86519b8c6119d3565b808b52611ab7565b01848901612214565b85805f9684516002815233878201523086820152606081018652613c438b611f8d565b52613c4d8a611f8d565b505f925b613d85575b5050508351613c69575b50505050505090565b85809598979692980181613c7d8289611fda565b52613c888188611fda565b505f925b613c9b575b5085969750613c60565b8451831015613d80576001600160a01b03613d1281613cba8689611fda565b51511686613cc8878a611fda565b51015187815160051b9101207f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f52601c52603c5f208c613d09888b611fda565b51015191614a2a565b15613d6857868098999a928192613d29878a611fda565b515116613d368787611fda565b52019385613d448289611fda565b510151613d51868c611fda565b52613d5c858b611fda565b50019290989796613c8c565b8951630a57f30960e31b815260048101859052602490fd5b613c91565b9091968151881015613dc0578280910197613da08184611fda565b51613dab8a8d611fda565b52613db6898c611fda565b5001919081613c51565b96829150613c56565b50613c205f96613bee565b613ddc614fcc565b60408051630782d7e160e01b81526001600160a01b03831660048201529091828260248173200e12d10bb0c5e4a17e7018f0f1161919bb93895afa928315613b99575f925f94613b645750613b2183613a81565b9091939284158215175f14613e4a5750505090505f905f90565b82810192600160fd1b8082019083011760fe1c613f81575b5050613e6d81614ba3565b93613e7781614ba3565b94613e828682614bc3565b90918215613f72575f9083986f0785ee10d5da46d900f436a000000000808611613f64575b50670de0b6b3a7640000808b11613f55575b50633b9aca00808b11613f46575b50612710808b11613f38575b5098805b613f27575081906118db989982600a0a9109960195817fcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccd0a93838211900382610100031b9203901c170291614bd6565b60019290920191600a900480613ed7565b60049a04998a930192613ed3565b600991939a049901915f613ec7565b601291939a049901915f613eb9565b85049950602592505f613ea7565b509290506118db949550614bd6565b5f821215613fd557808413613fc7575b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb2841315613e62579092506118db939491614ae1565b9092506118db939491614b48565b80841215613f91579092506118db939491614ae1565b6134c5828261423e565b9290918061401b576044848460405191637a97930f60e01b835260048301526024820152fd5b90919280155f1461403057505050505f905f90565b6140499361403d91614c90565b92919490938492614c90565b909391928461405788614ba3565b9161406186614ba3565b947f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000094604c91868810614208575b030191600160ff1b98838a018112155f146141d5575050035b5f955f8212806141cc575b6141ae575b5f81128061419c575b61417e5786820103966001600160ff1b0388149081614174575b508061416b575b80614162575b6141445750906140f89291614e3c565b915f811361410b575b506118db93614bd6565b9091604c82136141395761412291600a0a90613968565b90811561412f575f614101565b505050505f905f90565b50505050505f905f90565b876044916040519163d556b11160e01b835260048301526024820152fd5b505f85126140e8565b508284146140e2565b905088145f6140db565b604489836040519163d556b11160e01b835260048301526024820152fd5b50806001600160ff1b030182136140c1565b95508087018613156141c65786818703015b956140b8565b5f6141c0565b505f81136140b3565b89985090920390506001600160ff1b03819003870182136141f957018601946140a8565b5050505050505050505f905f90565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009650604b925061408f565b8115613972570590565b8082601b82810b8314614433577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e100000000000000000084056143df575b8380820b036143ce57507b199999999999999999999999999999999999999999999999999999987b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc8401111561437f575b838060030b03614303575b8084136142e75750506001600160e01b036001925b60e01b91161791565b8303600a0a8015613972576001600160e01b03910715926142de565b92915f8413156143535750906143198383614ede565b61433557637ffffffe1901600a0a810290637fffffff926142c9565b506044916040519163d556b11160e01b835260048301526024820152fd5b637fffffff1992830390604382136141395761437291600a0a90614234565b91821561412f57926142c9565b5f198401808060030b1461439357506142be565b90506001600160e01b039293507b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff915060e01b9260ff1d181617905f90565b600190940193600a90930592614271565b937f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000840515614420576305f5e100600894058094819201955b915050614271565b620186a060059405809481920195614418565b50826142be57505050505f90600190565b919291600160ff1b840161445c576118db9350614ef7565b906118db935f0391614608565b919291600160ff1b91908015806145f657509061448591614c90565b9490929091905f8685858582821380156145ed575b6145d0575b505050508682841860ff1c94860391039081604c0381116145b55701600a0a80820591908461459b575b505081019182821860ff1c111561459357826001600160ff1b031461457557905f600192135f1461454657600a9004915b01925b8115811761450a57509190565b80614523575b50801561451b579190565b505f91508190565b91926145399203600160ff1b01600a0a90614234565b600160ff1b91905f614510565b600a60037fe66666666666666666666666666666666666666666666666666666666666666792010401916144fa565b604490836040519163d556b11160e01b835260048301526024820152fd5b5090926144fd565b81076145a8575b806144c9565b60ff1d600117015f6145a2565b5050509193506145c3579190565b60018160ff1d1790039190565b5f9a50909750909550600160ff1b9450925090508680808061449f565b50835f1261449a565b156146015750509190565b9350919050565b93929193841581158181176147595750509061462391614c90565b919490829561463482958294614c90565b8096929491969387868482138015614750575b614737575b5050505050508682841860ff1c94860391039081604c0381116145b55701600a0a80820591908461471d575b505081019182821860ff1c111561471557826001600160ff1b031461457557905f600192135f146146e657600a9004915b01925b811581176146b957509190565b806146c95750801561451b579190565b600160ff1b936146e09291038401600a0a90614234565b5f614510565b600a60037fe66666666666666666666666666666666666666666666666666666666666666792010401916146a9565b5090926146ac565b810761472a575b80614678565b60ff1d600117015f614724565b929b5098509196509450925090505f808080808061464c565b50858412614647565b939593909291901561476f57505061451b579190565b945092915050565b60088151106139eb576008015167ffffffffffffffff1667ff0a89c674ee78741490565b91604083019260406147d5610c18606087519401938451906001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b613e30565b945193016147e48151866127b4565b6147ec575050565b909350611a5691925051925183613487565b92915f9060018184145f87128715171717614878575f9280821361486a575b03604c81135f82121761485e57600a0a908461483c8382029384614234565b146148515750501561484d575f9190565b5f90565b9093509015611a56579190565b50501561484d575f9190565b5f956001945092509061481d565b5050505f90565b93929190918083145f83125f871218831587151717176148ce575f928082136148c15703604c81135f82121761485e57600a0a908461483c8382029384614234565b919460019350919061481d565b50919050565b919082604091031261018257815160048110156101825760209092015160ff811681036101825790565b91925f831215614926576044838360405191634a7d166b60e01b835260048301526024820152fd5b91928361493857505090505f90600190565b60ff8116820191808312614a00575f831215614970575050604c19811261451b575f03600a0a916149698382613968565b9283021490565b909293915f81135f146149f657604d81136149cb57600a0a92831561397257835f190483116149a25750500290600190565b60405163c849483b60e01b815260048101849052602481019290925260ff166044820152606490fd5b5060405163c849483b60e01b81526004810192909252602482015260ff919091166044820152606490fd5b5050905090600190565b60405163c849483b60e01b815260048101869052602481019190915260ff82166044820152606490fd5b9091813b614a6557614a3c9192615035565b50614a4681613a81565b159182614a5257505090565b6001600160a01b03918216911614919050565b6020918160645f935160405192630b135d3f60e11b9788855260048501526040602485015286820190604485015e8281018201859052601f01601f191601915afa905f5114601f3d11161690565b9060ff165f03916001600160ff1b0382115f14614ad957600a6001818404940192061590565b909190600190565b909392915f614af1918184613e30565b9490945f8483019182019412159081614b3e575b8115614b34575b50614b1657505090565b604492506040519163d556b11160e01b835260048301526024820152fd5b905083125f614b0c565b8281129150614b05565b614b5d93600160fe1b90810193920190613e30565b9081815f821215614b94575050604b1982126128a257614b82915f03600a0a90614234565b9081614b8c575f90565b600160ff1b90565b93600160ff1b90910192509050565b5f811215611a5657600160ff1b90808203614bbc575090565b90505f0390565b905f198183099102908180821091030391565b92939291905f8184181215614c6b576001600160ff1b039283831115614c5557600160ff1b93838503614c0b57505050509190565b90919293508514614c25575050600a600191045f03920190565b604051630ed8062160e21b8152600481019190915260248101919091526044810182905260648101849052608490fd5b5090915050600160ff1b811461285b575f039190565b90916001600160ff1b0380841115612823578514614c25575050600a60019104920190565b9190918015614e3257827f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000080830515614d40575b507f19999999999999999999999999999999999999999999999999999999999999997f0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc830110614d31575b8313614d1b5791905f90565b919060018060ff1b926001600160ff1b03030190565b9290600a02905f190192614d0f565b6f4b3b4ca85a86c47a098a22400000000080840515614e20575b507728c87cb5c89a2571ebfdcb54864ada834a00000000000000830515614e09575b7b097edd871cfda3a5697758bf0e3cbb5ac5741c640000000000000000830515614df5575b7e3899162693736ac531a5a58f1fbb4b746504382ca7e4000000000000000000830515614de557820515614dd6575b5f614cc4565b9290600a02905f190192614dd0565b9391606402916001190193614da1565b93916402540be40002916009190193614da1565b9391678ac7230489e8000002916012190193614d7c565b6025198301955092909202915f614d5a565b505f915081908190565b90915f198383099280830292838086109503948086039584871015614eba5714614eb2579082910960018219018216809204600280826003021880830282030280830282030280830282030280830282030280830282030280920290030293600183805f03040190848311900302920304170290565b505091500490565b60648386866040519263362ced0960e11b8452600484015260248301526044820152fd5b611a5691905f811215614ef2575f0361506f565b61506f565b909291600160ff1b91828101614f895750808414614f7f57808413918215614f77578185035b604c811115614f665750505f915b15614f5757507f8000000000000000000000000000000000000000000000000000000000000001019190565b92506001600160ff1b03039190565b600a0a908115613972570491614f2b565b848203614f1d565b505090505f905f90565b93614f9692945f03614469565b80939180928114614faa575b50505f039190565b915092506001600160ff1b03831461457557600a600191059201915f80614fa2565b73200e12d10bb0c5e4a17e7018f0f1161919bb9389803b15801561500a575b614ff25750565b602490604051906373e6d7b360e01b82526004820152fd5b507f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d41813f1415614feb565b81519190604183036150655761505e9250602082015190606060408401519301515f1a906150fe565b9192909190565b50505f9160029190565b90637ffffff58113156150f857637ffffffe19810190604382136150f1575f8212156150c557637fffffff91505f0301600a0a7b8000000000000000000000000000000000000000000000000000000202111590565b50600a0a8015613972577b80000000000000000000000000000000000000000000000000000001041090565b5050151590565b50505f90565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411615175579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa1561022c575f516001600160a01b0381161561516b57905f905f90565b505f906001905f90565b5050505f916003919056000000000000000000000000200e12d10bb0c5e4a17e7018f0f1161919bb93890000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000044b608060405234801561000f575f80fd5b506004361061004a575f3560e01c80630782d7e11461004e57806354636d2b14610078578063b7bad1b11461009d578063f5c36eaf146100b0575b5f80fd5b61006161005c366004610363565b6100c3565b60405161006f929190610403565b60405180910390f35b61008b610086366004610363565b6100d8565b60405160ff909116815260200161006f565b6100616100ab366004610363565b6100e9565b61008b6100be366004610363565b6100f5565b5f806100cf5f84610100565b91509150915091565b5f6100e35f836101f0565b92915050565b5f806100cf5f84610281565b5f6100e35f83610356565b73ffffffffffffffffffffffffffffffffffffffff81165f9081526020838152604080832081518083019092525460ff8082161515835261010090910416818301527f313ce56700000000000000000000000000000000000000000000000000000000808452839283908190816004818a5afa915060203d1015610182575f91505b811561019857505f5160ff811115610198575f91505b816101af57505050602001516003925090506101e9565b83516101c3575f955093506101e992505050565b836020015160ff1681146101d85760026101db565b60015b846020015195509550505050505b9250929050565b5f805f6101fd8585610281565b909250905060018260038111156102165761021661039d565b1415801561023557505f8260038111156102325761023261039d565b14155b156102795783826040517fee07877f000000000000000000000000000000000000000000000000000000008152600401610270929190610421565b60405180910390fd5b949350505050565b5f805f8061028f8686610100565b90925090505f8260038111156102a7576102a761039d565b0361034b576040805180820182526001815260ff838116602080840191825273ffffffffffffffffffffffffffffffffffffffff8a165f908152908b9052939093209151825493517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009094169015157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff161761010093909116929092029190911790555b909590945092505050565b5f805f6101fd8585610100565b5f60208284031215610373575f80fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114610396575f80fd5b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b600481106103ff577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b9052565b6040810161041182856103ca565b60ff831660208301529392505050565b73ffffffffffffffffffffffffffffffffffffffff831681526040810161039660208301846103ca56000000000000000000000000000000000000000000"; + hex"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000052c00000000000000000000000002eb98f9489cff4a429368e389f5ffc6f8d9c5ede000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000052046080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a7146117b4575080632cb77e9f1461178857806341d1514f146117515780635343c1b7146116b65780635cffe9de1461155a5780635d003c44146113d6578063613255ab14611353578063687cf02a1461103c578063ac9650d814610eee578063b0460f07146105f3578063b845b83e1461059b578063ca9109ba1461044c578063d9d98ce41461039b578063ddebc96f146103475763df6db3c2146100c1575f80fd5b34610321576003196040368201126103215767ffffffffffffffff9060043582811161032157806004019160a0823603918201126103215760243584811161032157610111903690600401611c76565b909361011b61289f565b5f946001600160a01b0394856101308461257a565b163303610325576101496101443685611aa8565b6128e1565b805f525f60205260405f20966001885414610190575b60208960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556040519015158152f35b9091929394959697505f600198556040519633885282602089015260606040890152816101bc87611833565b166060890152602484013590606219018112156103215783019060a06080890152806101ea60048401611833565b166101008901526101fd60248301611833565b16610120880152604481013560221982360301811215610321570190602460048301359201988211610321578136038913610321577f09d18501db0080ca2d6cd7c17fa7255daff4b2d503ea93b76ff68b6752ea8e6387806103069560846102c561030e9a60209f610284906103149f9a60606101406102ef9d015261016088019161232b565b6102b66102ab610297604488018561268a565b605f198a8603810160a08c015294916126bf565b92606487019061268a565b918784030160c08801526126bf565b91013560e08301520390a13390919060405192600284526020840152604083015260608201604052565b906040519160018352602083015260408201604052565b92369161234b565b906135db565b5f8080808080808061015f565b5f80fd5b6024866103318561257a565b6040516335252be360e01b815291166004820152fd5b3461032157600319602036820112610321576004359067ffffffffffffffff8211610321576080908236030112610321576103866060916004016125ce565b90604051921515835260208301526040820152f35b34610321576040366003190112610321576001600160a01b036103bc611807565b166040516370a0823160e01b8152306004820152602081602481855afa908115610441575f9161040f575b50156103f75760206040515f8152f35b60249060405190633c5bf76960e21b82526004820152fd5b90506020813d602011610439575b8161042a60209383611917565b810103126103215751826103e7565b3d915061041d565b6040513d5f823e3d90fd5b346103215761045a36611ca7565b9280949261046661289f565b6104718285336134d7565b61047a81612e4c565b15610567578061048e6104dd928633613a1d565b9790957f7f9dfa19cf1cc2f806f2f860fbc9c056b601fb1afc0e9b843dfe5c63616268e660806040513381526001600160a01b038416998a60208301528560408301526060820152a133613133565b9390918561050c575b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b61055b9661030e956103069460ff93604051956005875260208701526040860152606085015260808401521660a082015260c08101604052906040519160018352602083015260408201604052565b808080808080806104e6565b506040516306dde9c360e41b81523360048201526001600160a01b03841660248201526044810191909152606490fd5b0390fd5b346103215760203660031901126103215760043567ffffffffffffffff81116103215761030e6105d26104e6923690600401611c76565b91906105dc61289f565b604051926105e9846118fb565b5f8452369161234b565b34610321576003196020368201126103215767ffffffffffffffff600435116103215760c090600435360301126103215761062c61289f565b5f8080610641600480356084810191016124b3565b905015610edc57602460043501359261065984612e4c565b15610eca5760608060405161066d816118af565b610675612508565b81525f60208201525f6040820152015261068d612508565b506106ed6106e86106c76106bd6106b76106b16084600435016004356004016124b3565b9061253a565b80612555565b6040810190612445565b60206106e06106b16084600435016004356004016124b3565b01359161256a565b61257a565b936001600160a01b0361073c6106e86107236107196106b76106b16084600435016004356004016124b3565b6060810190612445565b60406106e06106b16084600435016004356004016124b3565b816040519761074a89611877565b168752166020860152604085015261076c6084600435016004356004016124b3565b9490506001604051955f87520160051b85016040525f905f5b6107996084600435016004356004016124b3565b9050811080610eb7575b15610d04576107bc6084600435016004356004016124b3565b821015610cf0578160051b810135607e198236030181121561032157608081830136031261032157604051916107f1836118af565b8181013567ffffffffffffffff81116103215761081390369084840101611aa8565b835280820160208181013590850152604080820135908501526060013567ffffffffffffffff81116103215761084c9236920101611c5b565b606082015280516001600160a01b0361086e6040830151602085015190611d64565b5151166001600160a01b0385511614801590610cbc575b610caa5761089d60208301516040840151908361391a565b6108a6816128e1565b91825f525f60205260405f2054155f1461090a575051604080513381526001600160a01b039092166020830152810191909152600191907fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f390606090a15b01610785565b919061093b602084979597015160408501519060608601519060405192610930846118fb565b5f8452339186612b0e565b925f9361095360608201516044600435013590612e6f565b156109ba57505051604080513381526001600160a01b03909216602083015281019190915260019291907fe3151dc8cb7a54ffc4baabd28c1f241c94d510b5e5b502491ac3cad6c16316d590606090a15b81156109b2575b5092610904565b9050886109ab565b6109c76040820151612e4c565b158015610c97575b15610a2457505051604080513381526001600160a01b03909216602083015281019190915260019291907f500b713857325f9e6dcb52ae832eca9109d107ed1aae9cb4928b4c1e13f051aa90606090a16109a4565b9250925050600196959691610a3d60646004350161258e565b15610c045796610aad97610abd60408401516040880151610a5e8183612eb9565b15610bfc5750925b610ab7848592610aa0610a9a60608a01516001600160e01b03601b918660e01d92828816810b928260e01d9216900b613f6a565b90613edf565b9d8e9260408d0151612ee0565b60408c01526139f3565b996139f3565b98610ac88484612f0a565b610ad28482612f68565b60405192338452608060208501526060610af88451608080880152610100870190611dbf565b93602081015160a0870152604081015160c0870152015192607f198582030160e0860152835180825260208201906020808260051b8501019601925f5b828110610b9457505050505092806001979695937fbae4dbf76931c547f765e9def16d693d86daaa596f491de979008831789185ae93610b8f96604084015260608301520390a180858c5101808d5260051b8c015261321f565b6109a4565b9091929396602080610bef600193601f198782030189528b51906001600160a01b03825116815283820151848201526060610bde604084015160806040850152608084019061259b565b920151906060818403910152611cf3565b9901950193929101610b35565b905092610a66565b610aad90610abd6060840151610ab7610c42610a9a60408801516001600160e01b0394601b90868360e01d9316820b91878260e01d9216900b613f6a565b60408a0151610c518183612eb9565b15610c8f5750915b829c8d916060890151908116155f14610c80575060408801515b96879460408d0151612ee0565b610c8a908561394f565b610c73565b905091610c59565b50610ca56060820151612e96565b6109cf565b60405163936bb5ad60e01b8152600490fd5b506001600160a01b03610cd86060830151604085015190611d64565b5151166001600160a01b036020860151161415610885565b634e487b7160e01b5f52603260045260245ffd5b50919390610d1660646004350161258e565b15610eb157835b6004356004013590610d2f8282612eb9565b610e935750508490610d4f856001600160a01b0360208701511633613569565b505060a46004350190610d6782600435600401612412565b905015159081610e8b575b50610dea575b506001600160a01b03610d8e9293511633613a1d565b50505b8351811015610db65780610db0610daa60019387611d64565b51613093565b01610d91565b5060409160017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005582519182526020820152f35b90506001600160a01b03602084015116610e146001600160a01b0385511692600435600401612412565b929091333b1561032157610e5c5f93604051958694859463691f9ed760e01b8652600486015260248501528960448501528a606485015260a0608485015260a484019161232b565b038183335af190811561044157859115610d78579050610e7c91506118cb565b5f836001600160a01b03610d78565b905088610d72565b604492506040519163573b6f4160e01b835260048301526024820152fd5b84610d1d565b50610ec56040830151612e4c565b6107a3565b60405163315f9e2360e21b8152600490fd5b604051639c95219f60e01b8152600490fd5b34610321576020806003193601126103215760043567ffffffffffffffff811161032157610f20903690600401611c76565b919060405192610f2f846118fb565b5f8452828401610f3e826119fb565b94610f4c6040519687611917565b828652610f58836119fb565b93610f6a86880195601f190186612497565b5f5b848110610fce57604080518881528951818a018190525f92600582901b83018101918a918c9085015b828710610fa25785850386f35b909192938280610fbe600193603f198a82030186528851611cf3565b9601920196019592919092610f95565b8061101d88611017610fea60019560059d9c9d1b870187612412565b929089846040519586938585013782018381015f81528b519283915e015f83820152038084520182611917565b30613889565b611027828a611d64565b526110328189611d64565b5001969596610f6c565b34610321576003196040368201126103215760043567ffffffffffffffff8082116103215760c0826004019383360301126103215760243590811161032157611089903690600401611c76565b9061109261289f565b6110c36110be6110b96110b26110a888806123fd565b6040810190612412565b3691611939565b61380b565b613874565b8015611341576001101561132f57602483016110df8186612445565b90501561131d5760448401946110f58682612445565b90501561130b5761115b6111239661114f61111a61111385806123fd565b9585612445565b99909285612445565b9190926111406040519761113689611847565b338952369061199d565b9a60209b8c8901523691611a13565b60408601523691611a13565b606083015260648501356080830152611173826128e1565b91825f525f875260405f209586541596876111b7575b888860017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055604051908152f35b6001905560a46001600160a01b03917f87491344dfbcf91f6cbbc610cbbeedc85313d37a02df0c93527f7ea5f8db717f83855116604051908152878c820152606060408201528061120b6060820188611dbf565b0390a1019161121a8385612412565b905061125f575b5050505061125392916103066102ef61030e933390919060405192600284526020840152604083015260608201604052565b82808080808080611189565b61126c6110b28486612412565b61127581613f46565b156112e85750937fd46c2c56b35c8210e9e712ec3f02242d5fc90187c0ac8ed80cc33626846ec369896112539897956112db6112be610306976102ef9761030e9b511693612412565b86604051958695865285015260606040850152606084019161232b565b0390a19383959650611221565b89610597604051928392630c89984b60e31b845260048401526024830190611cf3565b60405163540e5f0b60e01b8152600490fd5b604051636c44ef8f60e01b8152600490fd5b604051633c8270bd60e21b8152600490fd5b604051632cff108b60e21b8152600490fd5b3461032157602080600319360112610321576024816001600160a01b03611378611807565b16604051928380926370a0823160e01b82523060048301525afa908115610441575f916113a9575b50604051908152f35b90508181813d83116113cf575b6113c08183611917565b810103126103215751826113a0565b503d6113b6565b34610321576113e436611ca7565b92916113f194919461289f565b6113fc8383336134d7565b61140581612e4c565b15611529578160ff9161141d856114e096953361270f565b6114278183612eb9565b15611523575080935b61143c8582853361350b565b917f8045c25080b0868951141ed0a91720bcad09a8364a2b3109ee1fd49c1f0bc8b860c061146b898833613569565b97906001600160a01b0360405192338452169a8b6020840152856040840152886060840152608083015260a0820152a16040519660068852602088015260408701526060860152608085015260a08401521660c082015260e08101604052906040519160018352602083015260408201604052565b908061150c5760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b61151b9261030e91369161234b565b8080806104e6565b93611430565b50604051623a3a4d60e21b81523360048201526001600160a01b039190911660248201526044810191909152606490fd5b34610321576080366003190112610321576004356001600160a01b03908181168091036103215761158961181d565b6044359167ffffffffffffffff916064358381116103215736602382011215610321578060040135938411610321573660248583010111610321576116169560209216936115d88685876133f8565b60405196879283926323e30c8b60e01b84523360048501528760248501528860448501525f606485015260a06084850152602460a48501920161232b565b03815f855af1938415610441575f94611682575b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd984036116695761165e93503091613471565b602060405160018152f35b604051630b6c58a960e31b815260048101859052602490fd5b9093506020813d6020116116ae575b8161169e60209383611917565b810103126103215751928461162a565b3d9150611691565b34610321576101403660031901126103215767ffffffffffffffff600435818111610321576116e9903690600401611aa8565b60243582811161032157611701903690600401611aa8565b60c0366043190112610321576101043583811161032157611726903690600401611c5b565b9061012435938411610321576117436104e6943690600401611c5b565b9261174c61289f565b611e70565b3461032157606036600319011261032157602061178061176f611807565b61177761181d565b6044359161270f565b604051908152f35b34610321576020366003190112610321576004355f525f6020526020600160405f205414604051908152f35b34610321576020366003190112610321576004359063ffffffff60e01b82168092036103215760209163e414309160e01b81149081156117f6575b5015158152f35b6301ffc9a760e01b149050836117ef565b600435906001600160a01b038216820361032157565b602435906001600160a01b038216820361032157565b35906001600160a01b038216820361032157565b60a0810190811067ffffffffffffffff82111761186357604052565b634e487b7160e01b5f52604160045260245ffd5b6060810190811067ffffffffffffffff82111761186357604052565b6040810190811067ffffffffffffffff82111761186357604052565b6080810190811067ffffffffffffffff82111761186357604052565b67ffffffffffffffff811161186357604052565b60e0810190811067ffffffffffffffff82111761186357604052565b6020810190811067ffffffffffffffff82111761186357604052565b90601f8019910116810190811067ffffffffffffffff82111761186357604052565b92919267ffffffffffffffff82116118635760405191611963601f8201601f191660200184611917565b829481845281830111610321578281602093845f960137010152565b9080601f830112156103215781602061199a93359101611939565b90565b919060608382031261032157604051906119b682611877565b81936119c181611833565b83526119cf60208201611833565b602084015260408101359167ffffffffffffffff8311610321576040926119f6920161197f565b910152565b67ffffffffffffffff81116118635760051b60200190565b929192611a1f826119fb565b604092611a2f6040519283611917565b819581835260208093019160061b84019381851161032157915b848310611a5857505050505050565b8583830312610321578386918251611a6f81611893565b611a7886611833565b81528286013583820152815201920191611a49565b9080601f830112156103215781602061199a93359101611a13565b91909160a0818403126103215760405190611ac282611847565b8193611acd82611833565b835267ffffffffffffffff9160208101358381116103215782611af191830161199d565b602085015260408101358381116103215782611b0e918301611a8d565b6040850152606081013592831161032157611b2f6080939284938301611a8d565b60608501520135910152565b90929192611b48816119fb565b91604094611b596040519485611917565b839583855260208095019160059460051b8401948186116103215784935b868510611b88575050505050505050565b67ffffffffffffffff90853582811161032157870190608082860312610321578551611bb3816118af565b611bbc83611833565b81528a8301358b8201528683013584811161032157830186601f8201121561032157803590611bea826119fb565b91611bf78a519384611917565b8083528d80840191891b83010191898311610321578e809101915b838310611c4b57505050508782015260608084013594851161032157611c3c878d9687960161197f565b90820152815201940193611b77565b82358152918101918f9101611c12565b9080601f830112156103215781602061199a93359101611b3b565b9181601f840112156103215782359167ffffffffffffffff8311610321576020808501948460051b01011161032157565b906080600319830112610321576004356001600160a01b0381168103610321579160243591604435916064359067ffffffffffffffff821161032157611cef91600401611c76565b9091565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b805115610cf05760200190565b805160011015610cf05760400190565b805160021015610cf05760600190565b805160031015610cf05760800190565b805160041015610cf05760a00190565b8051821015610cf05760209160051b010190565b9081518082526020808093019301915f5b828110611d97575050505090565b835180516001600160a01b031686528201518583015260409094019392810192600101611d89565b90608080611e35611e23611e1160406001600160a01b0380895116885260208901519060a060208a01528082511660a08a015260208201511660c08901520151606060e0880152610100870190611cf3565b60408701518682036040880152611d78565b60608601518582036060870152611d78565b93015191015290565b90611e48826119fb565b611e556040519182611917565b8281528092611e66601f19916119fb565b0190602036910137565b92916001600160a01b038451166001600160a01b0383511614612319576001600160a01b03611ea6606086015160643590611d64565b515116906040830151916001600160a01b03611ec56084358095611d64565b515116148015906122d9575b610caa576040850151906001600160a01b03611ef06044358094611d64565b5151166001600160a01b03611f0b60643560608a0151611d64565b515116146122c757611f1c866128e1565b805f525f60205260405f2054156122745750611f37846128e1565b805f525f60205260405f205415612220575061201a9291611ff4917f6fa7f4c28634b0a9d6831401c45ae468195fb63aed07308935c35374ff5d9e3960405180611f9f611f9161012033845280602085015283018d611dbf565b82810360408401528a611dbf565b85606083015260643560808301528760a083015260a43560c083015260c43560e083015260e4356101008301520390a16001600160a01b0386511660405192611fe7846118fb565b5f8452606435908a612b0e565b936001600160a01b038651166040519261200d846118fb565b5f845260a4359086612b0e565b916120286040820151612e4c565b15801561220c575b80156121f9575b80156121e6575b6121d4576040519161204f836118af565b5f83525f60208401525f60408401525f606084015261206e8483613e57565b845260408401526120946120828386613e57565b60208601528060608601528451612ee0565b946120a86020850151604086015190612ee0565b936120b287612e96565b80156121c5575b6121b35761217a6121ac957fd9fa84dd790c969daa5c33d8050dc06b4a9b59d5b42e2be5f5e8ae20447f618d9461215c6121b19a60a0966120fb8a8851612f0a565b6121098c6020890151612f0a565b6121178a6040890151612f68565b6121258c6060890151612f68565b61212e8a613093565b6121378c613093565b6001600160a01b0361215360c435926060606435910151611d64565b51511633613133565b50506001600160a01b0361215360e43592606060a435910151611d64565b5050606060405191338352805160208401526020810151604084015260408101518284015201516080820152a161321f565b61321f565b565b604051630d86822160e01b8152600490fd5b506121cf85612e96565b6120b9565b6040516321badf1f60e01b8152600490fd5b506121f46060840151612e96565b61203e565b506122076060820151612e96565b612037565b5061221a6040840151612e4c565b15612030565b9351604080513381526001600160a01b039092166020830152810194909452507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f3945091925082915050606081015b0390a1565b9551604080513381526001600160a01b039092166020830152810196909652507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f39493508392505060608201905061226f565b604051631cd2f1c760e21b8152600490fd5b506001600160a01b036122f3606085015160a43590611d64565b5151166001600160a01b0361230f604088015160443590611d64565b5151161415611ed1565b604051630a98f1f360e21b8152600490fd5b908060209392818452848401375f828201840152601f01601f1916010190565b90929192612358816119fb565b916040916123696040519485611917565b839581855260208095019160051b8301938185116103215783925b8584106123945750505050505050565b67ffffffffffffffff9084358281116103215786019083828603126103215783516123be81611893565b823584811161032157866123d391850161199d565b815289830135938411610321576123ee868b95869501611c5b565b83820152815201930192612384565b903590605e1981360301821215610321570190565b903590601e1981360301821215610321570180359067ffffffffffffffff82116103215760200191813603831361032157565b903590601e1981360301821215610321570180359067ffffffffffffffff821161032157602001918160061b3603831361032157565b5f5b60808110612489575050565b60608282015260200161247d565b5f5b8281106124a557505050565b606082820152602001612499565b903590601e1981360301821215610321570180359067ffffffffffffffff821161032157602001918160051b3603831361032157565b604051906124f682611877565b60606040835f81525f60208201520152565b6040519061251582611847565b5f6080838281526125246124e9565b6020820152606060408201526060808201520152565b9015610cf057803590607e1981360301821215610321570190565b903590609e1981360301821215610321570190565b9190811015610cf05760061b0190565b356001600160a01b03811681036103215790565b3580151581036103215790565b9081518082526020808093019301915f5b8281106125ba575050505090565b8351855293810193928101926001016125ac565b6125e56101446125de8380612555565b3690611aa8565b5f525f602052600160405f20540361268157806126058161267193612555565b6126696126246126296020850135938460408701359384923690611aa8565b61391a565b6126416126368580612555565b9460608101906124b3565b929061266160405196612653886118fb565b5f88525f3681373690611aa8565b933691611b3b565b923392612b0e565b6040810151606090910151600192565b505f905f905f90565b9035601e198236030181121561032157016020813591019167ffffffffffffffff8211610321578160061b3603831361032157565b9190808252602080920192915f905b8282106126dc575050505090565b909192936001906001600160a01b036126f487611833565b168152858301358382015260409081019501939201906126ce565b8215612744576001600160a01b038091165f52600160205260405f2091165f5260205260405f20905f5260205260405f205490565b90915061275082613ae8565b6001600160a01b03809316906040918251946370a0823160e01b86528416938460048701526020928387602481865afa968715612866575f97612870575b50836127a76127a0836127d79a6148ac565b509061436e565b508651636eb1769f60e11b81526001600160a01b0390941660048501523060248501529297889081906044820190565b0381865afa968715612866575f97612835575b506127a06127fb9161199a986148ac565b506128068183612eb9565b1561282d5750935b5f5260018252825f20905f528152815f20905f8052525f2054906139f3565b90509361280e565b96508387813d831161285f575b61284c8183611917565b81010312610321579551956127a06127ea565b503d612842565b85513d5f823e3d90fd5b96508387813d8311612898575b6128878183611917565b81010312610321579551958361278e565b503d61287d565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0060028154146128cf5760029055565b604051633ee5aeb560e01b8152600490fd5b60405161290c816128fe6020820194602086526040830190611dbf565b03601f198101835282611917565b51902090565b919060408382031261032157825167ffffffffffffffff908181116103215784019082601f8301121561032157815160209261294d826119fb565b9161295b6040519384611917565b808352848084019160051b830101918683116103215785809101915b8383106129ea5750505050948281015191821161032157019180601f840112156103215782516129a6816119fb565b936129b46040519586611917565b818552838086019260051b820101928311610321578301905b8282106129db575050505090565b815181529083019083016129cd565b8251815291810191869101612977565b90808251908181526020809101926020808460051b8301019501935f915b848310612a285750505050505090565b9091929394958480612a46600193601f198682030187528a5161259b565b9801930193019194939290612a18565b91906020928381526001600160a01b0382511684820152838201516040820152612a90604083015160e06060840152610100830190611cf3565b9060608301516080820152612ab7608084015192601f1993848483030160a08501526129fa565b9260a081015193838382030160c08401528680865192838152019501905f5b818110612afa5750505061199a94955060c060e0910151928285030191015261259b565b825187529588019591880191600101612ad6565b949193612d4d919360c0915f612cd4604092835194612b2c866118df565b612b34612508565b86526020958487820152848682015260609781868a809401528260808201528660a08201520152612c84855191612b6a83611847565b60048352612b7988840161247b565b8d612b83816128e1565b9c896001600160a01b039e8f94859182865116908d5194600386528501528c840152168c820152608081018a52612bb986611d17565b52612bc385611d17565b508851612bcf81611877565b6002815289368c830137612be286611d24565b52612bec85611d24565b5060ff8a612c4f8b850193612c3987612c1281612c0a858a51611d64565b515116613ae8565b97511688612c21848951611d64565b51511685612c30858a51611d64565b5101519161270f565b96612c45828751611d64565b5151169451611d64565b51015192169093929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b612c8d82611d34565b52612c9781611d34565b50612cbb8a8d8d60ff8a612c4f8d850193612c3987612c1281612c0a858a51611d64565b612cc482611d44565b52612cce81611d44565b50613bc6565b95878a511697848b0191825191868184511693015116928a85523087528580862091510151865191612d05836118fb565b868352875195612d14876118df565b86528886015286850152848885015289608085015260a084015260c08301528351808098819463d04dfe2360e01b835260048301612a56565b03915afa968715612e42575f945f98612e18575b50845160028110612e0157508183860151950151612d87612d8188611d54565b51611d44565b51612d928183612eb9565b15612df95750925b612dbc8685919060405192600284526020840152604083015260608201604052565b612dc588611d34565b52612dcf87611d34565b50825199612ddc8b6118df565b8a52890152870152850152608084015260a083015260c082015290565b905092612d9a565b602490835190630fbb8e5560e21b82526004820152fd5b909750612e389194503d805f833e612e308183611917565b810190612912565b939093965f612d61565b50513d5f823e3d90fd5b612e6b905f60e01d906001600160e01b038160e01d9116601b0b614963565b1290565b90612e6b916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6149e4565b612eb5905f60e01d906001600160e01b038160e01d9116601b0b614963565b1390565b90612eb5916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6149e4565b61199a91610a9a916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b613eba565b612f64916080810182612f26612f208351611d54565b51611d54565b52612f5d612f576001600160a01b03809451511693612f4e612f488551611d54565b51611d17565b51169251611d54565b51611d34565b519161350b565b5050565b90608081019180612f7c612f208551611d44565b526001600160a01b03809251511691612f98612f488551611d44565b5116612fa7612f578551611d44565b51908161305b57612fb783612e96565b613042579183917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a959361226f955f526020906001825261300d604094855f20835f528452855f20855f528452855f20546139f3565b945f5260018252835f20905f528152825f20915f52525f20555b516040519182913383526040602084015260408301906129fa565b60405163793a8f5560e01b815260048101849052602490fd5b9161308c917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a959361226f95613133565b5050613027565b608081016130a4612f578251611d44565b519182156130b157505050565b6130cb612f486001600160a01b0380935151169351611d44565b5116815f5260209160018352604092835f20835f528152835f20855f528152835f2054936001600160e01b038516613106575b505050505050565b61312a955f9284845260018152828420868552815282842091845252812055613569565b5f8080806130fe565b9392919361314083612e96565b613042578461315c57613154939450613569565b50505f905f90565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f528152613199835f205494856139f3565b956131a387612e96565b6131c6575f97885260018252838820908852815282872091875252909320829055565b835163c5e12af560e01b815260048101889052602490fd5b90604082019082526020606081936040838201528551809452019301915f5b82811061320b575050505090565b8351855293810193928101926001016131fd565b60c0810151908151915f92613393575b506132d46020918281510151926001600160a01b039081818187511696015116928660a082019485518252308452604097888320898686510151015160808601518b519161327c836118fb565b8683528c519361328b856118fb565b8785528d519661329a886118df565b8752898701528c86015260016060860152608085015260a084015260c08301528851808099819463d04dfe2360e01b835260048301612a56565b03915afa94851561338957879561336b575b5084516132f7575b50505050505050565b81905101510151169051813b156133675791849184938361332c965180978195829463012c676d60e21b8452600484016131de565b03925af190811561335e5750613347575b80808080806132ee565b61335182916118cb565b61335b578061333d565b80fd5b513d84823e3d90fd5b8480fd5b6133809195503d8089833e612e308183611917565b9050935f6132e6565b86513d89823e3d90fd5b6001600160a01b03602080845101510151169060a083015190823b15610321576133d6925f928360405180968195829463012c676d60e21b8452600484016131de565b03925af18015610441571561322f576133f09192506118cb565b5f905f61322f565b6040519263a9059cbb60e01b5f526001600160a01b0380931660045260245260205f60448180855af160015f5114811615613452575b836040521561343c57505050565b635274afe760e01b835216600482015260249150fd5b600181151661346857813b15153d15161661342e565b833d5f823e3d90fd5b9092604051936323b872dd60e01b5f526001600160a01b0393848092166004521660245260445260205f60648180855af160015f51148116156134c1575b836040525f6060521561343c57505050565b600181151661346857813b15153d1516166134af565b9091156134e2575050565b6040516305dbdfd960e41b81526001600160a01b03918216600482015291166024820152604490fd5b9392919361351883612e96565b613042578461352c57613154939450613a1d565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f528152613199835f20549485612ee0565b9092919261357681613ee9565b9361358081612e96565b6135c95784816001600160e01b0361359f9360e01d9116601b0b614b0e565b508092816135af575b5050509190565b6001600160a01b036135c193166133f8565b5f81816135a8565b604051632d1671a360e11b8152600490fd5b9160408051916135ea83611847565b600480845260206135fc81860161247b565b5f5b875181101561363157806136146001928a611d64565b5161361f8289611d64565b5261362a8188611d64565b50016135fe565b5092955092939093335f52308352855f209186519061364f82611893565b6136576124e9565b825260608581930152875161366b816118fb565b5f815288519161367a836118fb565b5f83525f3681375f5b81518110156137e0576136968183611d64565b5190888c8b84519189818401518d8d82516136be575b50505050505050506001915001613683565b5f61372d97948197948c97946136eb8c956001600160a01b039d8e81818d51169c0151169b015190613bc6565b948651996136f88b6118df565b8a528901528488015286015260808501528a60a08501528b60c08501525180958194829363d04dfe2360e01b84528301612a56565b03915afa9384156137d6578b915f956137b8575b508451613756575b50908b8e89838d8d6136ac565b51015116803b1561032157613785925f918c8f84905180978195829463012c676d60e21b8452339084016131de565b03925af19182156137ae5760019261379f575b8981613749565b6137a8906118cb565b5f613798565b8c513d5f823e3d90fd5b6137cd9195503d805f833e612e308183611917565b9050935f613741565b8e513d5f823e3d90fd5b5050505050505050509050565b81156137f7570490565b634e487b7160e01b5f52601260045260245ffd5b6040815110613867576020810151908051603f1981019081116138535760051c821161383f5760016020920160051b010190565b505060405161384d816118fb565b5f815290565b634e487b7160e01b5f52601160045260245ffd5b5060405161384d816118fb565b80511561388457602001515f1a90565b505f90565b905f8091602081519101845af48080613907575b156138bd5750506040513d81523d5f602083013e60203d82010160405290565b156138e457604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b3d156138f5576040513d5f823e3d90fd5b60405163d6bda27560e01b8152600490fd5b503d15158061389d5750813b151561389d565b9161394590606061393a936001600160a01b039485916040880151611d64565b515116940151611d64565b515116146122c757565b6139766001600160e01b0392838316601b0b9260e01d938160e01d9116601b0b8484614125565b90637ffffff582136139c6575b9061398d9161436e565b92909215806139be575b6139a057505090565b6044925060405191638eba4d0760e01b835260048301526024820152fd5b508215613997565b6139d08282615037565b1561398357604483856040519163d556b11160e01b835260048301526024820152fd5b61199a91610a9a916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614713565b929192613a2982613ee9565b93613a3381612e96565b613a945784816001600160e01b03613a529360e01d9116601b0b614b0e565b9290809315613a7f575b50829081613a6b575050509190565b6135c1926001600160a01b03309216613471565b9092505f19811461385357600101915f613a5c565b604051632eaefac360e21b8152600490fd5b60041115613ab057565b634e487b7160e01b5f52602160045260245ffd5b602090939291936001600160a01b036040820195168152613ae483613aa6565b0152565b613af0615050565b60408051630782d7e160e01b81526001600160a01b03831660048201529091828260248173200e12d10bb0c5e4a17e7018f0f1161919bb93895afa928315613bbd575f925f94613b88575b50613b4583613aa6565b600183141580613b76575b613b5a5750505090565b5163ee07877f60e01b8152918291610597919060048401613ac4565b50613b8083613aa6565b821515613b50565b90809450613bac9293503d8511613bb6575b613ba48183611917565b810190614882565b919091925f613b3b565b503d613b9a565b513d5f823e3d90fd5b613bd08251611e3e565b613bda8351611e3e565b9282519281518015155f14613e4f57600201935b60019401840190613bfe826119fb565b95613c19604093613c118551998a611917565b8089526119fb565b613c2b602091601f1901828a01612497565b5f9584519389896002926002885233868901523089890152606097606081018a52613c5584611d17565b52613c5f83611d17565b505f825b613e0f575b505050508651613c7f575b50505050505050505090565b90919293600288613ca28c86613c9b8e809c9d9e018093611d64565b528d611d64565b500185613caf828d611d64565b52613cba818c611d64565b505f965b613cc9575b50613c73565b8851871015613e0a576001600160a01b03613d75898b85613d6c8c60428c88613cf28488611d64565b515116968582613d02868a611d64565b51015192613d10868a611d64565b51838d82511691015182815160051b910120908451927f6ec4dff745ec96dbde88c5d41f8aa5ac13aa1664afb47b8406b44fa945a650c88452830152838201522090519161190160f01b83528d83015260228201522093611d64565b510151916148da565b15613df25787613de18b8e8c8f9e9d9c9b9a999897968f613dce918d613dc4898f8f613db083889f613da7828f611d64565b51511692611d64565b52613dbb828b611d64565b51015192611d64565b52019c8d94611d64565b510151613ddb8383611d64565b52611d64565b500196979895909192939495613cbe565b8851630a57f30960e31b815260048101899052602490fd5b613cc3565b9091929a8251821015613e475790613e3b84809301809d613e308487611d64565b51613ddb8383611d64565b50019082918d93613c63565b9a9291613c68565b505f93613bee565b9160408301926040613e91610a9a606087519401938451906001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b613f6a565b94519301613ea0815186612e6f565b613ea8575050565b90935061199a9192505192518361394f565b919291600160ff1b8401613ed257611cef9350614a39565b90611cef935f0391614713565b61398d828261436e565b613ef1615050565b6040805163b7bad1b160e01b81526001600160a01b0383166004820152909182826024815f73200e12d10bb0c5e4a17e7018f0f1161919bb93895af1928315613bbd575f925f94613b885750613b4583613aa6565b6008815110613884576008015167ffffffffffffffff1667ff0a89c674ee78741490565b9091939284158215175f14613f845750505090505f905f90565b82810192600160fd1b8082019083011760fe1c6140bb575b5050613fa781614cfc565b93613fb181614cfc565b94613fbc8682614d1c565b909182156140ac575f9083986f0785ee10d5da46d900f436a00000000080861161409e575b50670de0b6b3a7640000808b1161408f575b50633b9aca00808b11614080575b50612710808b11614072575b5098805b61406157508190611cef989982600a0a9109960195817fcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccd0a93838211900382610100031b9203901c170291614d2f565b60019290920191600a900480614011565b60049a04998a93019261400d565b600991939a049901915f614001565b601291939a049901915f613ff3565b85049950602592505f613fe1565b50929050611cef949550614d2f565b5f82121561410f57808413614101575b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb2841315613f9c57909250611cef939491614c3a565b909250611cef939491614ca1565b808412156140cb57909250611cef939491614c3a565b9290918061414b576044848460405191637a97930f60e01b835260048301526024820152fd5b90919280155f1461416057505050505f905f90565b6141799361416d91614de9565b92919490938492614de9565b909391928461418788614cfc565b9161419186614cfc565b947f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000094604c91868810614338575b030191600160ff1b98838a018112155f14614305575050035b5f955f8212806142fc575b6142de575b5f8112806142cc575b6142ae5786820103966001600160ff1b03881490816142a4575b508061429b575b80614292575b6142745750906142289291614f95565b915f811361423b575b50611cef93614d2f565b9091604c82136142695761425291600a0a906137ed565b90811561425f575f614231565b505050505f905f90565b50505050505f905f90565b876044916040519163d556b11160e01b835260048301526024820152fd5b505f8512614218565b50828414614212565b905088145f61420b565b604489836040519163d556b11160e01b835260048301526024820152fd5b50806001600160ff1b030182136141f1565b95508087018613156142f65786818703015b956141e8565b5f6142f0565b505f81136141e3565b89985090920390506001600160ff1b038190038701821361432957018601946141d8565b5050505050505050505f905f90565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009650604b92506141bf565b81156137f7570590565b8082601b82810b8314614563577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e1000000000000000000840561450f575b8380820b036144fe57507b199999999999999999999999999999999999999999999999999999987b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc840111156144af575b838060030b03614433575b8084136144175750506001600160e01b036001925b60e01b91161791565b8303600a0a80156137f7576001600160e01b039107159261440e565b92915f8413156144835750906144498383615037565b61446557637ffffffe1901600a0a810290637fffffff926143f9565b506044916040519163d556b11160e01b835260048301526024820152fd5b637fffffff199283039060438213614269576144a291600a0a90614364565b91821561425f57926143f9565b5f198401808060030b146144c357506143ee565b90506001600160e01b039293507b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff915060e01b9260ff1d181617905f90565b600190940193600a909305926143a1565b937f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000840515614550576305f5e100600894058094819201955b9150506143a1565b620186a060059405809481920195614548565b50826143ee57505050505f90600190565b919291600160ff1b919080158061470157509061459091614de9565b9490929091905f8685858582821380156146f8575b6146db575b505050508682841860ff1c94860391039081604c0381116146c05701600a0a8082059190846146a6575b505081019182821860ff1c111561469e57826001600160ff1b031461468057905f600192135f1461465157600a9004915b01925b8115811761461557509190565b8061462e575b508015614626579190565b505f91508190565b91926146449203600160ff1b01600a0a90614364565b600160ff1b91905f61461b565b600a60037fe6666666666666666666666666666666666666666666666666666666666666679201040191614605565b604490836040519163d556b11160e01b835260048301526024820152fd5b509092614608565b81076146b3575b806145d4565b60ff1d600117015f6146ad565b5050509193506146ce579190565b60018160ff1d1790039190565b5f9a50909750909550600160ff1b945092509050868080806145aa565b50835f126145a5565b1561470c5750509190565b9350919050565b93929193841581158181176148645750509061472e91614de9565b919490829561473f82958294614de9565b809692949196938786848213801561485b575b614842575b5050505050508682841860ff1c94860391039081604c0381116146c05701600a0a808205919084614828575b505081019182821860ff1c111561482057826001600160ff1b031461468057905f600192135f146147f157600a9004915b01925b811581176147c457509190565b806147d457508015614626579190565b600160ff1b936147eb9291038401600a0a90614364565b5f61461b565b600a60037fe66666666666666666666666666666666666666666666666666666666666666792010401916147b4565b5090926147b7565b8107614835575b80614783565b60ff1d600117015f61482f565b929b5098509196509450925090505f8080808080614757565b50858412614752565b939593909291901561487a575050614626579190565b945092915050565b919082604091031261032157815160048110156103215760209092015160ff811681036103215790565b9060ff165f03916001600160ff1b0382115f146148d257600a6001818404940192061590565b909190600190565b9091813b614915576148ec91926150b9565b506148f681613aa6565b15918261490257505090565b6001600160a01b03918216911614919050565b6020918160645f935160405192630b135d3f60e11b9788855260048501526040602485015286820190604485015e8281018201859052601f01601f191601915afa905f5114601f3d11161690565b92915f9060018184145f871287151717176149dd575f928082136149cf575b03604c81135f8212176149c357600a0a90846149a18382029384614364565b146149b6575050156149b2575f9190565b5f90565b909350901561199a579190565b5050156149b2575f9190565b5f9560019450925090614982565b5050505f90565b93929190918083145f83125f87121883158715171717614a33575f92808213614a265703604c81135f8212176149c357600a0a90846149a18382029384614364565b9194600193509190614982565b50919050565b909291600160ff1b91828101614acb5750808414614ac157808413918215614ab9578185035b604c811115614aa85750505f915b15614a9957507f8000000000000000000000000000000000000000000000000000000000000001019190565b92506001600160ff1b03039190565b600a0a9081156137f7570491614a6d565b848203614a5f565b505090505f905f90565b93614ad892945f03614574565b80939180928114614aec575b50505f039190565b915092506001600160ff1b03831461468057600a600191059201915f80614ae4565b91925f831215614b36576044838360405191634a7d166b60e01b835260048301526024820152fd5b919283614b4857505090505f90600190565b60ff8116820191808312614c10575f831215614b80575050604c198112614626575f03600a0a91614b7983826137ed565b9283021490565b909293915f81135f14614c0657604d8113614bdb57600a0a9283156137f757835f19048311614bb25750500290600190565b60405163c849483b60e01b815260048101849052602481019290925260ff166044820152606490fd5b5060405163c849483b60e01b81526004810192909252602482015260ff919091166044820152606490fd5b5050905090600190565b60405163c849483b60e01b815260048101869052602481019190915260ff82166044820152606490fd5b909392915f614c4a918184613f6a565b9490945f8483019182019412159081614c97575b8115614c8d575b50614c6f57505090565b604492506040519163d556b11160e01b835260048301526024820152fd5b905083125f614c65565b8281129150614c5e565b614cb693600160fe1b90810193920190613f6a565b9081815f821215614ced575050604b19821261315457614cdb915f03600a0a90614364565b9081614ce5575f90565b600160ff1b90565b93600160ff1b90910192509050565b5f81121561199a57600160ff1b90808203614d15575090565b90505f0390565b905f198183099102908180821091030391565b92939291905f8184181215614dc4576001600160ff1b039283831115614dae57600160ff1b93838503614d6457505050509190565b90919293508514614d7e575050600a600191045f03920190565b604051630ed8062160e21b8152600481019190915260248101919091526044810182905260648101849052608490fd5b5090915050600160ff1b8114613853575f039190565b90916001600160ff1b03808411156135a8578514614d7e575050600a60019104920190565b9190918015614f8b57827f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000080830515614e99575b507f19999999999999999999999999999999999999999999999999999999999999997f0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc830110614e8a575b8313614e745791905f90565b919060018060ff1b926001600160ff1b03030190565b9290600a02905f190192614e68565b6f4b3b4ca85a86c47a098a22400000000080840515614f79575b507728c87cb5c89a2571ebfdcb54864ada834a00000000000000830515614f62575b7b097edd871cfda3a5697758bf0e3cbb5ac5741c640000000000000000830515614f4e575b7e3899162693736ac531a5a58f1fbb4b746504382ca7e4000000000000000000830515614f3e57820515614f2f575b5f614e1d565b9290600a02905f190192614f29565b9391606402916001190193614efa565b93916402540be40002916009190193614efa565b9391678ac7230489e8000002916012190193614ed5565b6025198301955092909202915f614eb3565b505f915081908190565b90915f198383099280830292838086109503948086039584871015615013571461500b579082910960018219018216809204600280826003021880830282030280830282030280830282030280830282030280830282030280920290030293600183805f03040190848311900302920304170290565b505091500490565b60648386866040519263362ced0960e11b8452600484015260248301526044820152fd5b61199a91905f81121561504b575f036150f3565b6150f3565b73200e12d10bb0c5e4a17e7018f0f1161919bb9389803b15801561508e575b6150765750565b602490604051906373e6d7b360e01b82526004820152fd5b507f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d41813f141561506f565b81519190604183036150e9576150e29250602082015190606060408401519301515f1a90615182565b9192909190565b50505f9160029190565b90637ffffff581131561517c57637ffffffe1981019060438213615175575f82121561514957637fffffff91505f0301600a0a7b8000000000000000000000000000000000000000000000000000000202111590565b50600a0a80156137f7577b80000000000000000000000000000000000000000000000000000001041090565b5050151590565b50505f90565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084116151f9579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa15610441575f516001600160a01b038116156151ef57905f905f90565b505f906001905f90565b5050505f91600391905600000000000000000000000000000000000000000000000000000000000000000000000000000000200e12d10bb0c5e4a17e7018f0f1161919bb93890000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000044b608060405234801561000f575f80fd5b506004361061004a575f3560e01c80630782d7e11461004e57806354636d2b14610078578063b7bad1b11461009d578063f5c36eaf146100b0575b5f80fd5b61006161005c366004610363565b6100c3565b60405161006f929190610403565b60405180910390f35b61008b610086366004610363565b6100d8565b60405160ff909116815260200161006f565b6100616100ab366004610363565b6100e9565b61008b6100be366004610363565b6100f5565b5f806100cf5f84610100565b91509150915091565b5f6100e35f836101f0565b92915050565b5f806100cf5f84610281565b5f6100e35f83610356565b73ffffffffffffffffffffffffffffffffffffffff81165f9081526020838152604080832081518083019092525460ff8082161515835261010090910416818301527f313ce56700000000000000000000000000000000000000000000000000000000808452839283908190816004818a5afa915060203d1015610182575f91505b811561019857505f5160ff811115610198575f91505b816101af57505050602001516003925090506101e9565b83516101c3575f955093506101e992505050565b836020015160ff1681146101d85760026101db565b60015b846020015195509550505050505b9250929050565b5f805f6101fd8585610281565b909250905060018260038111156102165761021661039d565b1415801561023557505f8260038111156102325761023261039d565b14155b156102795783826040517fee07877f000000000000000000000000000000000000000000000000000000008152600401610270929190610421565b60405180910390fd5b949350505050565b5f805f8061028f8686610100565b90925090505f8260038111156102a7576102a761039d565b0361034b576040805180820182526001815260ff838116602080840191825273ffffffffffffffffffffffffffffffffffffffff8a165f908152908b9052939093209151825493517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009094169015157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff161761010093909116929092029190911790555b909590945092505050565b5f805f6101fd8585610100565b5f60208284031215610373575f80fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114610396575f80fd5b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b600481106103ff577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b9052565b6040810161041182856103ca565b60ff831660208301529392505050565b73ffffffffffffffffffffffffffffffffffffffff831681526040810161039660208301846103ca56000000000000000000000000000000000000000000"; diff --git a/src/generated/candidate/RaindexV6.sol b/src/generated/candidate/RaindexV6.sol index b53e3d0ef5..6e1a29b13b 100644 --- a/src/generated/candidate/RaindexV6.sol +++ b/src/generated/candidate/RaindexV6.sol @@ -5,19 +5,19 @@ pragma solidity ^0.8.25; // THIS FILE IS AUTOGENERATED BY THE BUILD SCRIPT. DO NOT EDIT BY HAND. /// @dev Hash of the known bytecode. -bytes32 constant BYTECODE_HASH = bytes32(0xf7f6fb2d7658986e321c27fa6351690e170819f2dc34cdc983469a05df491aef); +bytes32 constant BYTECODE_HASH = bytes32(0x3a2b30a9e29df847f767cf9a2092511cc5ff9ad6faad1f366c6d0101f7637c29); /// @dev The deterministic deploy address of the contract when deployed via /// the Zoltu factory. -address constant DEPLOYED_ADDRESS = address(0xC4cF8F35f6fa0a36CBAea5c0a6cEa77134C03e2A); +address constant DEPLOYED_ADDRESS = address(0x2Eb98F9489cFf4A429368e389f5fFc6F8d9C5eDe); /// @dev The creation bytecode of the contract. bytes constant CREATION_CODE = - hex"6080806040523460395760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055615180908161003e8239f35b5f80fdfe6080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a7146117cf575080631f69cb75146115725780632cb77e9f146115465780632fbc4ba0146113fc57806341d1514f146113c55780635cffe9de1461126957806360746119146110e5578063613255ab1461106257806369c7285614610771578063709fb8a5146104375780639235084d146103e3578063ac9650d814610295578063d7e442ec14610237578063d9d98ce4146101865763fa501182146100c1575f80fd5b34610182576101403660031901126101825767ffffffffffffffff600435818111610182576100f4903690600401611b64565b6024358281116101825761010c903690600401611b64565b60c0366043190112610182576101043583811161018257610131903690600401611d0a565b90610124359384116101825761014e61015c943690600401611d0a565b926101576126ea565b612230565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b5f80fd5b34610182576040366003190112610182576001600160a01b036101a7611853565b166040516370a0823160e01b8152306004820152602081602481855afa90811561022c575f916101fa575b50156101e25760206040515f8152f35b60249060405190633c5bf76960e21b82526004820152fd5b90506020813d602011610224575b81610215602093836119d3565b810103126101825751826101d2565b3d9150610208565b6040513d5f823e3d90fd5b346101825760203660031901126101825760043567ffffffffffffffff81116101825761028f61026e61015c923690600401611822565b91906102786126ea565b60405192610285846119b7565b5f84523691611dde565b90612b82565b34610182576020806003193601126101825760043567ffffffffffffffff8111610182576102c7903690600401611822565b9190604051926102d6846119b7565b5f84528284016102e582611ab7565b946102f360405196876119d3565b8286526102ff83611ab7565b9361031186880195601f190186612214565b5f5b84811061037557604080518881528951818a018190525f92600582901b83018101918a918c9085015b8287106103495785850386f35b909192938280610365600193603f198a820301865288516118df565b960192019601959291909261033c565b806103c4886103be61039160019560059d9c9d1b8701876120f4565b929089846040519586938585013782018381015f81528b519283915e015f838201520380845201826119d3565b306139f0565b6103ce828a611fda565b526103d98189611fda565b5001969596610313565b3461018257600319602036820112610182576004359067ffffffffffffffff82116101825760809082360301126101825761042260609160040161213c565b90604051921515835260208301526040820152f35b34610182576003196040368201126101825760043567ffffffffffffffff8082116101825760c0826004019383360301126101825760243590811161018257610484903690600401611822565b9061048d6126ea565b6104be6104b96104b46104ad6104a38880612127565b60408101906120f4565b36916119f5565b613986565b6139db565b801561075f576001101561074d57602483016104da8186611f47565b90501561073b5760448401946104f08682611f47565b9050156107295761055661051e9661054a61051561050e8580612127565b9585611f47565b99909285611f47565b91909261053b6040519761053189611903565b3389523690611a59565b9a60209b8c8901523691611acf565b60408601523691611acf565b60608301526064850135608083015261056e8261272c565b91825f525f875260405f209586541596876105b2575b888860017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055604051908152f35b6001905560a46001600160a01b03917f87491344dfbcf91f6cbbc610cbbeedc85313d37a02df0c93527f7ea5f8db717f83855116604051908152878c82015260606040820152806106066060820188612042565b0390a1019161061583856120f4565b9050610679575b5050505061066d929161066561064e61028f933390919060405192600284526020840152604083015260608201604052565b906040519160018352602083015260408201604052565b923691611dde565b82808080808080610584565b6106866104ad84866120f4565b61068f81614777565b156107025750937fd46c2c56b35c8210e9e712ec3f02242d5fc90187c0ac8ed80cc33626846ec3698961066d9897956106f56106d86106659761064e9761028f9b5116936120f4565b866040519586958652850152606060408501526060840191611d39565b0390a1938395965061061c565b89610725604051928392630c89984b60e31b8452600484015260248301906118df565b0390fd5b60405163540e5f0b60e01b8152600490fd5b604051636c44ef8f60e01b8152600490fd5b604051633c8270bd60e21b8152600490fd5b604051632cff108b60e21b8152600490fd5b34610182576003196020368201126101825767ffffffffffffffff600435116101825760c09060043536030112610182576107aa6126ea565b5f80806107bf60048035608481019101611e90565b9050156110505760246004350135926107d784612791565b1561103e576060806040516107eb8161196b565b6107f3611ee5565b81525f60208201525f6040820152015261080b611ee5565b5061086b61086661084561083b61083561082f608460043501600435600401611e90565b90611f17565b80611f32565b6040810190611f47565b602061085e61082f608460043501600435600401611e90565b013591611f7d565b611d25565b936001600160a01b036108ba6108666108a161089761083561082f608460043501600435600401611e90565b6060810190611f47565b604061085e61082f608460043501600435600401611e90565b81604051976108c889611933565b16875216602086015260408501526108ea608460043501600435600401611e90565b9490506001604051955f87520160051b85016040525f905f5b610917608460043501600435600401611e90565b905081108061102b575b15610e785761093a608460043501600435600401611e90565b821015610e64578160051b810135607e1982360301811215610182576080818301360312610182576040519161096f8361196b565b8181013567ffffffffffffffff81116101825761099190369084840101611b64565b835280820160208181013590850152604080820135908501526060013567ffffffffffffffff8111610182576109ca9236920101611d0a565b606082015280516001600160a01b036109ec6040830151602085015190611fda565b5151166001600160a01b0385511614801590610e30575b610e1e57610a1b6020830151604084015190836130d2565b610a248161272c565b91825f525f60205260405f2054155f14610a88575051604080513381526001600160a01b039092166020830152810191909152600191907fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f390606090a15b01610903565b9190610ab9602084979597015160408501519060608601519060405192610aae846119b7565b5f8452339186613107565b925f93610ad1606082015160446004350135906127b4565b15610b3857505051604080513381526001600160a01b03909216602083015281019190915260019291907fe3151dc8cb7a54ffc4baabd28c1f241c94d510b5e5b502491ac3cad6c16316d590606090a15b8115610b30575b5092610a82565b905088610b29565b610b456040820151612791565b158015610e0b575b15610ba257505051604080513381526001600160a01b03909216602083015281019190915260019291907f500b713857325f9e6dcb52ae832eca9109d107ed1aae9cb4928b4c1e13f051aa90606090a1610b22565b9250925050600196959691610bbb606460043501611fee565b15610d785796610c2b97610c3b60408401516040880151610bdc8183613460565b15610d705750925b610c35848592610c1e610c1860608a01516001600160e01b03601b918660e01d92828816810b928260e01d9216900b613e30565b90613feb565b9d8e9260408d015161352b565b60408c0152613555565b99613555565b98610c46848461357f565b610c5084826135dd565b60405192338452608060208501526060610c768451608080880152610100870190612042565b93602081015160a0870152604081015160c0870152015192607f198582030160e0860152835180825260208201906020808260051b8501019601925f5b828110610d1257505050505092806001979695937f194f1feb3b4d7076a2c272e774e792e0c48bb8c7aa1a9a3671c1cd6da9e6b4c193610d0d96604084015260608301520390a180858c5101808d5260051b8c01526136ef565b610b22565b9091929396602080610d63600193601f198782030189528b51906001600160a01b0382511681526040610d528584015160608785015260608401906120c1565b9201519060408184039101526118df565b9901950193929101610cb3565b905092610be4565b610c2b90610c3b6060840151610c35610db6610c1860408801516001600160e01b0394601b90868360e01d9316820b91878260e01d9216900b613e30565b60408a0151610dc58183613460565b15610e035750915b829c8d916060890151908116155f14610df4575060408801515b96879460408d015161352b565b610dfe9085613487565b610de7565b905091610dcd565b50610e19606082015161343d565b610b4d565b60405163936bb5ad60e01b8152600490fd5b506001600160a01b03610e4c6060830151604085015190611fda565b5151166001600160a01b036020860151161415610a03565b634e487b7160e01b5f52603260045260245ffd5b50919390610e8a606460043501611fee565b1561102557835b6004356004013590610ea38282613460565b6110075750508490610ec3856001600160a01b0360208701511633613069565b505060a46004350190610edb826004356004016120f4565b905015159081610fff575b50610f5e575b506001600160a01b03610f0292935116336127db565b50505b8351811015610f2a5780610f24610f1e60019387611fda565b516138c8565b01610f05565b5060409160017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005582519182526020820152f35b90506001600160a01b03602084015116610f886001600160a01b03855116926004356004016120f4565b929091333b1561018257610fd05f93604051958694859463691f9ed760e01b8652600486015260248501528960448501528a606485015260a0608485015260a4840191611d39565b038183335af190811561022c57859115610eec579050610ff09150611987565b5f836001600160a01b03610eec565b905088610ee6565b604492506040519163573b6f4160e01b835260048301526024820152fd5b84610e91565b506110396040830151612791565b610921565b60405163315f9e2360e21b8152600490fd5b604051639c95219f60e01b8152600490fd5b3461018257602080600319360112610182576024816001600160a01b03611087611853565b16604051928380926370a0823160e01b82523060048301525afa90811561022c575f916110b8575b50604051908152f35b90508181813d83116110de575b6110cf81836119d3565b810103126101825751826110af565b503d6110c5565b34610182576110f336611893565b92916111009491946126ea565b61110b83833361275d565b61111481612791565b15611238578160ff9161112c856111ef969533612d9c565b6111368183613460565b15611232575080935b61114b8582853361300b565b917f8045c25080b0868951141ed0a91720bcad09a8364a2b3109ee1fd49c1f0bc8b860c061117a898833613069565b97906001600160a01b0360405192338452169a8b6020840152856040840152886060840152608083015260a0820152a16040519660068852602088015260408701526060860152608085015260a08401521660c082015260e08101604052906040519160018352602083015260408201604052565b908061121b5760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b61122a9261028f913691611dde565b80808061015c565b9361113f565b50604051623a3a4d60e21b81523360048201526001600160a01b039190911660248201526044810191909152606490fd5b34610182576080366003190112610182576004356001600160a01b039081811680910361018257611298611869565b6044359167ffffffffffffffff916064358381116101825736602382011215610182578060040135938411610182573660248583010111610182576113259560209216936112e7868587612f2c565b60405196879283926323e30c8b60e01b84523360048501528760248501528860448501525f606485015260a06084850152602460a485019201611d39565b03815f855af193841561022c575f94611391575b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd984036113785761136d93503091612fa5565b602060405160018152f35b604051630b6c58a960e31b815260048101859052602490fd5b9093506020813d6020116113bd575b816113ad602093836119d3565b8101031261018257519284611339565b3d91506113a0565b346101825760603660031901126101825760206113f46113e3611853565b6113eb611869565b60443591612d9c565b604051908152f35b346101825761140a36611893565b928094926114166126ea565b61142182853361275d565b61142a81612791565b15611516578061143e61148d9286336127db565b9790957f7f9dfa19cf1cc2f806f2f860fbc9c056b601fb1afc0e9b843dfe5c63616268e660806040513381526001600160a01b038416998a60208301528560408301526060820152a133612881565b939091856114bb5760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b61150a9661028f956106659460ff93604051956005875260208701526040860152606085015260808401521660a082015260c08101604052906040519160018352602083015260408201604052565b8080808080808061015c565b506040516306dde9c360e41b81523360048201526001600160a01b03841660248201526044810191909152606490fd5b34610182576020366003190112610182576004355f525f6020526020600160405f205414604051908152f35b34610182576003196040368201126101825767ffffffffffffffff9060043582811161018257806004019160a08236039182011261018257602435848111610182576115c2903690600401611822565b90936115cc6126ea565b5f946001600160a01b0394856115e184611d25565b1633036117ad576115fa6115f53685611b64565b61272c565b805f525f60205260405f20966001885414611641575b60208960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556040519015158152f35b9091929394959697505f6001985560405196338852826020890152606060408901528161166d8761187f565b166060890152602484013590606219018112156101825783019060a060808901528061169b6004840161187f565b166101008901526116ae6024830161187f565b16610120880152604481013560221982360301811215610182570190602460048301359201988211610182578136038913610182577f09d18501db0080ca2d6cd7c17fa7255daff4b2d503ea93b76ff68b6752ea8e63878061066595608461177661028f9a60209f611735906117a09f9a606061014061064e9d0152610160880191611d39565b61176761175c6117486044880185611d59565b605f198a8603810160a08c01529491611d8e565b926064870190611d59565b918784030160c0880152611d8e565b91013560e08301520390a13390919060405192600284526020840152604083015260608201604052565b8280808080808080611610565b6024866117b985611d25565b6040516335252be360e01b815291166004820152fd5b34610182576020366003190112610182576004359063ffffffff60e01b82168092036101825760209163e414309160e01b8114908115611811575b5015158152f35b6301ffc9a760e01b1490508361180a565b9181601f840112156101825782359167ffffffffffffffff8311610182576020808501948460051b01011161018257565b600435906001600160a01b038216820361018257565b602435906001600160a01b038216820361018257565b35906001600160a01b038216820361018257565b906080600319830112610182576004356001600160a01b0381168103610182579160243591604435916064359067ffffffffffffffff8211610182576118db91600401611822565b9091565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b60a0810190811067ffffffffffffffff82111761191f57604052565b634e487b7160e01b5f52604160045260245ffd5b6060810190811067ffffffffffffffff82111761191f57604052565b6040810190811067ffffffffffffffff82111761191f57604052565b6080810190811067ffffffffffffffff82111761191f57604052565b67ffffffffffffffff811161191f57604052565b60e0810190811067ffffffffffffffff82111761191f57604052565b6020810190811067ffffffffffffffff82111761191f57604052565b90601f8019910116810190811067ffffffffffffffff82111761191f57604052565b92919267ffffffffffffffff821161191f5760405191611a1f601f8201601f1916602001846119d3565b829481845281830111610182578281602093845f960137010152565b9080601f8301121561018257816020611a56933591016119f5565b90565b91906060838203126101825760405190611a7282611933565b8193611a7d8161187f565b8352611a8b6020820161187f565b602084015260408101359167ffffffffffffffff831161018257604092611ab29201611a3b565b910152565b67ffffffffffffffff811161191f5760051b60200190565b929192611adb82611ab7565b604092611aeb60405192836119d3565b819581835260208093019160061b84019381851161018257915b848310611b1457505050505050565b8583830312610182578386918251611b2b8161194f565b611b348661187f565b81528286013583820152815201920191611b05565b9080601f8301121561018257816020611a5693359101611acf565b91909160a0818403126101825760405190611b7e82611903565b8193611b898261187f565b835267ffffffffffffffff9160208101358381116101825782611bad918301611a59565b602085015260408101358381116101825782611bca918301611b49565b6040850152606081013592831161018257611beb6080939284938301611b49565b60608501520135910152565b909291611c0384611ab7565b916040611c1360405194856119d3565b839580855260208095019160059160051b8401948086116101825784935b868510611c42575050505050505050565b67ffffffffffffffff90853582811161018257870190606082850312610182578451611c6d81611933565b611c768361187f565b81528a83013584811161018257830185601f8201121561018257803590611c9c82611ab7565b91611ca9895193846119d3565b8083528d808401918b1b83010191888311610182578e809101915b838310611cfa57509150508201528583013593841161018257611ceb858c95869501611a3b565b86820152815201940193611c31565b82358152918101918f9101611cc4565b9080601f8301121561018257816020611a5693359101611bf7565b356001600160a01b03811681036101825790565b908060209392818452848401375f828201840152601f01601f1916010190565b9035601e198236030181121561018257016020813591019167ffffffffffffffff8211610182578160061b3603831361018257565b9190808252602080920192915f905b828210611dab575050505090565b909192936001906001600160a01b03611dc38761187f565b16815285830135838201526040908101950193920190611d9d565b90929192611deb81611ab7565b91604091611dfc60405194856119d3565b839581855260208095019160051b8301938185116101825783925b858410611e275750505050505050565b67ffffffffffffffff908435828111610182578601908382860312610182578351611e518161194f565b82358481116101825786611e66918501611a59565b81528983013593841161018257611e81868b95869501611d0a565b83820152815201930192611e17565b903590601e1981360301821215610182570180359067ffffffffffffffff821161018257602001918160051b3603831361018257565b60405190611ed382611933565b60606040835f81525f60208201520152565b60405190611ef282611903565b5f608083828152611f01611ec6565b6020820152606060408201526060808201520152565b9015610e6457803590607e1981360301821215610182570190565b903590609e1981360301821215610182570190565b903590601e1981360301821215610182570180359067ffffffffffffffff821161018257602001918160061b3603831361018257565b9190811015610e645760061b0190565b805115610e645760200190565b805160011015610e645760400190565b805160021015610e645760600190565b805160031015610e645760800190565b805160041015610e645760a00190565b8051821015610e645760209160051b010190565b3580151581036101825790565b9081518082526020808093019301915f5b82811061201a575050505090565b835180516001600160a01b03168652820151858301526040909401939281019260010161200c565b906080806120b86120a661209460406001600160a01b0380895116885260208901519060a060208a01528082511660a08a015260208201511660c08901520151606060e08801526101008701906118df565b60408701518682036040880152611ffb565b60608601518582036060870152611ffb565b93015191015290565b9081518082526020808093019301915f5b8281106120e0575050505090565b8351855293810193928101926001016120d2565b903590601e1981360301821215610182570180359067ffffffffffffffff82116101825760200191813603831361018257565b903590605e1981360301821215610182570190565b6121536115f561214c8380611f32565b3690611b64565b5f525f602052600160405f2054036121ef5780612173816121df93611f32565b6121d76121926121976020850135938460408701359384923690611b64565b6130d2565b6121af6121a48580611f32565b946060810190611e90565b92906121cf604051966121c1886119b7565b5f88525f3681373690611b64565b933691611bf7565b923392613107565b6040810151606090910151600192565b505f905f905f90565b5f5b60808110612206575050565b6060828201526020016121fa565b5f5b82811061222257505050565b606082820152602001612216565b926001600160a01b038451166001600160a01b03835116146126d8576001600160a01b03612265606086015160643590611fda565b515116906040830151916001600160a01b036122846084358095611fda565b51511614801590612698575b610e1e576040850151906001600160a01b036122af6044358094611fda565b5151166001600160a01b036122ca60643560608a0151611fda565b51511614612686576122db8661272c565b805f525f60205260405f20541561263357506122f68461272c565b805f525f60205260405f2054156125df57506123d992916123b3917f6fa7f4c28634b0a9d6831401c45ae468195fb63aed07308935c35374ff5d9e396040518061235e61235061012033845280602085015283018d612042565b82810360408401528a612042565b85606083015260643560808301528760a083015260a43560c083015260c43560e083015260e4356101008301520390a16001600160a01b03865116604051926123a6846119b7565b5f8452606435908a613107565b936001600160a01b03865116604051926123cc846119b7565b5f845260a4359086613107565b916123e76040820151612791565b1580156125cb575b80156125b8575b80156125a5575b612593576040519161240e8361196b565b5f83525f60208401525f60408401525f606084015261242d848361479b565b84526040840152612453612441838661479b565b6020860152806060860152845161352b565b94612467602085015160408601519061352b565b936124718761343d565b8015612584575b6125725761253961256b957fd9fa84dd790c969daa5c33d8050dc06b4a9b59d5b42e2be5f5e8ae20447f618d9461251b6125709a60a0966124ba8a885161357f565b6124c88c602089015161357f565b6124d68a60408901516135dd565b6124e48c60608901516135dd565b6124ed8a6138c8565b6124f68c6138c8565b6001600160a01b0361251260c435926060606435910151611fda565b51511633612881565b50506001600160a01b0361251260e43592606060a435910151611fda565b5050606060405191338352805160208401526020810151604084015260408101518284015201516080820152a16136ef565b6136ef565b565b604051630d86822160e01b8152600490fd5b5061258e8561343d565b612478565b6040516321badf1f60e01b8152600490fd5b506125b3606084015161343d565b6123fd565b506125c6606082015161343d565b6123f6565b506125d96040840151612791565b156123ef565b9351604080513381526001600160a01b039092166020830152810194909452507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f3945091925082915050606081015b0390a1565b9551604080513381526001600160a01b039092166020830152810196909652507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f39493508392505060608201905061262e565b604051631cd2f1c760e21b8152600490fd5b506001600160a01b036126b2606085015160a43590611fda565b5151166001600160a01b036126ce604088015160443590611fda565b5151161415612290565b604051630a98f1f360e21b8152600490fd5b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00600281541461271a5760029055565b604051633ee5aeb560e01b8152600490fd5b604051612757816127496020820194602086526040830190612042565b03601f1981018352826119d3565b51902090565b909115612768575050565b6040516305dbdfd960e41b81526001600160a01b03918216600482015291166024820152604490fd5b6127b0905f60e01d906001600160e01b038160e01d9116601b0b6147fe565b1290565b906127b0916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b61487f565b9291926127e782613ac3565b936127f18161343d565b61286f5784816001600160e01b036128109360e01d9116601b0b6148fe565b9290809315612846575b5082908161282a575b5050509190565b61283e926001600160a01b03309216612fa5565b5f8181612823565b9092505f19811461285b57600101915f61281a565b634e487b7160e01b5f52601160045260245ffd5b604051632eaefac360e21b8152600490fd5b9392919361288e8361343d565b61292c57846128aa576128a2939450613069565b50505f905f90565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f5281526128e7835f20549485613555565b956128f18761343d565b612914575f97885260018252838820908852815282872091875252909320829055565b835163c5e12af560e01b815260048101889052602490fd5b60405163793a8f5560e01b815260048101849052602490fd5b919060408382031261018257825167ffffffffffffffff908181116101825784019082601f8301121561018257815160209261298082611ab7565b9161298e60405193846119d3565b808352848084019160051b830101918683116101825785809101915b838310612a1d5750505050948281015191821161018257019180601f840112156101825782516129d981611ab7565b936129e760405195866119d3565b818552838086019260051b820101928311610182578301905b828210612a0e575050505090565b81518152908301908301612a00565b82518152918101918691016129aa565b90808251908181526020809101926020808460051b8301019501935f915b848310612a5b5750505050505090565b9091929394958480612a79600193601f198682030187528a516120c1565b9801930193019194939290612a4b565b91906020928381526001600160a01b0382511684820152838201516040820152612ac3604083015160e060608401526101008301906118df565b9060608301516080820152612aea608084015192601f1993848483030160a0850152612a2d565b9260a081015193838382030160c08401528680865192838152019501905f5b818110612b2d57505050611a5694955060c060e091015192828503019101526120c1565b825187529588019591880191600101612b09565b90604082019082526020606081936040838201528551809452019301915f5b828110612b6e575050505090565b835185529381019392810192600101612b60565b916040805191612b9183611903565b60048084526020612ba38186016121f8565b5f5b8751811015612bd85780612bbb6001928a611fda565b51612bc68289611fda565b52612bd18188611fda565b5001612ba5565b5092955092939093335f52308352855f2091865190612bf68261194f565b612bfe611ec6565b8252606085819301528751612c12816119b7565b5f8152885191612c21836119b7565b5f83525f3681375f5b8151811015612d8f57612c3d8183611fda565b5190888c8b84519189818401518d8d8251612c65575b50505050505050506001915001612c2a565b5f612cd497948197948c9794612c928c956001600160a01b039d8e81818d51169c0151169b015190613ba2565b94865199612c9f8b61199b565b8a528901528488015286015260808501528a60a08501528b60c08501525180958194829363d04dfe2360e01b84528301612a89565b03915afa938415612d85578b915f95612d5f575b508451612cfd575b50908b8e89838d8d612c53565b51015116803b1561018257612d2c925f918c8f84905180978195829463012c676d60e21b845233908401612b41565b03925af1918215612d5557600192612d46575b8981612cf0565b612d4f90611987565b5f612d3f565b8c513d5f823e3d90fd5b612d7c9195503d805f833e612d7481836119d3565b810190612945565b9050935f612ce8565b8e513d5f823e3d90fd5b5050505050505050509050565b8215612dd1576001600160a01b038091165f52600160205260405f2091165f5260205260405f20905f5260205260405f205490565b909150612ddd82613dd4565b6001600160a01b03809316906040918251946370a0823160e01b86528416938460048701526020928387602481865afa968715612ef3575f97612efd575b5083612e34612e2d83612e649a614ab3565b509061423e565b508651636eb1769f60e11b81526001600160a01b0390941660048501523060248501529297889081906044820190565b0381865afa968715612ef3575f97612ec2575b50612e2d612e8891611a5698614ab3565b50612e938183613460565b15612eba5750935b5f5260018252825f20905f528152815f20905f8052525f205490613555565b905093612e9b565b96508387813d8311612eec575b612ed981836119d3565b8101031261018257955195612e2d612e77565b503d612ecf565b85513d5f823e3d90fd5b96508387813d8311612f25575b612f1481836119d3565b810103126101825795519583612e1b565b503d612f0a565b6040519263a9059cbb60e01b5f526001600160a01b0380931660045260245260205f60448180855af160015f5114811615612f86575b8360405215612f7057505050565b635274afe760e01b835216600482015260249150fd5b6001811516612f9c57813b15153d151616612f62565b833d5f823e3d90fd5b9092604051936323b872dd60e01b5f526001600160a01b0393848092166004521660245260445260205f60648180855af160015f5114811615612ff5575b836040525f60605215612f7057505050565b6001811516612f9c57813b15153d151616612fe3565b939291936130188361343d565b61292c578461302c576128a29394506127db565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f5281526128e7835f2054948561352b565b9092919261307681613ac3565b936130808161343d565b6130c05784816001600160e01b0361309f9360e01d9116601b0b6148fe565b508092816130ae575050509190565b6001600160a01b0361283e9316612f2c565b604051632d1671a360e11b8152600490fd5b916130fd9060606130f2936001600160a01b039485916040880151611fda565b515116940151611fda565b5151161461268657565b949193613346919360c0915f6132cd6040928351946131258661199b565b61312d611ee5565b86526020958487820152848682015260609781868a809401528260808201528660a0820152015261327d85519161316383611903565b600483526131728884016121f8565b8d61317c8161272c565b9c896001600160a01b039e8f94859182865116908d5194600386528501528c840152168c820152608081018a526131b286611f8d565b526131bc85611f8d565b5088516131c881611933565b6002815289368c8301376131db86611f9a565b526131e585611f9a565b5060ff8a6132488b8501936132328761320b81613203858a51611fda565b515116613dd4565b9751168861321a848951611fda565b51511685613229858a51611fda565b51015191612d9c565b9661323e828751611fda565b5151169451611fda565b51015192169093929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b61328682611faa565b5261329081611faa565b506132b48a8d8d60ff8a6132488d8501936132328761320b81613203858a51611fda565b6132bd82611fba565b526132c781611fba565b50613ba2565b95878a511697848b0191825191868184511693015116928a855230875285808620915101518651916132fe836119b7565b86835287519561330d8761199b565b86528886015286850152848885015289608085015260a084015260c08301528351808098819463d04dfe2360e01b835260048301612a89565b03915afa968715613433575f945f98613411575b508451600281106133fa5750818386015195015161338061337a88611fca565b51611fba565b5161338b8183613460565b156133f25750925b6133b58685919060405192600284526020840152604083015260608201604052565b6133be88611faa565b526133c887611faa565b508251996133d58b61199b565b8a52890152870152850152608084015260a083015260c082015290565b905092613393565b602490835190630fbb8e5560e21b82526004820152fd5b9097506134299194503d805f833e612d7481836119d3565b939093965f61335a565b50513d5f823e3d90fd5b61345c905f60e01d906001600160e01b038160e01d9116601b0b6147fe565b1390565b9061345c916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b61487f565b6134ae6001600160e01b0392838316601b0b9260e01d938160e01d9116601b0b8484613ff5565b90637ffffff582136134fe575b906134c59161423e565b92909215806134f6575b6134d857505090565b6044925060405191638eba4d0760e01b835260048301526024820152fd5b5082156134cf565b6135088282614ede565b156134bb57604483856040519163d556b11160e01b835260048301526024820152fd5b611a5691610c18916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614444565b611a5691610c18916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614608565b6135d991608081018261359b6135958351611fca565b51611fca565b526135d26135cc6001600160a01b038094515116936135c36135bd8551611fca565b51611f8d565b51169251611fca565b51611faa565b519161300b565b5050565b906080810191806135f16135958551611fba565b526001600160a01b0380925151169161360d6135bd8551611fba565b511661361c6135cc8551611fba565b5190816136b75761362c8361343d565b61292c579183917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a959361262e955f5260209060018252613682604094855f20835f528452855f20855f528452855f2054613555565b945f5260018252835f20905f528152825f20915f52525f20555b51604051918291338352604060208401526040830190612a2d565b916136e8917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a959361262e95612881565b505061369c565b60c0810151908151915f92613863575b506137a46020918281510151926001600160a01b039081818187511696015116928660a082019485518252308452604097888320898686510151015160808601518b519161374c836119b7565b8683528c519361375b856119b7565b8785528d519661376a8861199b565b8752898701528c86015260016060860152608085015260a084015260c08301528851808099819463d04dfe2360e01b835260048301612a89565b03915afa94851561385957879561383b575b5084516137c7575b50505050505050565b81905101510151169051813b15613837579184918493836137fc965180978195829463012c676d60e21b845260048401612b41565b03925af190811561382e5750613817575b80808080806137be565b6138218291611987565b61382b578061380d565b80fd5b513d84823e3d90fd5b8480fd5b6138509195503d8089833e612d7481836119d3565b9050935f6137b6565b86513d89823e3d90fd5b6001600160a01b03602080845101510151169060a083015190823b15610182576138a6925f928360405180968195829463012c676d60e21b845260048401612b41565b03925af1801561022c57156136ff576138c0919250611987565b5f905f6136ff565b608081016138d96135cc8251611fba565b519182156138e657505050565b6139006135bd6001600160a01b0380935151169351611fba565b5116815f5260209160018352604092835f20835f528152835f20855f528152835f2054936001600160e01b03851661393b575b505050505050565b61395f955f9284845260018152828420868552815282842091845252812055613069565b5f808080613933565b8115613972570490565b634e487b7160e01b5f52601260045260245ffd5b60408151106139ce576020810151908051603f19810190811161285b5760051c82116139ba5760016020920160051b010190565b50506040516139c8816119b7565b5f815290565b506040516139c8816119b7565b8051156139eb57602001515f1a90565b505f90565b905f8091602081519101845af48080613a6e575b15613a245750506040513d81523d5f602083013e60203d82010160405290565b15613a4b57604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b3d15613a5c576040513d5f823e3d90fd5b60405163d6bda27560e01b8152600490fd5b503d151580613a045750813b1515613a04565b60041115613a8b57565b634e487b7160e01b5f52602160045260245ffd5b602090939291936001600160a01b036040820195168152613abf83613a81565b0152565b613acb614fcc565b6040805163b7bad1b160e01b81526001600160a01b0383166004820152909182826024815f73200e12d10bb0c5e4a17e7018f0f1161919bb93895af1928315613b99575f925f94613b64575b50613b2183613a81565b600183141580613b52575b613b365750505090565b5163ee07877f60e01b8152918291610725919060048401613a9f565b50613b5c83613a81565b821515613b2c565b90809450613b889293503d8511613b92575b613b8081836119d3565b8101906148d4565b919091925f613b17565b503d613b76565b513d5f823e3d90fd5b90805191613baf83611ab7565b91613bca604094613bc2865195866119d3565b808552611ab7565b601f199460209186013686840137835183519095908015613dc9576001613c209101965b6001978891010197613c17613c028a611ab7565b99613c0f86519b8c6119d3565b808b52611ab7565b01848901612214565b85805f9684516002815233878201523086820152606081018652613c438b611f8d565b52613c4d8a611f8d565b505f925b613d85575b5050508351613c69575b50505050505090565b85809598979692980181613c7d8289611fda565b52613c888188611fda565b505f925b613c9b575b5085969750613c60565b8451831015613d80576001600160a01b03613d1281613cba8689611fda565b51511686613cc8878a611fda565b51015187815160051b9101207f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f52601c52603c5f208c613d09888b611fda565b51015191614a2a565b15613d6857868098999a928192613d29878a611fda565b515116613d368787611fda565b52019385613d448289611fda565b510151613d51868c611fda565b52613d5c858b611fda565b50019290989796613c8c565b8951630a57f30960e31b815260048101859052602490fd5b613c91565b9091968151881015613dc0578280910197613da08184611fda565b51613dab8a8d611fda565b52613db6898c611fda565b5001919081613c51565b96829150613c56565b50613c205f96613bee565b613ddc614fcc565b60408051630782d7e160e01b81526001600160a01b03831660048201529091828260248173200e12d10bb0c5e4a17e7018f0f1161919bb93895afa928315613b99575f925f94613b645750613b2183613a81565b9091939284158215175f14613e4a5750505090505f905f90565b82810192600160fd1b8082019083011760fe1c613f81575b5050613e6d81614ba3565b93613e7781614ba3565b94613e828682614bc3565b90918215613f72575f9083986f0785ee10d5da46d900f436a000000000808611613f64575b50670de0b6b3a7640000808b11613f55575b50633b9aca00808b11613f46575b50612710808b11613f38575b5098805b613f27575081906118db989982600a0a9109960195817fcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccd0a93838211900382610100031b9203901c170291614bd6565b60019290920191600a900480613ed7565b60049a04998a930192613ed3565b600991939a049901915f613ec7565b601291939a049901915f613eb9565b85049950602592505f613ea7565b509290506118db949550614bd6565b5f821215613fd557808413613fc7575b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb2841315613e62579092506118db939491614ae1565b9092506118db939491614b48565b80841215613f91579092506118db939491614ae1565b6134c5828261423e565b9290918061401b576044848460405191637a97930f60e01b835260048301526024820152fd5b90919280155f1461403057505050505f905f90565b6140499361403d91614c90565b92919490938492614c90565b909391928461405788614ba3565b9161406186614ba3565b947f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000094604c91868810614208575b030191600160ff1b98838a018112155f146141d5575050035b5f955f8212806141cc575b6141ae575b5f81128061419c575b61417e5786820103966001600160ff1b0388149081614174575b508061416b575b80614162575b6141445750906140f89291614e3c565b915f811361410b575b506118db93614bd6565b9091604c82136141395761412291600a0a90613968565b90811561412f575f614101565b505050505f905f90565b50505050505f905f90565b876044916040519163d556b11160e01b835260048301526024820152fd5b505f85126140e8565b508284146140e2565b905088145f6140db565b604489836040519163d556b11160e01b835260048301526024820152fd5b50806001600160ff1b030182136140c1565b95508087018613156141c65786818703015b956140b8565b5f6141c0565b505f81136140b3565b89985090920390506001600160ff1b03819003870182136141f957018601946140a8565b5050505050505050505f905f90565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009650604b925061408f565b8115613972570590565b8082601b82810b8314614433577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e100000000000000000084056143df575b8380820b036143ce57507b199999999999999999999999999999999999999999999999999999987b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc8401111561437f575b838060030b03614303575b8084136142e75750506001600160e01b036001925b60e01b91161791565b8303600a0a8015613972576001600160e01b03910715926142de565b92915f8413156143535750906143198383614ede565b61433557637ffffffe1901600a0a810290637fffffff926142c9565b506044916040519163d556b11160e01b835260048301526024820152fd5b637fffffff1992830390604382136141395761437291600a0a90614234565b91821561412f57926142c9565b5f198401808060030b1461439357506142be565b90506001600160e01b039293507b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff915060e01b9260ff1d181617905f90565b600190940193600a90930592614271565b937f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000840515614420576305f5e100600894058094819201955b915050614271565b620186a060059405809481920195614418565b50826142be57505050505f90600190565b919291600160ff1b840161445c576118db9350614ef7565b906118db935f0391614608565b919291600160ff1b91908015806145f657509061448591614c90565b9490929091905f8685858582821380156145ed575b6145d0575b505050508682841860ff1c94860391039081604c0381116145b55701600a0a80820591908461459b575b505081019182821860ff1c111561459357826001600160ff1b031461457557905f600192135f1461454657600a9004915b01925b8115811761450a57509190565b80614523575b50801561451b579190565b505f91508190565b91926145399203600160ff1b01600a0a90614234565b600160ff1b91905f614510565b600a60037fe66666666666666666666666666666666666666666666666666666666666666792010401916144fa565b604490836040519163d556b11160e01b835260048301526024820152fd5b5090926144fd565b81076145a8575b806144c9565b60ff1d600117015f6145a2565b5050509193506145c3579190565b60018160ff1d1790039190565b5f9a50909750909550600160ff1b9450925090508680808061449f565b50835f1261449a565b156146015750509190565b9350919050565b93929193841581158181176147595750509061462391614c90565b919490829561463482958294614c90565b8096929491969387868482138015614750575b614737575b5050505050508682841860ff1c94860391039081604c0381116145b55701600a0a80820591908461471d575b505081019182821860ff1c111561471557826001600160ff1b031461457557905f600192135f146146e657600a9004915b01925b811581176146b957509190565b806146c95750801561451b579190565b600160ff1b936146e09291038401600a0a90614234565b5f614510565b600a60037fe66666666666666666666666666666666666666666666666666666666666666792010401916146a9565b5090926146ac565b810761472a575b80614678565b60ff1d600117015f614724565b929b5098509196509450925090505f808080808061464c565b50858412614647565b939593909291901561476f57505061451b579190565b945092915050565b60088151106139eb576008015167ffffffffffffffff1667ff0a89c674ee78741490565b91604083019260406147d5610c18606087519401938451906001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b613e30565b945193016147e48151866127b4565b6147ec575050565b909350611a5691925051925183613487565b92915f9060018184145f87128715171717614878575f9280821361486a575b03604c81135f82121761485e57600a0a908461483c8382029384614234565b146148515750501561484d575f9190565b5f90565b9093509015611a56579190565b50501561484d575f9190565b5f956001945092509061481d565b5050505f90565b93929190918083145f83125f871218831587151717176148ce575f928082136148c15703604c81135f82121761485e57600a0a908461483c8382029384614234565b919460019350919061481d565b50919050565b919082604091031261018257815160048110156101825760209092015160ff811681036101825790565b91925f831215614926576044838360405191634a7d166b60e01b835260048301526024820152fd5b91928361493857505090505f90600190565b60ff8116820191808312614a00575f831215614970575050604c19811261451b575f03600a0a916149698382613968565b9283021490565b909293915f81135f146149f657604d81136149cb57600a0a92831561397257835f190483116149a25750500290600190565b60405163c849483b60e01b815260048101849052602481019290925260ff166044820152606490fd5b5060405163c849483b60e01b81526004810192909252602482015260ff919091166044820152606490fd5b5050905090600190565b60405163c849483b60e01b815260048101869052602481019190915260ff82166044820152606490fd5b9091813b614a6557614a3c9192615035565b50614a4681613a81565b159182614a5257505090565b6001600160a01b03918216911614919050565b6020918160645f935160405192630b135d3f60e11b9788855260048501526040602485015286820190604485015e8281018201859052601f01601f191601915afa905f5114601f3d11161690565b9060ff165f03916001600160ff1b0382115f14614ad957600a6001818404940192061590565b909190600190565b909392915f614af1918184613e30565b9490945f8483019182019412159081614b3e575b8115614b34575b50614b1657505090565b604492506040519163d556b11160e01b835260048301526024820152fd5b905083125f614b0c565b8281129150614b05565b614b5d93600160fe1b90810193920190613e30565b9081815f821215614b94575050604b1982126128a257614b82915f03600a0a90614234565b9081614b8c575f90565b600160ff1b90565b93600160ff1b90910192509050565b5f811215611a5657600160ff1b90808203614bbc575090565b90505f0390565b905f198183099102908180821091030391565b92939291905f8184181215614c6b576001600160ff1b039283831115614c5557600160ff1b93838503614c0b57505050509190565b90919293508514614c25575050600a600191045f03920190565b604051630ed8062160e21b8152600481019190915260248101919091526044810182905260648101849052608490fd5b5090915050600160ff1b811461285b575f039190565b90916001600160ff1b0380841115612823578514614c25575050600a60019104920190565b9190918015614e3257827f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000080830515614d40575b507f19999999999999999999999999999999999999999999999999999999999999997f0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc830110614d31575b8313614d1b5791905f90565b919060018060ff1b926001600160ff1b03030190565b9290600a02905f190192614d0f565b6f4b3b4ca85a86c47a098a22400000000080840515614e20575b507728c87cb5c89a2571ebfdcb54864ada834a00000000000000830515614e09575b7b097edd871cfda3a5697758bf0e3cbb5ac5741c640000000000000000830515614df5575b7e3899162693736ac531a5a58f1fbb4b746504382ca7e4000000000000000000830515614de557820515614dd6575b5f614cc4565b9290600a02905f190192614dd0565b9391606402916001190193614da1565b93916402540be40002916009190193614da1565b9391678ac7230489e8000002916012190193614d7c565b6025198301955092909202915f614d5a565b505f915081908190565b90915f198383099280830292838086109503948086039584871015614eba5714614eb2579082910960018219018216809204600280826003021880830282030280830282030280830282030280830282030280830282030280920290030293600183805f03040190848311900302920304170290565b505091500490565b60648386866040519263362ced0960e11b8452600484015260248301526044820152fd5b611a5691905f811215614ef2575f0361506f565b61506f565b909291600160ff1b91828101614f895750808414614f7f57808413918215614f77578185035b604c811115614f665750505f915b15614f5757507f8000000000000000000000000000000000000000000000000000000000000001019190565b92506001600160ff1b03039190565b600a0a908115613972570491614f2b565b848203614f1d565b505090505f905f90565b93614f9692945f03614469565b80939180928114614faa575b50505f039190565b915092506001600160ff1b03831461457557600a600191059201915f80614fa2565b73200e12d10bb0c5e4a17e7018f0f1161919bb9389803b15801561500a575b614ff25750565b602490604051906373e6d7b360e01b82526004820152fd5b507f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d41813f1415614feb565b81519190604183036150655761505e9250602082015190606060408401519301515f1a906150fe565b9192909190565b50505f9160029190565b90637ffffff58113156150f857637ffffffe19810190604382136150f1575f8212156150c557637fffffff91505f0301600a0a7b8000000000000000000000000000000000000000000000000000000202111590565b50600a0a8015613972577b80000000000000000000000000000000000000000000000000000001041090565b5050151590565b50505f90565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411615175579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa1561022c575f516001600160a01b0381161561516b57905f905f90565b505f906001905f90565b5050505f916003919056"; + hex"6080806040523460395760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055615204908161003e8239f35b5f80fdfe6080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a7146117b4575080632cb77e9f1461178857806341d1514f146117515780635343c1b7146116b65780635cffe9de1461155a5780635d003c44146113d6578063613255ab14611353578063687cf02a1461103c578063ac9650d814610eee578063b0460f07146105f3578063b845b83e1461059b578063ca9109ba1461044c578063d9d98ce41461039b578063ddebc96f146103475763df6db3c2146100c1575f80fd5b34610321576003196040368201126103215767ffffffffffffffff9060043582811161032157806004019160a0823603918201126103215760243584811161032157610111903690600401611c76565b909361011b61289f565b5f946001600160a01b0394856101308461257a565b163303610325576101496101443685611aa8565b6128e1565b805f525f60205260405f20966001885414610190575b60208960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556040519015158152f35b9091929394959697505f600198556040519633885282602089015260606040890152816101bc87611833565b166060890152602484013590606219018112156103215783019060a06080890152806101ea60048401611833565b166101008901526101fd60248301611833565b16610120880152604481013560221982360301811215610321570190602460048301359201988211610321578136038913610321577f09d18501db0080ca2d6cd7c17fa7255daff4b2d503ea93b76ff68b6752ea8e6387806103069560846102c561030e9a60209f610284906103149f9a60606101406102ef9d015261016088019161232b565b6102b66102ab610297604488018561268a565b605f198a8603810160a08c015294916126bf565b92606487019061268a565b918784030160c08801526126bf565b91013560e08301520390a13390919060405192600284526020840152604083015260608201604052565b906040519160018352602083015260408201604052565b92369161234b565b906135db565b5f8080808080808061015f565b5f80fd5b6024866103318561257a565b6040516335252be360e01b815291166004820152fd5b3461032157600319602036820112610321576004359067ffffffffffffffff8211610321576080908236030112610321576103866060916004016125ce565b90604051921515835260208301526040820152f35b34610321576040366003190112610321576001600160a01b036103bc611807565b166040516370a0823160e01b8152306004820152602081602481855afa908115610441575f9161040f575b50156103f75760206040515f8152f35b60249060405190633c5bf76960e21b82526004820152fd5b90506020813d602011610439575b8161042a60209383611917565b810103126103215751826103e7565b3d915061041d565b6040513d5f823e3d90fd5b346103215761045a36611ca7565b9280949261046661289f565b6104718285336134d7565b61047a81612e4c565b15610567578061048e6104dd928633613a1d565b9790957f7f9dfa19cf1cc2f806f2f860fbc9c056b601fb1afc0e9b843dfe5c63616268e660806040513381526001600160a01b038416998a60208301528560408301526060820152a133613133565b9390918561050c575b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b61055b9661030e956103069460ff93604051956005875260208701526040860152606085015260808401521660a082015260c08101604052906040519160018352602083015260408201604052565b808080808080806104e6565b506040516306dde9c360e41b81523360048201526001600160a01b03841660248201526044810191909152606490fd5b0390fd5b346103215760203660031901126103215760043567ffffffffffffffff81116103215761030e6105d26104e6923690600401611c76565b91906105dc61289f565b604051926105e9846118fb565b5f8452369161234b565b34610321576003196020368201126103215767ffffffffffffffff600435116103215760c090600435360301126103215761062c61289f565b5f8080610641600480356084810191016124b3565b905015610edc57602460043501359261065984612e4c565b15610eca5760608060405161066d816118af565b610675612508565b81525f60208201525f6040820152015261068d612508565b506106ed6106e86106c76106bd6106b76106b16084600435016004356004016124b3565b9061253a565b80612555565b6040810190612445565b60206106e06106b16084600435016004356004016124b3565b01359161256a565b61257a565b936001600160a01b0361073c6106e86107236107196106b76106b16084600435016004356004016124b3565b6060810190612445565b60406106e06106b16084600435016004356004016124b3565b816040519761074a89611877565b168752166020860152604085015261076c6084600435016004356004016124b3565b9490506001604051955f87520160051b85016040525f905f5b6107996084600435016004356004016124b3565b9050811080610eb7575b15610d04576107bc6084600435016004356004016124b3565b821015610cf0578160051b810135607e198236030181121561032157608081830136031261032157604051916107f1836118af565b8181013567ffffffffffffffff81116103215761081390369084840101611aa8565b835280820160208181013590850152604080820135908501526060013567ffffffffffffffff81116103215761084c9236920101611c5b565b606082015280516001600160a01b0361086e6040830151602085015190611d64565b5151166001600160a01b0385511614801590610cbc575b610caa5761089d60208301516040840151908361391a565b6108a6816128e1565b91825f525f60205260405f2054155f1461090a575051604080513381526001600160a01b039092166020830152810191909152600191907fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f390606090a15b01610785565b919061093b602084979597015160408501519060608601519060405192610930846118fb565b5f8452339186612b0e565b925f9361095360608201516044600435013590612e6f565b156109ba57505051604080513381526001600160a01b03909216602083015281019190915260019291907fe3151dc8cb7a54ffc4baabd28c1f241c94d510b5e5b502491ac3cad6c16316d590606090a15b81156109b2575b5092610904565b9050886109ab565b6109c76040820151612e4c565b158015610c97575b15610a2457505051604080513381526001600160a01b03909216602083015281019190915260019291907f500b713857325f9e6dcb52ae832eca9109d107ed1aae9cb4928b4c1e13f051aa90606090a16109a4565b9250925050600196959691610a3d60646004350161258e565b15610c045796610aad97610abd60408401516040880151610a5e8183612eb9565b15610bfc5750925b610ab7848592610aa0610a9a60608a01516001600160e01b03601b918660e01d92828816810b928260e01d9216900b613f6a565b90613edf565b9d8e9260408d0151612ee0565b60408c01526139f3565b996139f3565b98610ac88484612f0a565b610ad28482612f68565b60405192338452608060208501526060610af88451608080880152610100870190611dbf565b93602081015160a0870152604081015160c0870152015192607f198582030160e0860152835180825260208201906020808260051b8501019601925f5b828110610b9457505050505092806001979695937fbae4dbf76931c547f765e9def16d693d86daaa596f491de979008831789185ae93610b8f96604084015260608301520390a180858c5101808d5260051b8c015261321f565b6109a4565b9091929396602080610bef600193601f198782030189528b51906001600160a01b03825116815283820151848201526060610bde604084015160806040850152608084019061259b565b920151906060818403910152611cf3565b9901950193929101610b35565b905092610a66565b610aad90610abd6060840151610ab7610c42610a9a60408801516001600160e01b0394601b90868360e01d9316820b91878260e01d9216900b613f6a565b60408a0151610c518183612eb9565b15610c8f5750915b829c8d916060890151908116155f14610c80575060408801515b96879460408d0151612ee0565b610c8a908561394f565b610c73565b905091610c59565b50610ca56060820151612e96565b6109cf565b60405163936bb5ad60e01b8152600490fd5b506001600160a01b03610cd86060830151604085015190611d64565b5151166001600160a01b036020860151161415610885565b634e487b7160e01b5f52603260045260245ffd5b50919390610d1660646004350161258e565b15610eb157835b6004356004013590610d2f8282612eb9565b610e935750508490610d4f856001600160a01b0360208701511633613569565b505060a46004350190610d6782600435600401612412565b905015159081610e8b575b50610dea575b506001600160a01b03610d8e9293511633613a1d565b50505b8351811015610db65780610db0610daa60019387611d64565b51613093565b01610d91565b5060409160017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005582519182526020820152f35b90506001600160a01b03602084015116610e146001600160a01b0385511692600435600401612412565b929091333b1561032157610e5c5f93604051958694859463691f9ed760e01b8652600486015260248501528960448501528a606485015260a0608485015260a484019161232b565b038183335af190811561044157859115610d78579050610e7c91506118cb565b5f836001600160a01b03610d78565b905088610d72565b604492506040519163573b6f4160e01b835260048301526024820152fd5b84610d1d565b50610ec56040830151612e4c565b6107a3565b60405163315f9e2360e21b8152600490fd5b604051639c95219f60e01b8152600490fd5b34610321576020806003193601126103215760043567ffffffffffffffff811161032157610f20903690600401611c76565b919060405192610f2f846118fb565b5f8452828401610f3e826119fb565b94610f4c6040519687611917565b828652610f58836119fb565b93610f6a86880195601f190186612497565b5f5b848110610fce57604080518881528951818a018190525f92600582901b83018101918a918c9085015b828710610fa25785850386f35b909192938280610fbe600193603f198a82030186528851611cf3565b9601920196019592919092610f95565b8061101d88611017610fea60019560059d9c9d1b870187612412565b929089846040519586938585013782018381015f81528b519283915e015f83820152038084520182611917565b30613889565b611027828a611d64565b526110328189611d64565b5001969596610f6c565b34610321576003196040368201126103215760043567ffffffffffffffff8082116103215760c0826004019383360301126103215760243590811161032157611089903690600401611c76565b9061109261289f565b6110c36110be6110b96110b26110a888806123fd565b6040810190612412565b3691611939565b61380b565b613874565b8015611341576001101561132f57602483016110df8186612445565b90501561131d5760448401946110f58682612445565b90501561130b5761115b6111239661114f61111a61111385806123fd565b9585612445565b99909285612445565b9190926111406040519761113689611847565b338952369061199d565b9a60209b8c8901523691611a13565b60408601523691611a13565b606083015260648501356080830152611173826128e1565b91825f525f875260405f209586541596876111b7575b888860017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055604051908152f35b6001905560a46001600160a01b03917f87491344dfbcf91f6cbbc610cbbeedc85313d37a02df0c93527f7ea5f8db717f83855116604051908152878c820152606060408201528061120b6060820188611dbf565b0390a1019161121a8385612412565b905061125f575b5050505061125392916103066102ef61030e933390919060405192600284526020840152604083015260608201604052565b82808080808080611189565b61126c6110b28486612412565b61127581613f46565b156112e85750937fd46c2c56b35c8210e9e712ec3f02242d5fc90187c0ac8ed80cc33626846ec369896112539897956112db6112be610306976102ef9761030e9b511693612412565b86604051958695865285015260606040850152606084019161232b565b0390a19383959650611221565b89610597604051928392630c89984b60e31b845260048401526024830190611cf3565b60405163540e5f0b60e01b8152600490fd5b604051636c44ef8f60e01b8152600490fd5b604051633c8270bd60e21b8152600490fd5b604051632cff108b60e21b8152600490fd5b3461032157602080600319360112610321576024816001600160a01b03611378611807565b16604051928380926370a0823160e01b82523060048301525afa908115610441575f916113a9575b50604051908152f35b90508181813d83116113cf575b6113c08183611917565b810103126103215751826113a0565b503d6113b6565b34610321576113e436611ca7565b92916113f194919461289f565b6113fc8383336134d7565b61140581612e4c565b15611529578160ff9161141d856114e096953361270f565b6114278183612eb9565b15611523575080935b61143c8582853361350b565b917f8045c25080b0868951141ed0a91720bcad09a8364a2b3109ee1fd49c1f0bc8b860c061146b898833613569565b97906001600160a01b0360405192338452169a8b6020840152856040840152886060840152608083015260a0820152a16040519660068852602088015260408701526060860152608085015260a08401521660c082015260e08101604052906040519160018352602083015260408201604052565b908061150c5760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b61151b9261030e91369161234b565b8080806104e6565b93611430565b50604051623a3a4d60e21b81523360048201526001600160a01b039190911660248201526044810191909152606490fd5b34610321576080366003190112610321576004356001600160a01b03908181168091036103215761158961181d565b6044359167ffffffffffffffff916064358381116103215736602382011215610321578060040135938411610321573660248583010111610321576116169560209216936115d88685876133f8565b60405196879283926323e30c8b60e01b84523360048501528760248501528860448501525f606485015260a06084850152602460a48501920161232b565b03815f855af1938415610441575f94611682575b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd984036116695761165e93503091613471565b602060405160018152f35b604051630b6c58a960e31b815260048101859052602490fd5b9093506020813d6020116116ae575b8161169e60209383611917565b810103126103215751928461162a565b3d9150611691565b34610321576101403660031901126103215767ffffffffffffffff600435818111610321576116e9903690600401611aa8565b60243582811161032157611701903690600401611aa8565b60c0366043190112610321576101043583811161032157611726903690600401611c5b565b9061012435938411610321576117436104e6943690600401611c5b565b9261174c61289f565b611e70565b3461032157606036600319011261032157602061178061176f611807565b61177761181d565b6044359161270f565b604051908152f35b34610321576020366003190112610321576004355f525f6020526020600160405f205414604051908152f35b34610321576020366003190112610321576004359063ffffffff60e01b82168092036103215760209163e414309160e01b81149081156117f6575b5015158152f35b6301ffc9a760e01b149050836117ef565b600435906001600160a01b038216820361032157565b602435906001600160a01b038216820361032157565b35906001600160a01b038216820361032157565b60a0810190811067ffffffffffffffff82111761186357604052565b634e487b7160e01b5f52604160045260245ffd5b6060810190811067ffffffffffffffff82111761186357604052565b6040810190811067ffffffffffffffff82111761186357604052565b6080810190811067ffffffffffffffff82111761186357604052565b67ffffffffffffffff811161186357604052565b60e0810190811067ffffffffffffffff82111761186357604052565b6020810190811067ffffffffffffffff82111761186357604052565b90601f8019910116810190811067ffffffffffffffff82111761186357604052565b92919267ffffffffffffffff82116118635760405191611963601f8201601f191660200184611917565b829481845281830111610321578281602093845f960137010152565b9080601f830112156103215781602061199a93359101611939565b90565b919060608382031261032157604051906119b682611877565b81936119c181611833565b83526119cf60208201611833565b602084015260408101359167ffffffffffffffff8311610321576040926119f6920161197f565b910152565b67ffffffffffffffff81116118635760051b60200190565b929192611a1f826119fb565b604092611a2f6040519283611917565b819581835260208093019160061b84019381851161032157915b848310611a5857505050505050565b8583830312610321578386918251611a6f81611893565b611a7886611833565b81528286013583820152815201920191611a49565b9080601f830112156103215781602061199a93359101611a13565b91909160a0818403126103215760405190611ac282611847565b8193611acd82611833565b835267ffffffffffffffff9160208101358381116103215782611af191830161199d565b602085015260408101358381116103215782611b0e918301611a8d565b6040850152606081013592831161032157611b2f6080939284938301611a8d565b60608501520135910152565b90929192611b48816119fb565b91604094611b596040519485611917565b839583855260208095019160059460051b8401948186116103215784935b868510611b88575050505050505050565b67ffffffffffffffff90853582811161032157870190608082860312610321578551611bb3816118af565b611bbc83611833565b81528a8301358b8201528683013584811161032157830186601f8201121561032157803590611bea826119fb565b91611bf78a519384611917565b8083528d80840191891b83010191898311610321578e809101915b838310611c4b57505050508782015260608084013594851161032157611c3c878d9687960161197f565b90820152815201940193611b77565b82358152918101918f9101611c12565b9080601f830112156103215781602061199a93359101611b3b565b9181601f840112156103215782359167ffffffffffffffff8311610321576020808501948460051b01011161032157565b906080600319830112610321576004356001600160a01b0381168103610321579160243591604435916064359067ffffffffffffffff821161032157611cef91600401611c76565b9091565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b805115610cf05760200190565b805160011015610cf05760400190565b805160021015610cf05760600190565b805160031015610cf05760800190565b805160041015610cf05760a00190565b8051821015610cf05760209160051b010190565b9081518082526020808093019301915f5b828110611d97575050505090565b835180516001600160a01b031686528201518583015260409094019392810192600101611d89565b90608080611e35611e23611e1160406001600160a01b0380895116885260208901519060a060208a01528082511660a08a015260208201511660c08901520151606060e0880152610100870190611cf3565b60408701518682036040880152611d78565b60608601518582036060870152611d78565b93015191015290565b90611e48826119fb565b611e556040519182611917565b8281528092611e66601f19916119fb565b0190602036910137565b92916001600160a01b038451166001600160a01b0383511614612319576001600160a01b03611ea6606086015160643590611d64565b515116906040830151916001600160a01b03611ec56084358095611d64565b515116148015906122d9575b610caa576040850151906001600160a01b03611ef06044358094611d64565b5151166001600160a01b03611f0b60643560608a0151611d64565b515116146122c757611f1c866128e1565b805f525f60205260405f2054156122745750611f37846128e1565b805f525f60205260405f205415612220575061201a9291611ff4917f6fa7f4c28634b0a9d6831401c45ae468195fb63aed07308935c35374ff5d9e3960405180611f9f611f9161012033845280602085015283018d611dbf565b82810360408401528a611dbf565b85606083015260643560808301528760a083015260a43560c083015260c43560e083015260e4356101008301520390a16001600160a01b0386511660405192611fe7846118fb565b5f8452606435908a612b0e565b936001600160a01b038651166040519261200d846118fb565b5f845260a4359086612b0e565b916120286040820151612e4c565b15801561220c575b80156121f9575b80156121e6575b6121d4576040519161204f836118af565b5f83525f60208401525f60408401525f606084015261206e8483613e57565b845260408401526120946120828386613e57565b60208601528060608601528451612ee0565b946120a86020850151604086015190612ee0565b936120b287612e96565b80156121c5575b6121b35761217a6121ac957fd9fa84dd790c969daa5c33d8050dc06b4a9b59d5b42e2be5f5e8ae20447f618d9461215c6121b19a60a0966120fb8a8851612f0a565b6121098c6020890151612f0a565b6121178a6040890151612f68565b6121258c6060890151612f68565b61212e8a613093565b6121378c613093565b6001600160a01b0361215360c435926060606435910151611d64565b51511633613133565b50506001600160a01b0361215360e43592606060a435910151611d64565b5050606060405191338352805160208401526020810151604084015260408101518284015201516080820152a161321f565b61321f565b565b604051630d86822160e01b8152600490fd5b506121cf85612e96565b6120b9565b6040516321badf1f60e01b8152600490fd5b506121f46060840151612e96565b61203e565b506122076060820151612e96565b612037565b5061221a6040840151612e4c565b15612030565b9351604080513381526001600160a01b039092166020830152810194909452507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f3945091925082915050606081015b0390a1565b9551604080513381526001600160a01b039092166020830152810196909652507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f39493508392505060608201905061226f565b604051631cd2f1c760e21b8152600490fd5b506001600160a01b036122f3606085015160a43590611d64565b5151166001600160a01b0361230f604088015160443590611d64565b5151161415611ed1565b604051630a98f1f360e21b8152600490fd5b908060209392818452848401375f828201840152601f01601f1916010190565b90929192612358816119fb565b916040916123696040519485611917565b839581855260208095019160051b8301938185116103215783925b8584106123945750505050505050565b67ffffffffffffffff9084358281116103215786019083828603126103215783516123be81611893565b823584811161032157866123d391850161199d565b815289830135938411610321576123ee868b95869501611c5b565b83820152815201930192612384565b903590605e1981360301821215610321570190565b903590601e1981360301821215610321570180359067ffffffffffffffff82116103215760200191813603831361032157565b903590601e1981360301821215610321570180359067ffffffffffffffff821161032157602001918160061b3603831361032157565b5f5b60808110612489575050565b60608282015260200161247d565b5f5b8281106124a557505050565b606082820152602001612499565b903590601e1981360301821215610321570180359067ffffffffffffffff821161032157602001918160051b3603831361032157565b604051906124f682611877565b60606040835f81525f60208201520152565b6040519061251582611847565b5f6080838281526125246124e9565b6020820152606060408201526060808201520152565b9015610cf057803590607e1981360301821215610321570190565b903590609e1981360301821215610321570190565b9190811015610cf05760061b0190565b356001600160a01b03811681036103215790565b3580151581036103215790565b9081518082526020808093019301915f5b8281106125ba575050505090565b8351855293810193928101926001016125ac565b6125e56101446125de8380612555565b3690611aa8565b5f525f602052600160405f20540361268157806126058161267193612555565b6126696126246126296020850135938460408701359384923690611aa8565b61391a565b6126416126368580612555565b9460608101906124b3565b929061266160405196612653886118fb565b5f88525f3681373690611aa8565b933691611b3b565b923392612b0e565b6040810151606090910151600192565b505f905f905f90565b9035601e198236030181121561032157016020813591019167ffffffffffffffff8211610321578160061b3603831361032157565b9190808252602080920192915f905b8282106126dc575050505090565b909192936001906001600160a01b036126f487611833565b168152858301358382015260409081019501939201906126ce565b8215612744576001600160a01b038091165f52600160205260405f2091165f5260205260405f20905f5260205260405f205490565b90915061275082613ae8565b6001600160a01b03809316906040918251946370a0823160e01b86528416938460048701526020928387602481865afa968715612866575f97612870575b50836127a76127a0836127d79a6148ac565b509061436e565b508651636eb1769f60e11b81526001600160a01b0390941660048501523060248501529297889081906044820190565b0381865afa968715612866575f97612835575b506127a06127fb9161199a986148ac565b506128068183612eb9565b1561282d5750935b5f5260018252825f20905f528152815f20905f8052525f2054906139f3565b90509361280e565b96508387813d831161285f575b61284c8183611917565b81010312610321579551956127a06127ea565b503d612842565b85513d5f823e3d90fd5b96508387813d8311612898575b6128878183611917565b81010312610321579551958361278e565b503d61287d565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0060028154146128cf5760029055565b604051633ee5aeb560e01b8152600490fd5b60405161290c816128fe6020820194602086526040830190611dbf565b03601f198101835282611917565b51902090565b919060408382031261032157825167ffffffffffffffff908181116103215784019082601f8301121561032157815160209261294d826119fb565b9161295b6040519384611917565b808352848084019160051b830101918683116103215785809101915b8383106129ea5750505050948281015191821161032157019180601f840112156103215782516129a6816119fb565b936129b46040519586611917565b818552838086019260051b820101928311610321578301905b8282106129db575050505090565b815181529083019083016129cd565b8251815291810191869101612977565b90808251908181526020809101926020808460051b8301019501935f915b848310612a285750505050505090565b9091929394958480612a46600193601f198682030187528a5161259b565b9801930193019194939290612a18565b91906020928381526001600160a01b0382511684820152838201516040820152612a90604083015160e06060840152610100830190611cf3565b9060608301516080820152612ab7608084015192601f1993848483030160a08501526129fa565b9260a081015193838382030160c08401528680865192838152019501905f5b818110612afa5750505061199a94955060c060e0910151928285030191015261259b565b825187529588019591880191600101612ad6565b949193612d4d919360c0915f612cd4604092835194612b2c866118df565b612b34612508565b86526020958487820152848682015260609781868a809401528260808201528660a08201520152612c84855191612b6a83611847565b60048352612b7988840161247b565b8d612b83816128e1565b9c896001600160a01b039e8f94859182865116908d5194600386528501528c840152168c820152608081018a52612bb986611d17565b52612bc385611d17565b508851612bcf81611877565b6002815289368c830137612be286611d24565b52612bec85611d24565b5060ff8a612c4f8b850193612c3987612c1281612c0a858a51611d64565b515116613ae8565b97511688612c21848951611d64565b51511685612c30858a51611d64565b5101519161270f565b96612c45828751611d64565b5151169451611d64565b51015192169093929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b612c8d82611d34565b52612c9781611d34565b50612cbb8a8d8d60ff8a612c4f8d850193612c3987612c1281612c0a858a51611d64565b612cc482611d44565b52612cce81611d44565b50613bc6565b95878a511697848b0191825191868184511693015116928a85523087528580862091510151865191612d05836118fb565b868352875195612d14876118df565b86528886015286850152848885015289608085015260a084015260c08301528351808098819463d04dfe2360e01b835260048301612a56565b03915afa968715612e42575f945f98612e18575b50845160028110612e0157508183860151950151612d87612d8188611d54565b51611d44565b51612d928183612eb9565b15612df95750925b612dbc8685919060405192600284526020840152604083015260608201604052565b612dc588611d34565b52612dcf87611d34565b50825199612ddc8b6118df565b8a52890152870152850152608084015260a083015260c082015290565b905092612d9a565b602490835190630fbb8e5560e21b82526004820152fd5b909750612e389194503d805f833e612e308183611917565b810190612912565b939093965f612d61565b50513d5f823e3d90fd5b612e6b905f60e01d906001600160e01b038160e01d9116601b0b614963565b1290565b90612e6b916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6149e4565b612eb5905f60e01d906001600160e01b038160e01d9116601b0b614963565b1390565b90612eb5916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6149e4565b61199a91610a9a916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b613eba565b612f64916080810182612f26612f208351611d54565b51611d54565b52612f5d612f576001600160a01b03809451511693612f4e612f488551611d54565b51611d17565b51169251611d54565b51611d34565b519161350b565b5050565b90608081019180612f7c612f208551611d44565b526001600160a01b03809251511691612f98612f488551611d44565b5116612fa7612f578551611d44565b51908161305b57612fb783612e96565b613042579183917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a959361226f955f526020906001825261300d604094855f20835f528452855f20855f528452855f20546139f3565b945f5260018252835f20905f528152825f20915f52525f20555b516040519182913383526040602084015260408301906129fa565b60405163793a8f5560e01b815260048101849052602490fd5b9161308c917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a959361226f95613133565b5050613027565b608081016130a4612f578251611d44565b519182156130b157505050565b6130cb612f486001600160a01b0380935151169351611d44565b5116815f5260209160018352604092835f20835f528152835f20855f528152835f2054936001600160e01b038516613106575b505050505050565b61312a955f9284845260018152828420868552815282842091845252812055613569565b5f8080806130fe565b9392919361314083612e96565b613042578461315c57613154939450613569565b50505f905f90565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f528152613199835f205494856139f3565b956131a387612e96565b6131c6575f97885260018252838820908852815282872091875252909320829055565b835163c5e12af560e01b815260048101889052602490fd5b90604082019082526020606081936040838201528551809452019301915f5b82811061320b575050505090565b8351855293810193928101926001016131fd565b60c0810151908151915f92613393575b506132d46020918281510151926001600160a01b039081818187511696015116928660a082019485518252308452604097888320898686510151015160808601518b519161327c836118fb565b8683528c519361328b856118fb565b8785528d519661329a886118df565b8752898701528c86015260016060860152608085015260a084015260c08301528851808099819463d04dfe2360e01b835260048301612a56565b03915afa94851561338957879561336b575b5084516132f7575b50505050505050565b81905101510151169051813b156133675791849184938361332c965180978195829463012c676d60e21b8452600484016131de565b03925af190811561335e5750613347575b80808080806132ee565b61335182916118cb565b61335b578061333d565b80fd5b513d84823e3d90fd5b8480fd5b6133809195503d8089833e612e308183611917565b9050935f6132e6565b86513d89823e3d90fd5b6001600160a01b03602080845101510151169060a083015190823b15610321576133d6925f928360405180968195829463012c676d60e21b8452600484016131de565b03925af18015610441571561322f576133f09192506118cb565b5f905f61322f565b6040519263a9059cbb60e01b5f526001600160a01b0380931660045260245260205f60448180855af160015f5114811615613452575b836040521561343c57505050565b635274afe760e01b835216600482015260249150fd5b600181151661346857813b15153d15161661342e565b833d5f823e3d90fd5b9092604051936323b872dd60e01b5f526001600160a01b0393848092166004521660245260445260205f60648180855af160015f51148116156134c1575b836040525f6060521561343c57505050565b600181151661346857813b15153d1516166134af565b9091156134e2575050565b6040516305dbdfd960e41b81526001600160a01b03918216600482015291166024820152604490fd5b9392919361351883612e96565b613042578461352c57613154939450613a1d565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f528152613199835f20549485612ee0565b9092919261357681613ee9565b9361358081612e96565b6135c95784816001600160e01b0361359f9360e01d9116601b0b614b0e565b508092816135af575b5050509190565b6001600160a01b036135c193166133f8565b5f81816135a8565b604051632d1671a360e11b8152600490fd5b9160408051916135ea83611847565b600480845260206135fc81860161247b565b5f5b875181101561363157806136146001928a611d64565b5161361f8289611d64565b5261362a8188611d64565b50016135fe565b5092955092939093335f52308352855f209186519061364f82611893565b6136576124e9565b825260608581930152875161366b816118fb565b5f815288519161367a836118fb565b5f83525f3681375f5b81518110156137e0576136968183611d64565b5190888c8b84519189818401518d8d82516136be575b50505050505050506001915001613683565b5f61372d97948197948c97946136eb8c956001600160a01b039d8e81818d51169c0151169b015190613bc6565b948651996136f88b6118df565b8a528901528488015286015260808501528a60a08501528b60c08501525180958194829363d04dfe2360e01b84528301612a56565b03915afa9384156137d6578b915f956137b8575b508451613756575b50908b8e89838d8d6136ac565b51015116803b1561032157613785925f918c8f84905180978195829463012c676d60e21b8452339084016131de565b03925af19182156137ae5760019261379f575b8981613749565b6137a8906118cb565b5f613798565b8c513d5f823e3d90fd5b6137cd9195503d805f833e612e308183611917565b9050935f613741565b8e513d5f823e3d90fd5b5050505050505050509050565b81156137f7570490565b634e487b7160e01b5f52601260045260245ffd5b6040815110613867576020810151908051603f1981019081116138535760051c821161383f5760016020920160051b010190565b505060405161384d816118fb565b5f815290565b634e487b7160e01b5f52601160045260245ffd5b5060405161384d816118fb565b80511561388457602001515f1a90565b505f90565b905f8091602081519101845af48080613907575b156138bd5750506040513d81523d5f602083013e60203d82010160405290565b156138e457604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b3d156138f5576040513d5f823e3d90fd5b60405163d6bda27560e01b8152600490fd5b503d15158061389d5750813b151561389d565b9161394590606061393a936001600160a01b039485916040880151611d64565b515116940151611d64565b515116146122c757565b6139766001600160e01b0392838316601b0b9260e01d938160e01d9116601b0b8484614125565b90637ffffff582136139c6575b9061398d9161436e565b92909215806139be575b6139a057505090565b6044925060405191638eba4d0760e01b835260048301526024820152fd5b508215613997565b6139d08282615037565b1561398357604483856040519163d556b11160e01b835260048301526024820152fd5b61199a91610a9a916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614713565b929192613a2982613ee9565b93613a3381612e96565b613a945784816001600160e01b03613a529360e01d9116601b0b614b0e565b9290809315613a7f575b50829081613a6b575050509190565b6135c1926001600160a01b03309216613471565b9092505f19811461385357600101915f613a5c565b604051632eaefac360e21b8152600490fd5b60041115613ab057565b634e487b7160e01b5f52602160045260245ffd5b602090939291936001600160a01b036040820195168152613ae483613aa6565b0152565b613af0615050565b60408051630782d7e160e01b81526001600160a01b03831660048201529091828260248173200e12d10bb0c5e4a17e7018f0f1161919bb93895afa928315613bbd575f925f94613b88575b50613b4583613aa6565b600183141580613b76575b613b5a5750505090565b5163ee07877f60e01b8152918291610597919060048401613ac4565b50613b8083613aa6565b821515613b50565b90809450613bac9293503d8511613bb6575b613ba48183611917565b810190614882565b919091925f613b3b565b503d613b9a565b513d5f823e3d90fd5b613bd08251611e3e565b613bda8351611e3e565b9282519281518015155f14613e4f57600201935b60019401840190613bfe826119fb565b95613c19604093613c118551998a611917565b8089526119fb565b613c2b602091601f1901828a01612497565b5f9584519389896002926002885233868901523089890152606097606081018a52613c5584611d17565b52613c5f83611d17565b505f825b613e0f575b505050508651613c7f575b50505050505050505090565b90919293600288613ca28c86613c9b8e809c9d9e018093611d64565b528d611d64565b500185613caf828d611d64565b52613cba818c611d64565b505f965b613cc9575b50613c73565b8851871015613e0a576001600160a01b03613d75898b85613d6c8c60428c88613cf28488611d64565b515116968582613d02868a611d64565b51015192613d10868a611d64565b51838d82511691015182815160051b910120908451927f6ec4dff745ec96dbde88c5d41f8aa5ac13aa1664afb47b8406b44fa945a650c88452830152838201522090519161190160f01b83528d83015260228201522093611d64565b510151916148da565b15613df25787613de18b8e8c8f9e9d9c9b9a999897968f613dce918d613dc4898f8f613db083889f613da7828f611d64565b51511692611d64565b52613dbb828b611d64565b51015192611d64565b52019c8d94611d64565b510151613ddb8383611d64565b52611d64565b500196979895909192939495613cbe565b8851630a57f30960e31b815260048101899052602490fd5b613cc3565b9091929a8251821015613e475790613e3b84809301809d613e308487611d64565b51613ddb8383611d64565b50019082918d93613c63565b9a9291613c68565b505f93613bee565b9160408301926040613e91610a9a606087519401938451906001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b613f6a565b94519301613ea0815186612e6f565b613ea8575050565b90935061199a9192505192518361394f565b919291600160ff1b8401613ed257611cef9350614a39565b90611cef935f0391614713565b61398d828261436e565b613ef1615050565b6040805163b7bad1b160e01b81526001600160a01b0383166004820152909182826024815f73200e12d10bb0c5e4a17e7018f0f1161919bb93895af1928315613bbd575f925f94613b885750613b4583613aa6565b6008815110613884576008015167ffffffffffffffff1667ff0a89c674ee78741490565b9091939284158215175f14613f845750505090505f905f90565b82810192600160fd1b8082019083011760fe1c6140bb575b5050613fa781614cfc565b93613fb181614cfc565b94613fbc8682614d1c565b909182156140ac575f9083986f0785ee10d5da46d900f436a00000000080861161409e575b50670de0b6b3a7640000808b1161408f575b50633b9aca00808b11614080575b50612710808b11614072575b5098805b61406157508190611cef989982600a0a9109960195817fcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccd0a93838211900382610100031b9203901c170291614d2f565b60019290920191600a900480614011565b60049a04998a93019261400d565b600991939a049901915f614001565b601291939a049901915f613ff3565b85049950602592505f613fe1565b50929050611cef949550614d2f565b5f82121561410f57808413614101575b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb2841315613f9c57909250611cef939491614c3a565b909250611cef939491614ca1565b808412156140cb57909250611cef939491614c3a565b9290918061414b576044848460405191637a97930f60e01b835260048301526024820152fd5b90919280155f1461416057505050505f905f90565b6141799361416d91614de9565b92919490938492614de9565b909391928461418788614cfc565b9161419186614cfc565b947f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000094604c91868810614338575b030191600160ff1b98838a018112155f14614305575050035b5f955f8212806142fc575b6142de575b5f8112806142cc575b6142ae5786820103966001600160ff1b03881490816142a4575b508061429b575b80614292575b6142745750906142289291614f95565b915f811361423b575b50611cef93614d2f565b9091604c82136142695761425291600a0a906137ed565b90811561425f575f614231565b505050505f905f90565b50505050505f905f90565b876044916040519163d556b11160e01b835260048301526024820152fd5b505f8512614218565b50828414614212565b905088145f61420b565b604489836040519163d556b11160e01b835260048301526024820152fd5b50806001600160ff1b030182136141f1565b95508087018613156142f65786818703015b956141e8565b5f6142f0565b505f81136141e3565b89985090920390506001600160ff1b038190038701821361432957018601946141d8565b5050505050505050505f905f90565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009650604b92506141bf565b81156137f7570590565b8082601b82810b8314614563577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e1000000000000000000840561450f575b8380820b036144fe57507b199999999999999999999999999999999999999999999999999999987b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc840111156144af575b838060030b03614433575b8084136144175750506001600160e01b036001925b60e01b91161791565b8303600a0a80156137f7576001600160e01b039107159261440e565b92915f8413156144835750906144498383615037565b61446557637ffffffe1901600a0a810290637fffffff926143f9565b506044916040519163d556b11160e01b835260048301526024820152fd5b637fffffff199283039060438213614269576144a291600a0a90614364565b91821561425f57926143f9565b5f198401808060030b146144c357506143ee565b90506001600160e01b039293507b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff915060e01b9260ff1d181617905f90565b600190940193600a909305926143a1565b937f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000840515614550576305f5e100600894058094819201955b9150506143a1565b620186a060059405809481920195614548565b50826143ee57505050505f90600190565b919291600160ff1b919080158061470157509061459091614de9565b9490929091905f8685858582821380156146f8575b6146db575b505050508682841860ff1c94860391039081604c0381116146c05701600a0a8082059190846146a6575b505081019182821860ff1c111561469e57826001600160ff1b031461468057905f600192135f1461465157600a9004915b01925b8115811761461557509190565b8061462e575b508015614626579190565b505f91508190565b91926146449203600160ff1b01600a0a90614364565b600160ff1b91905f61461b565b600a60037fe6666666666666666666666666666666666666666666666666666666666666679201040191614605565b604490836040519163d556b11160e01b835260048301526024820152fd5b509092614608565b81076146b3575b806145d4565b60ff1d600117015f6146ad565b5050509193506146ce579190565b60018160ff1d1790039190565b5f9a50909750909550600160ff1b945092509050868080806145aa565b50835f126145a5565b1561470c5750509190565b9350919050565b93929193841581158181176148645750509061472e91614de9565b919490829561473f82958294614de9565b809692949196938786848213801561485b575b614842575b5050505050508682841860ff1c94860391039081604c0381116146c05701600a0a808205919084614828575b505081019182821860ff1c111561482057826001600160ff1b031461468057905f600192135f146147f157600a9004915b01925b811581176147c457509190565b806147d457508015614626579190565b600160ff1b936147eb9291038401600a0a90614364565b5f61461b565b600a60037fe66666666666666666666666666666666666666666666666666666666666666792010401916147b4565b5090926147b7565b8107614835575b80614783565b60ff1d600117015f61482f565b929b5098509196509450925090505f8080808080614757565b50858412614752565b939593909291901561487a575050614626579190565b945092915050565b919082604091031261032157815160048110156103215760209092015160ff811681036103215790565b9060ff165f03916001600160ff1b0382115f146148d257600a6001818404940192061590565b909190600190565b9091813b614915576148ec91926150b9565b506148f681613aa6565b15918261490257505090565b6001600160a01b03918216911614919050565b6020918160645f935160405192630b135d3f60e11b9788855260048501526040602485015286820190604485015e8281018201859052601f01601f191601915afa905f5114601f3d11161690565b92915f9060018184145f871287151717176149dd575f928082136149cf575b03604c81135f8212176149c357600a0a90846149a18382029384614364565b146149b6575050156149b2575f9190565b5f90565b909350901561199a579190565b5050156149b2575f9190565b5f9560019450925090614982565b5050505f90565b93929190918083145f83125f87121883158715171717614a33575f92808213614a265703604c81135f8212176149c357600a0a90846149a18382029384614364565b9194600193509190614982565b50919050565b909291600160ff1b91828101614acb5750808414614ac157808413918215614ab9578185035b604c811115614aa85750505f915b15614a9957507f8000000000000000000000000000000000000000000000000000000000000001019190565b92506001600160ff1b03039190565b600a0a9081156137f7570491614a6d565b848203614a5f565b505090505f905f90565b93614ad892945f03614574565b80939180928114614aec575b50505f039190565b915092506001600160ff1b03831461468057600a600191059201915f80614ae4565b91925f831215614b36576044838360405191634a7d166b60e01b835260048301526024820152fd5b919283614b4857505090505f90600190565b60ff8116820191808312614c10575f831215614b80575050604c198112614626575f03600a0a91614b7983826137ed565b9283021490565b909293915f81135f14614c0657604d8113614bdb57600a0a9283156137f757835f19048311614bb25750500290600190565b60405163c849483b60e01b815260048101849052602481019290925260ff166044820152606490fd5b5060405163c849483b60e01b81526004810192909252602482015260ff919091166044820152606490fd5b5050905090600190565b60405163c849483b60e01b815260048101869052602481019190915260ff82166044820152606490fd5b909392915f614c4a918184613f6a565b9490945f8483019182019412159081614c97575b8115614c8d575b50614c6f57505090565b604492506040519163d556b11160e01b835260048301526024820152fd5b905083125f614c65565b8281129150614c5e565b614cb693600160fe1b90810193920190613f6a565b9081815f821215614ced575050604b19821261315457614cdb915f03600a0a90614364565b9081614ce5575f90565b600160ff1b90565b93600160ff1b90910192509050565b5f81121561199a57600160ff1b90808203614d15575090565b90505f0390565b905f198183099102908180821091030391565b92939291905f8184181215614dc4576001600160ff1b039283831115614dae57600160ff1b93838503614d6457505050509190565b90919293508514614d7e575050600a600191045f03920190565b604051630ed8062160e21b8152600481019190915260248101919091526044810182905260648101849052608490fd5b5090915050600160ff1b8114613853575f039190565b90916001600160ff1b03808411156135a8578514614d7e575050600a60019104920190565b9190918015614f8b57827f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000080830515614e99575b507f19999999999999999999999999999999999999999999999999999999999999997f0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc830110614e8a575b8313614e745791905f90565b919060018060ff1b926001600160ff1b03030190565b9290600a02905f190192614e68565b6f4b3b4ca85a86c47a098a22400000000080840515614f79575b507728c87cb5c89a2571ebfdcb54864ada834a00000000000000830515614f62575b7b097edd871cfda3a5697758bf0e3cbb5ac5741c640000000000000000830515614f4e575b7e3899162693736ac531a5a58f1fbb4b746504382ca7e4000000000000000000830515614f3e57820515614f2f575b5f614e1d565b9290600a02905f190192614f29565b9391606402916001190193614efa565b93916402540be40002916009190193614efa565b9391678ac7230489e8000002916012190193614ed5565b6025198301955092909202915f614eb3565b505f915081908190565b90915f198383099280830292838086109503948086039584871015615013571461500b579082910960018219018216809204600280826003021880830282030280830282030280830282030280830282030280830282030280920290030293600183805f03040190848311900302920304170290565b505091500490565b60648386866040519263362ced0960e11b8452600484015260248301526044820152fd5b61199a91905f81121561504b575f036150f3565b6150f3565b73200e12d10bb0c5e4a17e7018f0f1161919bb9389803b15801561508e575b6150765750565b602490604051906373e6d7b360e01b82526004820152fd5b507f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d41813f141561506f565b81519190604183036150e9576150e29250602082015190606060408401519301515f1a90615182565b9192909190565b50505f9160029190565b90637ffffff581131561517c57637ffffffe1981019060438213615175575f82121561514957637fffffff91505f0301600a0a7b8000000000000000000000000000000000000000000000000000000202111590565b50600a0a80156137f7577b80000000000000000000000000000000000000000000000000000001041090565b5050151590565b50505f90565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084116151f9579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa15610441575f516001600160a01b038116156151ef57905f905f90565b505f906001905f90565b5050505f916003919056"; /// @dev The runtime bytecode of the contract. bytes constant RUNTIME_CODE = - hex"6080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a7146117cf575080631f69cb75146115725780632cb77e9f146115465780632fbc4ba0146113fc57806341d1514f146113c55780635cffe9de1461126957806360746119146110e5578063613255ab1461106257806369c7285614610771578063709fb8a5146104375780639235084d146103e3578063ac9650d814610295578063d7e442ec14610237578063d9d98ce4146101865763fa501182146100c1575f80fd5b34610182576101403660031901126101825767ffffffffffffffff600435818111610182576100f4903690600401611b64565b6024358281116101825761010c903690600401611b64565b60c0366043190112610182576101043583811161018257610131903690600401611d0a565b90610124359384116101825761014e61015c943690600401611d0a565b926101576126ea565b612230565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b5f80fd5b34610182576040366003190112610182576001600160a01b036101a7611853565b166040516370a0823160e01b8152306004820152602081602481855afa90811561022c575f916101fa575b50156101e25760206040515f8152f35b60249060405190633c5bf76960e21b82526004820152fd5b90506020813d602011610224575b81610215602093836119d3565b810103126101825751826101d2565b3d9150610208565b6040513d5f823e3d90fd5b346101825760203660031901126101825760043567ffffffffffffffff81116101825761028f61026e61015c923690600401611822565b91906102786126ea565b60405192610285846119b7565b5f84523691611dde565b90612b82565b34610182576020806003193601126101825760043567ffffffffffffffff8111610182576102c7903690600401611822565b9190604051926102d6846119b7565b5f84528284016102e582611ab7565b946102f360405196876119d3565b8286526102ff83611ab7565b9361031186880195601f190186612214565b5f5b84811061037557604080518881528951818a018190525f92600582901b83018101918a918c9085015b8287106103495785850386f35b909192938280610365600193603f198a820301865288516118df565b960192019601959291909261033c565b806103c4886103be61039160019560059d9c9d1b8701876120f4565b929089846040519586938585013782018381015f81528b519283915e015f838201520380845201826119d3565b306139f0565b6103ce828a611fda565b526103d98189611fda565b5001969596610313565b3461018257600319602036820112610182576004359067ffffffffffffffff82116101825760809082360301126101825761042260609160040161213c565b90604051921515835260208301526040820152f35b34610182576003196040368201126101825760043567ffffffffffffffff8082116101825760c0826004019383360301126101825760243590811161018257610484903690600401611822565b9061048d6126ea565b6104be6104b96104b46104ad6104a38880612127565b60408101906120f4565b36916119f5565b613986565b6139db565b801561075f576001101561074d57602483016104da8186611f47565b90501561073b5760448401946104f08682611f47565b9050156107295761055661051e9661054a61051561050e8580612127565b9585611f47565b99909285611f47565b91909261053b6040519761053189611903565b3389523690611a59565b9a60209b8c8901523691611acf565b60408601523691611acf565b60608301526064850135608083015261056e8261272c565b91825f525f875260405f209586541596876105b2575b888860017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055604051908152f35b6001905560a46001600160a01b03917f87491344dfbcf91f6cbbc610cbbeedc85313d37a02df0c93527f7ea5f8db717f83855116604051908152878c82015260606040820152806106066060820188612042565b0390a1019161061583856120f4565b9050610679575b5050505061066d929161066561064e61028f933390919060405192600284526020840152604083015260608201604052565b906040519160018352602083015260408201604052565b923691611dde565b82808080808080610584565b6106866104ad84866120f4565b61068f81614777565b156107025750937fd46c2c56b35c8210e9e712ec3f02242d5fc90187c0ac8ed80cc33626846ec3698961066d9897956106f56106d86106659761064e9761028f9b5116936120f4565b866040519586958652850152606060408501526060840191611d39565b0390a1938395965061061c565b89610725604051928392630c89984b60e31b8452600484015260248301906118df565b0390fd5b60405163540e5f0b60e01b8152600490fd5b604051636c44ef8f60e01b8152600490fd5b604051633c8270bd60e21b8152600490fd5b604051632cff108b60e21b8152600490fd5b34610182576003196020368201126101825767ffffffffffffffff600435116101825760c09060043536030112610182576107aa6126ea565b5f80806107bf60048035608481019101611e90565b9050156110505760246004350135926107d784612791565b1561103e576060806040516107eb8161196b565b6107f3611ee5565b81525f60208201525f6040820152015261080b611ee5565b5061086b61086661084561083b61083561082f608460043501600435600401611e90565b90611f17565b80611f32565b6040810190611f47565b602061085e61082f608460043501600435600401611e90565b013591611f7d565b611d25565b936001600160a01b036108ba6108666108a161089761083561082f608460043501600435600401611e90565b6060810190611f47565b604061085e61082f608460043501600435600401611e90565b81604051976108c889611933565b16875216602086015260408501526108ea608460043501600435600401611e90565b9490506001604051955f87520160051b85016040525f905f5b610917608460043501600435600401611e90565b905081108061102b575b15610e785761093a608460043501600435600401611e90565b821015610e64578160051b810135607e1982360301811215610182576080818301360312610182576040519161096f8361196b565b8181013567ffffffffffffffff81116101825761099190369084840101611b64565b835280820160208181013590850152604080820135908501526060013567ffffffffffffffff8111610182576109ca9236920101611d0a565b606082015280516001600160a01b036109ec6040830151602085015190611fda565b5151166001600160a01b0385511614801590610e30575b610e1e57610a1b6020830151604084015190836130d2565b610a248161272c565b91825f525f60205260405f2054155f14610a88575051604080513381526001600160a01b039092166020830152810191909152600191907fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f390606090a15b01610903565b9190610ab9602084979597015160408501519060608601519060405192610aae846119b7565b5f8452339186613107565b925f93610ad1606082015160446004350135906127b4565b15610b3857505051604080513381526001600160a01b03909216602083015281019190915260019291907fe3151dc8cb7a54ffc4baabd28c1f241c94d510b5e5b502491ac3cad6c16316d590606090a15b8115610b30575b5092610a82565b905088610b29565b610b456040820151612791565b158015610e0b575b15610ba257505051604080513381526001600160a01b03909216602083015281019190915260019291907f500b713857325f9e6dcb52ae832eca9109d107ed1aae9cb4928b4c1e13f051aa90606090a1610b22565b9250925050600196959691610bbb606460043501611fee565b15610d785796610c2b97610c3b60408401516040880151610bdc8183613460565b15610d705750925b610c35848592610c1e610c1860608a01516001600160e01b03601b918660e01d92828816810b928260e01d9216900b613e30565b90613feb565b9d8e9260408d015161352b565b60408c0152613555565b99613555565b98610c46848461357f565b610c5084826135dd565b60405192338452608060208501526060610c768451608080880152610100870190612042565b93602081015160a0870152604081015160c0870152015192607f198582030160e0860152835180825260208201906020808260051b8501019601925f5b828110610d1257505050505092806001979695937f194f1feb3b4d7076a2c272e774e792e0c48bb8c7aa1a9a3671c1cd6da9e6b4c193610d0d96604084015260608301520390a180858c5101808d5260051b8c01526136ef565b610b22565b9091929396602080610d63600193601f198782030189528b51906001600160a01b0382511681526040610d528584015160608785015260608401906120c1565b9201519060408184039101526118df565b9901950193929101610cb3565b905092610be4565b610c2b90610c3b6060840151610c35610db6610c1860408801516001600160e01b0394601b90868360e01d9316820b91878260e01d9216900b613e30565b60408a0151610dc58183613460565b15610e035750915b829c8d916060890151908116155f14610df4575060408801515b96879460408d015161352b565b610dfe9085613487565b610de7565b905091610dcd565b50610e19606082015161343d565b610b4d565b60405163936bb5ad60e01b8152600490fd5b506001600160a01b03610e4c6060830151604085015190611fda565b5151166001600160a01b036020860151161415610a03565b634e487b7160e01b5f52603260045260245ffd5b50919390610e8a606460043501611fee565b1561102557835b6004356004013590610ea38282613460565b6110075750508490610ec3856001600160a01b0360208701511633613069565b505060a46004350190610edb826004356004016120f4565b905015159081610fff575b50610f5e575b506001600160a01b03610f0292935116336127db565b50505b8351811015610f2a5780610f24610f1e60019387611fda565b516138c8565b01610f05565b5060409160017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005582519182526020820152f35b90506001600160a01b03602084015116610f886001600160a01b03855116926004356004016120f4565b929091333b1561018257610fd05f93604051958694859463691f9ed760e01b8652600486015260248501528960448501528a606485015260a0608485015260a4840191611d39565b038183335af190811561022c57859115610eec579050610ff09150611987565b5f836001600160a01b03610eec565b905088610ee6565b604492506040519163573b6f4160e01b835260048301526024820152fd5b84610e91565b506110396040830151612791565b610921565b60405163315f9e2360e21b8152600490fd5b604051639c95219f60e01b8152600490fd5b3461018257602080600319360112610182576024816001600160a01b03611087611853565b16604051928380926370a0823160e01b82523060048301525afa90811561022c575f916110b8575b50604051908152f35b90508181813d83116110de575b6110cf81836119d3565b810103126101825751826110af565b503d6110c5565b34610182576110f336611893565b92916111009491946126ea565b61110b83833361275d565b61111481612791565b15611238578160ff9161112c856111ef969533612d9c565b6111368183613460565b15611232575080935b61114b8582853361300b565b917f8045c25080b0868951141ed0a91720bcad09a8364a2b3109ee1fd49c1f0bc8b860c061117a898833613069565b97906001600160a01b0360405192338452169a8b6020840152856040840152886060840152608083015260a0820152a16040519660068852602088015260408701526060860152608085015260a08401521660c082015260e08101604052906040519160018352602083015260408201604052565b908061121b5760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b61122a9261028f913691611dde565b80808061015c565b9361113f565b50604051623a3a4d60e21b81523360048201526001600160a01b039190911660248201526044810191909152606490fd5b34610182576080366003190112610182576004356001600160a01b039081811680910361018257611298611869565b6044359167ffffffffffffffff916064358381116101825736602382011215610182578060040135938411610182573660248583010111610182576113259560209216936112e7868587612f2c565b60405196879283926323e30c8b60e01b84523360048501528760248501528860448501525f606485015260a06084850152602460a485019201611d39565b03815f855af193841561022c575f94611391575b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd984036113785761136d93503091612fa5565b602060405160018152f35b604051630b6c58a960e31b815260048101859052602490fd5b9093506020813d6020116113bd575b816113ad602093836119d3565b8101031261018257519284611339565b3d91506113a0565b346101825760603660031901126101825760206113f46113e3611853565b6113eb611869565b60443591612d9c565b604051908152f35b346101825761140a36611893565b928094926114166126ea565b61142182853361275d565b61142a81612791565b15611516578061143e61148d9286336127db565b9790957f7f9dfa19cf1cc2f806f2f860fbc9c056b601fb1afc0e9b843dfe5c63616268e660806040513381526001600160a01b038416998a60208301528560408301526060820152a133612881565b939091856114bb5760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b61150a9661028f956106659460ff93604051956005875260208701526040860152606085015260808401521660a082015260c08101604052906040519160018352602083015260408201604052565b8080808080808061015c565b506040516306dde9c360e41b81523360048201526001600160a01b03841660248201526044810191909152606490fd5b34610182576020366003190112610182576004355f525f6020526020600160405f205414604051908152f35b34610182576003196040368201126101825767ffffffffffffffff9060043582811161018257806004019160a08236039182011261018257602435848111610182576115c2903690600401611822565b90936115cc6126ea565b5f946001600160a01b0394856115e184611d25565b1633036117ad576115fa6115f53685611b64565b61272c565b805f525f60205260405f20966001885414611641575b60208960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556040519015158152f35b9091929394959697505f6001985560405196338852826020890152606060408901528161166d8761187f565b166060890152602484013590606219018112156101825783019060a060808901528061169b6004840161187f565b166101008901526116ae6024830161187f565b16610120880152604481013560221982360301811215610182570190602460048301359201988211610182578136038913610182577f09d18501db0080ca2d6cd7c17fa7255daff4b2d503ea93b76ff68b6752ea8e63878061066595608461177661028f9a60209f611735906117a09f9a606061014061064e9d0152610160880191611d39565b61176761175c6117486044880185611d59565b605f198a8603810160a08c01529491611d8e565b926064870190611d59565b918784030160c0880152611d8e565b91013560e08301520390a13390919060405192600284526020840152604083015260608201604052565b8280808080808080611610565b6024866117b985611d25565b6040516335252be360e01b815291166004820152fd5b34610182576020366003190112610182576004359063ffffffff60e01b82168092036101825760209163e414309160e01b8114908115611811575b5015158152f35b6301ffc9a760e01b1490508361180a565b9181601f840112156101825782359167ffffffffffffffff8311610182576020808501948460051b01011161018257565b600435906001600160a01b038216820361018257565b602435906001600160a01b038216820361018257565b35906001600160a01b038216820361018257565b906080600319830112610182576004356001600160a01b0381168103610182579160243591604435916064359067ffffffffffffffff8211610182576118db91600401611822565b9091565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b60a0810190811067ffffffffffffffff82111761191f57604052565b634e487b7160e01b5f52604160045260245ffd5b6060810190811067ffffffffffffffff82111761191f57604052565b6040810190811067ffffffffffffffff82111761191f57604052565b6080810190811067ffffffffffffffff82111761191f57604052565b67ffffffffffffffff811161191f57604052565b60e0810190811067ffffffffffffffff82111761191f57604052565b6020810190811067ffffffffffffffff82111761191f57604052565b90601f8019910116810190811067ffffffffffffffff82111761191f57604052565b92919267ffffffffffffffff821161191f5760405191611a1f601f8201601f1916602001846119d3565b829481845281830111610182578281602093845f960137010152565b9080601f8301121561018257816020611a56933591016119f5565b90565b91906060838203126101825760405190611a7282611933565b8193611a7d8161187f565b8352611a8b6020820161187f565b602084015260408101359167ffffffffffffffff831161018257604092611ab29201611a3b565b910152565b67ffffffffffffffff811161191f5760051b60200190565b929192611adb82611ab7565b604092611aeb60405192836119d3565b819581835260208093019160061b84019381851161018257915b848310611b1457505050505050565b8583830312610182578386918251611b2b8161194f565b611b348661187f565b81528286013583820152815201920191611b05565b9080601f8301121561018257816020611a5693359101611acf565b91909160a0818403126101825760405190611b7e82611903565b8193611b898261187f565b835267ffffffffffffffff9160208101358381116101825782611bad918301611a59565b602085015260408101358381116101825782611bca918301611b49565b6040850152606081013592831161018257611beb6080939284938301611b49565b60608501520135910152565b909291611c0384611ab7565b916040611c1360405194856119d3565b839580855260208095019160059160051b8401948086116101825784935b868510611c42575050505050505050565b67ffffffffffffffff90853582811161018257870190606082850312610182578451611c6d81611933565b611c768361187f565b81528a83013584811161018257830185601f8201121561018257803590611c9c82611ab7565b91611ca9895193846119d3565b8083528d808401918b1b83010191888311610182578e809101915b838310611cfa57509150508201528583013593841161018257611ceb858c95869501611a3b565b86820152815201940193611c31565b82358152918101918f9101611cc4565b9080601f8301121561018257816020611a5693359101611bf7565b356001600160a01b03811681036101825790565b908060209392818452848401375f828201840152601f01601f1916010190565b9035601e198236030181121561018257016020813591019167ffffffffffffffff8211610182578160061b3603831361018257565b9190808252602080920192915f905b828210611dab575050505090565b909192936001906001600160a01b03611dc38761187f565b16815285830135838201526040908101950193920190611d9d565b90929192611deb81611ab7565b91604091611dfc60405194856119d3565b839581855260208095019160051b8301938185116101825783925b858410611e275750505050505050565b67ffffffffffffffff908435828111610182578601908382860312610182578351611e518161194f565b82358481116101825786611e66918501611a59565b81528983013593841161018257611e81868b95869501611d0a565b83820152815201930192611e17565b903590601e1981360301821215610182570180359067ffffffffffffffff821161018257602001918160051b3603831361018257565b60405190611ed382611933565b60606040835f81525f60208201520152565b60405190611ef282611903565b5f608083828152611f01611ec6565b6020820152606060408201526060808201520152565b9015610e6457803590607e1981360301821215610182570190565b903590609e1981360301821215610182570190565b903590601e1981360301821215610182570180359067ffffffffffffffff821161018257602001918160061b3603831361018257565b9190811015610e645760061b0190565b805115610e645760200190565b805160011015610e645760400190565b805160021015610e645760600190565b805160031015610e645760800190565b805160041015610e645760a00190565b8051821015610e645760209160051b010190565b3580151581036101825790565b9081518082526020808093019301915f5b82811061201a575050505090565b835180516001600160a01b03168652820151858301526040909401939281019260010161200c565b906080806120b86120a661209460406001600160a01b0380895116885260208901519060a060208a01528082511660a08a015260208201511660c08901520151606060e08801526101008701906118df565b60408701518682036040880152611ffb565b60608601518582036060870152611ffb565b93015191015290565b9081518082526020808093019301915f5b8281106120e0575050505090565b8351855293810193928101926001016120d2565b903590601e1981360301821215610182570180359067ffffffffffffffff82116101825760200191813603831361018257565b903590605e1981360301821215610182570190565b6121536115f561214c8380611f32565b3690611b64565b5f525f602052600160405f2054036121ef5780612173816121df93611f32565b6121d76121926121976020850135938460408701359384923690611b64565b6130d2565b6121af6121a48580611f32565b946060810190611e90565b92906121cf604051966121c1886119b7565b5f88525f3681373690611b64565b933691611bf7565b923392613107565b6040810151606090910151600192565b505f905f905f90565b5f5b60808110612206575050565b6060828201526020016121fa565b5f5b82811061222257505050565b606082820152602001612216565b926001600160a01b038451166001600160a01b03835116146126d8576001600160a01b03612265606086015160643590611fda565b515116906040830151916001600160a01b036122846084358095611fda565b51511614801590612698575b610e1e576040850151906001600160a01b036122af6044358094611fda565b5151166001600160a01b036122ca60643560608a0151611fda565b51511614612686576122db8661272c565b805f525f60205260405f20541561263357506122f68461272c565b805f525f60205260405f2054156125df57506123d992916123b3917f6fa7f4c28634b0a9d6831401c45ae468195fb63aed07308935c35374ff5d9e396040518061235e61235061012033845280602085015283018d612042565b82810360408401528a612042565b85606083015260643560808301528760a083015260a43560c083015260c43560e083015260e4356101008301520390a16001600160a01b03865116604051926123a6846119b7565b5f8452606435908a613107565b936001600160a01b03865116604051926123cc846119b7565b5f845260a4359086613107565b916123e76040820151612791565b1580156125cb575b80156125b8575b80156125a5575b612593576040519161240e8361196b565b5f83525f60208401525f60408401525f606084015261242d848361479b565b84526040840152612453612441838661479b565b6020860152806060860152845161352b565b94612467602085015160408601519061352b565b936124718761343d565b8015612584575b6125725761253961256b957fd9fa84dd790c969daa5c33d8050dc06b4a9b59d5b42e2be5f5e8ae20447f618d9461251b6125709a60a0966124ba8a885161357f565b6124c88c602089015161357f565b6124d68a60408901516135dd565b6124e48c60608901516135dd565b6124ed8a6138c8565b6124f68c6138c8565b6001600160a01b0361251260c435926060606435910151611fda565b51511633612881565b50506001600160a01b0361251260e43592606060a435910151611fda565b5050606060405191338352805160208401526020810151604084015260408101518284015201516080820152a16136ef565b6136ef565b565b604051630d86822160e01b8152600490fd5b5061258e8561343d565b612478565b6040516321badf1f60e01b8152600490fd5b506125b3606084015161343d565b6123fd565b506125c6606082015161343d565b6123f6565b506125d96040840151612791565b156123ef565b9351604080513381526001600160a01b039092166020830152810194909452507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f3945091925082915050606081015b0390a1565b9551604080513381526001600160a01b039092166020830152810196909652507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f39493508392505060608201905061262e565b604051631cd2f1c760e21b8152600490fd5b506001600160a01b036126b2606085015160a43590611fda565b5151166001600160a01b036126ce604088015160443590611fda565b5151161415612290565b604051630a98f1f360e21b8152600490fd5b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00600281541461271a5760029055565b604051633ee5aeb560e01b8152600490fd5b604051612757816127496020820194602086526040830190612042565b03601f1981018352826119d3565b51902090565b909115612768575050565b6040516305dbdfd960e41b81526001600160a01b03918216600482015291166024820152604490fd5b6127b0905f60e01d906001600160e01b038160e01d9116601b0b6147fe565b1290565b906127b0916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b61487f565b9291926127e782613ac3565b936127f18161343d565b61286f5784816001600160e01b036128109360e01d9116601b0b6148fe565b9290809315612846575b5082908161282a575b5050509190565b61283e926001600160a01b03309216612fa5565b5f8181612823565b9092505f19811461285b57600101915f61281a565b634e487b7160e01b5f52601160045260245ffd5b604051632eaefac360e21b8152600490fd5b9392919361288e8361343d565b61292c57846128aa576128a2939450613069565b50505f905f90565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f5281526128e7835f20549485613555565b956128f18761343d565b612914575f97885260018252838820908852815282872091875252909320829055565b835163c5e12af560e01b815260048101889052602490fd5b60405163793a8f5560e01b815260048101849052602490fd5b919060408382031261018257825167ffffffffffffffff908181116101825784019082601f8301121561018257815160209261298082611ab7565b9161298e60405193846119d3565b808352848084019160051b830101918683116101825785809101915b838310612a1d5750505050948281015191821161018257019180601f840112156101825782516129d981611ab7565b936129e760405195866119d3565b818552838086019260051b820101928311610182578301905b828210612a0e575050505090565b81518152908301908301612a00565b82518152918101918691016129aa565b90808251908181526020809101926020808460051b8301019501935f915b848310612a5b5750505050505090565b9091929394958480612a79600193601f198682030187528a516120c1565b9801930193019194939290612a4b565b91906020928381526001600160a01b0382511684820152838201516040820152612ac3604083015160e060608401526101008301906118df565b9060608301516080820152612aea608084015192601f1993848483030160a0850152612a2d565b9260a081015193838382030160c08401528680865192838152019501905f5b818110612b2d57505050611a5694955060c060e091015192828503019101526120c1565b825187529588019591880191600101612b09565b90604082019082526020606081936040838201528551809452019301915f5b828110612b6e575050505090565b835185529381019392810192600101612b60565b916040805191612b9183611903565b60048084526020612ba38186016121f8565b5f5b8751811015612bd85780612bbb6001928a611fda565b51612bc68289611fda565b52612bd18188611fda565b5001612ba5565b5092955092939093335f52308352855f2091865190612bf68261194f565b612bfe611ec6565b8252606085819301528751612c12816119b7565b5f8152885191612c21836119b7565b5f83525f3681375f5b8151811015612d8f57612c3d8183611fda565b5190888c8b84519189818401518d8d8251612c65575b50505050505050506001915001612c2a565b5f612cd497948197948c9794612c928c956001600160a01b039d8e81818d51169c0151169b015190613ba2565b94865199612c9f8b61199b565b8a528901528488015286015260808501528a60a08501528b60c08501525180958194829363d04dfe2360e01b84528301612a89565b03915afa938415612d85578b915f95612d5f575b508451612cfd575b50908b8e89838d8d612c53565b51015116803b1561018257612d2c925f918c8f84905180978195829463012c676d60e21b845233908401612b41565b03925af1918215612d5557600192612d46575b8981612cf0565b612d4f90611987565b5f612d3f565b8c513d5f823e3d90fd5b612d7c9195503d805f833e612d7481836119d3565b810190612945565b9050935f612ce8565b8e513d5f823e3d90fd5b5050505050505050509050565b8215612dd1576001600160a01b038091165f52600160205260405f2091165f5260205260405f20905f5260205260405f205490565b909150612ddd82613dd4565b6001600160a01b03809316906040918251946370a0823160e01b86528416938460048701526020928387602481865afa968715612ef3575f97612efd575b5083612e34612e2d83612e649a614ab3565b509061423e565b508651636eb1769f60e11b81526001600160a01b0390941660048501523060248501529297889081906044820190565b0381865afa968715612ef3575f97612ec2575b50612e2d612e8891611a5698614ab3565b50612e938183613460565b15612eba5750935b5f5260018252825f20905f528152815f20905f8052525f205490613555565b905093612e9b565b96508387813d8311612eec575b612ed981836119d3565b8101031261018257955195612e2d612e77565b503d612ecf565b85513d5f823e3d90fd5b96508387813d8311612f25575b612f1481836119d3565b810103126101825795519583612e1b565b503d612f0a565b6040519263a9059cbb60e01b5f526001600160a01b0380931660045260245260205f60448180855af160015f5114811615612f86575b8360405215612f7057505050565b635274afe760e01b835216600482015260249150fd5b6001811516612f9c57813b15153d151616612f62565b833d5f823e3d90fd5b9092604051936323b872dd60e01b5f526001600160a01b0393848092166004521660245260445260205f60648180855af160015f5114811615612ff5575b836040525f60605215612f7057505050565b6001811516612f9c57813b15153d151616612fe3565b939291936130188361343d565b61292c578461302c576128a29394506127db565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f5281526128e7835f2054948561352b565b9092919261307681613ac3565b936130808161343d565b6130c05784816001600160e01b0361309f9360e01d9116601b0b6148fe565b508092816130ae575050509190565b6001600160a01b0361283e9316612f2c565b604051632d1671a360e11b8152600490fd5b916130fd9060606130f2936001600160a01b039485916040880151611fda565b515116940151611fda565b5151161461268657565b949193613346919360c0915f6132cd6040928351946131258661199b565b61312d611ee5565b86526020958487820152848682015260609781868a809401528260808201528660a0820152015261327d85519161316383611903565b600483526131728884016121f8565b8d61317c8161272c565b9c896001600160a01b039e8f94859182865116908d5194600386528501528c840152168c820152608081018a526131b286611f8d565b526131bc85611f8d565b5088516131c881611933565b6002815289368c8301376131db86611f9a565b526131e585611f9a565b5060ff8a6132488b8501936132328761320b81613203858a51611fda565b515116613dd4565b9751168861321a848951611fda565b51511685613229858a51611fda565b51015191612d9c565b9661323e828751611fda565b5151169451611fda565b51015192169093929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b61328682611faa565b5261329081611faa565b506132b48a8d8d60ff8a6132488d8501936132328761320b81613203858a51611fda565b6132bd82611fba565b526132c781611fba565b50613ba2565b95878a511697848b0191825191868184511693015116928a855230875285808620915101518651916132fe836119b7565b86835287519561330d8761199b565b86528886015286850152848885015289608085015260a084015260c08301528351808098819463d04dfe2360e01b835260048301612a89565b03915afa968715613433575f945f98613411575b508451600281106133fa5750818386015195015161338061337a88611fca565b51611fba565b5161338b8183613460565b156133f25750925b6133b58685919060405192600284526020840152604083015260608201604052565b6133be88611faa565b526133c887611faa565b508251996133d58b61199b565b8a52890152870152850152608084015260a083015260c082015290565b905092613393565b602490835190630fbb8e5560e21b82526004820152fd5b9097506134299194503d805f833e612d7481836119d3565b939093965f61335a565b50513d5f823e3d90fd5b61345c905f60e01d906001600160e01b038160e01d9116601b0b6147fe565b1390565b9061345c916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b61487f565b6134ae6001600160e01b0392838316601b0b9260e01d938160e01d9116601b0b8484613ff5565b90637ffffff582136134fe575b906134c59161423e565b92909215806134f6575b6134d857505090565b6044925060405191638eba4d0760e01b835260048301526024820152fd5b5082156134cf565b6135088282614ede565b156134bb57604483856040519163d556b11160e01b835260048301526024820152fd5b611a5691610c18916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614444565b611a5691610c18916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614608565b6135d991608081018261359b6135958351611fca565b51611fca565b526135d26135cc6001600160a01b038094515116936135c36135bd8551611fca565b51611f8d565b51169251611fca565b51611faa565b519161300b565b5050565b906080810191806135f16135958551611fba565b526001600160a01b0380925151169161360d6135bd8551611fba565b511661361c6135cc8551611fba565b5190816136b75761362c8361343d565b61292c579183917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a959361262e955f5260209060018252613682604094855f20835f528452855f20855f528452855f2054613555565b945f5260018252835f20905f528152825f20915f52525f20555b51604051918291338352604060208401526040830190612a2d565b916136e8917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a959361262e95612881565b505061369c565b60c0810151908151915f92613863575b506137a46020918281510151926001600160a01b039081818187511696015116928660a082019485518252308452604097888320898686510151015160808601518b519161374c836119b7565b8683528c519361375b856119b7565b8785528d519661376a8861199b565b8752898701528c86015260016060860152608085015260a084015260c08301528851808099819463d04dfe2360e01b835260048301612a89565b03915afa94851561385957879561383b575b5084516137c7575b50505050505050565b81905101510151169051813b15613837579184918493836137fc965180978195829463012c676d60e21b845260048401612b41565b03925af190811561382e5750613817575b80808080806137be565b6138218291611987565b61382b578061380d565b80fd5b513d84823e3d90fd5b8480fd5b6138509195503d8089833e612d7481836119d3565b9050935f6137b6565b86513d89823e3d90fd5b6001600160a01b03602080845101510151169060a083015190823b15610182576138a6925f928360405180968195829463012c676d60e21b845260048401612b41565b03925af1801561022c57156136ff576138c0919250611987565b5f905f6136ff565b608081016138d96135cc8251611fba565b519182156138e657505050565b6139006135bd6001600160a01b0380935151169351611fba565b5116815f5260209160018352604092835f20835f528152835f20855f528152835f2054936001600160e01b03851661393b575b505050505050565b61395f955f9284845260018152828420868552815282842091845252812055613069565b5f808080613933565b8115613972570490565b634e487b7160e01b5f52601260045260245ffd5b60408151106139ce576020810151908051603f19810190811161285b5760051c82116139ba5760016020920160051b010190565b50506040516139c8816119b7565b5f815290565b506040516139c8816119b7565b8051156139eb57602001515f1a90565b505f90565b905f8091602081519101845af48080613a6e575b15613a245750506040513d81523d5f602083013e60203d82010160405290565b15613a4b57604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b3d15613a5c576040513d5f823e3d90fd5b60405163d6bda27560e01b8152600490fd5b503d151580613a045750813b1515613a04565b60041115613a8b57565b634e487b7160e01b5f52602160045260245ffd5b602090939291936001600160a01b036040820195168152613abf83613a81565b0152565b613acb614fcc565b6040805163b7bad1b160e01b81526001600160a01b0383166004820152909182826024815f73200e12d10bb0c5e4a17e7018f0f1161919bb93895af1928315613b99575f925f94613b64575b50613b2183613a81565b600183141580613b52575b613b365750505090565b5163ee07877f60e01b8152918291610725919060048401613a9f565b50613b5c83613a81565b821515613b2c565b90809450613b889293503d8511613b92575b613b8081836119d3565b8101906148d4565b919091925f613b17565b503d613b76565b513d5f823e3d90fd5b90805191613baf83611ab7565b91613bca604094613bc2865195866119d3565b808552611ab7565b601f199460209186013686840137835183519095908015613dc9576001613c209101965b6001978891010197613c17613c028a611ab7565b99613c0f86519b8c6119d3565b808b52611ab7565b01848901612214565b85805f9684516002815233878201523086820152606081018652613c438b611f8d565b52613c4d8a611f8d565b505f925b613d85575b5050508351613c69575b50505050505090565b85809598979692980181613c7d8289611fda565b52613c888188611fda565b505f925b613c9b575b5085969750613c60565b8451831015613d80576001600160a01b03613d1281613cba8689611fda565b51511686613cc8878a611fda565b51015187815160051b9101207f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f52601c52603c5f208c613d09888b611fda565b51015191614a2a565b15613d6857868098999a928192613d29878a611fda565b515116613d368787611fda565b52019385613d448289611fda565b510151613d51868c611fda565b52613d5c858b611fda565b50019290989796613c8c565b8951630a57f30960e31b815260048101859052602490fd5b613c91565b9091968151881015613dc0578280910197613da08184611fda565b51613dab8a8d611fda565b52613db6898c611fda565b5001919081613c51565b96829150613c56565b50613c205f96613bee565b613ddc614fcc565b60408051630782d7e160e01b81526001600160a01b03831660048201529091828260248173200e12d10bb0c5e4a17e7018f0f1161919bb93895afa928315613b99575f925f94613b645750613b2183613a81565b9091939284158215175f14613e4a5750505090505f905f90565b82810192600160fd1b8082019083011760fe1c613f81575b5050613e6d81614ba3565b93613e7781614ba3565b94613e828682614bc3565b90918215613f72575f9083986f0785ee10d5da46d900f436a000000000808611613f64575b50670de0b6b3a7640000808b11613f55575b50633b9aca00808b11613f46575b50612710808b11613f38575b5098805b613f27575081906118db989982600a0a9109960195817fcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccd0a93838211900382610100031b9203901c170291614bd6565b60019290920191600a900480613ed7565b60049a04998a930192613ed3565b600991939a049901915f613ec7565b601291939a049901915f613eb9565b85049950602592505f613ea7565b509290506118db949550614bd6565b5f821215613fd557808413613fc7575b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb2841315613e62579092506118db939491614ae1565b9092506118db939491614b48565b80841215613f91579092506118db939491614ae1565b6134c5828261423e565b9290918061401b576044848460405191637a97930f60e01b835260048301526024820152fd5b90919280155f1461403057505050505f905f90565b6140499361403d91614c90565b92919490938492614c90565b909391928461405788614ba3565b9161406186614ba3565b947f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000094604c91868810614208575b030191600160ff1b98838a018112155f146141d5575050035b5f955f8212806141cc575b6141ae575b5f81128061419c575b61417e5786820103966001600160ff1b0388149081614174575b508061416b575b80614162575b6141445750906140f89291614e3c565b915f811361410b575b506118db93614bd6565b9091604c82136141395761412291600a0a90613968565b90811561412f575f614101565b505050505f905f90565b50505050505f905f90565b876044916040519163d556b11160e01b835260048301526024820152fd5b505f85126140e8565b508284146140e2565b905088145f6140db565b604489836040519163d556b11160e01b835260048301526024820152fd5b50806001600160ff1b030182136140c1565b95508087018613156141c65786818703015b956140b8565b5f6141c0565b505f81136140b3565b89985090920390506001600160ff1b03819003870182136141f957018601946140a8565b5050505050505050505f905f90565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009650604b925061408f565b8115613972570590565b8082601b82810b8314614433577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e100000000000000000084056143df575b8380820b036143ce57507b199999999999999999999999999999999999999999999999999999987b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc8401111561437f575b838060030b03614303575b8084136142e75750506001600160e01b036001925b60e01b91161791565b8303600a0a8015613972576001600160e01b03910715926142de565b92915f8413156143535750906143198383614ede565b61433557637ffffffe1901600a0a810290637fffffff926142c9565b506044916040519163d556b11160e01b835260048301526024820152fd5b637fffffff1992830390604382136141395761437291600a0a90614234565b91821561412f57926142c9565b5f198401808060030b1461439357506142be565b90506001600160e01b039293507b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff915060e01b9260ff1d181617905f90565b600190940193600a90930592614271565b937f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000840515614420576305f5e100600894058094819201955b915050614271565b620186a060059405809481920195614418565b50826142be57505050505f90600190565b919291600160ff1b840161445c576118db9350614ef7565b906118db935f0391614608565b919291600160ff1b91908015806145f657509061448591614c90565b9490929091905f8685858582821380156145ed575b6145d0575b505050508682841860ff1c94860391039081604c0381116145b55701600a0a80820591908461459b575b505081019182821860ff1c111561459357826001600160ff1b031461457557905f600192135f1461454657600a9004915b01925b8115811761450a57509190565b80614523575b50801561451b579190565b505f91508190565b91926145399203600160ff1b01600a0a90614234565b600160ff1b91905f614510565b600a60037fe66666666666666666666666666666666666666666666666666666666666666792010401916144fa565b604490836040519163d556b11160e01b835260048301526024820152fd5b5090926144fd565b81076145a8575b806144c9565b60ff1d600117015f6145a2565b5050509193506145c3579190565b60018160ff1d1790039190565b5f9a50909750909550600160ff1b9450925090508680808061449f565b50835f1261449a565b156146015750509190565b9350919050565b93929193841581158181176147595750509061462391614c90565b919490829561463482958294614c90565b8096929491969387868482138015614750575b614737575b5050505050508682841860ff1c94860391039081604c0381116145b55701600a0a80820591908461471d575b505081019182821860ff1c111561471557826001600160ff1b031461457557905f600192135f146146e657600a9004915b01925b811581176146b957509190565b806146c95750801561451b579190565b600160ff1b936146e09291038401600a0a90614234565b5f614510565b600a60037fe66666666666666666666666666666666666666666666666666666666666666792010401916146a9565b5090926146ac565b810761472a575b80614678565b60ff1d600117015f614724565b929b5098509196509450925090505f808080808061464c565b50858412614647565b939593909291901561476f57505061451b579190565b945092915050565b60088151106139eb576008015167ffffffffffffffff1667ff0a89c674ee78741490565b91604083019260406147d5610c18606087519401938451906001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b613e30565b945193016147e48151866127b4565b6147ec575050565b909350611a5691925051925183613487565b92915f9060018184145f87128715171717614878575f9280821361486a575b03604c81135f82121761485e57600a0a908461483c8382029384614234565b146148515750501561484d575f9190565b5f90565b9093509015611a56579190565b50501561484d575f9190565b5f956001945092509061481d565b5050505f90565b93929190918083145f83125f871218831587151717176148ce575f928082136148c15703604c81135f82121761485e57600a0a908461483c8382029384614234565b919460019350919061481d565b50919050565b919082604091031261018257815160048110156101825760209092015160ff811681036101825790565b91925f831215614926576044838360405191634a7d166b60e01b835260048301526024820152fd5b91928361493857505090505f90600190565b60ff8116820191808312614a00575f831215614970575050604c19811261451b575f03600a0a916149698382613968565b9283021490565b909293915f81135f146149f657604d81136149cb57600a0a92831561397257835f190483116149a25750500290600190565b60405163c849483b60e01b815260048101849052602481019290925260ff166044820152606490fd5b5060405163c849483b60e01b81526004810192909252602482015260ff919091166044820152606490fd5b5050905090600190565b60405163c849483b60e01b815260048101869052602481019190915260ff82166044820152606490fd5b9091813b614a6557614a3c9192615035565b50614a4681613a81565b159182614a5257505090565b6001600160a01b03918216911614919050565b6020918160645f935160405192630b135d3f60e11b9788855260048501526040602485015286820190604485015e8281018201859052601f01601f191601915afa905f5114601f3d11161690565b9060ff165f03916001600160ff1b0382115f14614ad957600a6001818404940192061590565b909190600190565b909392915f614af1918184613e30565b9490945f8483019182019412159081614b3e575b8115614b34575b50614b1657505090565b604492506040519163d556b11160e01b835260048301526024820152fd5b905083125f614b0c565b8281129150614b05565b614b5d93600160fe1b90810193920190613e30565b9081815f821215614b94575050604b1982126128a257614b82915f03600a0a90614234565b9081614b8c575f90565b600160ff1b90565b93600160ff1b90910192509050565b5f811215611a5657600160ff1b90808203614bbc575090565b90505f0390565b905f198183099102908180821091030391565b92939291905f8184181215614c6b576001600160ff1b039283831115614c5557600160ff1b93838503614c0b57505050509190565b90919293508514614c25575050600a600191045f03920190565b604051630ed8062160e21b8152600481019190915260248101919091526044810182905260648101849052608490fd5b5090915050600160ff1b811461285b575f039190565b90916001600160ff1b0380841115612823578514614c25575050600a60019104920190565b9190918015614e3257827f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000080830515614d40575b507f19999999999999999999999999999999999999999999999999999999999999997f0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc830110614d31575b8313614d1b5791905f90565b919060018060ff1b926001600160ff1b03030190565b9290600a02905f190192614d0f565b6f4b3b4ca85a86c47a098a22400000000080840515614e20575b507728c87cb5c89a2571ebfdcb54864ada834a00000000000000830515614e09575b7b097edd871cfda3a5697758bf0e3cbb5ac5741c640000000000000000830515614df5575b7e3899162693736ac531a5a58f1fbb4b746504382ca7e4000000000000000000830515614de557820515614dd6575b5f614cc4565b9290600a02905f190192614dd0565b9391606402916001190193614da1565b93916402540be40002916009190193614da1565b9391678ac7230489e8000002916012190193614d7c565b6025198301955092909202915f614d5a565b505f915081908190565b90915f198383099280830292838086109503948086039584871015614eba5714614eb2579082910960018219018216809204600280826003021880830282030280830282030280830282030280830282030280830282030280920290030293600183805f03040190848311900302920304170290565b505091500490565b60648386866040519263362ced0960e11b8452600484015260248301526044820152fd5b611a5691905f811215614ef2575f0361506f565b61506f565b909291600160ff1b91828101614f895750808414614f7f57808413918215614f77578185035b604c811115614f665750505f915b15614f5757507f8000000000000000000000000000000000000000000000000000000000000001019190565b92506001600160ff1b03039190565b600a0a908115613972570491614f2b565b848203614f1d565b505090505f905f90565b93614f9692945f03614469565b80939180928114614faa575b50505f039190565b915092506001600160ff1b03831461457557600a600191059201915f80614fa2565b73200e12d10bb0c5e4a17e7018f0f1161919bb9389803b15801561500a575b614ff25750565b602490604051906373e6d7b360e01b82526004820152fd5b507f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d41813f1415614feb565b81519190604183036150655761505e9250602082015190606060408401519301515f1a906150fe565b9192909190565b50505f9160029190565b90637ffffff58113156150f857637ffffffe19810190604382136150f1575f8212156150c557637fffffff91505f0301600a0a7b8000000000000000000000000000000000000000000000000000000202111590565b50600a0a8015613972577b80000000000000000000000000000000000000000000000000000001041090565b5050151590565b50505f90565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411615175579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa1561022c575f516001600160a01b0381161561516b57905f905f90565b505f906001905f90565b5050505f916003919056"; + hex"6080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a7146117b4575080632cb77e9f1461178857806341d1514f146117515780635343c1b7146116b65780635cffe9de1461155a5780635d003c44146113d6578063613255ab14611353578063687cf02a1461103c578063ac9650d814610eee578063b0460f07146105f3578063b845b83e1461059b578063ca9109ba1461044c578063d9d98ce41461039b578063ddebc96f146103475763df6db3c2146100c1575f80fd5b34610321576003196040368201126103215767ffffffffffffffff9060043582811161032157806004019160a0823603918201126103215760243584811161032157610111903690600401611c76565b909361011b61289f565b5f946001600160a01b0394856101308461257a565b163303610325576101496101443685611aa8565b6128e1565b805f525f60205260405f20966001885414610190575b60208960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556040519015158152f35b9091929394959697505f600198556040519633885282602089015260606040890152816101bc87611833565b166060890152602484013590606219018112156103215783019060a06080890152806101ea60048401611833565b166101008901526101fd60248301611833565b16610120880152604481013560221982360301811215610321570190602460048301359201988211610321578136038913610321577f09d18501db0080ca2d6cd7c17fa7255daff4b2d503ea93b76ff68b6752ea8e6387806103069560846102c561030e9a60209f610284906103149f9a60606101406102ef9d015261016088019161232b565b6102b66102ab610297604488018561268a565b605f198a8603810160a08c015294916126bf565b92606487019061268a565b918784030160c08801526126bf565b91013560e08301520390a13390919060405192600284526020840152604083015260608201604052565b906040519160018352602083015260408201604052565b92369161234b565b906135db565b5f8080808080808061015f565b5f80fd5b6024866103318561257a565b6040516335252be360e01b815291166004820152fd5b3461032157600319602036820112610321576004359067ffffffffffffffff8211610321576080908236030112610321576103866060916004016125ce565b90604051921515835260208301526040820152f35b34610321576040366003190112610321576001600160a01b036103bc611807565b166040516370a0823160e01b8152306004820152602081602481855afa908115610441575f9161040f575b50156103f75760206040515f8152f35b60249060405190633c5bf76960e21b82526004820152fd5b90506020813d602011610439575b8161042a60209383611917565b810103126103215751826103e7565b3d915061041d565b6040513d5f823e3d90fd5b346103215761045a36611ca7565b9280949261046661289f565b6104718285336134d7565b61047a81612e4c565b15610567578061048e6104dd928633613a1d565b9790957f7f9dfa19cf1cc2f806f2f860fbc9c056b601fb1afc0e9b843dfe5c63616268e660806040513381526001600160a01b038416998a60208301528560408301526060820152a133613133565b9390918561050c575b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b61055b9661030e956103069460ff93604051956005875260208701526040860152606085015260808401521660a082015260c08101604052906040519160018352602083015260408201604052565b808080808080806104e6565b506040516306dde9c360e41b81523360048201526001600160a01b03841660248201526044810191909152606490fd5b0390fd5b346103215760203660031901126103215760043567ffffffffffffffff81116103215761030e6105d26104e6923690600401611c76565b91906105dc61289f565b604051926105e9846118fb565b5f8452369161234b565b34610321576003196020368201126103215767ffffffffffffffff600435116103215760c090600435360301126103215761062c61289f565b5f8080610641600480356084810191016124b3565b905015610edc57602460043501359261065984612e4c565b15610eca5760608060405161066d816118af565b610675612508565b81525f60208201525f6040820152015261068d612508565b506106ed6106e86106c76106bd6106b76106b16084600435016004356004016124b3565b9061253a565b80612555565b6040810190612445565b60206106e06106b16084600435016004356004016124b3565b01359161256a565b61257a565b936001600160a01b0361073c6106e86107236107196106b76106b16084600435016004356004016124b3565b6060810190612445565b60406106e06106b16084600435016004356004016124b3565b816040519761074a89611877565b168752166020860152604085015261076c6084600435016004356004016124b3565b9490506001604051955f87520160051b85016040525f905f5b6107996084600435016004356004016124b3565b9050811080610eb7575b15610d04576107bc6084600435016004356004016124b3565b821015610cf0578160051b810135607e198236030181121561032157608081830136031261032157604051916107f1836118af565b8181013567ffffffffffffffff81116103215761081390369084840101611aa8565b835280820160208181013590850152604080820135908501526060013567ffffffffffffffff81116103215761084c9236920101611c5b565b606082015280516001600160a01b0361086e6040830151602085015190611d64565b5151166001600160a01b0385511614801590610cbc575b610caa5761089d60208301516040840151908361391a565b6108a6816128e1565b91825f525f60205260405f2054155f1461090a575051604080513381526001600160a01b039092166020830152810191909152600191907fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f390606090a15b01610785565b919061093b602084979597015160408501519060608601519060405192610930846118fb565b5f8452339186612b0e565b925f9361095360608201516044600435013590612e6f565b156109ba57505051604080513381526001600160a01b03909216602083015281019190915260019291907fe3151dc8cb7a54ffc4baabd28c1f241c94d510b5e5b502491ac3cad6c16316d590606090a15b81156109b2575b5092610904565b9050886109ab565b6109c76040820151612e4c565b158015610c97575b15610a2457505051604080513381526001600160a01b03909216602083015281019190915260019291907f500b713857325f9e6dcb52ae832eca9109d107ed1aae9cb4928b4c1e13f051aa90606090a16109a4565b9250925050600196959691610a3d60646004350161258e565b15610c045796610aad97610abd60408401516040880151610a5e8183612eb9565b15610bfc5750925b610ab7848592610aa0610a9a60608a01516001600160e01b03601b918660e01d92828816810b928260e01d9216900b613f6a565b90613edf565b9d8e9260408d0151612ee0565b60408c01526139f3565b996139f3565b98610ac88484612f0a565b610ad28482612f68565b60405192338452608060208501526060610af88451608080880152610100870190611dbf565b93602081015160a0870152604081015160c0870152015192607f198582030160e0860152835180825260208201906020808260051b8501019601925f5b828110610b9457505050505092806001979695937fbae4dbf76931c547f765e9def16d693d86daaa596f491de979008831789185ae93610b8f96604084015260608301520390a180858c5101808d5260051b8c015261321f565b6109a4565b9091929396602080610bef600193601f198782030189528b51906001600160a01b03825116815283820151848201526060610bde604084015160806040850152608084019061259b565b920151906060818403910152611cf3565b9901950193929101610b35565b905092610a66565b610aad90610abd6060840151610ab7610c42610a9a60408801516001600160e01b0394601b90868360e01d9316820b91878260e01d9216900b613f6a565b60408a0151610c518183612eb9565b15610c8f5750915b829c8d916060890151908116155f14610c80575060408801515b96879460408d0151612ee0565b610c8a908561394f565b610c73565b905091610c59565b50610ca56060820151612e96565b6109cf565b60405163936bb5ad60e01b8152600490fd5b506001600160a01b03610cd86060830151604085015190611d64565b5151166001600160a01b036020860151161415610885565b634e487b7160e01b5f52603260045260245ffd5b50919390610d1660646004350161258e565b15610eb157835b6004356004013590610d2f8282612eb9565b610e935750508490610d4f856001600160a01b0360208701511633613569565b505060a46004350190610d6782600435600401612412565b905015159081610e8b575b50610dea575b506001600160a01b03610d8e9293511633613a1d565b50505b8351811015610db65780610db0610daa60019387611d64565b51613093565b01610d91565b5060409160017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005582519182526020820152f35b90506001600160a01b03602084015116610e146001600160a01b0385511692600435600401612412565b929091333b1561032157610e5c5f93604051958694859463691f9ed760e01b8652600486015260248501528960448501528a606485015260a0608485015260a484019161232b565b038183335af190811561044157859115610d78579050610e7c91506118cb565b5f836001600160a01b03610d78565b905088610d72565b604492506040519163573b6f4160e01b835260048301526024820152fd5b84610d1d565b50610ec56040830151612e4c565b6107a3565b60405163315f9e2360e21b8152600490fd5b604051639c95219f60e01b8152600490fd5b34610321576020806003193601126103215760043567ffffffffffffffff811161032157610f20903690600401611c76565b919060405192610f2f846118fb565b5f8452828401610f3e826119fb565b94610f4c6040519687611917565b828652610f58836119fb565b93610f6a86880195601f190186612497565b5f5b848110610fce57604080518881528951818a018190525f92600582901b83018101918a918c9085015b828710610fa25785850386f35b909192938280610fbe600193603f198a82030186528851611cf3565b9601920196019592919092610f95565b8061101d88611017610fea60019560059d9c9d1b870187612412565b929089846040519586938585013782018381015f81528b519283915e015f83820152038084520182611917565b30613889565b611027828a611d64565b526110328189611d64565b5001969596610f6c565b34610321576003196040368201126103215760043567ffffffffffffffff8082116103215760c0826004019383360301126103215760243590811161032157611089903690600401611c76565b9061109261289f565b6110c36110be6110b96110b26110a888806123fd565b6040810190612412565b3691611939565b61380b565b613874565b8015611341576001101561132f57602483016110df8186612445565b90501561131d5760448401946110f58682612445565b90501561130b5761115b6111239661114f61111a61111385806123fd565b9585612445565b99909285612445565b9190926111406040519761113689611847565b338952369061199d565b9a60209b8c8901523691611a13565b60408601523691611a13565b606083015260648501356080830152611173826128e1565b91825f525f875260405f209586541596876111b7575b888860017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055604051908152f35b6001905560a46001600160a01b03917f87491344dfbcf91f6cbbc610cbbeedc85313d37a02df0c93527f7ea5f8db717f83855116604051908152878c820152606060408201528061120b6060820188611dbf565b0390a1019161121a8385612412565b905061125f575b5050505061125392916103066102ef61030e933390919060405192600284526020840152604083015260608201604052565b82808080808080611189565b61126c6110b28486612412565b61127581613f46565b156112e85750937fd46c2c56b35c8210e9e712ec3f02242d5fc90187c0ac8ed80cc33626846ec369896112539897956112db6112be610306976102ef9761030e9b511693612412565b86604051958695865285015260606040850152606084019161232b565b0390a19383959650611221565b89610597604051928392630c89984b60e31b845260048401526024830190611cf3565b60405163540e5f0b60e01b8152600490fd5b604051636c44ef8f60e01b8152600490fd5b604051633c8270bd60e21b8152600490fd5b604051632cff108b60e21b8152600490fd5b3461032157602080600319360112610321576024816001600160a01b03611378611807565b16604051928380926370a0823160e01b82523060048301525afa908115610441575f916113a9575b50604051908152f35b90508181813d83116113cf575b6113c08183611917565b810103126103215751826113a0565b503d6113b6565b34610321576113e436611ca7565b92916113f194919461289f565b6113fc8383336134d7565b61140581612e4c565b15611529578160ff9161141d856114e096953361270f565b6114278183612eb9565b15611523575080935b61143c8582853361350b565b917f8045c25080b0868951141ed0a91720bcad09a8364a2b3109ee1fd49c1f0bc8b860c061146b898833613569565b97906001600160a01b0360405192338452169a8b6020840152856040840152886060840152608083015260a0820152a16040519660068852602088015260408701526060860152608085015260a08401521660c082015260e08101604052906040519160018352602083015260408201604052565b908061150c5760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b61151b9261030e91369161234b565b8080806104e6565b93611430565b50604051623a3a4d60e21b81523360048201526001600160a01b039190911660248201526044810191909152606490fd5b34610321576080366003190112610321576004356001600160a01b03908181168091036103215761158961181d565b6044359167ffffffffffffffff916064358381116103215736602382011215610321578060040135938411610321573660248583010111610321576116169560209216936115d88685876133f8565b60405196879283926323e30c8b60e01b84523360048501528760248501528860448501525f606485015260a06084850152602460a48501920161232b565b03815f855af1938415610441575f94611682575b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd984036116695761165e93503091613471565b602060405160018152f35b604051630b6c58a960e31b815260048101859052602490fd5b9093506020813d6020116116ae575b8161169e60209383611917565b810103126103215751928461162a565b3d9150611691565b34610321576101403660031901126103215767ffffffffffffffff600435818111610321576116e9903690600401611aa8565b60243582811161032157611701903690600401611aa8565b60c0366043190112610321576101043583811161032157611726903690600401611c5b565b9061012435938411610321576117436104e6943690600401611c5b565b9261174c61289f565b611e70565b3461032157606036600319011261032157602061178061176f611807565b61177761181d565b6044359161270f565b604051908152f35b34610321576020366003190112610321576004355f525f6020526020600160405f205414604051908152f35b34610321576020366003190112610321576004359063ffffffff60e01b82168092036103215760209163e414309160e01b81149081156117f6575b5015158152f35b6301ffc9a760e01b149050836117ef565b600435906001600160a01b038216820361032157565b602435906001600160a01b038216820361032157565b35906001600160a01b038216820361032157565b60a0810190811067ffffffffffffffff82111761186357604052565b634e487b7160e01b5f52604160045260245ffd5b6060810190811067ffffffffffffffff82111761186357604052565b6040810190811067ffffffffffffffff82111761186357604052565b6080810190811067ffffffffffffffff82111761186357604052565b67ffffffffffffffff811161186357604052565b60e0810190811067ffffffffffffffff82111761186357604052565b6020810190811067ffffffffffffffff82111761186357604052565b90601f8019910116810190811067ffffffffffffffff82111761186357604052565b92919267ffffffffffffffff82116118635760405191611963601f8201601f191660200184611917565b829481845281830111610321578281602093845f960137010152565b9080601f830112156103215781602061199a93359101611939565b90565b919060608382031261032157604051906119b682611877565b81936119c181611833565b83526119cf60208201611833565b602084015260408101359167ffffffffffffffff8311610321576040926119f6920161197f565b910152565b67ffffffffffffffff81116118635760051b60200190565b929192611a1f826119fb565b604092611a2f6040519283611917565b819581835260208093019160061b84019381851161032157915b848310611a5857505050505050565b8583830312610321578386918251611a6f81611893565b611a7886611833565b81528286013583820152815201920191611a49565b9080601f830112156103215781602061199a93359101611a13565b91909160a0818403126103215760405190611ac282611847565b8193611acd82611833565b835267ffffffffffffffff9160208101358381116103215782611af191830161199d565b602085015260408101358381116103215782611b0e918301611a8d565b6040850152606081013592831161032157611b2f6080939284938301611a8d565b60608501520135910152565b90929192611b48816119fb565b91604094611b596040519485611917565b839583855260208095019160059460051b8401948186116103215784935b868510611b88575050505050505050565b67ffffffffffffffff90853582811161032157870190608082860312610321578551611bb3816118af565b611bbc83611833565b81528a8301358b8201528683013584811161032157830186601f8201121561032157803590611bea826119fb565b91611bf78a519384611917565b8083528d80840191891b83010191898311610321578e809101915b838310611c4b57505050508782015260608084013594851161032157611c3c878d9687960161197f565b90820152815201940193611b77565b82358152918101918f9101611c12565b9080601f830112156103215781602061199a93359101611b3b565b9181601f840112156103215782359167ffffffffffffffff8311610321576020808501948460051b01011161032157565b906080600319830112610321576004356001600160a01b0381168103610321579160243591604435916064359067ffffffffffffffff821161032157611cef91600401611c76565b9091565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b805115610cf05760200190565b805160011015610cf05760400190565b805160021015610cf05760600190565b805160031015610cf05760800190565b805160041015610cf05760a00190565b8051821015610cf05760209160051b010190565b9081518082526020808093019301915f5b828110611d97575050505090565b835180516001600160a01b031686528201518583015260409094019392810192600101611d89565b90608080611e35611e23611e1160406001600160a01b0380895116885260208901519060a060208a01528082511660a08a015260208201511660c08901520151606060e0880152610100870190611cf3565b60408701518682036040880152611d78565b60608601518582036060870152611d78565b93015191015290565b90611e48826119fb565b611e556040519182611917565b8281528092611e66601f19916119fb565b0190602036910137565b92916001600160a01b038451166001600160a01b0383511614612319576001600160a01b03611ea6606086015160643590611d64565b515116906040830151916001600160a01b03611ec56084358095611d64565b515116148015906122d9575b610caa576040850151906001600160a01b03611ef06044358094611d64565b5151166001600160a01b03611f0b60643560608a0151611d64565b515116146122c757611f1c866128e1565b805f525f60205260405f2054156122745750611f37846128e1565b805f525f60205260405f205415612220575061201a9291611ff4917f6fa7f4c28634b0a9d6831401c45ae468195fb63aed07308935c35374ff5d9e3960405180611f9f611f9161012033845280602085015283018d611dbf565b82810360408401528a611dbf565b85606083015260643560808301528760a083015260a43560c083015260c43560e083015260e4356101008301520390a16001600160a01b0386511660405192611fe7846118fb565b5f8452606435908a612b0e565b936001600160a01b038651166040519261200d846118fb565b5f845260a4359086612b0e565b916120286040820151612e4c565b15801561220c575b80156121f9575b80156121e6575b6121d4576040519161204f836118af565b5f83525f60208401525f60408401525f606084015261206e8483613e57565b845260408401526120946120828386613e57565b60208601528060608601528451612ee0565b946120a86020850151604086015190612ee0565b936120b287612e96565b80156121c5575b6121b35761217a6121ac957fd9fa84dd790c969daa5c33d8050dc06b4a9b59d5b42e2be5f5e8ae20447f618d9461215c6121b19a60a0966120fb8a8851612f0a565b6121098c6020890151612f0a565b6121178a6040890151612f68565b6121258c6060890151612f68565b61212e8a613093565b6121378c613093565b6001600160a01b0361215360c435926060606435910151611d64565b51511633613133565b50506001600160a01b0361215360e43592606060a435910151611d64565b5050606060405191338352805160208401526020810151604084015260408101518284015201516080820152a161321f565b61321f565b565b604051630d86822160e01b8152600490fd5b506121cf85612e96565b6120b9565b6040516321badf1f60e01b8152600490fd5b506121f46060840151612e96565b61203e565b506122076060820151612e96565b612037565b5061221a6040840151612e4c565b15612030565b9351604080513381526001600160a01b039092166020830152810194909452507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f3945091925082915050606081015b0390a1565b9551604080513381526001600160a01b039092166020830152810196909652507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f39493508392505060608201905061226f565b604051631cd2f1c760e21b8152600490fd5b506001600160a01b036122f3606085015160a43590611d64565b5151166001600160a01b0361230f604088015160443590611d64565b5151161415611ed1565b604051630a98f1f360e21b8152600490fd5b908060209392818452848401375f828201840152601f01601f1916010190565b90929192612358816119fb565b916040916123696040519485611917565b839581855260208095019160051b8301938185116103215783925b8584106123945750505050505050565b67ffffffffffffffff9084358281116103215786019083828603126103215783516123be81611893565b823584811161032157866123d391850161199d565b815289830135938411610321576123ee868b95869501611c5b565b83820152815201930192612384565b903590605e1981360301821215610321570190565b903590601e1981360301821215610321570180359067ffffffffffffffff82116103215760200191813603831361032157565b903590601e1981360301821215610321570180359067ffffffffffffffff821161032157602001918160061b3603831361032157565b5f5b60808110612489575050565b60608282015260200161247d565b5f5b8281106124a557505050565b606082820152602001612499565b903590601e1981360301821215610321570180359067ffffffffffffffff821161032157602001918160051b3603831361032157565b604051906124f682611877565b60606040835f81525f60208201520152565b6040519061251582611847565b5f6080838281526125246124e9565b6020820152606060408201526060808201520152565b9015610cf057803590607e1981360301821215610321570190565b903590609e1981360301821215610321570190565b9190811015610cf05760061b0190565b356001600160a01b03811681036103215790565b3580151581036103215790565b9081518082526020808093019301915f5b8281106125ba575050505090565b8351855293810193928101926001016125ac565b6125e56101446125de8380612555565b3690611aa8565b5f525f602052600160405f20540361268157806126058161267193612555565b6126696126246126296020850135938460408701359384923690611aa8565b61391a565b6126416126368580612555565b9460608101906124b3565b929061266160405196612653886118fb565b5f88525f3681373690611aa8565b933691611b3b565b923392612b0e565b6040810151606090910151600192565b505f905f905f90565b9035601e198236030181121561032157016020813591019167ffffffffffffffff8211610321578160061b3603831361032157565b9190808252602080920192915f905b8282106126dc575050505090565b909192936001906001600160a01b036126f487611833565b168152858301358382015260409081019501939201906126ce565b8215612744576001600160a01b038091165f52600160205260405f2091165f5260205260405f20905f5260205260405f205490565b90915061275082613ae8565b6001600160a01b03809316906040918251946370a0823160e01b86528416938460048701526020928387602481865afa968715612866575f97612870575b50836127a76127a0836127d79a6148ac565b509061436e565b508651636eb1769f60e11b81526001600160a01b0390941660048501523060248501529297889081906044820190565b0381865afa968715612866575f97612835575b506127a06127fb9161199a986148ac565b506128068183612eb9565b1561282d5750935b5f5260018252825f20905f528152815f20905f8052525f2054906139f3565b90509361280e565b96508387813d831161285f575b61284c8183611917565b81010312610321579551956127a06127ea565b503d612842565b85513d5f823e3d90fd5b96508387813d8311612898575b6128878183611917565b81010312610321579551958361278e565b503d61287d565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0060028154146128cf5760029055565b604051633ee5aeb560e01b8152600490fd5b60405161290c816128fe6020820194602086526040830190611dbf565b03601f198101835282611917565b51902090565b919060408382031261032157825167ffffffffffffffff908181116103215784019082601f8301121561032157815160209261294d826119fb565b9161295b6040519384611917565b808352848084019160051b830101918683116103215785809101915b8383106129ea5750505050948281015191821161032157019180601f840112156103215782516129a6816119fb565b936129b46040519586611917565b818552838086019260051b820101928311610321578301905b8282106129db575050505090565b815181529083019083016129cd565b8251815291810191869101612977565b90808251908181526020809101926020808460051b8301019501935f915b848310612a285750505050505090565b9091929394958480612a46600193601f198682030187528a5161259b565b9801930193019194939290612a18565b91906020928381526001600160a01b0382511684820152838201516040820152612a90604083015160e06060840152610100830190611cf3565b9060608301516080820152612ab7608084015192601f1993848483030160a08501526129fa565b9260a081015193838382030160c08401528680865192838152019501905f5b818110612afa5750505061199a94955060c060e0910151928285030191015261259b565b825187529588019591880191600101612ad6565b949193612d4d919360c0915f612cd4604092835194612b2c866118df565b612b34612508565b86526020958487820152848682015260609781868a809401528260808201528660a08201520152612c84855191612b6a83611847565b60048352612b7988840161247b565b8d612b83816128e1565b9c896001600160a01b039e8f94859182865116908d5194600386528501528c840152168c820152608081018a52612bb986611d17565b52612bc385611d17565b508851612bcf81611877565b6002815289368c830137612be286611d24565b52612bec85611d24565b5060ff8a612c4f8b850193612c3987612c1281612c0a858a51611d64565b515116613ae8565b97511688612c21848951611d64565b51511685612c30858a51611d64565b5101519161270f565b96612c45828751611d64565b5151169451611d64565b51015192169093929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b612c8d82611d34565b52612c9781611d34565b50612cbb8a8d8d60ff8a612c4f8d850193612c3987612c1281612c0a858a51611d64565b612cc482611d44565b52612cce81611d44565b50613bc6565b95878a511697848b0191825191868184511693015116928a85523087528580862091510151865191612d05836118fb565b868352875195612d14876118df565b86528886015286850152848885015289608085015260a084015260c08301528351808098819463d04dfe2360e01b835260048301612a56565b03915afa968715612e42575f945f98612e18575b50845160028110612e0157508183860151950151612d87612d8188611d54565b51611d44565b51612d928183612eb9565b15612df95750925b612dbc8685919060405192600284526020840152604083015260608201604052565b612dc588611d34565b52612dcf87611d34565b50825199612ddc8b6118df565b8a52890152870152850152608084015260a083015260c082015290565b905092612d9a565b602490835190630fbb8e5560e21b82526004820152fd5b909750612e389194503d805f833e612e308183611917565b810190612912565b939093965f612d61565b50513d5f823e3d90fd5b612e6b905f60e01d906001600160e01b038160e01d9116601b0b614963565b1290565b90612e6b916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6149e4565b612eb5905f60e01d906001600160e01b038160e01d9116601b0b614963565b1390565b90612eb5916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6149e4565b61199a91610a9a916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b613eba565b612f64916080810182612f26612f208351611d54565b51611d54565b52612f5d612f576001600160a01b03809451511693612f4e612f488551611d54565b51611d17565b51169251611d54565b51611d34565b519161350b565b5050565b90608081019180612f7c612f208551611d44565b526001600160a01b03809251511691612f98612f488551611d44565b5116612fa7612f578551611d44565b51908161305b57612fb783612e96565b613042579183917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a959361226f955f526020906001825261300d604094855f20835f528452855f20855f528452855f20546139f3565b945f5260018252835f20905f528152825f20915f52525f20555b516040519182913383526040602084015260408301906129fa565b60405163793a8f5560e01b815260048101849052602490fd5b9161308c917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a959361226f95613133565b5050613027565b608081016130a4612f578251611d44565b519182156130b157505050565b6130cb612f486001600160a01b0380935151169351611d44565b5116815f5260209160018352604092835f20835f528152835f20855f528152835f2054936001600160e01b038516613106575b505050505050565b61312a955f9284845260018152828420868552815282842091845252812055613569565b5f8080806130fe565b9392919361314083612e96565b613042578461315c57613154939450613569565b50505f905f90565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f528152613199835f205494856139f3565b956131a387612e96565b6131c6575f97885260018252838820908852815282872091875252909320829055565b835163c5e12af560e01b815260048101889052602490fd5b90604082019082526020606081936040838201528551809452019301915f5b82811061320b575050505090565b8351855293810193928101926001016131fd565b60c0810151908151915f92613393575b506132d46020918281510151926001600160a01b039081818187511696015116928660a082019485518252308452604097888320898686510151015160808601518b519161327c836118fb565b8683528c519361328b856118fb565b8785528d519661329a886118df565b8752898701528c86015260016060860152608085015260a084015260c08301528851808099819463d04dfe2360e01b835260048301612a56565b03915afa94851561338957879561336b575b5084516132f7575b50505050505050565b81905101510151169051813b156133675791849184938361332c965180978195829463012c676d60e21b8452600484016131de565b03925af190811561335e5750613347575b80808080806132ee565b61335182916118cb565b61335b578061333d565b80fd5b513d84823e3d90fd5b8480fd5b6133809195503d8089833e612e308183611917565b9050935f6132e6565b86513d89823e3d90fd5b6001600160a01b03602080845101510151169060a083015190823b15610321576133d6925f928360405180968195829463012c676d60e21b8452600484016131de565b03925af18015610441571561322f576133f09192506118cb565b5f905f61322f565b6040519263a9059cbb60e01b5f526001600160a01b0380931660045260245260205f60448180855af160015f5114811615613452575b836040521561343c57505050565b635274afe760e01b835216600482015260249150fd5b600181151661346857813b15153d15161661342e565b833d5f823e3d90fd5b9092604051936323b872dd60e01b5f526001600160a01b0393848092166004521660245260445260205f60648180855af160015f51148116156134c1575b836040525f6060521561343c57505050565b600181151661346857813b15153d1516166134af565b9091156134e2575050565b6040516305dbdfd960e41b81526001600160a01b03918216600482015291166024820152604490fd5b9392919361351883612e96565b613042578461352c57613154939450613a1d565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f528152613199835f20549485612ee0565b9092919261357681613ee9565b9361358081612e96565b6135c95784816001600160e01b0361359f9360e01d9116601b0b614b0e565b508092816135af575b5050509190565b6001600160a01b036135c193166133f8565b5f81816135a8565b604051632d1671a360e11b8152600490fd5b9160408051916135ea83611847565b600480845260206135fc81860161247b565b5f5b875181101561363157806136146001928a611d64565b5161361f8289611d64565b5261362a8188611d64565b50016135fe565b5092955092939093335f52308352855f209186519061364f82611893565b6136576124e9565b825260608581930152875161366b816118fb565b5f815288519161367a836118fb565b5f83525f3681375f5b81518110156137e0576136968183611d64565b5190888c8b84519189818401518d8d82516136be575b50505050505050506001915001613683565b5f61372d97948197948c97946136eb8c956001600160a01b039d8e81818d51169c0151169b015190613bc6565b948651996136f88b6118df565b8a528901528488015286015260808501528a60a08501528b60c08501525180958194829363d04dfe2360e01b84528301612a56565b03915afa9384156137d6578b915f956137b8575b508451613756575b50908b8e89838d8d6136ac565b51015116803b1561032157613785925f918c8f84905180978195829463012c676d60e21b8452339084016131de565b03925af19182156137ae5760019261379f575b8981613749565b6137a8906118cb565b5f613798565b8c513d5f823e3d90fd5b6137cd9195503d805f833e612e308183611917565b9050935f613741565b8e513d5f823e3d90fd5b5050505050505050509050565b81156137f7570490565b634e487b7160e01b5f52601260045260245ffd5b6040815110613867576020810151908051603f1981019081116138535760051c821161383f5760016020920160051b010190565b505060405161384d816118fb565b5f815290565b634e487b7160e01b5f52601160045260245ffd5b5060405161384d816118fb565b80511561388457602001515f1a90565b505f90565b905f8091602081519101845af48080613907575b156138bd5750506040513d81523d5f602083013e60203d82010160405290565b156138e457604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b3d156138f5576040513d5f823e3d90fd5b60405163d6bda27560e01b8152600490fd5b503d15158061389d5750813b151561389d565b9161394590606061393a936001600160a01b039485916040880151611d64565b515116940151611d64565b515116146122c757565b6139766001600160e01b0392838316601b0b9260e01d938160e01d9116601b0b8484614125565b90637ffffff582136139c6575b9061398d9161436e565b92909215806139be575b6139a057505090565b6044925060405191638eba4d0760e01b835260048301526024820152fd5b508215613997565b6139d08282615037565b1561398357604483856040519163d556b11160e01b835260048301526024820152fd5b61199a91610a9a916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614713565b929192613a2982613ee9565b93613a3381612e96565b613a945784816001600160e01b03613a529360e01d9116601b0b614b0e565b9290809315613a7f575b50829081613a6b575050509190565b6135c1926001600160a01b03309216613471565b9092505f19811461385357600101915f613a5c565b604051632eaefac360e21b8152600490fd5b60041115613ab057565b634e487b7160e01b5f52602160045260245ffd5b602090939291936001600160a01b036040820195168152613ae483613aa6565b0152565b613af0615050565b60408051630782d7e160e01b81526001600160a01b03831660048201529091828260248173200e12d10bb0c5e4a17e7018f0f1161919bb93895afa928315613bbd575f925f94613b88575b50613b4583613aa6565b600183141580613b76575b613b5a5750505090565b5163ee07877f60e01b8152918291610597919060048401613ac4565b50613b8083613aa6565b821515613b50565b90809450613bac9293503d8511613bb6575b613ba48183611917565b810190614882565b919091925f613b3b565b503d613b9a565b513d5f823e3d90fd5b613bd08251611e3e565b613bda8351611e3e565b9282519281518015155f14613e4f57600201935b60019401840190613bfe826119fb565b95613c19604093613c118551998a611917565b8089526119fb565b613c2b602091601f1901828a01612497565b5f9584519389896002926002885233868901523089890152606097606081018a52613c5584611d17565b52613c5f83611d17565b505f825b613e0f575b505050508651613c7f575b50505050505050505090565b90919293600288613ca28c86613c9b8e809c9d9e018093611d64565b528d611d64565b500185613caf828d611d64565b52613cba818c611d64565b505f965b613cc9575b50613c73565b8851871015613e0a576001600160a01b03613d75898b85613d6c8c60428c88613cf28488611d64565b515116968582613d02868a611d64565b51015192613d10868a611d64565b51838d82511691015182815160051b910120908451927f6ec4dff745ec96dbde88c5d41f8aa5ac13aa1664afb47b8406b44fa945a650c88452830152838201522090519161190160f01b83528d83015260228201522093611d64565b510151916148da565b15613df25787613de18b8e8c8f9e9d9c9b9a999897968f613dce918d613dc4898f8f613db083889f613da7828f611d64565b51511692611d64565b52613dbb828b611d64565b51015192611d64565b52019c8d94611d64565b510151613ddb8383611d64565b52611d64565b500196979895909192939495613cbe565b8851630a57f30960e31b815260048101899052602490fd5b613cc3565b9091929a8251821015613e475790613e3b84809301809d613e308487611d64565b51613ddb8383611d64565b50019082918d93613c63565b9a9291613c68565b505f93613bee565b9160408301926040613e91610a9a606087519401938451906001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b613f6a565b94519301613ea0815186612e6f565b613ea8575050565b90935061199a9192505192518361394f565b919291600160ff1b8401613ed257611cef9350614a39565b90611cef935f0391614713565b61398d828261436e565b613ef1615050565b6040805163b7bad1b160e01b81526001600160a01b0383166004820152909182826024815f73200e12d10bb0c5e4a17e7018f0f1161919bb93895af1928315613bbd575f925f94613b885750613b4583613aa6565b6008815110613884576008015167ffffffffffffffff1667ff0a89c674ee78741490565b9091939284158215175f14613f845750505090505f905f90565b82810192600160fd1b8082019083011760fe1c6140bb575b5050613fa781614cfc565b93613fb181614cfc565b94613fbc8682614d1c565b909182156140ac575f9083986f0785ee10d5da46d900f436a00000000080861161409e575b50670de0b6b3a7640000808b1161408f575b50633b9aca00808b11614080575b50612710808b11614072575b5098805b61406157508190611cef989982600a0a9109960195817fcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccd0a93838211900382610100031b9203901c170291614d2f565b60019290920191600a900480614011565b60049a04998a93019261400d565b600991939a049901915f614001565b601291939a049901915f613ff3565b85049950602592505f613fe1565b50929050611cef949550614d2f565b5f82121561410f57808413614101575b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb2841315613f9c57909250611cef939491614c3a565b909250611cef939491614ca1565b808412156140cb57909250611cef939491614c3a565b9290918061414b576044848460405191637a97930f60e01b835260048301526024820152fd5b90919280155f1461416057505050505f905f90565b6141799361416d91614de9565b92919490938492614de9565b909391928461418788614cfc565b9161419186614cfc565b947f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000094604c91868810614338575b030191600160ff1b98838a018112155f14614305575050035b5f955f8212806142fc575b6142de575b5f8112806142cc575b6142ae5786820103966001600160ff1b03881490816142a4575b508061429b575b80614292575b6142745750906142289291614f95565b915f811361423b575b50611cef93614d2f565b9091604c82136142695761425291600a0a906137ed565b90811561425f575f614231565b505050505f905f90565b50505050505f905f90565b876044916040519163d556b11160e01b835260048301526024820152fd5b505f8512614218565b50828414614212565b905088145f61420b565b604489836040519163d556b11160e01b835260048301526024820152fd5b50806001600160ff1b030182136141f1565b95508087018613156142f65786818703015b956141e8565b5f6142f0565b505f81136141e3565b89985090920390506001600160ff1b038190038701821361432957018601946141d8565b5050505050505050505f905f90565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009650604b92506141bf565b81156137f7570590565b8082601b82810b8314614563577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e1000000000000000000840561450f575b8380820b036144fe57507b199999999999999999999999999999999999999999999999999999987b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc840111156144af575b838060030b03614433575b8084136144175750506001600160e01b036001925b60e01b91161791565b8303600a0a80156137f7576001600160e01b039107159261440e565b92915f8413156144835750906144498383615037565b61446557637ffffffe1901600a0a810290637fffffff926143f9565b506044916040519163d556b11160e01b835260048301526024820152fd5b637fffffff199283039060438213614269576144a291600a0a90614364565b91821561425f57926143f9565b5f198401808060030b146144c357506143ee565b90506001600160e01b039293507b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff915060e01b9260ff1d181617905f90565b600190940193600a909305926143a1565b937f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000840515614550576305f5e100600894058094819201955b9150506143a1565b620186a060059405809481920195614548565b50826143ee57505050505f90600190565b919291600160ff1b919080158061470157509061459091614de9565b9490929091905f8685858582821380156146f8575b6146db575b505050508682841860ff1c94860391039081604c0381116146c05701600a0a8082059190846146a6575b505081019182821860ff1c111561469e57826001600160ff1b031461468057905f600192135f1461465157600a9004915b01925b8115811761461557509190565b8061462e575b508015614626579190565b505f91508190565b91926146449203600160ff1b01600a0a90614364565b600160ff1b91905f61461b565b600a60037fe6666666666666666666666666666666666666666666666666666666666666679201040191614605565b604490836040519163d556b11160e01b835260048301526024820152fd5b509092614608565b81076146b3575b806145d4565b60ff1d600117015f6146ad565b5050509193506146ce579190565b60018160ff1d1790039190565b5f9a50909750909550600160ff1b945092509050868080806145aa565b50835f126145a5565b1561470c5750509190565b9350919050565b93929193841581158181176148645750509061472e91614de9565b919490829561473f82958294614de9565b809692949196938786848213801561485b575b614842575b5050505050508682841860ff1c94860391039081604c0381116146c05701600a0a808205919084614828575b505081019182821860ff1c111561482057826001600160ff1b031461468057905f600192135f146147f157600a9004915b01925b811581176147c457509190565b806147d457508015614626579190565b600160ff1b936147eb9291038401600a0a90614364565b5f61461b565b600a60037fe66666666666666666666666666666666666666666666666666666666666666792010401916147b4565b5090926147b7565b8107614835575b80614783565b60ff1d600117015f61482f565b929b5098509196509450925090505f8080808080614757565b50858412614752565b939593909291901561487a575050614626579190565b945092915050565b919082604091031261032157815160048110156103215760209092015160ff811681036103215790565b9060ff165f03916001600160ff1b0382115f146148d257600a6001818404940192061590565b909190600190565b9091813b614915576148ec91926150b9565b506148f681613aa6565b15918261490257505090565b6001600160a01b03918216911614919050565b6020918160645f935160405192630b135d3f60e11b9788855260048501526040602485015286820190604485015e8281018201859052601f01601f191601915afa905f5114601f3d11161690565b92915f9060018184145f871287151717176149dd575f928082136149cf575b03604c81135f8212176149c357600a0a90846149a18382029384614364565b146149b6575050156149b2575f9190565b5f90565b909350901561199a579190565b5050156149b2575f9190565b5f9560019450925090614982565b5050505f90565b93929190918083145f83125f87121883158715171717614a33575f92808213614a265703604c81135f8212176149c357600a0a90846149a18382029384614364565b9194600193509190614982565b50919050565b909291600160ff1b91828101614acb5750808414614ac157808413918215614ab9578185035b604c811115614aa85750505f915b15614a9957507f8000000000000000000000000000000000000000000000000000000000000001019190565b92506001600160ff1b03039190565b600a0a9081156137f7570491614a6d565b848203614a5f565b505090505f905f90565b93614ad892945f03614574565b80939180928114614aec575b50505f039190565b915092506001600160ff1b03831461468057600a600191059201915f80614ae4565b91925f831215614b36576044838360405191634a7d166b60e01b835260048301526024820152fd5b919283614b4857505090505f90600190565b60ff8116820191808312614c10575f831215614b80575050604c198112614626575f03600a0a91614b7983826137ed565b9283021490565b909293915f81135f14614c0657604d8113614bdb57600a0a9283156137f757835f19048311614bb25750500290600190565b60405163c849483b60e01b815260048101849052602481019290925260ff166044820152606490fd5b5060405163c849483b60e01b81526004810192909252602482015260ff919091166044820152606490fd5b5050905090600190565b60405163c849483b60e01b815260048101869052602481019190915260ff82166044820152606490fd5b909392915f614c4a918184613f6a565b9490945f8483019182019412159081614c97575b8115614c8d575b50614c6f57505090565b604492506040519163d556b11160e01b835260048301526024820152fd5b905083125f614c65565b8281129150614c5e565b614cb693600160fe1b90810193920190613f6a565b9081815f821215614ced575050604b19821261315457614cdb915f03600a0a90614364565b9081614ce5575f90565b600160ff1b90565b93600160ff1b90910192509050565b5f81121561199a57600160ff1b90808203614d15575090565b90505f0390565b905f198183099102908180821091030391565b92939291905f8184181215614dc4576001600160ff1b039283831115614dae57600160ff1b93838503614d6457505050509190565b90919293508514614d7e575050600a600191045f03920190565b604051630ed8062160e21b8152600481019190915260248101919091526044810182905260648101849052608490fd5b5090915050600160ff1b8114613853575f039190565b90916001600160ff1b03808411156135a8578514614d7e575050600a60019104920190565b9190918015614f8b57827f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000080830515614e99575b507f19999999999999999999999999999999999999999999999999999999999999997f0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc830110614e8a575b8313614e745791905f90565b919060018060ff1b926001600160ff1b03030190565b9290600a02905f190192614e68565b6f4b3b4ca85a86c47a098a22400000000080840515614f79575b507728c87cb5c89a2571ebfdcb54864ada834a00000000000000830515614f62575b7b097edd871cfda3a5697758bf0e3cbb5ac5741c640000000000000000830515614f4e575b7e3899162693736ac531a5a58f1fbb4b746504382ca7e4000000000000000000830515614f3e57820515614f2f575b5f614e1d565b9290600a02905f190192614f29565b9391606402916001190193614efa565b93916402540be40002916009190193614efa565b9391678ac7230489e8000002916012190193614ed5565b6025198301955092909202915f614eb3565b505f915081908190565b90915f198383099280830292838086109503948086039584871015615013571461500b579082910960018219018216809204600280826003021880830282030280830282030280830282030280830282030280830282030280920290030293600183805f03040190848311900302920304170290565b505091500490565b60648386866040519263362ced0960e11b8452600484015260248301526044820152fd5b61199a91905f81121561504b575f036150f3565b6150f3565b73200e12d10bb0c5e4a17e7018f0f1161919bb9389803b15801561508e575b6150765750565b602490604051906373e6d7b360e01b82526004820152fd5b507f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d41813f141561506f565b81519190604183036150e9576150e29250602082015190606060408401519301515f1a90615182565b9192909190565b50505f9160029190565b90637ffffff581131561517c57637ffffffe1981019060438213615175575f82121561514957637fffffff91505f0301600a0a7b8000000000000000000000000000000000000000000000000000000202111590565b50600a0a80156137f7577b80000000000000000000000000000000000000000000000000000001041090565b5050151590565b50505f90565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084116151f9579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa15610441575f516001600160a01b038116156151ef57905f905f90565b505f906001905f90565b5050505f916003919056"; /// @dev What MUST already be on a network before this release can be /// broadcast there: an address, and the runtime code that belongs at it. diff --git a/src/generated/candidate/RaindexV6SubParser.sol b/src/generated/candidate/RaindexV6SubParser.sol index be95bdf327..dc863ad3ef 100644 --- a/src/generated/candidate/RaindexV6SubParser.sol +++ b/src/generated/candidate/RaindexV6SubParser.sol @@ -5,19 +5,19 @@ pragma solidity ^0.8.25; // THIS FILE IS AUTOGENERATED BY THE BUILD SCRIPT. DO NOT EDIT BY HAND. /// @dev Hash of the known bytecode. -bytes32 constant BYTECODE_HASH = bytes32(0xb5f18596862c369ecb1bc3cf69399785a578427214d9372d94d0fde2ed0ecaeb); +bytes32 constant BYTECODE_HASH = bytes32(0xa97dd44eacfb2527934079d037d4baa6ceffe1e9e12fd5a17d79c3e9cfd9e974); /// @dev The deterministic deploy address of the contract when deployed via /// the Zoltu factory. -address constant DEPLOYED_ADDRESS = address(0x1E01A5C29679C9155468B331f0258F56EAF6Ea5F); +address constant DEPLOYED_ADDRESS = address(0xA909a8be688EDB80d2018C99fce528D59A3392C2); /// @dev The creation bytecode of the contract. bytes constant CREATION_CODE = - hex"6080604052348015600e575f80fd5b506126378061001c5f395ff3fe608060405234801561000f575f80fd5b506004361061007a575f3560e01c80636f5aa28d116100585780636f5aa28d146100dd578063c6c0cbb61461010b578063ccf4477514610135578063d6d8c9a814610148575f80fd5b806301ffc9a71461007e578063336284d4146100a6578063570c7a63146100bb575b5f80fd5b61009161008c3660046122f2565b610150565b60405190151581526020015b60405180910390f35b6100ae6101d7565b60405161009d919061234e565b6100ce6100c9366004612374565b610bc5565b60405161009d9392919061241e565b6040517ff2d0eca454c544ab10f9991c019349475a416e38494f112a50807174c3000d0b815260200161009d565b61011e610119366004612374565b610d09565b60408051921515835260208301919091520161009d565b60408051602081019091525f81526100ae565b6100ae610d41565b5f6001600160e01b031982166391ccb1d560e01b148061018057506001600160e01b03198216636f5aa28d60e01b145b8061019b57506001600160e01b03198216631a2c8edd60e01b145b806101b657506001600160e01b03198216630cd8a13560e21b145b806101d157506301ffc9a760e01b6001600160e01b03198316145b92915050565b60605f6101e66004600161248f565b6101f190600261248f565b6101fc90600161248f565b61020790600161248f565b6001600160401b0381111561021e5761021e612360565b60405190808252806020026020018201604052801561025157816020015b606081526020019060019003908161023c5790505b50604080516002808252606082019092529192505f9190816020015b6122e881526020019060019003908161026d5790505090506116cc815f8151811061029a5761029a6124a2565b60200260200101906001600160401b031690816001600160401b0316815250506116e9816001815181106102d0576102d06124a2565b6001600160401b039290921660209283029190910190910152604080516003808252608082019092525f91816020015b6122e88152602001906001900390816103005790505090506116f8815f8151811061032d5761032d6124a2565b60200260200101906001600160401b031690816001600160401b03168152505061170781600181518110610363576103636124a2565b60200260200101906001600160401b031690816001600160401b03168152505061171681600281518110610399576103996124a2565b6001600160401b039290921660209283029190910190910152604080516002808252606082019092525f91816020015b6122e88152602001906001900390816103c9579050509050611726815f815181106103f6576103f66124a2565b60200260200101906001600160401b031690816001600160401b0316815250506117358160018151811061042c5761042c6124a2565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b6122e881526020019060019003908161045c579050509050611745815f81518110610489576104896124a2565b60200260200101906001600160401b031690816001600160401b031681525050611754816001815181106104bf576104bf6124a2565b60200260200101906001600160401b031690816001600160401b031681525050611764816002815181106104f5576104f56124a2565b60200260200101906001600160401b031690816001600160401b0316815250506117748160038151811061052b5761052b6124a2565b60200260200101906001600160401b031690816001600160401b03168152505061178381600481518110610561576105616124a2565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b6122e8815260200190600190039081610591579050509050611793815f815181106105be576105be6124a2565b60200260200101906001600160401b031690816001600160401b0316815250506117a2816001815181106105f4576105f46124a2565b60200260200101906001600160401b031690816001600160401b0316815250506117b28160028151811061062a5761062a6124a2565b60200260200101906001600160401b031690816001600160401b0316815250506117c281600381518110610660576106606124a2565b60200260200101906001600160401b031690816001600160401b0316815250506117d281600481518110610696576106966124a2565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6122e88152602001906001900390816106c55790505090506117e1815f815181106106f2576106f26124a2565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6122e88152602001906001900390816107215790505090506117f0815f8151811061074e5761074e6124a2565b60200260200101906001600160401b031690816001600160401b03168152505086885f81518110610781576107816124a2565b602002602001018190525085886001815181106107a0576107a06124a2565b602002602001018190525084886002815181106107bf576107bf6124a2565b602002602001018190525083886003815181106107de576107de6124a2565b602002602001018190525082886004815181106107fd576107fd6124a2565b6020026020010181905250818860058151811061081c5761081c6124a2565b6020026020010181905250808860068151811061083b5761083b6124a2565b602090810291909101015260408051600680825260e082019092525f91816020015b6122e881526020019060019003908161085d5790505090506116cc815f8151811061088a5761088a6124a2565b60200260200101906001600160401b031690816001600160401b0316815250506116f8816001815181106108c0576108c06124a2565b60200260200101906001600160401b031690816001600160401b031681525050611707816002815181106108f6576108f66124a2565b60200260200101906001600160401b031690816001600160401b0316815250506117168160038151811061092c5761092c6124a2565b60200260200101906001600160401b031690816001600160401b03168152505061182581600481518110610962576109626124a2565b60200260200101906001600160401b031690816001600160401b03168152505061183581600581518110610998576109986124a2565b6001600160401b039092166020928302919091019091015280896109be6006600161248f565b815181106109ce576109ce6124a2565b602090810291909101015260408051600780825261010082019092525f91816020015b6122e88152602001906001900390816109f15790505090506116cc815f81518110610a1e57610a1e6124a2565b60200260200101906001600160401b031690816001600160401b0316815250506116f881600181518110610a5457610a546124a2565b60200260200101906001600160401b031690816001600160401b03168152505061170781600281518110610a8a57610a8a6124a2565b60200260200101906001600160401b031690816001600160401b03168152505061171681600381518110610ac057610ac06124a2565b60200260200101906001600160401b031690816001600160401b03168152505061182581600481518110610af657610af66124a2565b60200260200101906001600160401b031690816001600160401b03168152505061183581600581518110610b2c57610b2c6124a2565b60200260200101906001600160401b031690816001600160401b03168152505061184581600681518110610b6257610b626124a2565b6001600160401b0390921660209283029190910190910152808a610b886006600261248f565b81518110610b9857610b986124a2565b602090810291909101015289610bb5610bb082611855565b61186a565b9b50505050505050505050505090565b5f6060805f805f610be587610bd86118f9565b610be0611919565b611939565b9250925092505f610bfb82610220015160200190565b90505f8261022001515182610c10919061248f565b90505f610c2e83836f07fffffe0000000003ff200000000000611a2a565b80925081945050505f80610c4786610240015184611ac6565b915091508115610cdc575f610c5c8783611b9d565b90506122e85f610c6a611bcc565b90505f60028251610c7b91906124ca565b9050808510610cac576040516303bdd1b160e51b815260048101869052602481018290526044015b60405180910390fd5b6001850160020282015161ffff169250610cc58c8c8686565b9e509e509e50505050505050505050505050610d02565b5050604080515f80825281830190925260208101828152919a5090985096505050505050505b9193909250565b5f805f805f610d31866002810151815160228084019461ffff93909316840101920160200190565b505f988998509650505050505050565b60605f610d506004600161248f565b610d5b90600261248f565b610d6690600161248f565b610d7190600161248f565b6001600160401b03811115610d8857610d88612360565b604051908082528060200260200182016040528015610dbb57816020015b6060815260200190600190039081610da65790505b50604080516002808252606082019092529192505f9190816020015b6122e8815260200190600190039081610dd7579050509050611bec815f81518110610e0457610e046124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec81600181518110610e3a57610e3a6124a2565b6001600160401b039290921660209283029190910190910152604080516003808252608082019092525f91816020015b6122e8815260200190600190039081610e6a579050509050611bec815f81518110610e9757610e976124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec81600181518110610ecd57610ecd6124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec81600281518110610f0357610f036124a2565b6001600160401b039290921660209283029190910190910152604080516002808252606082019092525f91816020015b6122e8815260200190600190039081610f33579050509050611bec815f81518110610f6057610f606124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec81600181518110610f9657610f966124a2565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b6122e8815260200190600190039081610fc6579050509050611bec815f81518110610ff357610ff36124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec81600181518110611029576110296124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec8160028151811061105f5761105f6124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec81600381518110611095576110956124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec816004815181106110cb576110cb6124a2565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b6122e88152602001906001900390816110fb579050509050611bec815f81518110611128576111286124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec8160018151811061115e5761115e6124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec81600281518110611194576111946124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec816003815181106111ca576111ca6124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec81600481518110611200576112006124a2565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6122e881526020019060019003908161122f579050509050611c15815f8151811061125c5761125c6124a2565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6122e881526020019060019003908161128b579050509050611cb1815f815181106112b8576112b86124a2565b60200260200101906001600160401b031690816001600160401b03168152505086885f815181106112eb576112eb6124a2565b6020026020010181905250858860018151811061130a5761130a6124a2565b60200260200101819052508488600281518110611329576113296124a2565b60200260200101819052508388600381518110611348576113486124a2565b60200260200101819052508288600481518110611367576113676124a2565b60200260200101819052508188600581518110611386576113866124a2565b602002602001018190525080886006815181106113a5576113a56124a2565b602090810291909101015260408051600680825260e082019092525f91816020015b6122e88152602001906001900390816113c7579050509050611bec815f815181106113f4576113f46124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec8160018151811061142a5761142a6124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec81600281518110611460576114606124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec81600381518110611496576114966124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec816004815181106114cc576114cc6124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec81600581518110611502576115026124a2565b6001600160401b039092166020928302919091019091015280896115286006600161248f565b81518110611538576115386124a2565b602090810291909101015260408051600780825261010082019092525f91816020015b6122e881526020019060019003908161155b579050509050611bec815f81518110611588576115886124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec816001815181106115be576115be6124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec816002815181106115f4576115f46124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec8160038151811061162a5761162a6124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec81600481518110611660576116606124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec81600581518110611696576116966124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec81600681518110610b6257610b626124a2565b5f6060806116da5f80611d69565b92509250925093509350939050565b5f6060806116da5f6001611d69565b5f6060806116da60015f611d69565b5f6060806116da600180611d69565b5f6060806116da60016002611d69565b5f6060806116da60025f611d69565b5f6060806116da60026001611d69565b5f6060806116da60035f611d69565b5f6060806116da60036001611d69565b5f6060806116da60036002611d69565b5f6060806116da600380611d69565b5f6060806116da60036004611d69565b5f6060806116da60045f611d69565b5f6060806116da60046001611d69565b5f6060806116da60046002611d69565b5f6060806116da60046003611d69565b5f6060806116da600480611d69565b5f6060806116da600585611d69565b5f60608060ff80851690600886901c1661181461180e83600661248f565b82611d69565b945094509450505093509350939050565b5f6060806116da60016003611d69565b5f6060806116da60016004611d69565b5f6060806116da60016005611d69565b6060815f61186282611deb565b949350505050565b60605f82516002026001600160401b0381111561188957611889612360565b6040519080825280601f01601f1916602001820160405280156118b3576020820181803683370190505b50905061ffff80196020850160208651028101600285015b818310156118ed578051835186169085161781526020909201916002016118cb565b50939695505050505050565b60606040518060e0016040528060a2815260200161259560a29139905090565b606060405180606001604052806040815260200161251560409139905090565b5f806119c86040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020016060815260200160608152602001606081526020015f815260200160608152602001606081525090565b606061ffff600288015116935060ff600388015116925061ffff600588015116600588019750808852602081018801915050611a1487878760405180602001604052805f815250611e59565b915080826101e001819052505093509350939050565b5f808060018187870360208111611a415780611a44565b60205b915050875192505b8519600184841a1b16158183101615611a6a57600182019150611a4c565b9681019660208290036008810293841c90931b92611ab55760408051602081018590520160408051601f198184030181529082905263e47fe8b760e01b8252610ca39160040161234e565b50869350909150505b935093915050565b600182810180515f928392600560ff93909316602102870192830192909101835b81831015611b8b5760018301516021909301805190935f90819060ff168180611b10838e61200a565b915091508186165f03611b32575f809b509b5050505050505050505050611b96565b5f87611b42600185038916612035565b016004028b015195505062ffffff9081169350841683039150611b769050575060019750601c1a9550611b96945050505050565b611b7f83612035565b84019350505050611ae7565b5f8095509550505050505b9250929050565b6101c08201516002828102820101516101e08401515f9261ffff9092169190611bc39083565b95945050505050565b606060405180606001604052806040815260200161255560409139905090565b5f81515f14611c0e576040516304f8b58160e51b815260040160405180910390fd5b505f919050565b5f8151600103611c72575060208101516001600160e01b038116601b0b60e082901d5f611c438383836120ee565b905061ffff811115611c6857604051631e4e01d760e21b815260040160405180910390fd5b9250611cac915050565b81515f03611c9357604051630f16066b60e41b815260040160405180910390fd5b604051630358cd2160e31b815260040160405180910390fd5b919050565b5f8151600203611d4657602082015160408301516001600160e01b038216601b0b60e083901d5f611ce38383836120ee565b6001600160e01b038516601b0b935060e085901d925090505f611d078484836120ee565b905060ff821180611d18575060ff81115b15611d3657604051631e4e01d760e21b815260040160405180910390fd5b60081b179450611cac9350505050565b600282511015611c9357604051630f16066b60e41b815260040160405180910390fd5b5f60608060ff851180611d7c575060ff84115b15611da457604051639b0f326160e01b81526004810186905260248101859052604401610ca3565b6040805160248101909152600386602383015385602283015360106021830153806020830153506004815260408051602081019091525f8152600197919650945092505050565b60605f611df783612130565b90505f611e058260206124e9565b9050606060405190508160200181016040528281526020850160208651028101602083015b81831015611e4d57602083515102806020855101835e6020939093019201611e2a565b50919695505050505050565b611ee66040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020016060815260200160608152602001606081526020015f815260200160608152602001606081525090565b5f6040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f801b81526020015f8152602001600481526020015f81526020015f81526020015f81526020015f801b815260200184815260200185815260200160046001600160401b03811115611f6b57611f6b612360565b604051908082528060200260200182016040528015611f94578160200160208202803683370190505b5081525f602080830182905260408084018b905260609384018a90528051601f01601f19168281528083018252835161ffff191681178452855290840182905283018190529082018190526080820181905260a08201819052610120820181905261014082018190526102008201529050611bc3565b5f80825f528360205360215f2090506001815f1a1b915062ffffff8116611b96575060019250929050565b5f5f1982036120475750610100919050565b507f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f7f5555555555555555555555555555555555555555555555555555555555555555600183901c16909103600281901c7f3333333333333333333333333333333333333333333333333333333333333333908116911601600481901c01167f01010101010101010101010101010101010101010101010101010101010101010260f81c90565b5f805f6120fc868686612179565b91509150806121275760405162bc8ecf60e31b81526004810187905260248101869052604401610ca3565b50949350505050565b5f60208201602083510281015b8082101561217257815151928301928084101561216657634e487b715f5260116020526024601cfd5b5060208201915061213d565b5050919050565b5f805f8512156121a657604051634a7d166b60e01b81526004810186905260248101859052604401610ca3565b845f036121b857505f90506001611abe565b8460ff84168501858112156121f35760405163c849483b60e01b8152600481018890526024810187905260ff86166044820152606401610ca3565b5f805f83121561223f57604c19831215612216575f809550955050505050611abe565b825f03600a0a915081848161222d5761222d6124b6565b0495505084029091149150611abe9050565b5f8313156122d857604d83131561227c5760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610ca3565b82600a0a9150815f1981612292576122926124b6565b048411156122c65760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610ca3565b5091909102925060019150611abe9050565b8360019550955050505050611abe565b6122f0612500565b565b5f60208284031215612302575f80fd5b81356001600160e01b031981168114612319575f80fd5b9392505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6123196020830184612320565b634e487b7160e01b5f52604160045260245ffd5b5f60208284031215612384575f80fd5b81356001600160401b038082111561239a575f80fd5b818401915084601f8301126123ad575f80fd5b8135818111156123bf576123bf612360565b604051601f8201601f19908116603f011681019083821181831017156123e7576123e7612360565b816040528281528760208487010111156123ff575f80fd5b826020860160208301375f928101602001929092525095945050505050565b83151581525f60206060602084015261243a6060840186612320565b8381036040850152845180825260208087019201905f5b8181101561246d57835183529284019291840191600101612451565b509098975050505050505050565b634e487b7160e01b5f52601160045260245ffd5b808201808211156101d1576101d161247b565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601260045260245ffd5b5f826124e457634e487b7160e01b5f52601260045260245ffd5b500490565b80820281158282048414176101d1576101d161247b565b634e487b7160e01b5f52605160045260245ffdfe1bec1bec1bec1bec1bec1bec1bec1bec1bec1bec1bec1bec1bec1bec1bec1bec1bec1c151cb11bec1bec1bec1bec1bec1bec1bec1bec1bec1bec1bec1bec1bec16cc16e916f8170717161726173517451754176417741783179317a217b217c217d217e117f016cc16f8170717161825183516cc16f8170717161825183518450101180010800082000100010480300038412a001810000010020004200004002038038ff54900cc66c61ff3dcab0616592209895f0b16fec9301b02e0920c5bfe561d21609201e959460b1974270f844db208bcd3bf1e989376111049db13b934301a0ae9a00af82a7805c138f40d28083f0742ef2104d561fd1415a13317716a6119d260cc107b9bfc0eec7ade15cba2891c6b14a512792bdb02e0f14718565589"; + hex"6080604052348015600e575f80fd5b506127e68061001c5f395ff3fe608060405234801561000f575f80fd5b506004361061007a575f3560e01c80636f5aa28d116100585780636f5aa28d146100dd578063c6c0cbb61461010b578063ccf4477514610135578063d6d8c9a814610148575f80fd5b806301ffc9a71461007e578063336284d4146100a6578063570c7a63146100bb575b5f80fd5b61009161008c366004612499565b610150565b60405190151581526020015b60405180910390f35b6100ae6101d7565b60405161009d91906124f5565b6100ce6100c936600461251b565b610c8c565b60405161009d939291906125c5565b6040517f828494fa15dec168f2372c71a11064dc163f7783fb7f3a9a84df40a87861a368815260200161009d565b61011e61011936600461251b565b610dd0565b60408051921515835260208301919091520161009d565b60408051602081019091525f81526100ae565b6100ae610e08565b5f6001600160e01b031982166391ccb1d560e01b148061018057506001600160e01b03198216636f5aa28d60e01b145b8061019b57506001600160e01b03198216631a2c8edd60e01b145b806101b657506001600160e01b03198216630cd8a13560e21b145b806101d157506301ffc9a760e01b6001600160e01b03198316145b92915050565b60605f6101e660046001612636565b6101f1906003612636565b6101fc906001612636565b610207906001612636565b6001600160401b0381111561021e5761021e612507565b60405190808252806020026020018201604052801561025157816020015b606081526020019060019003908161023c5790505b50604080516002808252606082019092529192505f9190816020015b61248f81526020019060019003908161026d579050509050611843815f8151811061029a5761029a612649565b60200260200101906001600160401b031690816001600160401b031681525050611860816001815181106102d0576102d0612649565b6001600160401b039290921660209283029190910190910152604080516003808252608082019092525f91816020015b61248f81526020019060019003908161030057905050905061186f815f8151811061032d5761032d612649565b60200260200101906001600160401b031690816001600160401b03168152505061187e8160018151811061036357610363612649565b60200260200101906001600160401b031690816001600160401b03168152505061188d8160028151811061039957610399612649565b6001600160401b039290921660209283029190910190910152604080516002808252606082019092525f91816020015b61248f8152602001906001900390816103c957905050905061189d815f815181106103f6576103f6612649565b60200260200101906001600160401b031690816001600160401b0316815250506118ac8160018151811061042c5761042c612649565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b61248f81526020019060019003908161045c5790505090506118bc815f8151811061048957610489612649565b60200260200101906001600160401b031690816001600160401b0316815250506118cb816001815181106104bf576104bf612649565b60200260200101906001600160401b031690816001600160401b0316815250506118db816002815181106104f5576104f5612649565b60200260200101906001600160401b031690816001600160401b0316815250506118eb8160038151811061052b5761052b612649565b60200260200101906001600160401b031690816001600160401b0316815250506118fa8160048151811061056157610561612649565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b61248f81526020019060019003908161059157905050905061190a815f815181106105be576105be612649565b60200260200101906001600160401b031690816001600160401b031681525050611919816001815181106105f4576105f4612649565b60200260200101906001600160401b031690816001600160401b0316815250506119298160028151811061062a5761062a612649565b60200260200101906001600160401b031690816001600160401b0316815250506119398160038151811061066057610660612649565b60200260200101906001600160401b031690816001600160401b0316815250506119498160048151811061069657610696612649565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b61248f8152602001906001900390816106c5579050509050611958815f815181106106f2576106f2612649565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b61248f815260200190600190039081610721579050509050611967815f8151811061074e5761074e612649565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b61248f81526020019060019003908161077d579050509050611980815f815181106107aa576107aa612649565b60200260200101906001600160401b031690816001600160401b03168152505087895f815181106107dd576107dd612649565b602002602001018190525086896001815181106107fc576107fc612649565b6020026020010181905250858960028151811061081b5761081b612649565b6020026020010181905250848960038151811061083a5761083a612649565b6020026020010181905250838960048151811061085957610859612649565b6020026020010181905250828960058151811061087857610878612649565b6020908102919091010152818961089160056001612636565b815181106108a1576108a1612649565b602090810291909101015280896108ba60056001612636565b6108c5906001612636565b815181106108d5576108d5612649565b602090810291909101015260408051600680825260e082019092525f91816020015b61248f8152602001906001900390816108f7579050509050611843815f8151811061092457610924612649565b60200260200101906001600160401b031690816001600160401b03168152505061186f8160018151811061095a5761095a612649565b60200260200101906001600160401b031690816001600160401b03168152505061187e8160028151811061099057610990612649565b60200260200101906001600160401b031690816001600160401b03168152505061188d816003815181106109c6576109c6612649565b60200260200101906001600160401b031690816001600160401b0316815250506119cc816004815181106109fc576109fc612649565b60200260200101906001600160401b031690816001600160401b0316815250506119dc81600581518110610a3257610a32612649565b6001600160401b0390921660209283029190910190910152808a610a5860056001612636565b610a63906001612636565b610a6e906001612636565b81518110610a7e57610a7e612649565b602090810291909101015260408051600780825261010082019092525f91816020015b61248f815260200190600190039081610aa1579050509050611843815f81518110610ace57610ace612649565b60200260200101906001600160401b031690816001600160401b03168152505061186f81600181518110610b0457610b04612649565b60200260200101906001600160401b031690816001600160401b03168152505061187e81600281518110610b3a57610b3a612649565b60200260200101906001600160401b031690816001600160401b03168152505061188d81600381518110610b7057610b70612649565b60200260200101906001600160401b031690816001600160401b0316815250506119cc81600481518110610ba657610ba6612649565b60200260200101906001600160401b031690816001600160401b0316815250506119dc81600581518110610bdc57610bdc612649565b60200260200101906001600160401b031690816001600160401b0316815250506119ec81600681518110610c1257610c12612649565b6001600160401b0390921660209283029190910190910152808b610c3860056001612636565b610c43906001612636565b610c4e906002612636565b81518110610c5e57610c5e612649565b60209081029190910101528a610c7b610c76826119fc565b611a11565b9c5050505050505050505050505090565b5f6060805f805f610cac87610c9f611aa0565b610ca7611ac0565b611ae0565b9250925092505f610cc282610220015160200190565b90505f8261022001515182610cd79190612636565b90505f610cf583836f07fffffe0000000003ff200000000000611bd1565b80925081945050505f80610d0e86610240015184611c6d565b915091508115610da3575f610d238783611d44565b905061248f5f610d31611d73565b90505f60028251610d429190612671565b9050808510610d73576040516303bdd1b160e51b815260048101869052602481018290526044015b60405180910390fd5b6001850160020282015161ffff169250610d8c8c8c8686565b9e509e509e50505050505050505050505050610dc9565b5050604080515f80825281830190925260208101828152919a5090985096505050505050505b9193909250565b5f805f805f610df8866002810151815160228084019461ffff93909316840101920160200190565b505f988998509650505050505050565b60605f610e1760046001612636565b610e22906003612636565b610e2d906001612636565b610e38906001612636565b6001600160401b03811115610e4f57610e4f612507565b604051908082528060200260200182016040528015610e8257816020015b6060815260200190600190039081610e6d5790505b50604080516002808252606082019092529192505f9190816020015b61248f815260200190600190039081610e9e579050509050611d93815f81518110610ecb57610ecb612649565b60200260200101906001600160401b031690816001600160401b031681525050611d9381600181518110610f0157610f01612649565b6001600160401b039290921660209283029190910190910152604080516003808252608082019092525f91816020015b61248f815260200190600190039081610f31579050509050611d93815f81518110610f5e57610f5e612649565b60200260200101906001600160401b031690816001600160401b031681525050611d9381600181518110610f9457610f94612649565b60200260200101906001600160401b031690816001600160401b031681525050611d9381600281518110610fca57610fca612649565b6001600160401b039290921660209283029190910190910152604080516002808252606082019092525f91816020015b61248f815260200190600190039081610ffa579050509050611d93815f8151811061102757611027612649565b60200260200101906001600160401b031690816001600160401b031681525050611d938160018151811061105d5761105d612649565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b61248f81526020019060019003908161108d579050509050611d93815f815181106110ba576110ba612649565b60200260200101906001600160401b031690816001600160401b031681525050611d93816001815181106110f0576110f0612649565b60200260200101906001600160401b031690816001600160401b031681525050611d938160028151811061112657611126612649565b60200260200101906001600160401b031690816001600160401b031681525050611d938160038151811061115c5761115c612649565b60200260200101906001600160401b031690816001600160401b031681525050611d938160048151811061119257611192612649565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b61248f8152602001906001900390816111c2579050509050611d93815f815181106111ef576111ef612649565b60200260200101906001600160401b031690816001600160401b031681525050611d938160018151811061122557611225612649565b60200260200101906001600160401b031690816001600160401b031681525050611d938160028151811061125b5761125b612649565b60200260200101906001600160401b031690816001600160401b031681525050611d938160038151811061129157611291612649565b60200260200101906001600160401b031690816001600160401b031681525050611d93816004815181106112c7576112c7612649565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b61248f8152602001906001900390816112f6579050509050611dbc815f8151811061132357611323612649565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b61248f815260200190600190039081611352579050509050611dbc815f8151811061137f5761137f612649565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b61248f8152602001906001900390816113ae579050509050611e58815f815181106113db576113db612649565b60200260200101906001600160401b031690816001600160401b03168152505087895f8151811061140e5761140e612649565b6020026020010181905250868960018151811061142d5761142d612649565b6020026020010181905250858960028151811061144c5761144c612649565b6020026020010181905250848960038151811061146b5761146b612649565b6020026020010181905250838960048151811061148a5761148a612649565b602002602001018190525082896005815181106114a9576114a9612649565b602090810291909101015281896114c260056001612636565b815181106114d2576114d2612649565b602090810291909101015280896114eb60056001612636565b6114f6906001612636565b8151811061150657611506612649565b602090810291909101015260408051600680825260e082019092525f91816020015b61248f815260200190600190039081611528579050509050611d93815f8151811061155557611555612649565b60200260200101906001600160401b031690816001600160401b031681525050611d938160018151811061158b5761158b612649565b60200260200101906001600160401b031690816001600160401b031681525050611d93816002815181106115c1576115c1612649565b60200260200101906001600160401b031690816001600160401b031681525050611d93816003815181106115f7576115f7612649565b60200260200101906001600160401b031690816001600160401b031681525050611d938160048151811061162d5761162d612649565b60200260200101906001600160401b031690816001600160401b031681525050611d938160058151811061166357611663612649565b6001600160401b0390921660209283029190910190910152808a61168960056001612636565b611694906001612636565b61169f906001612636565b815181106116af576116af612649565b602090810291909101015260408051600780825261010082019092525f91816020015b61248f8152602001906001900390816116d2579050509050611d93815f815181106116ff576116ff612649565b60200260200101906001600160401b031690816001600160401b031681525050611d938160018151811061173557611735612649565b60200260200101906001600160401b031690816001600160401b031681525050611d938160028151811061176b5761176b612649565b60200260200101906001600160401b031690816001600160401b031681525050611d93816003815181106117a1576117a1612649565b60200260200101906001600160401b031690816001600160401b031681525050611d93816004815181106117d7576117d7612649565b60200260200101906001600160401b031690816001600160401b031681525050611d938160058151811061180d5761180d612649565b60200260200101906001600160401b031690816001600160401b031681525050611d9381600681518110610c1257610c12612649565b5f6060806118515f80611f10565b92509250925093509350939050565b5f6060806118515f6001611f10565b5f60608061185160015f611f10565b5f606080611851600180611f10565b5f60608061185160016002611f10565b5f60608061185160025f611f10565b5f60608061185160026001611f10565b5f60608061185160035f611f10565b5f60608061185160036001611f10565b5f60608061185160036002611f10565b5f606080611851600380611f10565b5f60608061185160036004611f10565b5f60608061185160045f611f10565b5f60608061185160046001611f10565b5f60608061185160046002611f10565b5f60608061185160046003611f10565b5f606080611851600480611f10565b5f606080611851600585611f10565b5f60608061185161197a60056001612636565b85611f10565b5f60608060ff80851690600886901c166119bb826119a060056001612636565b6119ab906001612636565b6119b59190612636565b82611f10565b945094509450505093509350939050565b5f60608061185160016003611f10565b5f60608061185160016004611f10565b5f60608061185160016005611f10565b6060815f611a0982611f92565b949350505050565b60605f82516002026001600160401b03811115611a3057611a30612507565b6040519080825280601f01601f191660200182016040528015611a5a576020820181803683370190505b50905061ffff80196020850160208651028101600285015b81831015611a9457805183518616908516178152602090920191600201611a72565b50939695505050505050565b60606040518060e0016040528060a6815260200161274060a69139905090565b60606040518060800160405280604281526020016126bc60429139905090565b5f80611b6f6040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020016060815260200160608152602001606081526020015f815260200160608152602001606081525090565b606061ffff600288015116935060ff600388015116925061ffff600588015116600588019750808852602081018801915050611bbb87878760405180602001604052805f815250612000565b915080826101e001819052505093509350939050565b5f808060018187870360208111611be85780611beb565b60205b915050875192505b8519600184841a1b16158183101615611c1157600182019150611bf3565b9681019660208290036008810293841c90931b92611c5c5760408051602081018590520160408051601f198184030181529082905263e47fe8b760e01b8252610d6a916004016124f5565b50869350909150505b935093915050565b600182810180515f928392600560ff93909316602102870192830192909101835b81831015611d325760018301516021909301805190935f90819060ff168180611cb7838e6121b1565b915091508186165f03611cd9575f809b509b5050505050505050505050611d3d565b5f87611ce96001850389166121dc565b016004028b015195505062ffffff9081169350841683039150611d1d9050575060019750601c1a9550611d3d945050505050565b611d26836121dc565b84019350505050611c8e565b5f8095509550505050505b9250929050565b6101c08201516002828102820101516101e08401515f9261ffff9092169190611d6a9083565b95945050505050565b60606040518060800160405280604281526020016126fe60429139905090565b5f81515f14611db5576040516304f8b58160e51b815260040160405180910390fd5b505f919050565b5f8151600103611e19575060208101516001600160e01b038116601b0b60e082901d5f611dea838383612295565b905061ffff811115611e0f57604051631e4e01d760e21b815260040160405180910390fd5b9250611e53915050565b81515f03611e3a57604051630f16066b60e41b815260040160405180910390fd5b604051630358cd2160e31b815260040160405180910390fd5b919050565b5f8151600203611eed57602082015160408301516001600160e01b038216601b0b60e083901d5f611e8a838383612295565b6001600160e01b038516601b0b935060e085901d925090505f611eae848483612295565b905060ff821180611ebf575060ff81115b15611edd57604051631e4e01d760e21b815260040160405180910390fd5b60081b179450611e539350505050565b600282511015611e3a57604051630f16066b60e41b815260040160405180910390fd5b5f60608060ff851180611f23575060ff84115b15611f4b57604051639b0f326160e01b81526004810186905260248101859052604401610d6a565b6040805160248101909152600386602383015385602283015360106021830153806020830153506004815260408051602081019091525f8152600197919650945092505050565b60605f611f9e836122d7565b90505f611fac826020612690565b9050606060405190508160200181016040528281526020850160208651028101602083015b81831015611ff457602083515102806020855101835e6020939093019201611fd1565b50919695505050505050565b61208d6040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020016060815260200160608152602001606081526020015f815260200160608152602001606081525090565b5f6040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f801b81526020015f8152602001600481526020015f81526020015f81526020015f81526020015f801b815260200184815260200185815260200160046001600160401b0381111561211257612112612507565b60405190808252806020026020018201604052801561213b578160200160208202803683370190505b5081525f602080830182905260408084018b905260609384018a90528051601f01601f19168281528083018252835161ffff191681178452855290840182905283018190529082018190526080820181905260a08201819052610120820181905261014082018190526102008201529050611d6a565b5f80825f528360205360215f2090506001815f1a1b915062ffffff8116611d3d575060019250929050565b5f5f1982036121ee5750610100919050565b507f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f7f5555555555555555555555555555555555555555555555555555555555555555600183901c16909103600281901c7f3333333333333333333333333333333333333333333333333333333333333333908116911601600481901c01167f01010101010101010101010101010101010101010101010101010101010101010260f81c90565b5f805f6122a3868686612320565b91509150806122ce5760405162bc8ecf60e31b81526004810187905260248101869052604401610d6a565b50949350505050565b5f60208201602083510281015b8082101561231957815151928301928084101561230d57634e487b715f5260116020526024601cfd5b506020820191506122e4565b5050919050565b5f805f85121561234d57604051634a7d166b60e01b81526004810186905260248101859052604401610d6a565b845f0361235f57505f90506001611c65565b8460ff841685018581121561239a5760405163c849483b60e01b8152600481018890526024810187905260ff86166044820152606401610d6a565b5f805f8312156123e657604c198312156123bd575f809550955050505050611c65565b825f03600a0a91508184816123d4576123d461265d565b0495505084029091149150611c659050565b5f83131561247f57604d8313156124235760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610d6a565b82600a0a9150815f19816124395761243961265d565b0484111561246d5760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610d6a565b5091909102925060019150611c659050565b8360019550955050505050611c65565b6124976126a7565b565b5f602082840312156124a9575f80fd5b81356001600160e01b0319811681146124c0575f80fd5b9392505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6124c060208301846124c7565b634e487b7160e01b5f52604160045260245ffd5b5f6020828403121561252b575f80fd5b81356001600160401b0380821115612541575f80fd5b818401915084601f830112612554575f80fd5b81358181111561256657612566612507565b604051601f8201601f19908116603f0116810190838211818310171561258e5761258e612507565b816040528281528760208487010111156125a6575f80fd5b826020860160208301375f928101602001929092525095945050505050565b83151581525f6020606060208401526125e160608401866124c7565b8381036040850152845180825260208087019201905f5b81811015612614578351835292840192918401916001016125f8565b509098975050505050505050565b634e487b7160e01b5f52601160045260245ffd5b808201808211156101d1576101d1612622565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601260045260245ffd5b5f8261268b57634e487b7160e01b5f52601260045260245ffd5b500490565b80820281158282048414176101d1576101d1612622565b634e487b7160e01b5f52605160045260245ffdfe1d931d931d931d931d931d931d931d931d931d931d931d931d931d931d931d931d931dbc1dbc1e581d931d931d931d931d931d931d931d931d931d931d931d931d9318431860186f187e188d189d18ac18bc18cb18db18eb18fa190a19191929193919491958196719801843186f187e188d19cc19dc1843186f187e188d19cc19dc19ec0101180010800082000100010480300038412a001810000010020004200005002038038ff54900cc66c620f3dcab0616592212c9ec8109895f0b17fec9301c02e0920c5bfe561e21609201e959460b1974270f844db208bcd3bf1f989376111049db14b934301b0ae9a00af82a7805c138f40d28083f0742ef2104d561fd1515a13318716a611ad260cc107b9bfc0eec7ade16cba2891d6b14a513792bdb02e0f14719565589"; /// @dev The runtime bytecode of the contract. bytes constant RUNTIME_CODE = - hex"608060405234801561000f575f80fd5b506004361061007a575f3560e01c80636f5aa28d116100585780636f5aa28d146100dd578063c6c0cbb61461010b578063ccf4477514610135578063d6d8c9a814610148575f80fd5b806301ffc9a71461007e578063336284d4146100a6578063570c7a63146100bb575b5f80fd5b61009161008c3660046122f2565b610150565b60405190151581526020015b60405180910390f35b6100ae6101d7565b60405161009d919061234e565b6100ce6100c9366004612374565b610bc5565b60405161009d9392919061241e565b6040517ff2d0eca454c544ab10f9991c019349475a416e38494f112a50807174c3000d0b815260200161009d565b61011e610119366004612374565b610d09565b60408051921515835260208301919091520161009d565b60408051602081019091525f81526100ae565b6100ae610d41565b5f6001600160e01b031982166391ccb1d560e01b148061018057506001600160e01b03198216636f5aa28d60e01b145b8061019b57506001600160e01b03198216631a2c8edd60e01b145b806101b657506001600160e01b03198216630cd8a13560e21b145b806101d157506301ffc9a760e01b6001600160e01b03198316145b92915050565b60605f6101e66004600161248f565b6101f190600261248f565b6101fc90600161248f565b61020790600161248f565b6001600160401b0381111561021e5761021e612360565b60405190808252806020026020018201604052801561025157816020015b606081526020019060019003908161023c5790505b50604080516002808252606082019092529192505f9190816020015b6122e881526020019060019003908161026d5790505090506116cc815f8151811061029a5761029a6124a2565b60200260200101906001600160401b031690816001600160401b0316815250506116e9816001815181106102d0576102d06124a2565b6001600160401b039290921660209283029190910190910152604080516003808252608082019092525f91816020015b6122e88152602001906001900390816103005790505090506116f8815f8151811061032d5761032d6124a2565b60200260200101906001600160401b031690816001600160401b03168152505061170781600181518110610363576103636124a2565b60200260200101906001600160401b031690816001600160401b03168152505061171681600281518110610399576103996124a2565b6001600160401b039290921660209283029190910190910152604080516002808252606082019092525f91816020015b6122e88152602001906001900390816103c9579050509050611726815f815181106103f6576103f66124a2565b60200260200101906001600160401b031690816001600160401b0316815250506117358160018151811061042c5761042c6124a2565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b6122e881526020019060019003908161045c579050509050611745815f81518110610489576104896124a2565b60200260200101906001600160401b031690816001600160401b031681525050611754816001815181106104bf576104bf6124a2565b60200260200101906001600160401b031690816001600160401b031681525050611764816002815181106104f5576104f56124a2565b60200260200101906001600160401b031690816001600160401b0316815250506117748160038151811061052b5761052b6124a2565b60200260200101906001600160401b031690816001600160401b03168152505061178381600481518110610561576105616124a2565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b6122e8815260200190600190039081610591579050509050611793815f815181106105be576105be6124a2565b60200260200101906001600160401b031690816001600160401b0316815250506117a2816001815181106105f4576105f46124a2565b60200260200101906001600160401b031690816001600160401b0316815250506117b28160028151811061062a5761062a6124a2565b60200260200101906001600160401b031690816001600160401b0316815250506117c281600381518110610660576106606124a2565b60200260200101906001600160401b031690816001600160401b0316815250506117d281600481518110610696576106966124a2565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6122e88152602001906001900390816106c55790505090506117e1815f815181106106f2576106f26124a2565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6122e88152602001906001900390816107215790505090506117f0815f8151811061074e5761074e6124a2565b60200260200101906001600160401b031690816001600160401b03168152505086885f81518110610781576107816124a2565b602002602001018190525085886001815181106107a0576107a06124a2565b602002602001018190525084886002815181106107bf576107bf6124a2565b602002602001018190525083886003815181106107de576107de6124a2565b602002602001018190525082886004815181106107fd576107fd6124a2565b6020026020010181905250818860058151811061081c5761081c6124a2565b6020026020010181905250808860068151811061083b5761083b6124a2565b602090810291909101015260408051600680825260e082019092525f91816020015b6122e881526020019060019003908161085d5790505090506116cc815f8151811061088a5761088a6124a2565b60200260200101906001600160401b031690816001600160401b0316815250506116f8816001815181106108c0576108c06124a2565b60200260200101906001600160401b031690816001600160401b031681525050611707816002815181106108f6576108f66124a2565b60200260200101906001600160401b031690816001600160401b0316815250506117168160038151811061092c5761092c6124a2565b60200260200101906001600160401b031690816001600160401b03168152505061182581600481518110610962576109626124a2565b60200260200101906001600160401b031690816001600160401b03168152505061183581600581518110610998576109986124a2565b6001600160401b039092166020928302919091019091015280896109be6006600161248f565b815181106109ce576109ce6124a2565b602090810291909101015260408051600780825261010082019092525f91816020015b6122e88152602001906001900390816109f15790505090506116cc815f81518110610a1e57610a1e6124a2565b60200260200101906001600160401b031690816001600160401b0316815250506116f881600181518110610a5457610a546124a2565b60200260200101906001600160401b031690816001600160401b03168152505061170781600281518110610a8a57610a8a6124a2565b60200260200101906001600160401b031690816001600160401b03168152505061171681600381518110610ac057610ac06124a2565b60200260200101906001600160401b031690816001600160401b03168152505061182581600481518110610af657610af66124a2565b60200260200101906001600160401b031690816001600160401b03168152505061183581600581518110610b2c57610b2c6124a2565b60200260200101906001600160401b031690816001600160401b03168152505061184581600681518110610b6257610b626124a2565b6001600160401b0390921660209283029190910190910152808a610b886006600261248f565b81518110610b9857610b986124a2565b602090810291909101015289610bb5610bb082611855565b61186a565b9b50505050505050505050505090565b5f6060805f805f610be587610bd86118f9565b610be0611919565b611939565b9250925092505f610bfb82610220015160200190565b90505f8261022001515182610c10919061248f565b90505f610c2e83836f07fffffe0000000003ff200000000000611a2a565b80925081945050505f80610c4786610240015184611ac6565b915091508115610cdc575f610c5c8783611b9d565b90506122e85f610c6a611bcc565b90505f60028251610c7b91906124ca565b9050808510610cac576040516303bdd1b160e51b815260048101869052602481018290526044015b60405180910390fd5b6001850160020282015161ffff169250610cc58c8c8686565b9e509e509e50505050505050505050505050610d02565b5050604080515f80825281830190925260208101828152919a5090985096505050505050505b9193909250565b5f805f805f610d31866002810151815160228084019461ffff93909316840101920160200190565b505f988998509650505050505050565b60605f610d506004600161248f565b610d5b90600261248f565b610d6690600161248f565b610d7190600161248f565b6001600160401b03811115610d8857610d88612360565b604051908082528060200260200182016040528015610dbb57816020015b6060815260200190600190039081610da65790505b50604080516002808252606082019092529192505f9190816020015b6122e8815260200190600190039081610dd7579050509050611bec815f81518110610e0457610e046124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec81600181518110610e3a57610e3a6124a2565b6001600160401b039290921660209283029190910190910152604080516003808252608082019092525f91816020015b6122e8815260200190600190039081610e6a579050509050611bec815f81518110610e9757610e976124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec81600181518110610ecd57610ecd6124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec81600281518110610f0357610f036124a2565b6001600160401b039290921660209283029190910190910152604080516002808252606082019092525f91816020015b6122e8815260200190600190039081610f33579050509050611bec815f81518110610f6057610f606124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec81600181518110610f9657610f966124a2565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b6122e8815260200190600190039081610fc6579050509050611bec815f81518110610ff357610ff36124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec81600181518110611029576110296124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec8160028151811061105f5761105f6124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec81600381518110611095576110956124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec816004815181106110cb576110cb6124a2565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b6122e88152602001906001900390816110fb579050509050611bec815f81518110611128576111286124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec8160018151811061115e5761115e6124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec81600281518110611194576111946124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec816003815181106111ca576111ca6124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec81600481518110611200576112006124a2565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6122e881526020019060019003908161122f579050509050611c15815f8151811061125c5761125c6124a2565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6122e881526020019060019003908161128b579050509050611cb1815f815181106112b8576112b86124a2565b60200260200101906001600160401b031690816001600160401b03168152505086885f815181106112eb576112eb6124a2565b6020026020010181905250858860018151811061130a5761130a6124a2565b60200260200101819052508488600281518110611329576113296124a2565b60200260200101819052508388600381518110611348576113486124a2565b60200260200101819052508288600481518110611367576113676124a2565b60200260200101819052508188600581518110611386576113866124a2565b602002602001018190525080886006815181106113a5576113a56124a2565b602090810291909101015260408051600680825260e082019092525f91816020015b6122e88152602001906001900390816113c7579050509050611bec815f815181106113f4576113f46124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec8160018151811061142a5761142a6124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec81600281518110611460576114606124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec81600381518110611496576114966124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec816004815181106114cc576114cc6124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec81600581518110611502576115026124a2565b6001600160401b039092166020928302919091019091015280896115286006600161248f565b81518110611538576115386124a2565b602090810291909101015260408051600780825261010082019092525f91816020015b6122e881526020019060019003908161155b579050509050611bec815f81518110611588576115886124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec816001815181106115be576115be6124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec816002815181106115f4576115f46124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec8160038151811061162a5761162a6124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec81600481518110611660576116606124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec81600581518110611696576116966124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec81600681518110610b6257610b626124a2565b5f6060806116da5f80611d69565b92509250925093509350939050565b5f6060806116da5f6001611d69565b5f6060806116da60015f611d69565b5f6060806116da600180611d69565b5f6060806116da60016002611d69565b5f6060806116da60025f611d69565b5f6060806116da60026001611d69565b5f6060806116da60035f611d69565b5f6060806116da60036001611d69565b5f6060806116da60036002611d69565b5f6060806116da600380611d69565b5f6060806116da60036004611d69565b5f6060806116da60045f611d69565b5f6060806116da60046001611d69565b5f6060806116da60046002611d69565b5f6060806116da60046003611d69565b5f6060806116da600480611d69565b5f6060806116da600585611d69565b5f60608060ff80851690600886901c1661181461180e83600661248f565b82611d69565b945094509450505093509350939050565b5f6060806116da60016003611d69565b5f6060806116da60016004611d69565b5f6060806116da60016005611d69565b6060815f61186282611deb565b949350505050565b60605f82516002026001600160401b0381111561188957611889612360565b6040519080825280601f01601f1916602001820160405280156118b3576020820181803683370190505b50905061ffff80196020850160208651028101600285015b818310156118ed578051835186169085161781526020909201916002016118cb565b50939695505050505050565b60606040518060e0016040528060a2815260200161259560a29139905090565b606060405180606001604052806040815260200161251560409139905090565b5f806119c86040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020016060815260200160608152602001606081526020015f815260200160608152602001606081525090565b606061ffff600288015116935060ff600388015116925061ffff600588015116600588019750808852602081018801915050611a1487878760405180602001604052805f815250611e59565b915080826101e001819052505093509350939050565b5f808060018187870360208111611a415780611a44565b60205b915050875192505b8519600184841a1b16158183101615611a6a57600182019150611a4c565b9681019660208290036008810293841c90931b92611ab55760408051602081018590520160408051601f198184030181529082905263e47fe8b760e01b8252610ca39160040161234e565b50869350909150505b935093915050565b600182810180515f928392600560ff93909316602102870192830192909101835b81831015611b8b5760018301516021909301805190935f90819060ff168180611b10838e61200a565b915091508186165f03611b32575f809b509b5050505050505050505050611b96565b5f87611b42600185038916612035565b016004028b015195505062ffffff9081169350841683039150611b769050575060019750601c1a9550611b96945050505050565b611b7f83612035565b84019350505050611ae7565b5f8095509550505050505b9250929050565b6101c08201516002828102820101516101e08401515f9261ffff9092169190611bc39083565b95945050505050565b606060405180606001604052806040815260200161255560409139905090565b5f81515f14611c0e576040516304f8b58160e51b815260040160405180910390fd5b505f919050565b5f8151600103611c72575060208101516001600160e01b038116601b0b60e082901d5f611c438383836120ee565b905061ffff811115611c6857604051631e4e01d760e21b815260040160405180910390fd5b9250611cac915050565b81515f03611c9357604051630f16066b60e41b815260040160405180910390fd5b604051630358cd2160e31b815260040160405180910390fd5b919050565b5f8151600203611d4657602082015160408301516001600160e01b038216601b0b60e083901d5f611ce38383836120ee565b6001600160e01b038516601b0b935060e085901d925090505f611d078484836120ee565b905060ff821180611d18575060ff81115b15611d3657604051631e4e01d760e21b815260040160405180910390fd5b60081b179450611cac9350505050565b600282511015611c9357604051630f16066b60e41b815260040160405180910390fd5b5f60608060ff851180611d7c575060ff84115b15611da457604051639b0f326160e01b81526004810186905260248101859052604401610ca3565b6040805160248101909152600386602383015385602283015360106021830153806020830153506004815260408051602081019091525f8152600197919650945092505050565b60605f611df783612130565b90505f611e058260206124e9565b9050606060405190508160200181016040528281526020850160208651028101602083015b81831015611e4d57602083515102806020855101835e6020939093019201611e2a565b50919695505050505050565b611ee66040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020016060815260200160608152602001606081526020015f815260200160608152602001606081525090565b5f6040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f801b81526020015f8152602001600481526020015f81526020015f81526020015f81526020015f801b815260200184815260200185815260200160046001600160401b03811115611f6b57611f6b612360565b604051908082528060200260200182016040528015611f94578160200160208202803683370190505b5081525f602080830182905260408084018b905260609384018a90528051601f01601f19168281528083018252835161ffff191681178452855290840182905283018190529082018190526080820181905260a08201819052610120820181905261014082018190526102008201529050611bc3565b5f80825f528360205360215f2090506001815f1a1b915062ffffff8116611b96575060019250929050565b5f5f1982036120475750610100919050565b507f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f7f5555555555555555555555555555555555555555555555555555555555555555600183901c16909103600281901c7f3333333333333333333333333333333333333333333333333333333333333333908116911601600481901c01167f01010101010101010101010101010101010101010101010101010101010101010260f81c90565b5f805f6120fc868686612179565b91509150806121275760405162bc8ecf60e31b81526004810187905260248101869052604401610ca3565b50949350505050565b5f60208201602083510281015b8082101561217257815151928301928084101561216657634e487b715f5260116020526024601cfd5b5060208201915061213d565b5050919050565b5f805f8512156121a657604051634a7d166b60e01b81526004810186905260248101859052604401610ca3565b845f036121b857505f90506001611abe565b8460ff84168501858112156121f35760405163c849483b60e01b8152600481018890526024810187905260ff86166044820152606401610ca3565b5f805f83121561223f57604c19831215612216575f809550955050505050611abe565b825f03600a0a915081848161222d5761222d6124b6565b0495505084029091149150611abe9050565b5f8313156122d857604d83131561227c5760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610ca3565b82600a0a9150815f1981612292576122926124b6565b048411156122c65760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610ca3565b5091909102925060019150611abe9050565b8360019550955050505050611abe565b6122f0612500565b565b5f60208284031215612302575f80fd5b81356001600160e01b031981168114612319575f80fd5b9392505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6123196020830184612320565b634e487b7160e01b5f52604160045260245ffd5b5f60208284031215612384575f80fd5b81356001600160401b038082111561239a575f80fd5b818401915084601f8301126123ad575f80fd5b8135818111156123bf576123bf612360565b604051601f8201601f19908116603f011681019083821181831017156123e7576123e7612360565b816040528281528760208487010111156123ff575f80fd5b826020860160208301375f928101602001929092525095945050505050565b83151581525f60206060602084015261243a6060840186612320565b8381036040850152845180825260208087019201905f5b8181101561246d57835183529284019291840191600101612451565b509098975050505050505050565b634e487b7160e01b5f52601160045260245ffd5b808201808211156101d1576101d161247b565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601260045260245ffd5b5f826124e457634e487b7160e01b5f52601260045260245ffd5b500490565b80820281158282048414176101d1576101d161247b565b634e487b7160e01b5f52605160045260245ffdfe1bec1bec1bec1bec1bec1bec1bec1bec1bec1bec1bec1bec1bec1bec1bec1bec1bec1c151cb11bec1bec1bec1bec1bec1bec1bec1bec1bec1bec1bec1bec1bec16cc16e916f8170717161726173517451754176417741783179317a217b217c217d217e117f016cc16f8170717161825183516cc16f8170717161825183518450101180010800082000100010480300038412a001810000010020004200004002038038ff54900cc66c61ff3dcab0616592209895f0b16fec9301b02e0920c5bfe561d21609201e959460b1974270f844db208bcd3bf1e989376111049db13b934301a0ae9a00af82a7805c138f40d28083f0742ef2104d561fd1415a13317716a6119d260cc107b9bfc0eec7ade15cba2891c6b14a512792bdb02e0f14718565589"; + hex"608060405234801561000f575f80fd5b506004361061007a575f3560e01c80636f5aa28d116100585780636f5aa28d146100dd578063c6c0cbb61461010b578063ccf4477514610135578063d6d8c9a814610148575f80fd5b806301ffc9a71461007e578063336284d4146100a6578063570c7a63146100bb575b5f80fd5b61009161008c366004612499565b610150565b60405190151581526020015b60405180910390f35b6100ae6101d7565b60405161009d91906124f5565b6100ce6100c936600461251b565b610c8c565b60405161009d939291906125c5565b6040517f828494fa15dec168f2372c71a11064dc163f7783fb7f3a9a84df40a87861a368815260200161009d565b61011e61011936600461251b565b610dd0565b60408051921515835260208301919091520161009d565b60408051602081019091525f81526100ae565b6100ae610e08565b5f6001600160e01b031982166391ccb1d560e01b148061018057506001600160e01b03198216636f5aa28d60e01b145b8061019b57506001600160e01b03198216631a2c8edd60e01b145b806101b657506001600160e01b03198216630cd8a13560e21b145b806101d157506301ffc9a760e01b6001600160e01b03198316145b92915050565b60605f6101e660046001612636565b6101f1906003612636565b6101fc906001612636565b610207906001612636565b6001600160401b0381111561021e5761021e612507565b60405190808252806020026020018201604052801561025157816020015b606081526020019060019003908161023c5790505b50604080516002808252606082019092529192505f9190816020015b61248f81526020019060019003908161026d579050509050611843815f8151811061029a5761029a612649565b60200260200101906001600160401b031690816001600160401b031681525050611860816001815181106102d0576102d0612649565b6001600160401b039290921660209283029190910190910152604080516003808252608082019092525f91816020015b61248f81526020019060019003908161030057905050905061186f815f8151811061032d5761032d612649565b60200260200101906001600160401b031690816001600160401b03168152505061187e8160018151811061036357610363612649565b60200260200101906001600160401b031690816001600160401b03168152505061188d8160028151811061039957610399612649565b6001600160401b039290921660209283029190910190910152604080516002808252606082019092525f91816020015b61248f8152602001906001900390816103c957905050905061189d815f815181106103f6576103f6612649565b60200260200101906001600160401b031690816001600160401b0316815250506118ac8160018151811061042c5761042c612649565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b61248f81526020019060019003908161045c5790505090506118bc815f8151811061048957610489612649565b60200260200101906001600160401b031690816001600160401b0316815250506118cb816001815181106104bf576104bf612649565b60200260200101906001600160401b031690816001600160401b0316815250506118db816002815181106104f5576104f5612649565b60200260200101906001600160401b031690816001600160401b0316815250506118eb8160038151811061052b5761052b612649565b60200260200101906001600160401b031690816001600160401b0316815250506118fa8160048151811061056157610561612649565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b61248f81526020019060019003908161059157905050905061190a815f815181106105be576105be612649565b60200260200101906001600160401b031690816001600160401b031681525050611919816001815181106105f4576105f4612649565b60200260200101906001600160401b031690816001600160401b0316815250506119298160028151811061062a5761062a612649565b60200260200101906001600160401b031690816001600160401b0316815250506119398160038151811061066057610660612649565b60200260200101906001600160401b031690816001600160401b0316815250506119498160048151811061069657610696612649565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b61248f8152602001906001900390816106c5579050509050611958815f815181106106f2576106f2612649565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b61248f815260200190600190039081610721579050509050611967815f8151811061074e5761074e612649565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b61248f81526020019060019003908161077d579050509050611980815f815181106107aa576107aa612649565b60200260200101906001600160401b031690816001600160401b03168152505087895f815181106107dd576107dd612649565b602002602001018190525086896001815181106107fc576107fc612649565b6020026020010181905250858960028151811061081b5761081b612649565b6020026020010181905250848960038151811061083a5761083a612649565b6020026020010181905250838960048151811061085957610859612649565b6020026020010181905250828960058151811061087857610878612649565b6020908102919091010152818961089160056001612636565b815181106108a1576108a1612649565b602090810291909101015280896108ba60056001612636565b6108c5906001612636565b815181106108d5576108d5612649565b602090810291909101015260408051600680825260e082019092525f91816020015b61248f8152602001906001900390816108f7579050509050611843815f8151811061092457610924612649565b60200260200101906001600160401b031690816001600160401b03168152505061186f8160018151811061095a5761095a612649565b60200260200101906001600160401b031690816001600160401b03168152505061187e8160028151811061099057610990612649565b60200260200101906001600160401b031690816001600160401b03168152505061188d816003815181106109c6576109c6612649565b60200260200101906001600160401b031690816001600160401b0316815250506119cc816004815181106109fc576109fc612649565b60200260200101906001600160401b031690816001600160401b0316815250506119dc81600581518110610a3257610a32612649565b6001600160401b0390921660209283029190910190910152808a610a5860056001612636565b610a63906001612636565b610a6e906001612636565b81518110610a7e57610a7e612649565b602090810291909101015260408051600780825261010082019092525f91816020015b61248f815260200190600190039081610aa1579050509050611843815f81518110610ace57610ace612649565b60200260200101906001600160401b031690816001600160401b03168152505061186f81600181518110610b0457610b04612649565b60200260200101906001600160401b031690816001600160401b03168152505061187e81600281518110610b3a57610b3a612649565b60200260200101906001600160401b031690816001600160401b03168152505061188d81600381518110610b7057610b70612649565b60200260200101906001600160401b031690816001600160401b0316815250506119cc81600481518110610ba657610ba6612649565b60200260200101906001600160401b031690816001600160401b0316815250506119dc81600581518110610bdc57610bdc612649565b60200260200101906001600160401b031690816001600160401b0316815250506119ec81600681518110610c1257610c12612649565b6001600160401b0390921660209283029190910190910152808b610c3860056001612636565b610c43906001612636565b610c4e906002612636565b81518110610c5e57610c5e612649565b60209081029190910101528a610c7b610c76826119fc565b611a11565b9c5050505050505050505050505090565b5f6060805f805f610cac87610c9f611aa0565b610ca7611ac0565b611ae0565b9250925092505f610cc282610220015160200190565b90505f8261022001515182610cd79190612636565b90505f610cf583836f07fffffe0000000003ff200000000000611bd1565b80925081945050505f80610d0e86610240015184611c6d565b915091508115610da3575f610d238783611d44565b905061248f5f610d31611d73565b90505f60028251610d429190612671565b9050808510610d73576040516303bdd1b160e51b815260048101869052602481018290526044015b60405180910390fd5b6001850160020282015161ffff169250610d8c8c8c8686565b9e509e509e50505050505050505050505050610dc9565b5050604080515f80825281830190925260208101828152919a5090985096505050505050505b9193909250565b5f805f805f610df8866002810151815160228084019461ffff93909316840101920160200190565b505f988998509650505050505050565b60605f610e1760046001612636565b610e22906003612636565b610e2d906001612636565b610e38906001612636565b6001600160401b03811115610e4f57610e4f612507565b604051908082528060200260200182016040528015610e8257816020015b6060815260200190600190039081610e6d5790505b50604080516002808252606082019092529192505f9190816020015b61248f815260200190600190039081610e9e579050509050611d93815f81518110610ecb57610ecb612649565b60200260200101906001600160401b031690816001600160401b031681525050611d9381600181518110610f0157610f01612649565b6001600160401b039290921660209283029190910190910152604080516003808252608082019092525f91816020015b61248f815260200190600190039081610f31579050509050611d93815f81518110610f5e57610f5e612649565b60200260200101906001600160401b031690816001600160401b031681525050611d9381600181518110610f9457610f94612649565b60200260200101906001600160401b031690816001600160401b031681525050611d9381600281518110610fca57610fca612649565b6001600160401b039290921660209283029190910190910152604080516002808252606082019092525f91816020015b61248f815260200190600190039081610ffa579050509050611d93815f8151811061102757611027612649565b60200260200101906001600160401b031690816001600160401b031681525050611d938160018151811061105d5761105d612649565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b61248f81526020019060019003908161108d579050509050611d93815f815181106110ba576110ba612649565b60200260200101906001600160401b031690816001600160401b031681525050611d93816001815181106110f0576110f0612649565b60200260200101906001600160401b031690816001600160401b031681525050611d938160028151811061112657611126612649565b60200260200101906001600160401b031690816001600160401b031681525050611d938160038151811061115c5761115c612649565b60200260200101906001600160401b031690816001600160401b031681525050611d938160048151811061119257611192612649565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b61248f8152602001906001900390816111c2579050509050611d93815f815181106111ef576111ef612649565b60200260200101906001600160401b031690816001600160401b031681525050611d938160018151811061122557611225612649565b60200260200101906001600160401b031690816001600160401b031681525050611d938160028151811061125b5761125b612649565b60200260200101906001600160401b031690816001600160401b031681525050611d938160038151811061129157611291612649565b60200260200101906001600160401b031690816001600160401b031681525050611d93816004815181106112c7576112c7612649565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b61248f8152602001906001900390816112f6579050509050611dbc815f8151811061132357611323612649565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b61248f815260200190600190039081611352579050509050611dbc815f8151811061137f5761137f612649565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b61248f8152602001906001900390816113ae579050509050611e58815f815181106113db576113db612649565b60200260200101906001600160401b031690816001600160401b03168152505087895f8151811061140e5761140e612649565b6020026020010181905250868960018151811061142d5761142d612649565b6020026020010181905250858960028151811061144c5761144c612649565b6020026020010181905250848960038151811061146b5761146b612649565b6020026020010181905250838960048151811061148a5761148a612649565b602002602001018190525082896005815181106114a9576114a9612649565b602090810291909101015281896114c260056001612636565b815181106114d2576114d2612649565b602090810291909101015280896114eb60056001612636565b6114f6906001612636565b8151811061150657611506612649565b602090810291909101015260408051600680825260e082019092525f91816020015b61248f815260200190600190039081611528579050509050611d93815f8151811061155557611555612649565b60200260200101906001600160401b031690816001600160401b031681525050611d938160018151811061158b5761158b612649565b60200260200101906001600160401b031690816001600160401b031681525050611d93816002815181106115c1576115c1612649565b60200260200101906001600160401b031690816001600160401b031681525050611d93816003815181106115f7576115f7612649565b60200260200101906001600160401b031690816001600160401b031681525050611d938160048151811061162d5761162d612649565b60200260200101906001600160401b031690816001600160401b031681525050611d938160058151811061166357611663612649565b6001600160401b0390921660209283029190910190910152808a61168960056001612636565b611694906001612636565b61169f906001612636565b815181106116af576116af612649565b602090810291909101015260408051600780825261010082019092525f91816020015b61248f8152602001906001900390816116d2579050509050611d93815f815181106116ff576116ff612649565b60200260200101906001600160401b031690816001600160401b031681525050611d938160018151811061173557611735612649565b60200260200101906001600160401b031690816001600160401b031681525050611d938160028151811061176b5761176b612649565b60200260200101906001600160401b031690816001600160401b031681525050611d93816003815181106117a1576117a1612649565b60200260200101906001600160401b031690816001600160401b031681525050611d93816004815181106117d7576117d7612649565b60200260200101906001600160401b031690816001600160401b031681525050611d938160058151811061180d5761180d612649565b60200260200101906001600160401b031690816001600160401b031681525050611d9381600681518110610c1257610c12612649565b5f6060806118515f80611f10565b92509250925093509350939050565b5f6060806118515f6001611f10565b5f60608061185160015f611f10565b5f606080611851600180611f10565b5f60608061185160016002611f10565b5f60608061185160025f611f10565b5f60608061185160026001611f10565b5f60608061185160035f611f10565b5f60608061185160036001611f10565b5f60608061185160036002611f10565b5f606080611851600380611f10565b5f60608061185160036004611f10565b5f60608061185160045f611f10565b5f60608061185160046001611f10565b5f60608061185160046002611f10565b5f60608061185160046003611f10565b5f606080611851600480611f10565b5f606080611851600585611f10565b5f60608061185161197a60056001612636565b85611f10565b5f60608060ff80851690600886901c166119bb826119a060056001612636565b6119ab906001612636565b6119b59190612636565b82611f10565b945094509450505093509350939050565b5f60608061185160016003611f10565b5f60608061185160016004611f10565b5f60608061185160016005611f10565b6060815f611a0982611f92565b949350505050565b60605f82516002026001600160401b03811115611a3057611a30612507565b6040519080825280601f01601f191660200182016040528015611a5a576020820181803683370190505b50905061ffff80196020850160208651028101600285015b81831015611a9457805183518616908516178152602090920191600201611a72565b50939695505050505050565b60606040518060e0016040528060a6815260200161274060a69139905090565b60606040518060800160405280604281526020016126bc60429139905090565b5f80611b6f6040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020016060815260200160608152602001606081526020015f815260200160608152602001606081525090565b606061ffff600288015116935060ff600388015116925061ffff600588015116600588019750808852602081018801915050611bbb87878760405180602001604052805f815250612000565b915080826101e001819052505093509350939050565b5f808060018187870360208111611be85780611beb565b60205b915050875192505b8519600184841a1b16158183101615611c1157600182019150611bf3565b9681019660208290036008810293841c90931b92611c5c5760408051602081018590520160408051601f198184030181529082905263e47fe8b760e01b8252610d6a916004016124f5565b50869350909150505b935093915050565b600182810180515f928392600560ff93909316602102870192830192909101835b81831015611d325760018301516021909301805190935f90819060ff168180611cb7838e6121b1565b915091508186165f03611cd9575f809b509b5050505050505050505050611d3d565b5f87611ce96001850389166121dc565b016004028b015195505062ffffff9081169350841683039150611d1d9050575060019750601c1a9550611d3d945050505050565b611d26836121dc565b84019350505050611c8e565b5f8095509550505050505b9250929050565b6101c08201516002828102820101516101e08401515f9261ffff9092169190611d6a9083565b95945050505050565b60606040518060800160405280604281526020016126fe60429139905090565b5f81515f14611db5576040516304f8b58160e51b815260040160405180910390fd5b505f919050565b5f8151600103611e19575060208101516001600160e01b038116601b0b60e082901d5f611dea838383612295565b905061ffff811115611e0f57604051631e4e01d760e21b815260040160405180910390fd5b9250611e53915050565b81515f03611e3a57604051630f16066b60e41b815260040160405180910390fd5b604051630358cd2160e31b815260040160405180910390fd5b919050565b5f8151600203611eed57602082015160408301516001600160e01b038216601b0b60e083901d5f611e8a838383612295565b6001600160e01b038516601b0b935060e085901d925090505f611eae848483612295565b905060ff821180611ebf575060ff81115b15611edd57604051631e4e01d760e21b815260040160405180910390fd5b60081b179450611e539350505050565b600282511015611e3a57604051630f16066b60e41b815260040160405180910390fd5b5f60608060ff851180611f23575060ff84115b15611f4b57604051639b0f326160e01b81526004810186905260248101859052604401610d6a565b6040805160248101909152600386602383015385602283015360106021830153806020830153506004815260408051602081019091525f8152600197919650945092505050565b60605f611f9e836122d7565b90505f611fac826020612690565b9050606060405190508160200181016040528281526020850160208651028101602083015b81831015611ff457602083515102806020855101835e6020939093019201611fd1565b50919695505050505050565b61208d6040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020016060815260200160608152602001606081526020015f815260200160608152602001606081525090565b5f6040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f801b81526020015f8152602001600481526020015f81526020015f81526020015f81526020015f801b815260200184815260200185815260200160046001600160401b0381111561211257612112612507565b60405190808252806020026020018201604052801561213b578160200160208202803683370190505b5081525f602080830182905260408084018b905260609384018a90528051601f01601f19168281528083018252835161ffff191681178452855290840182905283018190529082018190526080820181905260a08201819052610120820181905261014082018190526102008201529050611d6a565b5f80825f528360205360215f2090506001815f1a1b915062ffffff8116611d3d575060019250929050565b5f5f1982036121ee5750610100919050565b507f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f7f5555555555555555555555555555555555555555555555555555555555555555600183901c16909103600281901c7f3333333333333333333333333333333333333333333333333333333333333333908116911601600481901c01167f01010101010101010101010101010101010101010101010101010101010101010260f81c90565b5f805f6122a3868686612320565b91509150806122ce5760405162bc8ecf60e31b81526004810187905260248101869052604401610d6a565b50949350505050565b5f60208201602083510281015b8082101561231957815151928301928084101561230d57634e487b715f5260116020526024601cfd5b506020820191506122e4565b5050919050565b5f805f85121561234d57604051634a7d166b60e01b81526004810186905260248101859052604401610d6a565b845f0361235f57505f90506001611c65565b8460ff841685018581121561239a5760405163c849483b60e01b8152600481018890526024810187905260ff86166044820152606401610d6a565b5f805f8312156123e657604c198312156123bd575f809550955050505050611c65565b825f03600a0a91508184816123d4576123d461265d565b0495505084029091149150611c659050565b5f83131561247f57604d8313156124235760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610d6a565b82600a0a9150815f19816124395761243961265d565b0484111561246d5760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610d6a565b5091909102925060019150611c659050565b8360019550955050505050611c65565b6124976126a7565b565b5f602082840312156124a9575f80fd5b81356001600160e01b0319811681146124c0575f80fd5b9392505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6124c060208301846124c7565b634e487b7160e01b5f52604160045260245ffd5b5f6020828403121561252b575f80fd5b81356001600160401b0380821115612541575f80fd5b818401915084601f830112612554575f80fd5b81358181111561256657612566612507565b604051601f8201601f19908116603f0116810190838211818310171561258e5761258e612507565b816040528281528760208487010111156125a6575f80fd5b826020860160208301375f928101602001929092525095945050505050565b83151581525f6020606060208401526125e160608401866124c7565b8381036040850152845180825260208087019201905f5b81811015612614578351835292840192918401916001016125f8565b509098975050505050505050565b634e487b7160e01b5f52601160045260245ffd5b808201808211156101d1576101d1612622565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601260045260245ffd5b5f8261268b57634e487b7160e01b5f52601260045260245ffd5b500490565b80820281158282048414176101d1576101d1612622565b634e487b7160e01b5f52605160045260245ffdfe1d931d931d931d931d931d931d931d931d931d931d931d931d931d931d931d931d931dbc1dbc1e581d931d931d931d931d931d931d931d931d931d931d931d931d9318431860186f187e188d189d18ac18bc18cb18db18eb18fa190a19191929193919491958196719801843186f187e188d19cc19dc1843186f187e188d19cc19dc19ec0101180010800082000100010480300038412a001810000010020004200005002038038ff54900cc66c620f3dcab0616592212c9ec8109895f0b17fec9301c02e0920c5bfe561e21609201e959460b1974270f844db208bcd3bf1f989376111049db14b934301b0ae9a00af82a7805c138f40d28083f0742ef2104d561fd1515a13318716a611ad260cc107b9bfc0eec7ade16cba2891d6b14a513792bdb02e0f14719565589"; /// @dev What MUST already be on a network before this release can be /// broadcast there: an address, and the runtime code that belongs at it. diff --git a/src/generated/candidate/RouteProcessorRaindexV6ArbOrderTaker.sol b/src/generated/candidate/RouteProcessorRaindexV6ArbOrderTaker.sol index 7a8ac37e1f..40eaec6ae7 100644 --- a/src/generated/candidate/RouteProcessorRaindexV6ArbOrderTaker.sol +++ b/src/generated/candidate/RouteProcessorRaindexV6ArbOrderTaker.sol @@ -5,23 +5,23 @@ pragma solidity ^0.8.25; // THIS FILE IS AUTOGENERATED BY THE BUILD SCRIPT. DO NOT EDIT BY HAND. /// @dev Hash of the known bytecode. -bytes32 constant BYTECODE_HASH = bytes32(0x858b3b9c3d903cc3e77e1e38b38c3f3322bfe54d0d9057866096e2b12530b8e5); +bytes32 constant BYTECODE_HASH = bytes32(0x8504990e41866b46b90f4cb618c5948a6c45fb329f0e274d34b2fb751d101653); /// @dev The deterministic deploy address of the contract when deployed via /// the Zoltu factory. -address constant DEPLOYED_ADDRESS = address(0x2b0178bAa4E6F09459a8c06a17D3E4Cec64a8479); +address constant DEPLOYED_ADDRESS = address(0xE3187B4D52147b859e451d104e1f60548269dDC6); /// @dev The creation bytecode of the contract. bytes constant CREATION_CODE = - hex"6080604052348015600e575f80fd5b5060017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556124d5806100405f395ff3fe608060405260043610610034575f3560e01c806301ffc9a71461003d578063691f9ed714610070578063b17c83c11461008f57005b3661003b57005b005b348015610048575f80fd5b5061005c610057366004611779565b6100a2565b604051901515815260200160405180910390f35b34801561007b575f80fd5b5061003b61008a3660046117b4565b6100f3565b61003b61009d366004611856565b61020e565b5f6001600160e01b0319821663691f9ed760e01b14806100d257506001600160e01b0319821663b17c83c160e01b145b806100ed57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6101018686868686866104d0565b736e2d0e71d900474b262e545bc4c98b71ab368d2161012b6001600160a01b038816825f1961053d565b5f610138838501856119d1565b90505f61014d876101488b6105b7565b61063b565b5090505f8061015f886101488c6105b7565b9150915080610176578161017281611a03565b9250505b604051632646478b60e01b81526001600160a01b03861690632646478b906101ac908e9087908f90889030908c90600401611a55565b6020604051808303815f875af11580156101c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101ec9190611aa0565b506102016001600160a01b038c16865f61053d565b5050505050505050505050565b610216610668565b61022561022282611c23565b50565b6102326080830183611cdf565b90505f0361025357604051639c95219f60e01b815260040160405180910390fd5b6001600160a01b03831673c4cf8f35f6fa0a36cbaea5c0a6cea77134c03e2a146102a05760405163516e822d60e01b81526001600160a01b03841660048201526024015b60405180910390fd5b5f6102ae6080840184611cdf565b5f8181106102be576102be611d25565b90506020028101906102d09190611d39565b6102da9080611d57565b6102e8906040810190611d6b565b6102f56080860186611cdf565b5f81811061030557610305611d25565b90506020028101906103179190611d39565b6020013581811061032a5761032a611d25565b6103409260206040909202019081019150611db1565b90505f6103506080850185611cdf565b5f81811061036057610360611d25565b90506020028101906103729190611d39565b61037c9080611d57565b61038a906060810190611d6b565b6103976080870187611cdf565b5f8181106103a7576103a7611d25565b90506020028101906103b99190611d39565b604001358181106103cc576103cc611d25565b6103e29260206040909202019081019150611db1565b90506103f96001600160a01b038316865f1961053d565b6040516334e3942b60e11b81526001600160a01b038616906369c7285690610425908790600401612015565b60408051808303815f875af1158015610440573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104649190612215565b5061047b90506001600160a01b038316865f61053d565b6104a061048784611c23565b83610491856105b7565b8461049b866105b7565b610696565b50506104cb60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054600214801561051557503373c4cf8f35f6fa0a36cbaea5c0a6cea77134c03e2a14155b156105355760405163f6688adf60e01b8152336004820152602401610297565b505050505050565b6105498383835f610935565b6104cb5761055a83835f6001610935565b61058257604051635274afe760e01b81526001600160a01b0384166004820152602401610297565b61058f8383836001610935565b6104cb57604051635274afe760e01b81526001600160a01b0384166004820152602401610297565b5f6105c0610997565b6040516354636d2b60e01b81526001600160a01b038316600482015273200e12d10bb0c5e4a17e7018f0f1161919bb9389906354636d2b906024016020604051808303815f875af1158015610617573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100ed9190612237565b5f806001600160e01b038416601b0b60e085901d61065a828287610a24565b9350935050505b9250929050565b610670610b96565b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b6040805160018082528183019092525f91816020015b60608152602001906001900390816106ac575050604080516003808252608082019092529192505f919060208201606080368337019050506040516370a0823160e01b81523060048201529091505f906001600160a01b038816906370a0823190602401602060405180830381865afa15801561072b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061074f9190611aa0565b9050801561076b5761076b6001600160a01b0388163383610bd8565b5f6107768288610be5565b50905080835f8151811061078c5761078c611d25565b602090810291909101015250506040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa1580156107dd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108019190611aa0565b9050801561081d5761081d6001600160a01b0386163383610bd8565b5f6108288286610be5565b509050808360018151811061083f5761083f611d25565b602090810291909101015250479050801561085e5761085e3382610c25565b5f61086a826012610be5565b509050808360028151811061088157610881611d25565b602002602001018181525050505080825f815181106108a2576108a2611d25565b60209081029190910101526040805160018082528183019092525f91816020015b6040805160a0810182525f91810182815260608083019390935260808201839052815260208101919091528152602001906001900390816108c357905050905087815f8151811061091657610916611d25565b602002602001018190525061092b8382610c9c565b5050505050505050565b60405163095ea7b360e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f5114831661098b57838315161561097f573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b73200e12d10bb0c5e4a17e7018f0f1161919bb93893b15806109ee575073200e12d10bb0c5e4a17e7018f0f1161919bb93893f7f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d4114155b15610a22576040516373e6d7b360e01b815273200e12d10bb0c5e4a17e7018f0f1161919bb93896004820152602401610297565b565b5f805f851215610a5157604051634a7d166b60e01b81526004810186905260248101859052604401610297565b845f03610a6357505f90506001610b8e565b8460ff8416850185811215610a9e5760405163c849483b60e01b8152600481018890526024810187905260ff86166044820152606401610297565b5f805f831215610aea57604c19831215610ac1575f809550955050505050610b8e565b825f03600a0a9150818481610ad857610ad8612257565b0495505084029091149150610b8e9050565b5f831315610b8357604d831315610b275760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610297565b82600a0a9150815f1981610b3d57610b3d612257565b04841115610b715760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610297565b5091909102925060019150610b8e9050565b509193506001925050505b935093915050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054600203610a2257604051633ee5aeb560e01b815260040160405180910390fd5b61058f8383836001610ee4565b5f805f805f610bf48787610f2e565b9250925092505f80610c068585610f8a565b9150915081838015610c155750815b9650965050505050509250929050565b80471015610c4f5760405163cf47918160e01b815247600482015260248101829052604401610297565b610c68828260405180602001604052805f8152506111d3565b15610c71575050565b3d15610c8357610c7f6111e8565b5050565b60405163d6bda27560e01b815260040160405180910390fd5b60408051600480825260a082019092525f91816020015b6060815260200190600190039081610cb35790505090505f5b8351811015610d1457838181518110610ce757610ce7611d25565b6020026020010151828281518110610d0157610d01611d25565b6020908102919091010152600101610ccc565b50335f8181523060209081526040808320815160a0810183528083018581526060808301879052608083018190529082528185015282518581529384018581528484019093529093909291905b8751811015610ed957878181518110610d7c57610d7c611d25565b602002602001015193505f845f015160400151511115610ed1575f845f01515f01516001600160a01b031663d04dfe236040518060e00160405280885f0151602001516001600160a01b03168152602001898152602001885f01516040015181526020015f8152602001610df48c8a602001516111f3565b8152602001878152602001868152506040518263ffffffff1660e01b8152600401610e1f91906122f2565b5f60405180830381865afa158015610e39573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610e6091908101906123f3565b9150505f81511115610ecf5784516020015160405163012c676d60e21b81526001600160a01b03909116906304b19db490610ea1908a9085906004016124a9565b5f604051808303815f87803b158015610eb8575f80fd5b505af1158015610eca573d5f803e3d5ffd5b505050505b505b600101610d61565b505050505050505050565b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f5114831661098b57838315161561097f573d5f823e3d81fd5b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff861115610f7957600a860460018201600a88065f1493509350935050610f83565b8593509150600190505b9250925092565b5f808383601b82900b8214806110c0577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e100000000000000000087051561100b577f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000870515610ffc576305f5e1008705965060088601955061100b565b620186a0870596506005860195505b8687601b0b1461102657600a8705965085600101955061100b565b7b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc7b19999999999999999999999999999999999999999999999999999998888201116110ba575f600188039050808160030b036110b85760e01b6001600160e01b037b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff60ff8b901d18161795505f94506106619350505050565b505b506110d7565b865f036110d757505f935060019250610661915050565b858660030b1461118e575f821315611136576110f383836114d5565b1561111b5760405163d556b11160e01b81526004810184905260248101839052604401610297565b637ffffffe19909501600a0a82029550637fffffff9461118e565b637fffffff19869003604381131561115857505f945084935061066192505050565b80600a0a888161116a5761116a612257565b059750875f0361118457505f945084935061066192505050565b50637fffffff1995505b81861361119e57600193506111b7565b818603600a0a83816111b2576111b2612257565b071593505b5050506001600160e01b03841660e084901b1791509250929050565b5f805f83516020850186885af1949350505050565b6040513d5f823e3d81fd5b60605f825167ffffffffffffffff811115611210576112106118d4565b604051908082528060200260200182016040528015611239578160200160208202803683370190505b5090505f8084511161124b575f611251565b83516001015b85516001010190505f8167ffffffffffffffff811115611273576112736118d4565b6040519080825280602002602001820160405280156112a657816020015b60608152602001906001900390816112915790505b5090505f6112ca604080516002815233602082015230818301526060810190915290565b8282815181106112dc576112dc611d25565b60200260200101819052505f5b875181101561133957818060010192505087818151811061130c5761130c611d25565b602002602001015183838151811061132657611326611d25565b60209081029190910101526001016112e9565b508551156114cb5780806001019150508382828151811061135c5761135c611d25565b60200260200101819052505f5b86518110156114c95761141887828151811061138757611387611d25565b60200260200101515f01516113f56113c38a85815181106113aa576113aa611d25565b6020026020010151602001518051602090810291012090565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f908152601c91909152603c902090565b89848151811061140757611407611d25565b6020026020010151604001516114f7565b61143857604051630a57f30960e31b815260048101829052602401610297565b86818151811061144a5761144a611d25565b60200260200101515f01516001600160a01b03165f1b85828151811061147257611472611d25565b602002602001018181525050818060010192505086818151811061149857611498611d25565b6020026020010151602001518383815181106114b6576114b6611d25565b6020908102919091010152600101611369565b505b5095945050505050565b5f6114f05f84126114e657836114ea565b835f035b83611568565b9392505050565b5f836001600160a01b03163b5f03611555575f806115158585611606565b5090925090505f81600381111561152e5761152e6124c1565b14801561154c5750856001600160a01b0316826001600160a01b0316145b925050506114f0565b61156084848461164c565b949350505050565b5f637ffffff5821361157b57505f6100ed565b637ffffffe19820160438113156115965750508115156100ed565b5f81126115d65780600a0a7b80000000000000000000000000000000000000000000000000000001816115cb576115cb612257565b0484119150506100ed565b805f03600a0a7b800000000000000000000000000000000000000000000000000000020284101591505092915050565b5f805f835160410361163d576020840151604085015160608601515f1a61162f888285856116b1565b955095509550505050610f83565b505081515f9150600290610f83565b805160408051630b135d3f60e11b8082526004820186905260248201929092525f92906020820185604483015e5f82606483010152601f820160051c60051b915060205f60648401838a5afa9050825f5114601f3d1116811693505050509392505050565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411156116ea57505f9150600390508261176f565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa15801561173b573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b03811661176657505f92506001915082905061176f565b92505f91508190505b9450945094915050565b5f60208284031215611789575f80fd5b81356001600160e01b0319811681146114f0575f80fd5b6001600160a01b0381168114610222575f80fd5b5f805f805f8060a087890312156117c9575f80fd5b86356117d4816117a0565b955060208701356117e4816117a0565b94506040870135935060608701359250608087013567ffffffffffffffff8082111561180e575f80fd5b818901915089601f830112611821575f80fd5b81358181111561182f575f80fd5b8a6020828501011115611840575f80fd5b6020830194508093505050509295509295509295565b5f805f60608486031215611868575f80fd5b8335611873816117a0565b9250602084013567ffffffffffffffff8082111561188f575f80fd5b9085019060c082880312156118a2575f80fd5b909250604085013590808211156118b7575f80fd5b508401604081870312156118c9575f80fd5b809150509250925092565b634e487b7160e01b5f52604160045260245ffd5b6040516060810167ffffffffffffffff8111828210171561190b5761190b6118d4565b60405290565b6040805190810167ffffffffffffffff8111828210171561190b5761190b6118d4565b604051601f8201601f1916810167ffffffffffffffff8111828210171561195d5761195d6118d4565b604052919050565b5f82601f830112611974575f80fd5b813567ffffffffffffffff81111561198e5761198e6118d4565b6119a1601f8201601f1916602001611934565b8181528460208386010111156119b5575f80fd5b816020850160208301375f918101602001919091529392505050565b5f602082840312156119e1575f80fd5b813567ffffffffffffffff8111156119f7575f80fd5b61156084828501611965565b5f60018201611a2057634e487b7160e01b5f52601160045260245ffd5b5060010190565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f6001600160a01b038089168352876020840152808716604084015285606084015280851660808401525060c060a0830152611a9460c0830184611a27565b98975050505050505050565b5f60208284031215611ab0575f80fd5b5051919050565b5f67ffffffffffffffff821115611ad057611ad06118d4565b5060051b60200190565b5f82601f830112611ae9575f80fd5b81356020611afe611af983611ab7565b611934565b82815260059290921b84018101918181019086841115611b1c575f80fd5b8286015b84811015611c1857803567ffffffffffffffff80821115611b3f575f80fd5b908801906060828b03601f19011215611b56575f80fd5b611b5e6118e8565b86830135611b6b816117a0565b815260408381013583811115611b7f575f80fd5b8401603f81018d13611b8f575f80fd5b88810135611b9f611af982611ab7565b81815260059190911b82018301908a8101908f831115611bbd575f80fd5b928401925b82841015611bdb5783358252928b0192908b0190611bc2565b858c0152505050606084013583811115611bf3575f80fd5b611c018d8a83880101611965565b918301919091525085525050918301918301611b20565b509695505050505050565b5f60408236031215611c33575f80fd5b611c3b611911565b823567ffffffffffffffff80821115611c52575f80fd5b818501915060608236031215611c66575f80fd5b611c6e6118e8565b8235611c79816117a0565b81526020830135611c89816117a0565b6020820152604083013582811115611c9f575f80fd5b611cab36828601611965565b60408301525083526020850135915080821115611cc6575f80fd5b50611cd336828601611ada565b60208301525092915050565b5f808335601e19843603018112611cf4575f80fd5b83018035915067ffffffffffffffff821115611d0e575f80fd5b6020019150600581901b3603821315610661575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235607e19833603018112611d4d575f80fd5b9190910192915050565b5f8235609e19833603018112611d4d575f80fd5b5f808335601e19843603018112611d80575f80fd5b83018035915067ffffffffffffffff821115611d9a575f80fd5b6020019150600681901b3603821315610661575f80fd5b5f60208284031215611dc1575f80fd5b81356114f0816117a0565b5f808335601e19843603018112611de1575f80fd5b830160208101925035905067ffffffffffffffff811115611e00575f80fd5b8060051b3603821315610661575f80fd5b5f8235605e19833603018112611e25575f80fd5b90910192915050565b5f808335601e19843603018112611e43575f80fd5b830160208101925035905067ffffffffffffffff811115611e62575f80fd5b803603821315610661575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f808335601e19843603018112611ead575f80fd5b830160208101925035905067ffffffffffffffff811115611ecc575f80fd5b8060061b3603821315610661575f80fd5b8183525f60208085019450825f5b85811015611f23578135611efe816117a0565b6001600160a01b03168752818301358388015260409687019690910190600101611eeb565b509495945050505050565b8183526020808401935f91600585811b8301820185855b8881101561200757858303601f19018a52611f608289611e11565b60608135611f6d816117a0565b6001600160a01b03168552611f8482880183611dcc565b82898801528083880152608092507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811115611fbe575f80fd5b871b808288850137860190506040611fd884820185611e2e565b9450838884030182890152611ff08484018683611e70565b9e8a019e9750505093870193505050600101611f45565b509098975050505050505050565b5f602080835260e0830184358285015260408286013581860152606081870135818701528087013580151580821461204b575f80fd5b80608089015250506120606080880188611dcc565b60c060a08901529384905261010093848801600582901b89018601835f5b848110156121dc578b830360ff19018452813536879003607e190181126120a3575f80fd5b8601803536829003609e190181126120b9575f80fd5b60808552810180356120ca816117a0565b6001600160a01b0380821660808801526120e68e840184611e11565b915060a08088015281356120f9816117a0565b8116610120880152818e013561210e816117a0565b16610140870152612121818c0182611e2e565b91508a61016088015261213961018088018383611e70565b9150506121488b830183611e98565b607f19808985030160c08a0152612160848385611edd565b935061216e8d860186611e98565b93509150808985030160e08a015250612188838383611edd565b9250505060808201358c8701528c8301358d8701528a8301358b8701526121b18a840184611dcc565b935091508581038a8701526121c7818484611f2e565b968d019695505050918a01915060010161207e565b50506121eb60a08c018c611e2e565b8b8303601f190160c08d015298509650612206818989611e70565b9b9a5050505050505050505050565b5f8060408385031215612226575f80fd5b505080516020909101519092909150565b5f60208284031215612247575f80fd5b815160ff811681146114f0575f80fd5b634e487b7160e01b5f52601260045260245ffd5b5f815180845260208085019450602084015f5b83811015611f235781518752958201959082019060010161227e565b5f8282518085526020808601955060208260051b840101602086015f5b848110156122e557601f198684030189526122d383835161226b565b988401989250908301906001016122b7565b5090979650505050505050565b602081526001600160a01b038251166020820152602082015160408201525f604083015160e0606084015261232b610100840182611a27565b9050606084015160808401526080840151601f19808584030160a0860152612353838361229a565b925060a08601519150808584030160c0860152612370838361226b565b925060c08601519150808584030160e08601525061238e828261226b565b95945050505050565b5f82601f8301126123a6575f80fd5b815160206123b6611af983611ab7565b8083825260208201915060208460051b8701019350868411156123d7575f80fd5b602086015b84811015611c1857805183529183019183016123dc565b5f8060408385031215612404575f80fd5b825167ffffffffffffffff8082111561241b575f80fd5b818501915085601f83011261242e575f80fd5b8151602061243e611af983611ab7565b82815260059290921b8401810191818101908984111561245c575f80fd5b948201945b8386101561247a57855182529482019490820190612461565b91880151919650909350505080821115612492575f80fd5b5061249f85828601612397565b9150509250929050565b828152604060208201525f611560604083018461226b565b634e487b7160e01b5f52602160045260245ffd"; + hex"6080604052348015600e575f80fd5b5060017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055612605806100405f395ff3fe608060405260043610610034575f3560e01c806301ffc9a71461003d578063691f9ed714610070578063ea37cc511461008f57005b3661003b57005b005b348015610048575f80fd5b5061005c61005736600461186a565b6100a2565b604051901515815260200160405180910390f35b34801561007b575f80fd5b5061003b61008a3660046118a5565b6100f3565b61003b61009d366004611947565b61020e565b5f6001600160e01b0319821663691f9ed760e01b14806100d257506001600160e01b0319821663ea37cc5160e01b145b806100ed57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6101018686868686866104d0565b736e2d0e71d900474b262e545bc4c98b71ab368d2161012b6001600160a01b038816825f1961053d565b5f61013883850185611ae5565b90505f61014d876101488b6105b7565b61063b565b5090505f8061015f886101488c6105b7565b9150915080610176578161017281611b17565b9250505b604051632646478b60e01b81526001600160a01b03861690632646478b906101ac908e9087908f90889030908c90600401611b69565b6020604051808303815f875af11580156101c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101ec9190611bb4565b506102016001600160a01b038c16865f61053d565b5050505050505050505050565b610216610668565b61022561022282611d36565b50565b6102326080830183611df2565b90505f0361025357604051639c95219f60e01b815260040160405180910390fd5b6001600160a01b038316732eb98f9489cff4a429368e389f5ffc6f8d9c5ede146102a05760405163516e822d60e01b81526001600160a01b03841660048201526024015b60405180910390fd5b5f6102ae6080840184611df2565b5f8181106102be576102be611e38565b90506020028101906102d09190611e4c565b6102da9080611e6a565b6102e8906040810190611e7e565b6102f56080860186611df2565b5f81811061030557610305611e38565b90506020028101906103179190611e4c565b6020013581811061032a5761032a611e38565b6103409260206040909202019081019150611ec4565b90505f6103506080850185611df2565b5f81811061036057610360611e38565b90506020028101906103729190611e4c565b61037c9080611e6a565b61038a906060810190611e7e565b6103976080870187611df2565b5f8181106103a7576103a7611e38565b90506020028101906103b99190611e4c565b604001358181106103cc576103cc611e38565b6103e29260206040909202019081019150611ec4565b90506103f96001600160a01b038316865f1961053d565b60405163b0460f0760e01b81526001600160a01b0386169063b0460f079061042590879060040161218c565b60408051808303815f875af1158015610440573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610464919061234e565b5061047b90506001600160a01b038316865f61053d565b6104a061048784611d36565b83610491856105b7565b8461049b866105b7565b610696565b50506104cb60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00546002148015610515575033732eb98f9489cff4a429368e389f5ffc6f8d9c5ede14155b156105355760405163f6688adf60e01b8152336004820152602401610297565b505050505050565b6105498383835f610935565b6104cb5761055a83835f6001610935565b61058257604051635274afe760e01b81526001600160a01b0384166004820152602401610297565b61058f8383836001610935565b6104cb57604051635274afe760e01b81526001600160a01b0384166004820152602401610297565b5f6105c0610997565b6040516354636d2b60e01b81526001600160a01b038316600482015273200e12d10bb0c5e4a17e7018f0f1161919bb9389906354636d2b906024016020604051808303815f875af1158015610617573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100ed9190612370565b5f806001600160e01b038416601b0b60e085901d61065a828287610a24565b9350935050505b9250929050565b610670610b96565b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b6040805160018082528183019092525f91816020015b60608152602001906001900390816106ac575050604080516003808252608082019092529192505f919060208201606080368337019050506040516370a0823160e01b81523060048201529091505f906001600160a01b038816906370a0823190602401602060405180830381865afa15801561072b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061074f9190611bb4565b9050801561076b5761076b6001600160a01b0388163383610bd8565b5f6107768288610be5565b50905080835f8151811061078c5761078c611e38565b602090810291909101015250506040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa1580156107dd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108019190611bb4565b9050801561081d5761081d6001600160a01b0386163383610bd8565b5f6108288286610be5565b509050808360018151811061083f5761083f611e38565b602090810291909101015250479050801561085e5761085e3382610c25565b5f61086a826012610be5565b509050808360028151811061088157610881611e38565b602002602001018181525050505080825f815181106108a2576108a2611e38565b60209081029190910101526040805160018082528183019092525f91816020015b6040805160a0810182525f91810182815260608083019390935260808201839052815260208101919091528152602001906001900390816108c357905050905087815f8151811061091657610916611e38565b602002602001018190525061092b8382610c9c565b5050505050505050565b60405163095ea7b360e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f5114831661098b57838315161561097f573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b73200e12d10bb0c5e4a17e7018f0f1161919bb93893b15806109ee575073200e12d10bb0c5e4a17e7018f0f1161919bb93893f7f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d4114155b15610a22576040516373e6d7b360e01b815273200e12d10bb0c5e4a17e7018f0f1161919bb93896004820152602401610297565b565b5f805f851215610a5157604051634a7d166b60e01b81526004810186905260248101859052604401610297565b845f03610a6357505f90506001610b8e565b8460ff8416850185811215610a9e5760405163c849483b60e01b8152600481018890526024810187905260ff86166044820152606401610297565b5f805f831215610aea57604c19831215610ac1575f809550955050505050610b8e565b825f03600a0a9150818481610ad857610ad8612390565b0495505084029091149150610b8e9050565b5f831315610b8357604d831315610b275760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610297565b82600a0a9150815f1981610b3d57610b3d612390565b04841115610b715760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610297565b5091909102925060019150610b8e9050565b509193506001925050505b935093915050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054600203610a2257604051633ee5aeb560e01b815260040160405180910390fd5b61058f8383836001610ee4565b5f805f805f610bf48787610f2e565b9250925092505f80610c068585610f8a565b9150915081838015610c155750815b9650965050505050509250929050565b80471015610c4f5760405163cf47918160e01b815247600482015260248101829052604401610297565b610c68828260405180602001604052805f8152506111d3565b15610c71575050565b3d15610c8357610c7f6111e8565b5050565b60405163d6bda27560e01b815260040160405180910390fd5b60408051600480825260a082019092525f91816020015b6060815260200190600190039081610cb35790505090505f5b8351811015610d1457838181518110610ce757610ce7611e38565b6020026020010151828281518110610d0157610d01611e38565b6020908102919091010152600101610ccc565b50335f8181523060209081526040808320815160a0810183528083018581526060808301879052608083018190529082528185015282518581529384018581528484019093529093909291905b8751811015610ed957878181518110610d7c57610d7c611e38565b602002602001015193505f845f015160400151511115610ed1575f845f01515f01516001600160a01b031663d04dfe236040518060e00160405280885f0151602001516001600160a01b03168152602001898152602001885f01516040015181526020015f8152602001610df48c8a602001516111f3565b8152602001878152602001868152506040518263ffffffff1660e01b8152600401610e1f919061242b565b5f60405180830381865afa158015610e39573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610e609190810190612523565b9150505f81511115610ecf5784516020015160405163012c676d60e21b81526001600160a01b03909116906304b19db490610ea1908a9085906004016125d9565b5f604051808303815f87803b158015610eb8575f80fd5b505af1158015610eca573d5f803e3d5ffd5b505050505b505b600101610d61565b505050505050505050565b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f5114831661098b57838315161561097f573d5f823e3d81fd5b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff861115610f7957600a860460018201600a88065f1493509350935050610f83565b8593509150600190505b9250925092565b5f808383601b82900b8214806110c0577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e100000000000000000087051561100b577f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000870515610ffc576305f5e1008705965060088601955061100b565b620186a0870596506005860195505b8687601b0b1461102657600a8705965085600101955061100b565b7b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc7b19999999999999999999999999999999999999999999999999999998888201116110ba575f600188039050808160030b036110b85760e01b6001600160e01b037b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff60ff8b901d18161795505f94506106619350505050565b505b506110d7565b865f036110d757505f935060019250610661915050565b858660030b1461118e575f821315611136576110f383836115c6565b1561111b5760405163d556b11160e01b81526004810184905260248101839052604401610297565b637ffffffe19909501600a0a82029550637fffffff9461118e565b637fffffff19869003604381131561115857505f945084935061066192505050565b80600a0a888161116a5761116a612390565b059750875f0361118457505f945084935061066192505050565b50637fffffff1995505b81861361119e57600193506111b7565b818603600a0a83816111b2576111b2612390565b071593505b5050506001600160e01b03841660e084901b1791509250929050565b5f805f83516020850186885af1949350505050565b6040513d5f823e3d81fd5b60605f825167ffffffffffffffff811115611210576112106119c5565b604051908082528060200260200182016040528015611239578160200160208202803683370190505b5090505f835167ffffffffffffffff811115611257576112576119c5565b604051908082528060200260200182016040528015611280578160200160208202803683370190505b5090505f80855111611292575f611298565b84516002015b86516001010190505f8167ffffffffffffffff8111156112ba576112ba6119c5565b6040519080825280602002602001820160405280156112ed57816020015b60608152602001906001900390816112d85790505b5090505f611311604080516002815233602082015230818301526060810190915290565b82828151811061132357611323611e38565b60200260200101819052505f5b885181101561138057818060010192505088818151811061135357611353611e38565b602002602001015183838151811061136d5761136d611e38565b6020908102919091010152600101611330565b508651156115bb578080600101915050848282815181106113a3576113a3611e38565b60200260200101819052508080600101915050838282815181106113c9576113c9611e38565b60200260200101819052505f5b87518110156115b9576114cc8882815181106113f4576113f4611e38565b60200260200101515f01516114a98a848151811061141457611414611e38565b60200260200101516020015161148a8c868151811061143557611435611e38565b60200260200101518051604091820151805160209081029181019190912083517f6ec4dff745ec96dbde88c5d41f8aa5ac13aa1664afb47b8406b44fa945a650c8815291820192909252918201526060902090565b60405161190160f01b8152600281019290925260228201526042902090565b8a84815181106114bb576114bb611e38565b6020026020010151606001516115e8565b6114ec57604051630a57f30960e31b815260048101829052602401610297565b8781815181106114fe576114fe611e38565b60200260200101515f01516001600160a01b03165f1b86828151811061152657611526611e38565b60200260200101818152505087818151811061154457611544611e38565b60200260200101516020015185828151811061156257611562611e38565b602002602001018181525050818060010192505087818151811061158857611588611e38565b6020026020010151604001518383815181106115a6576115a6611e38565b60209081029190910101526001016113d6565b505b509695505050505050565b5f6115e15f84126115d757836115db565b835f035b83611659565b9392505050565b5f836001600160a01b03163b5f03611646575f8061160685856116f7565b5090925090505f81600381111561161f5761161f6125f1565b14801561163d5750856001600160a01b0316826001600160a01b0316145b925050506115e1565b61165184848461173d565b949350505050565b5f637ffffff5821361166c57505f6100ed565b637ffffffe19820160438113156116875750508115156100ed565b5f81126116c75780600a0a7b80000000000000000000000000000000000000000000000000000001816116bc576116bc612390565b0484119150506100ed565b805f03600a0a7b800000000000000000000000000000000000000000000000000000020284101591505092915050565b5f805f835160410361172e576020840151604085015160608601515f1a611720888285856117a2565b955095509550505050610f83565b505081515f9150600290610f83565b805160408051630b135d3f60e11b8082526004820186905260248201929092525f92906020820185604483015e5f82606483010152601f820160051c60051b915060205f60648401838a5afa9050825f5114601f3d1116811693505050509392505050565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411156117db57505f91506003905082611860565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa15801561182c573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b03811661185757505f925060019150829050611860565b92505f91508190505b9450945094915050565b5f6020828403121561187a575f80fd5b81356001600160e01b0319811681146115e1575f80fd5b6001600160a01b0381168114610222575f80fd5b5f805f805f8060a087890312156118ba575f80fd5b86356118c581611891565b955060208701356118d581611891565b94506040870135935060608701359250608087013567ffffffffffffffff808211156118ff575f80fd5b818901915089601f830112611912575f80fd5b813581811115611920575f80fd5b8a6020828501011115611931575f80fd5b6020830194508093505050509295509295509295565b5f805f60608486031215611959575f80fd5b833561196481611891565b9250602084013567ffffffffffffffff80821115611980575f80fd5b9085019060c08288031215611993575f80fd5b909250604085013590808211156119a8575f80fd5b508401604081870312156119ba575f80fd5b809150509250925092565b634e487b7160e01b5f52604160045260245ffd5b6040516080810167ffffffffffffffff811182821017156119fc576119fc6119c5565b60405290565b6040805190810167ffffffffffffffff811182821017156119fc576119fc6119c5565b6040516060810167ffffffffffffffff811182821017156119fc576119fc6119c5565b604051601f8201601f1916810167ffffffffffffffff81118282101715611a7157611a716119c5565b604052919050565b5f82601f830112611a88575f80fd5b813567ffffffffffffffff811115611aa257611aa26119c5565b611ab5601f8201601f1916602001611a48565b818152846020838601011115611ac9575f80fd5b816020850160208301375f918101602001919091529392505050565b5f60208284031215611af5575f80fd5b813567ffffffffffffffff811115611b0b575f80fd5b61165184828501611a79565b5f60018201611b3457634e487b7160e01b5f52601160045260245ffd5b5060010190565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f6001600160a01b038089168352876020840152808716604084015285606084015280851660808401525060c060a0830152611ba860c0830184611b3b565b98975050505050505050565b5f60208284031215611bc4575f80fd5b5051919050565b5f67ffffffffffffffff821115611be457611be46119c5565b5060051b60200190565b5f82601f830112611bfd575f80fd5b81356020611c12611c0d83611bcb565b611a48565b82815260059290921b84018101918181019086841115611c30575f80fd5b8286015b848110156115bb57803567ffffffffffffffff80821115611c53575f80fd5b908801906080828b03601f19011215611c6a575f80fd5b611c726119d9565b86830135611c7f81611891565b815260408381013588830152606084013583811115611c9c575f80fd5b8401603f81018d13611cac575f80fd5b88810135611cbc611c0d82611bcb565b81815260059190911b82018301908a8101908f831115611cda575f80fd5b928401925b82841015611cf85783358252928b0192908b0190611cdf565b80858701525050505050608083013582811115611d13575f80fd5b611d218c8983870101611a79565b60608301525085525050918301918301611c34565b5f60408236031215611d46575f80fd5b611d4e611a02565b823567ffffffffffffffff80821115611d65575f80fd5b818501915060608236031215611d79575f80fd5b611d81611a25565b8235611d8c81611891565b81526020830135611d9c81611891565b6020820152604083013582811115611db2575f80fd5b611dbe36828601611a79565b60408301525083526020850135915080821115611dd9575f80fd5b50611de636828601611bee565b60208301525092915050565b5f808335601e19843603018112611e07575f80fd5b83018035915067ffffffffffffffff821115611e21575f80fd5b6020019150600581901b3603821315610661575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235607e19833603018112611e60575f80fd5b9190910192915050565b5f8235609e19833603018112611e60575f80fd5b5f808335601e19843603018112611e93575f80fd5b83018035915067ffffffffffffffff821115611ead575f80fd5b6020019150600681901b3603821315610661575f80fd5b5f60208284031215611ed4575f80fd5b81356115e181611891565b5f808335601e19843603018112611ef4575f80fd5b830160208101925035905067ffffffffffffffff811115611f13575f80fd5b8060051b3603821315610661575f80fd5b5f808335601e19843603018112611f39575f80fd5b830160208101925035905067ffffffffffffffff811115611f58575f80fd5b803603821315610661575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f8135611f9a81611891565b6001600160a01b039081168452602083013590611fb682611891565b166020840152611fc96040830183611f24565b60606040860152611fde606086018284611f66565b95945050505050565b5f808335601e19843603018112611ffc575f80fd5b830160208101925035905067ffffffffffffffff81111561201b575f80fd5b8060061b3603821315610661575f80fd5b8183525f60208085019450825f5b8581101561207257813561204d81611891565b6001600160a01b0316875281830135838801526040968701969091019060010161203a565b509495945050505050565b5f8235607e19833603018112612091575f80fd5b90910192915050565b8183526020808401935f91600585811b8301820185855b8881101561217e57858303601f19018a526120cc828961207d565b608081356120d981611891565b6001600160a01b03168552818701358786015260406120fa81840184611edf565b8383890152808489015260a093507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811115612134575f80fd5b881b9150818188850137508501606061214f84820185611f24565b94508388840301828901526121678484018683611f66565b9e8a019e97505050938701935050506001016120b1565b509098975050505050505050565b5f602080835260e0830184358285015281850135604085015260606040860135606086015260608601358015158082146121c4575f80fd5b60809150806080880152506121dc6080880188611edf565b60c060a08901529384905261010093848801600582901b89018601835f5b84811015612315578b830360ff19018452612215828761207d565b8035609e19823603018112612228575f80fd5b8885528101803561223881611891565b6001600160a01b0316858a0152808c013536829003605e1901811261225b575f80fd5b60a0808701526122716101208701838301611f8e565b90506122806040830183611fe7565b607f19808985030160c08a015261229884838561202c565b93506122a68e860186611fe7565b93509150808985030160e08a0152506122c083838361202c565b92505050898201358c8701528c8301358d870152604083013560408701526122ea8b840184611edf565b935091508581038b87015261230081848461209a565b968d019695505050918a0191506001016121fa565b505061232460a08c018c611f24565b8b8303601f190160c08d01529850965061233f818989611f66565b9b9a5050505050505050505050565b5f806040838503121561235f575f80fd5b505080516020909101519092909150565b5f60208284031215612380575f80fd5b815160ff811681146115e1575f80fd5b634e487b7160e01b5f52601260045260245ffd5b5f815180845260208085019450602084015f5b83811015612072578151875295820195908201906001016123b7565b5f8282518085526020808601955060208260051b840101602086015f5b8481101561241e57601f1986840301895261240c8383516123a4565b988401989250908301906001016123f0565b5090979650505050505050565b602081526001600160a01b038251166020820152602082015160408201525f604083015160e06060840152612464610100840182611b3b565b9050606084015160808401526080840151601f19808584030160a086015261248c83836123d3565b925060a08601519150808584030160c08601526124a983836123a4565b925060c08601519150808584030160e086015250611fde82826123a4565b5f82601f8301126124d6575f80fd5b815160206124e6611c0d83611bcb565b8083825260208201915060208460051b870101935086841115612507575f80fd5b602086015b848110156115bb578051835291830191830161250c565b5f8060408385031215612534575f80fd5b825167ffffffffffffffff8082111561254b575f80fd5b818501915085601f83011261255e575f80fd5b8151602061256e611c0d83611bcb565b82815260059290921b8401810191818101908984111561258c575f80fd5b948201945b838610156125aa57855182529482019490820190612591565b918801519196509093505050808211156125c2575f80fd5b506125cf858286016124c7565b9150509250929050565b828152604060208201525f61165160408301846123a4565b634e487b7160e01b5f52602160045260245ffd"; /// @dev The runtime bytecode of the contract. bytes constant RUNTIME_CODE = - hex"608060405260043610610034575f3560e01c806301ffc9a71461003d578063691f9ed714610070578063b17c83c11461008f57005b3661003b57005b005b348015610048575f80fd5b5061005c610057366004611779565b6100a2565b604051901515815260200160405180910390f35b34801561007b575f80fd5b5061003b61008a3660046117b4565b6100f3565b61003b61009d366004611856565b61020e565b5f6001600160e01b0319821663691f9ed760e01b14806100d257506001600160e01b0319821663b17c83c160e01b145b806100ed57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6101018686868686866104d0565b736e2d0e71d900474b262e545bc4c98b71ab368d2161012b6001600160a01b038816825f1961053d565b5f610138838501856119d1565b90505f61014d876101488b6105b7565b61063b565b5090505f8061015f886101488c6105b7565b9150915080610176578161017281611a03565b9250505b604051632646478b60e01b81526001600160a01b03861690632646478b906101ac908e9087908f90889030908c90600401611a55565b6020604051808303815f875af11580156101c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101ec9190611aa0565b506102016001600160a01b038c16865f61053d565b5050505050505050505050565b610216610668565b61022561022282611c23565b50565b6102326080830183611cdf565b90505f0361025357604051639c95219f60e01b815260040160405180910390fd5b6001600160a01b03831673c4cf8f35f6fa0a36cbaea5c0a6cea77134c03e2a146102a05760405163516e822d60e01b81526001600160a01b03841660048201526024015b60405180910390fd5b5f6102ae6080840184611cdf565b5f8181106102be576102be611d25565b90506020028101906102d09190611d39565b6102da9080611d57565b6102e8906040810190611d6b565b6102f56080860186611cdf565b5f81811061030557610305611d25565b90506020028101906103179190611d39565b6020013581811061032a5761032a611d25565b6103409260206040909202019081019150611db1565b90505f6103506080850185611cdf565b5f81811061036057610360611d25565b90506020028101906103729190611d39565b61037c9080611d57565b61038a906060810190611d6b565b6103976080870187611cdf565b5f8181106103a7576103a7611d25565b90506020028101906103b99190611d39565b604001358181106103cc576103cc611d25565b6103e29260206040909202019081019150611db1565b90506103f96001600160a01b038316865f1961053d565b6040516334e3942b60e11b81526001600160a01b038616906369c7285690610425908790600401612015565b60408051808303815f875af1158015610440573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104649190612215565b5061047b90506001600160a01b038316865f61053d565b6104a061048784611c23565b83610491856105b7565b8461049b866105b7565b610696565b50506104cb60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054600214801561051557503373c4cf8f35f6fa0a36cbaea5c0a6cea77134c03e2a14155b156105355760405163f6688adf60e01b8152336004820152602401610297565b505050505050565b6105498383835f610935565b6104cb5761055a83835f6001610935565b61058257604051635274afe760e01b81526001600160a01b0384166004820152602401610297565b61058f8383836001610935565b6104cb57604051635274afe760e01b81526001600160a01b0384166004820152602401610297565b5f6105c0610997565b6040516354636d2b60e01b81526001600160a01b038316600482015273200e12d10bb0c5e4a17e7018f0f1161919bb9389906354636d2b906024016020604051808303815f875af1158015610617573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100ed9190612237565b5f806001600160e01b038416601b0b60e085901d61065a828287610a24565b9350935050505b9250929050565b610670610b96565b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b6040805160018082528183019092525f91816020015b60608152602001906001900390816106ac575050604080516003808252608082019092529192505f919060208201606080368337019050506040516370a0823160e01b81523060048201529091505f906001600160a01b038816906370a0823190602401602060405180830381865afa15801561072b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061074f9190611aa0565b9050801561076b5761076b6001600160a01b0388163383610bd8565b5f6107768288610be5565b50905080835f8151811061078c5761078c611d25565b602090810291909101015250506040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa1580156107dd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108019190611aa0565b9050801561081d5761081d6001600160a01b0386163383610bd8565b5f6108288286610be5565b509050808360018151811061083f5761083f611d25565b602090810291909101015250479050801561085e5761085e3382610c25565b5f61086a826012610be5565b509050808360028151811061088157610881611d25565b602002602001018181525050505080825f815181106108a2576108a2611d25565b60209081029190910101526040805160018082528183019092525f91816020015b6040805160a0810182525f91810182815260608083019390935260808201839052815260208101919091528152602001906001900390816108c357905050905087815f8151811061091657610916611d25565b602002602001018190525061092b8382610c9c565b5050505050505050565b60405163095ea7b360e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f5114831661098b57838315161561097f573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b73200e12d10bb0c5e4a17e7018f0f1161919bb93893b15806109ee575073200e12d10bb0c5e4a17e7018f0f1161919bb93893f7f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d4114155b15610a22576040516373e6d7b360e01b815273200e12d10bb0c5e4a17e7018f0f1161919bb93896004820152602401610297565b565b5f805f851215610a5157604051634a7d166b60e01b81526004810186905260248101859052604401610297565b845f03610a6357505f90506001610b8e565b8460ff8416850185811215610a9e5760405163c849483b60e01b8152600481018890526024810187905260ff86166044820152606401610297565b5f805f831215610aea57604c19831215610ac1575f809550955050505050610b8e565b825f03600a0a9150818481610ad857610ad8612257565b0495505084029091149150610b8e9050565b5f831315610b8357604d831315610b275760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610297565b82600a0a9150815f1981610b3d57610b3d612257565b04841115610b715760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610297565b5091909102925060019150610b8e9050565b509193506001925050505b935093915050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054600203610a2257604051633ee5aeb560e01b815260040160405180910390fd5b61058f8383836001610ee4565b5f805f805f610bf48787610f2e565b9250925092505f80610c068585610f8a565b9150915081838015610c155750815b9650965050505050509250929050565b80471015610c4f5760405163cf47918160e01b815247600482015260248101829052604401610297565b610c68828260405180602001604052805f8152506111d3565b15610c71575050565b3d15610c8357610c7f6111e8565b5050565b60405163d6bda27560e01b815260040160405180910390fd5b60408051600480825260a082019092525f91816020015b6060815260200190600190039081610cb35790505090505f5b8351811015610d1457838181518110610ce757610ce7611d25565b6020026020010151828281518110610d0157610d01611d25565b6020908102919091010152600101610ccc565b50335f8181523060209081526040808320815160a0810183528083018581526060808301879052608083018190529082528185015282518581529384018581528484019093529093909291905b8751811015610ed957878181518110610d7c57610d7c611d25565b602002602001015193505f845f015160400151511115610ed1575f845f01515f01516001600160a01b031663d04dfe236040518060e00160405280885f0151602001516001600160a01b03168152602001898152602001885f01516040015181526020015f8152602001610df48c8a602001516111f3565b8152602001878152602001868152506040518263ffffffff1660e01b8152600401610e1f91906122f2565b5f60405180830381865afa158015610e39573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610e6091908101906123f3565b9150505f81511115610ecf5784516020015160405163012c676d60e21b81526001600160a01b03909116906304b19db490610ea1908a9085906004016124a9565b5f604051808303815f87803b158015610eb8575f80fd5b505af1158015610eca573d5f803e3d5ffd5b505050505b505b600101610d61565b505050505050505050565b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f5114831661098b57838315161561097f573d5f823e3d81fd5b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff861115610f7957600a860460018201600a88065f1493509350935050610f83565b8593509150600190505b9250925092565b5f808383601b82900b8214806110c0577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e100000000000000000087051561100b577f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000870515610ffc576305f5e1008705965060088601955061100b565b620186a0870596506005860195505b8687601b0b1461102657600a8705965085600101955061100b565b7b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc7b19999999999999999999999999999999999999999999999999999998888201116110ba575f600188039050808160030b036110b85760e01b6001600160e01b037b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff60ff8b901d18161795505f94506106619350505050565b505b506110d7565b865f036110d757505f935060019250610661915050565b858660030b1461118e575f821315611136576110f383836114d5565b1561111b5760405163d556b11160e01b81526004810184905260248101839052604401610297565b637ffffffe19909501600a0a82029550637fffffff9461118e565b637fffffff19869003604381131561115857505f945084935061066192505050565b80600a0a888161116a5761116a612257565b059750875f0361118457505f945084935061066192505050565b50637fffffff1995505b81861361119e57600193506111b7565b818603600a0a83816111b2576111b2612257565b071593505b5050506001600160e01b03841660e084901b1791509250929050565b5f805f83516020850186885af1949350505050565b6040513d5f823e3d81fd5b60605f825167ffffffffffffffff811115611210576112106118d4565b604051908082528060200260200182016040528015611239578160200160208202803683370190505b5090505f8084511161124b575f611251565b83516001015b85516001010190505f8167ffffffffffffffff811115611273576112736118d4565b6040519080825280602002602001820160405280156112a657816020015b60608152602001906001900390816112915790505b5090505f6112ca604080516002815233602082015230818301526060810190915290565b8282815181106112dc576112dc611d25565b60200260200101819052505f5b875181101561133957818060010192505087818151811061130c5761130c611d25565b602002602001015183838151811061132657611326611d25565b60209081029190910101526001016112e9565b508551156114cb5780806001019150508382828151811061135c5761135c611d25565b60200260200101819052505f5b86518110156114c95761141887828151811061138757611387611d25565b60200260200101515f01516113f56113c38a85815181106113aa576113aa611d25565b6020026020010151602001518051602090810291012090565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f908152601c91909152603c902090565b89848151811061140757611407611d25565b6020026020010151604001516114f7565b61143857604051630a57f30960e31b815260048101829052602401610297565b86818151811061144a5761144a611d25565b60200260200101515f01516001600160a01b03165f1b85828151811061147257611472611d25565b602002602001018181525050818060010192505086818151811061149857611498611d25565b6020026020010151602001518383815181106114b6576114b6611d25565b6020908102919091010152600101611369565b505b5095945050505050565b5f6114f05f84126114e657836114ea565b835f035b83611568565b9392505050565b5f836001600160a01b03163b5f03611555575f806115158585611606565b5090925090505f81600381111561152e5761152e6124c1565b14801561154c5750856001600160a01b0316826001600160a01b0316145b925050506114f0565b61156084848461164c565b949350505050565b5f637ffffff5821361157b57505f6100ed565b637ffffffe19820160438113156115965750508115156100ed565b5f81126115d65780600a0a7b80000000000000000000000000000000000000000000000000000001816115cb576115cb612257565b0484119150506100ed565b805f03600a0a7b800000000000000000000000000000000000000000000000000000020284101591505092915050565b5f805f835160410361163d576020840151604085015160608601515f1a61162f888285856116b1565b955095509550505050610f83565b505081515f9150600290610f83565b805160408051630b135d3f60e11b8082526004820186905260248201929092525f92906020820185604483015e5f82606483010152601f820160051c60051b915060205f60648401838a5afa9050825f5114601f3d1116811693505050509392505050565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411156116ea57505f9150600390508261176f565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa15801561173b573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b03811661176657505f92506001915082905061176f565b92505f91508190505b9450945094915050565b5f60208284031215611789575f80fd5b81356001600160e01b0319811681146114f0575f80fd5b6001600160a01b0381168114610222575f80fd5b5f805f805f8060a087890312156117c9575f80fd5b86356117d4816117a0565b955060208701356117e4816117a0565b94506040870135935060608701359250608087013567ffffffffffffffff8082111561180e575f80fd5b818901915089601f830112611821575f80fd5b81358181111561182f575f80fd5b8a6020828501011115611840575f80fd5b6020830194508093505050509295509295509295565b5f805f60608486031215611868575f80fd5b8335611873816117a0565b9250602084013567ffffffffffffffff8082111561188f575f80fd5b9085019060c082880312156118a2575f80fd5b909250604085013590808211156118b7575f80fd5b508401604081870312156118c9575f80fd5b809150509250925092565b634e487b7160e01b5f52604160045260245ffd5b6040516060810167ffffffffffffffff8111828210171561190b5761190b6118d4565b60405290565b6040805190810167ffffffffffffffff8111828210171561190b5761190b6118d4565b604051601f8201601f1916810167ffffffffffffffff8111828210171561195d5761195d6118d4565b604052919050565b5f82601f830112611974575f80fd5b813567ffffffffffffffff81111561198e5761198e6118d4565b6119a1601f8201601f1916602001611934565b8181528460208386010111156119b5575f80fd5b816020850160208301375f918101602001919091529392505050565b5f602082840312156119e1575f80fd5b813567ffffffffffffffff8111156119f7575f80fd5b61156084828501611965565b5f60018201611a2057634e487b7160e01b5f52601160045260245ffd5b5060010190565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f6001600160a01b038089168352876020840152808716604084015285606084015280851660808401525060c060a0830152611a9460c0830184611a27565b98975050505050505050565b5f60208284031215611ab0575f80fd5b5051919050565b5f67ffffffffffffffff821115611ad057611ad06118d4565b5060051b60200190565b5f82601f830112611ae9575f80fd5b81356020611afe611af983611ab7565b611934565b82815260059290921b84018101918181019086841115611b1c575f80fd5b8286015b84811015611c1857803567ffffffffffffffff80821115611b3f575f80fd5b908801906060828b03601f19011215611b56575f80fd5b611b5e6118e8565b86830135611b6b816117a0565b815260408381013583811115611b7f575f80fd5b8401603f81018d13611b8f575f80fd5b88810135611b9f611af982611ab7565b81815260059190911b82018301908a8101908f831115611bbd575f80fd5b928401925b82841015611bdb5783358252928b0192908b0190611bc2565b858c0152505050606084013583811115611bf3575f80fd5b611c018d8a83880101611965565b918301919091525085525050918301918301611b20565b509695505050505050565b5f60408236031215611c33575f80fd5b611c3b611911565b823567ffffffffffffffff80821115611c52575f80fd5b818501915060608236031215611c66575f80fd5b611c6e6118e8565b8235611c79816117a0565b81526020830135611c89816117a0565b6020820152604083013582811115611c9f575f80fd5b611cab36828601611965565b60408301525083526020850135915080821115611cc6575f80fd5b50611cd336828601611ada565b60208301525092915050565b5f808335601e19843603018112611cf4575f80fd5b83018035915067ffffffffffffffff821115611d0e575f80fd5b6020019150600581901b3603821315610661575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235607e19833603018112611d4d575f80fd5b9190910192915050565b5f8235609e19833603018112611d4d575f80fd5b5f808335601e19843603018112611d80575f80fd5b83018035915067ffffffffffffffff821115611d9a575f80fd5b6020019150600681901b3603821315610661575f80fd5b5f60208284031215611dc1575f80fd5b81356114f0816117a0565b5f808335601e19843603018112611de1575f80fd5b830160208101925035905067ffffffffffffffff811115611e00575f80fd5b8060051b3603821315610661575f80fd5b5f8235605e19833603018112611e25575f80fd5b90910192915050565b5f808335601e19843603018112611e43575f80fd5b830160208101925035905067ffffffffffffffff811115611e62575f80fd5b803603821315610661575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f808335601e19843603018112611ead575f80fd5b830160208101925035905067ffffffffffffffff811115611ecc575f80fd5b8060061b3603821315610661575f80fd5b8183525f60208085019450825f5b85811015611f23578135611efe816117a0565b6001600160a01b03168752818301358388015260409687019690910190600101611eeb565b509495945050505050565b8183526020808401935f91600585811b8301820185855b8881101561200757858303601f19018a52611f608289611e11565b60608135611f6d816117a0565b6001600160a01b03168552611f8482880183611dcc565b82898801528083880152608092507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811115611fbe575f80fd5b871b808288850137860190506040611fd884820185611e2e565b9450838884030182890152611ff08484018683611e70565b9e8a019e9750505093870193505050600101611f45565b509098975050505050505050565b5f602080835260e0830184358285015260408286013581860152606081870135818701528087013580151580821461204b575f80fd5b80608089015250506120606080880188611dcc565b60c060a08901529384905261010093848801600582901b89018601835f5b848110156121dc578b830360ff19018452813536879003607e190181126120a3575f80fd5b8601803536829003609e190181126120b9575f80fd5b60808552810180356120ca816117a0565b6001600160a01b0380821660808801526120e68e840184611e11565b915060a08088015281356120f9816117a0565b8116610120880152818e013561210e816117a0565b16610140870152612121818c0182611e2e565b91508a61016088015261213961018088018383611e70565b9150506121488b830183611e98565b607f19808985030160c08a0152612160848385611edd565b935061216e8d860186611e98565b93509150808985030160e08a015250612188838383611edd565b9250505060808201358c8701528c8301358d8701528a8301358b8701526121b18a840184611dcc565b935091508581038a8701526121c7818484611f2e565b968d019695505050918a01915060010161207e565b50506121eb60a08c018c611e2e565b8b8303601f190160c08d015298509650612206818989611e70565b9b9a5050505050505050505050565b5f8060408385031215612226575f80fd5b505080516020909101519092909150565b5f60208284031215612247575f80fd5b815160ff811681146114f0575f80fd5b634e487b7160e01b5f52601260045260245ffd5b5f815180845260208085019450602084015f5b83811015611f235781518752958201959082019060010161227e565b5f8282518085526020808601955060208260051b840101602086015f5b848110156122e557601f198684030189526122d383835161226b565b988401989250908301906001016122b7565b5090979650505050505050565b602081526001600160a01b038251166020820152602082015160408201525f604083015160e0606084015261232b610100840182611a27565b9050606084015160808401526080840151601f19808584030160a0860152612353838361229a565b925060a08601519150808584030160c0860152612370838361226b565b925060c08601519150808584030160e08601525061238e828261226b565b95945050505050565b5f82601f8301126123a6575f80fd5b815160206123b6611af983611ab7565b8083825260208201915060208460051b8701019350868411156123d7575f80fd5b602086015b84811015611c1857805183529183019183016123dc565b5f8060408385031215612404575f80fd5b825167ffffffffffffffff8082111561241b575f80fd5b818501915085601f83011261242e575f80fd5b8151602061243e611af983611ab7565b82815260059290921b8401810191818101908984111561245c575f80fd5b948201945b8386101561247a57855182529482019490820190612461565b91880151919650909350505080821115612492575f80fd5b5061249f85828601612397565b9150509250929050565b828152604060208201525f611560604083018461226b565b634e487b7160e01b5f52602160045260245ffd"; + hex"608060405260043610610034575f3560e01c806301ffc9a71461003d578063691f9ed714610070578063ea37cc511461008f57005b3661003b57005b005b348015610048575f80fd5b5061005c61005736600461186a565b6100a2565b604051901515815260200160405180910390f35b34801561007b575f80fd5b5061003b61008a3660046118a5565b6100f3565b61003b61009d366004611947565b61020e565b5f6001600160e01b0319821663691f9ed760e01b14806100d257506001600160e01b0319821663ea37cc5160e01b145b806100ed57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6101018686868686866104d0565b736e2d0e71d900474b262e545bc4c98b71ab368d2161012b6001600160a01b038816825f1961053d565b5f61013883850185611ae5565b90505f61014d876101488b6105b7565b61063b565b5090505f8061015f886101488c6105b7565b9150915080610176578161017281611b17565b9250505b604051632646478b60e01b81526001600160a01b03861690632646478b906101ac908e9087908f90889030908c90600401611b69565b6020604051808303815f875af11580156101c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101ec9190611bb4565b506102016001600160a01b038c16865f61053d565b5050505050505050505050565b610216610668565b61022561022282611d36565b50565b6102326080830183611df2565b90505f0361025357604051639c95219f60e01b815260040160405180910390fd5b6001600160a01b038316732eb98f9489cff4a429368e389f5ffc6f8d9c5ede146102a05760405163516e822d60e01b81526001600160a01b03841660048201526024015b60405180910390fd5b5f6102ae6080840184611df2565b5f8181106102be576102be611e38565b90506020028101906102d09190611e4c565b6102da9080611e6a565b6102e8906040810190611e7e565b6102f56080860186611df2565b5f81811061030557610305611e38565b90506020028101906103179190611e4c565b6020013581811061032a5761032a611e38565b6103409260206040909202019081019150611ec4565b90505f6103506080850185611df2565b5f81811061036057610360611e38565b90506020028101906103729190611e4c565b61037c9080611e6a565b61038a906060810190611e7e565b6103976080870187611df2565b5f8181106103a7576103a7611e38565b90506020028101906103b99190611e4c565b604001358181106103cc576103cc611e38565b6103e29260206040909202019081019150611ec4565b90506103f96001600160a01b038316865f1961053d565b60405163b0460f0760e01b81526001600160a01b0386169063b0460f079061042590879060040161218c565b60408051808303815f875af1158015610440573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610464919061234e565b5061047b90506001600160a01b038316865f61053d565b6104a061048784611d36565b83610491856105b7565b8461049b866105b7565b610696565b50506104cb60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00546002148015610515575033732eb98f9489cff4a429368e389f5ffc6f8d9c5ede14155b156105355760405163f6688adf60e01b8152336004820152602401610297565b505050505050565b6105498383835f610935565b6104cb5761055a83835f6001610935565b61058257604051635274afe760e01b81526001600160a01b0384166004820152602401610297565b61058f8383836001610935565b6104cb57604051635274afe760e01b81526001600160a01b0384166004820152602401610297565b5f6105c0610997565b6040516354636d2b60e01b81526001600160a01b038316600482015273200e12d10bb0c5e4a17e7018f0f1161919bb9389906354636d2b906024016020604051808303815f875af1158015610617573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100ed9190612370565b5f806001600160e01b038416601b0b60e085901d61065a828287610a24565b9350935050505b9250929050565b610670610b96565b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b6040805160018082528183019092525f91816020015b60608152602001906001900390816106ac575050604080516003808252608082019092529192505f919060208201606080368337019050506040516370a0823160e01b81523060048201529091505f906001600160a01b038816906370a0823190602401602060405180830381865afa15801561072b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061074f9190611bb4565b9050801561076b5761076b6001600160a01b0388163383610bd8565b5f6107768288610be5565b50905080835f8151811061078c5761078c611e38565b602090810291909101015250506040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa1580156107dd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108019190611bb4565b9050801561081d5761081d6001600160a01b0386163383610bd8565b5f6108288286610be5565b509050808360018151811061083f5761083f611e38565b602090810291909101015250479050801561085e5761085e3382610c25565b5f61086a826012610be5565b509050808360028151811061088157610881611e38565b602002602001018181525050505080825f815181106108a2576108a2611e38565b60209081029190910101526040805160018082528183019092525f91816020015b6040805160a0810182525f91810182815260608083019390935260808201839052815260208101919091528152602001906001900390816108c357905050905087815f8151811061091657610916611e38565b602002602001018190525061092b8382610c9c565b5050505050505050565b60405163095ea7b360e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f5114831661098b57838315161561097f573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b73200e12d10bb0c5e4a17e7018f0f1161919bb93893b15806109ee575073200e12d10bb0c5e4a17e7018f0f1161919bb93893f7f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d4114155b15610a22576040516373e6d7b360e01b815273200e12d10bb0c5e4a17e7018f0f1161919bb93896004820152602401610297565b565b5f805f851215610a5157604051634a7d166b60e01b81526004810186905260248101859052604401610297565b845f03610a6357505f90506001610b8e565b8460ff8416850185811215610a9e5760405163c849483b60e01b8152600481018890526024810187905260ff86166044820152606401610297565b5f805f831215610aea57604c19831215610ac1575f809550955050505050610b8e565b825f03600a0a9150818481610ad857610ad8612390565b0495505084029091149150610b8e9050565b5f831315610b8357604d831315610b275760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610297565b82600a0a9150815f1981610b3d57610b3d612390565b04841115610b715760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610297565b5091909102925060019150610b8e9050565b509193506001925050505b935093915050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054600203610a2257604051633ee5aeb560e01b815260040160405180910390fd5b61058f8383836001610ee4565b5f805f805f610bf48787610f2e565b9250925092505f80610c068585610f8a565b9150915081838015610c155750815b9650965050505050509250929050565b80471015610c4f5760405163cf47918160e01b815247600482015260248101829052604401610297565b610c68828260405180602001604052805f8152506111d3565b15610c71575050565b3d15610c8357610c7f6111e8565b5050565b60405163d6bda27560e01b815260040160405180910390fd5b60408051600480825260a082019092525f91816020015b6060815260200190600190039081610cb35790505090505f5b8351811015610d1457838181518110610ce757610ce7611e38565b6020026020010151828281518110610d0157610d01611e38565b6020908102919091010152600101610ccc565b50335f8181523060209081526040808320815160a0810183528083018581526060808301879052608083018190529082528185015282518581529384018581528484019093529093909291905b8751811015610ed957878181518110610d7c57610d7c611e38565b602002602001015193505f845f015160400151511115610ed1575f845f01515f01516001600160a01b031663d04dfe236040518060e00160405280885f0151602001516001600160a01b03168152602001898152602001885f01516040015181526020015f8152602001610df48c8a602001516111f3565b8152602001878152602001868152506040518263ffffffff1660e01b8152600401610e1f919061242b565b5f60405180830381865afa158015610e39573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610e609190810190612523565b9150505f81511115610ecf5784516020015160405163012c676d60e21b81526001600160a01b03909116906304b19db490610ea1908a9085906004016125d9565b5f604051808303815f87803b158015610eb8575f80fd5b505af1158015610eca573d5f803e3d5ffd5b505050505b505b600101610d61565b505050505050505050565b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f5114831661098b57838315161561097f573d5f823e3d81fd5b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff861115610f7957600a860460018201600a88065f1493509350935050610f83565b8593509150600190505b9250925092565b5f808383601b82900b8214806110c0577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e100000000000000000087051561100b577f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000870515610ffc576305f5e1008705965060088601955061100b565b620186a0870596506005860195505b8687601b0b1461102657600a8705965085600101955061100b565b7b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc7b19999999999999999999999999999999999999999999999999999998888201116110ba575f600188039050808160030b036110b85760e01b6001600160e01b037b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff60ff8b901d18161795505f94506106619350505050565b505b506110d7565b865f036110d757505f935060019250610661915050565b858660030b1461118e575f821315611136576110f383836115c6565b1561111b5760405163d556b11160e01b81526004810184905260248101839052604401610297565b637ffffffe19909501600a0a82029550637fffffff9461118e565b637fffffff19869003604381131561115857505f945084935061066192505050565b80600a0a888161116a5761116a612390565b059750875f0361118457505f945084935061066192505050565b50637fffffff1995505b81861361119e57600193506111b7565b818603600a0a83816111b2576111b2612390565b071593505b5050506001600160e01b03841660e084901b1791509250929050565b5f805f83516020850186885af1949350505050565b6040513d5f823e3d81fd5b60605f825167ffffffffffffffff811115611210576112106119c5565b604051908082528060200260200182016040528015611239578160200160208202803683370190505b5090505f835167ffffffffffffffff811115611257576112576119c5565b604051908082528060200260200182016040528015611280578160200160208202803683370190505b5090505f80855111611292575f611298565b84516002015b86516001010190505f8167ffffffffffffffff8111156112ba576112ba6119c5565b6040519080825280602002602001820160405280156112ed57816020015b60608152602001906001900390816112d85790505b5090505f611311604080516002815233602082015230818301526060810190915290565b82828151811061132357611323611e38565b60200260200101819052505f5b885181101561138057818060010192505088818151811061135357611353611e38565b602002602001015183838151811061136d5761136d611e38565b6020908102919091010152600101611330565b508651156115bb578080600101915050848282815181106113a3576113a3611e38565b60200260200101819052508080600101915050838282815181106113c9576113c9611e38565b60200260200101819052505f5b87518110156115b9576114cc8882815181106113f4576113f4611e38565b60200260200101515f01516114a98a848151811061141457611414611e38565b60200260200101516020015161148a8c868151811061143557611435611e38565b60200260200101518051604091820151805160209081029181019190912083517f6ec4dff745ec96dbde88c5d41f8aa5ac13aa1664afb47b8406b44fa945a650c8815291820192909252918201526060902090565b60405161190160f01b8152600281019290925260228201526042902090565b8a84815181106114bb576114bb611e38565b6020026020010151606001516115e8565b6114ec57604051630a57f30960e31b815260048101829052602401610297565b8781815181106114fe576114fe611e38565b60200260200101515f01516001600160a01b03165f1b86828151811061152657611526611e38565b60200260200101818152505087818151811061154457611544611e38565b60200260200101516020015185828151811061156257611562611e38565b602002602001018181525050818060010192505087818151811061158857611588611e38565b6020026020010151604001518383815181106115a6576115a6611e38565b60209081029190910101526001016113d6565b505b509695505050505050565b5f6115e15f84126115d757836115db565b835f035b83611659565b9392505050565b5f836001600160a01b03163b5f03611646575f8061160685856116f7565b5090925090505f81600381111561161f5761161f6125f1565b14801561163d5750856001600160a01b0316826001600160a01b0316145b925050506115e1565b61165184848461173d565b949350505050565b5f637ffffff5821361166c57505f6100ed565b637ffffffe19820160438113156116875750508115156100ed565b5f81126116c75780600a0a7b80000000000000000000000000000000000000000000000000000001816116bc576116bc612390565b0484119150506100ed565b805f03600a0a7b800000000000000000000000000000000000000000000000000000020284101591505092915050565b5f805f835160410361172e576020840151604085015160608601515f1a611720888285856117a2565b955095509550505050610f83565b505081515f9150600290610f83565b805160408051630b135d3f60e11b8082526004820186905260248201929092525f92906020820185604483015e5f82606483010152601f820160051c60051b915060205f60648401838a5afa9050825f5114601f3d1116811693505050509392505050565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411156117db57505f91506003905082611860565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa15801561182c573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b03811661185757505f925060019150829050611860565b92505f91508190505b9450945094915050565b5f6020828403121561187a575f80fd5b81356001600160e01b0319811681146115e1575f80fd5b6001600160a01b0381168114610222575f80fd5b5f805f805f8060a087890312156118ba575f80fd5b86356118c581611891565b955060208701356118d581611891565b94506040870135935060608701359250608087013567ffffffffffffffff808211156118ff575f80fd5b818901915089601f830112611912575f80fd5b813581811115611920575f80fd5b8a6020828501011115611931575f80fd5b6020830194508093505050509295509295509295565b5f805f60608486031215611959575f80fd5b833561196481611891565b9250602084013567ffffffffffffffff80821115611980575f80fd5b9085019060c08288031215611993575f80fd5b909250604085013590808211156119a8575f80fd5b508401604081870312156119ba575f80fd5b809150509250925092565b634e487b7160e01b5f52604160045260245ffd5b6040516080810167ffffffffffffffff811182821017156119fc576119fc6119c5565b60405290565b6040805190810167ffffffffffffffff811182821017156119fc576119fc6119c5565b6040516060810167ffffffffffffffff811182821017156119fc576119fc6119c5565b604051601f8201601f1916810167ffffffffffffffff81118282101715611a7157611a716119c5565b604052919050565b5f82601f830112611a88575f80fd5b813567ffffffffffffffff811115611aa257611aa26119c5565b611ab5601f8201601f1916602001611a48565b818152846020838601011115611ac9575f80fd5b816020850160208301375f918101602001919091529392505050565b5f60208284031215611af5575f80fd5b813567ffffffffffffffff811115611b0b575f80fd5b61165184828501611a79565b5f60018201611b3457634e487b7160e01b5f52601160045260245ffd5b5060010190565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f6001600160a01b038089168352876020840152808716604084015285606084015280851660808401525060c060a0830152611ba860c0830184611b3b565b98975050505050505050565b5f60208284031215611bc4575f80fd5b5051919050565b5f67ffffffffffffffff821115611be457611be46119c5565b5060051b60200190565b5f82601f830112611bfd575f80fd5b81356020611c12611c0d83611bcb565b611a48565b82815260059290921b84018101918181019086841115611c30575f80fd5b8286015b848110156115bb57803567ffffffffffffffff80821115611c53575f80fd5b908801906080828b03601f19011215611c6a575f80fd5b611c726119d9565b86830135611c7f81611891565b815260408381013588830152606084013583811115611c9c575f80fd5b8401603f81018d13611cac575f80fd5b88810135611cbc611c0d82611bcb565b81815260059190911b82018301908a8101908f831115611cda575f80fd5b928401925b82841015611cf85783358252928b0192908b0190611cdf565b80858701525050505050608083013582811115611d13575f80fd5b611d218c8983870101611a79565b60608301525085525050918301918301611c34565b5f60408236031215611d46575f80fd5b611d4e611a02565b823567ffffffffffffffff80821115611d65575f80fd5b818501915060608236031215611d79575f80fd5b611d81611a25565b8235611d8c81611891565b81526020830135611d9c81611891565b6020820152604083013582811115611db2575f80fd5b611dbe36828601611a79565b60408301525083526020850135915080821115611dd9575f80fd5b50611de636828601611bee565b60208301525092915050565b5f808335601e19843603018112611e07575f80fd5b83018035915067ffffffffffffffff821115611e21575f80fd5b6020019150600581901b3603821315610661575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235607e19833603018112611e60575f80fd5b9190910192915050565b5f8235609e19833603018112611e60575f80fd5b5f808335601e19843603018112611e93575f80fd5b83018035915067ffffffffffffffff821115611ead575f80fd5b6020019150600681901b3603821315610661575f80fd5b5f60208284031215611ed4575f80fd5b81356115e181611891565b5f808335601e19843603018112611ef4575f80fd5b830160208101925035905067ffffffffffffffff811115611f13575f80fd5b8060051b3603821315610661575f80fd5b5f808335601e19843603018112611f39575f80fd5b830160208101925035905067ffffffffffffffff811115611f58575f80fd5b803603821315610661575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f8135611f9a81611891565b6001600160a01b039081168452602083013590611fb682611891565b166020840152611fc96040830183611f24565b60606040860152611fde606086018284611f66565b95945050505050565b5f808335601e19843603018112611ffc575f80fd5b830160208101925035905067ffffffffffffffff81111561201b575f80fd5b8060061b3603821315610661575f80fd5b8183525f60208085019450825f5b8581101561207257813561204d81611891565b6001600160a01b0316875281830135838801526040968701969091019060010161203a565b509495945050505050565b5f8235607e19833603018112612091575f80fd5b90910192915050565b8183526020808401935f91600585811b8301820185855b8881101561217e57858303601f19018a526120cc828961207d565b608081356120d981611891565b6001600160a01b03168552818701358786015260406120fa81840184611edf565b8383890152808489015260a093507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811115612134575f80fd5b881b9150818188850137508501606061214f84820185611f24565b94508388840301828901526121678484018683611f66565b9e8a019e97505050938701935050506001016120b1565b509098975050505050505050565b5f602080835260e0830184358285015281850135604085015260606040860135606086015260608601358015158082146121c4575f80fd5b60809150806080880152506121dc6080880188611edf565b60c060a08901529384905261010093848801600582901b89018601835f5b84811015612315578b830360ff19018452612215828761207d565b8035609e19823603018112612228575f80fd5b8885528101803561223881611891565b6001600160a01b0316858a0152808c013536829003605e1901811261225b575f80fd5b60a0808701526122716101208701838301611f8e565b90506122806040830183611fe7565b607f19808985030160c08a015261229884838561202c565b93506122a68e860186611fe7565b93509150808985030160e08a0152506122c083838361202c565b92505050898201358c8701528c8301358d870152604083013560408701526122ea8b840184611edf565b935091508581038b87015261230081848461209a565b968d019695505050918a0191506001016121fa565b505061232460a08c018c611f24565b8b8303601f190160c08d01529850965061233f818989611f66565b9b9a5050505050505050505050565b5f806040838503121561235f575f80fd5b505080516020909101519092909150565b5f60208284031215612380575f80fd5b815160ff811681146115e1575f80fd5b634e487b7160e01b5f52601260045260245ffd5b5f815180845260208085019450602084015f5b83811015612072578151875295820195908201906001016123b7565b5f8282518085526020808601955060208260051b840101602086015f5b8481101561241e57601f1986840301895261240c8383516123a4565b988401989250908301906001016123f0565b5090979650505050505050565b602081526001600160a01b038251166020820152602082015160408201525f604083015160e06060840152612464610100840182611b3b565b9050606084015160808401526080840151601f19808584030160a086015261248c83836123d3565b925060a08601519150808584030160c08601526124a983836123a4565b925060c08601519150808584030160e086015250611fde82826123a4565b5f82601f8301126124d6575f80fd5b815160206124e6611c0d83611bcb565b8083825260208201915060208460051b870101935086841115612507575f80fd5b602086015b848110156115bb578051835291830191830161250c565b5f8060408385031215612534575f80fd5b825167ffffffffffffffff8082111561254b575f80fd5b818501915085601f83011261255e575f80fd5b8151602061256e611c0d83611bcb565b82815260059290921b8401810191818101908984111561258c575f80fd5b948201945b838610156125aa57855182529482019490820190612591565b918801519196509093505050808211156125c2575f80fd5b506125cf858286016124c7565b9150509250929050565b828152604060208201525f61165160408301846123a4565b634e487b7160e01b5f52602160045260245ffd"; /// @dev What MUST already be on a network before this release can be /// broadcast there: an address, and the runtime code that belongs at it. /// `abi.encode`d as a `DeployDependency[]` because Solidity has no /// file-scope constant of dynamic array type. bytes constant DEPENDENCIES = - hex"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000052400000000000000000000000000000000000000000000000000000000000005700000000000000000000000000c4cf8f35f6fa0a36cbaea5c0a6cea77134c03e2a000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000051806080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a7146117cf575080631f69cb75146115725780632cb77e9f146115465780632fbc4ba0146113fc57806341d1514f146113c55780635cffe9de1461126957806360746119146110e5578063613255ab1461106257806369c7285614610771578063709fb8a5146104375780639235084d146103e3578063ac9650d814610295578063d7e442ec14610237578063d9d98ce4146101865763fa501182146100c1575f80fd5b34610182576101403660031901126101825767ffffffffffffffff600435818111610182576100f4903690600401611b64565b6024358281116101825761010c903690600401611b64565b60c0366043190112610182576101043583811161018257610131903690600401611d0a565b90610124359384116101825761014e61015c943690600401611d0a565b926101576126ea565b612230565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b5f80fd5b34610182576040366003190112610182576001600160a01b036101a7611853565b166040516370a0823160e01b8152306004820152602081602481855afa90811561022c575f916101fa575b50156101e25760206040515f8152f35b60249060405190633c5bf76960e21b82526004820152fd5b90506020813d602011610224575b81610215602093836119d3565b810103126101825751826101d2565b3d9150610208565b6040513d5f823e3d90fd5b346101825760203660031901126101825760043567ffffffffffffffff81116101825761028f61026e61015c923690600401611822565b91906102786126ea565b60405192610285846119b7565b5f84523691611dde565b90612b82565b34610182576020806003193601126101825760043567ffffffffffffffff8111610182576102c7903690600401611822565b9190604051926102d6846119b7565b5f84528284016102e582611ab7565b946102f360405196876119d3565b8286526102ff83611ab7565b9361031186880195601f190186612214565b5f5b84811061037557604080518881528951818a018190525f92600582901b83018101918a918c9085015b8287106103495785850386f35b909192938280610365600193603f198a820301865288516118df565b960192019601959291909261033c565b806103c4886103be61039160019560059d9c9d1b8701876120f4565b929089846040519586938585013782018381015f81528b519283915e015f838201520380845201826119d3565b306139f0565b6103ce828a611fda565b526103d98189611fda565b5001969596610313565b3461018257600319602036820112610182576004359067ffffffffffffffff82116101825760809082360301126101825761042260609160040161213c565b90604051921515835260208301526040820152f35b34610182576003196040368201126101825760043567ffffffffffffffff8082116101825760c0826004019383360301126101825760243590811161018257610484903690600401611822565b9061048d6126ea565b6104be6104b96104b46104ad6104a38880612127565b60408101906120f4565b36916119f5565b613986565b6139db565b801561075f576001101561074d57602483016104da8186611f47565b90501561073b5760448401946104f08682611f47565b9050156107295761055661051e9661054a61051561050e8580612127565b9585611f47565b99909285611f47565b91909261053b6040519761053189611903565b3389523690611a59565b9a60209b8c8901523691611acf565b60408601523691611acf565b60608301526064850135608083015261056e8261272c565b91825f525f875260405f209586541596876105b2575b888860017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055604051908152f35b6001905560a46001600160a01b03917f87491344dfbcf91f6cbbc610cbbeedc85313d37a02df0c93527f7ea5f8db717f83855116604051908152878c82015260606040820152806106066060820188612042565b0390a1019161061583856120f4565b9050610679575b5050505061066d929161066561064e61028f933390919060405192600284526020840152604083015260608201604052565b906040519160018352602083015260408201604052565b923691611dde565b82808080808080610584565b6106866104ad84866120f4565b61068f81614777565b156107025750937fd46c2c56b35c8210e9e712ec3f02242d5fc90187c0ac8ed80cc33626846ec3698961066d9897956106f56106d86106659761064e9761028f9b5116936120f4565b866040519586958652850152606060408501526060840191611d39565b0390a1938395965061061c565b89610725604051928392630c89984b60e31b8452600484015260248301906118df565b0390fd5b60405163540e5f0b60e01b8152600490fd5b604051636c44ef8f60e01b8152600490fd5b604051633c8270bd60e21b8152600490fd5b604051632cff108b60e21b8152600490fd5b34610182576003196020368201126101825767ffffffffffffffff600435116101825760c09060043536030112610182576107aa6126ea565b5f80806107bf60048035608481019101611e90565b9050156110505760246004350135926107d784612791565b1561103e576060806040516107eb8161196b565b6107f3611ee5565b81525f60208201525f6040820152015261080b611ee5565b5061086b61086661084561083b61083561082f608460043501600435600401611e90565b90611f17565b80611f32565b6040810190611f47565b602061085e61082f608460043501600435600401611e90565b013591611f7d565b611d25565b936001600160a01b036108ba6108666108a161089761083561082f608460043501600435600401611e90565b6060810190611f47565b604061085e61082f608460043501600435600401611e90565b81604051976108c889611933565b16875216602086015260408501526108ea608460043501600435600401611e90565b9490506001604051955f87520160051b85016040525f905f5b610917608460043501600435600401611e90565b905081108061102b575b15610e785761093a608460043501600435600401611e90565b821015610e64578160051b810135607e1982360301811215610182576080818301360312610182576040519161096f8361196b565b8181013567ffffffffffffffff81116101825761099190369084840101611b64565b835280820160208181013590850152604080820135908501526060013567ffffffffffffffff8111610182576109ca9236920101611d0a565b606082015280516001600160a01b036109ec6040830151602085015190611fda565b5151166001600160a01b0385511614801590610e30575b610e1e57610a1b6020830151604084015190836130d2565b610a248161272c565b91825f525f60205260405f2054155f14610a88575051604080513381526001600160a01b039092166020830152810191909152600191907fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f390606090a15b01610903565b9190610ab9602084979597015160408501519060608601519060405192610aae846119b7565b5f8452339186613107565b925f93610ad1606082015160446004350135906127b4565b15610b3857505051604080513381526001600160a01b03909216602083015281019190915260019291907fe3151dc8cb7a54ffc4baabd28c1f241c94d510b5e5b502491ac3cad6c16316d590606090a15b8115610b30575b5092610a82565b905088610b29565b610b456040820151612791565b158015610e0b575b15610ba257505051604080513381526001600160a01b03909216602083015281019190915260019291907f500b713857325f9e6dcb52ae832eca9109d107ed1aae9cb4928b4c1e13f051aa90606090a1610b22565b9250925050600196959691610bbb606460043501611fee565b15610d785796610c2b97610c3b60408401516040880151610bdc8183613460565b15610d705750925b610c35848592610c1e610c1860608a01516001600160e01b03601b918660e01d92828816810b928260e01d9216900b613e30565b90613feb565b9d8e9260408d015161352b565b60408c0152613555565b99613555565b98610c46848461357f565b610c5084826135dd565b60405192338452608060208501526060610c768451608080880152610100870190612042565b93602081015160a0870152604081015160c0870152015192607f198582030160e0860152835180825260208201906020808260051b8501019601925f5b828110610d1257505050505092806001979695937f194f1feb3b4d7076a2c272e774e792e0c48bb8c7aa1a9a3671c1cd6da9e6b4c193610d0d96604084015260608301520390a180858c5101808d5260051b8c01526136ef565b610b22565b9091929396602080610d63600193601f198782030189528b51906001600160a01b0382511681526040610d528584015160608785015260608401906120c1565b9201519060408184039101526118df565b9901950193929101610cb3565b905092610be4565b610c2b90610c3b6060840151610c35610db6610c1860408801516001600160e01b0394601b90868360e01d9316820b91878260e01d9216900b613e30565b60408a0151610dc58183613460565b15610e035750915b829c8d916060890151908116155f14610df4575060408801515b96879460408d015161352b565b610dfe9085613487565b610de7565b905091610dcd565b50610e19606082015161343d565b610b4d565b60405163936bb5ad60e01b8152600490fd5b506001600160a01b03610e4c6060830151604085015190611fda565b5151166001600160a01b036020860151161415610a03565b634e487b7160e01b5f52603260045260245ffd5b50919390610e8a606460043501611fee565b1561102557835b6004356004013590610ea38282613460565b6110075750508490610ec3856001600160a01b0360208701511633613069565b505060a46004350190610edb826004356004016120f4565b905015159081610fff575b50610f5e575b506001600160a01b03610f0292935116336127db565b50505b8351811015610f2a5780610f24610f1e60019387611fda565b516138c8565b01610f05565b5060409160017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005582519182526020820152f35b90506001600160a01b03602084015116610f886001600160a01b03855116926004356004016120f4565b929091333b1561018257610fd05f93604051958694859463691f9ed760e01b8652600486015260248501528960448501528a606485015260a0608485015260a4840191611d39565b038183335af190811561022c57859115610eec579050610ff09150611987565b5f836001600160a01b03610eec565b905088610ee6565b604492506040519163573b6f4160e01b835260048301526024820152fd5b84610e91565b506110396040830151612791565b610921565b60405163315f9e2360e21b8152600490fd5b604051639c95219f60e01b8152600490fd5b3461018257602080600319360112610182576024816001600160a01b03611087611853565b16604051928380926370a0823160e01b82523060048301525afa90811561022c575f916110b8575b50604051908152f35b90508181813d83116110de575b6110cf81836119d3565b810103126101825751826110af565b503d6110c5565b34610182576110f336611893565b92916111009491946126ea565b61110b83833361275d565b61111481612791565b15611238578160ff9161112c856111ef969533612d9c565b6111368183613460565b15611232575080935b61114b8582853361300b565b917f8045c25080b0868951141ed0a91720bcad09a8364a2b3109ee1fd49c1f0bc8b860c061117a898833613069565b97906001600160a01b0360405192338452169a8b6020840152856040840152886060840152608083015260a0820152a16040519660068852602088015260408701526060860152608085015260a08401521660c082015260e08101604052906040519160018352602083015260408201604052565b908061121b5760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b61122a9261028f913691611dde565b80808061015c565b9361113f565b50604051623a3a4d60e21b81523360048201526001600160a01b039190911660248201526044810191909152606490fd5b34610182576080366003190112610182576004356001600160a01b039081811680910361018257611298611869565b6044359167ffffffffffffffff916064358381116101825736602382011215610182578060040135938411610182573660248583010111610182576113259560209216936112e7868587612f2c565b60405196879283926323e30c8b60e01b84523360048501528760248501528860448501525f606485015260a06084850152602460a485019201611d39565b03815f855af193841561022c575f94611391575b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd984036113785761136d93503091612fa5565b602060405160018152f35b604051630b6c58a960e31b815260048101859052602490fd5b9093506020813d6020116113bd575b816113ad602093836119d3565b8101031261018257519284611339565b3d91506113a0565b346101825760603660031901126101825760206113f46113e3611853565b6113eb611869565b60443591612d9c565b604051908152f35b346101825761140a36611893565b928094926114166126ea565b61142182853361275d565b61142a81612791565b15611516578061143e61148d9286336127db565b9790957f7f9dfa19cf1cc2f806f2f860fbc9c056b601fb1afc0e9b843dfe5c63616268e660806040513381526001600160a01b038416998a60208301528560408301526060820152a133612881565b939091856114bb5760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b61150a9661028f956106659460ff93604051956005875260208701526040860152606085015260808401521660a082015260c08101604052906040519160018352602083015260408201604052565b8080808080808061015c565b506040516306dde9c360e41b81523360048201526001600160a01b03841660248201526044810191909152606490fd5b34610182576020366003190112610182576004355f525f6020526020600160405f205414604051908152f35b34610182576003196040368201126101825767ffffffffffffffff9060043582811161018257806004019160a08236039182011261018257602435848111610182576115c2903690600401611822565b90936115cc6126ea565b5f946001600160a01b0394856115e184611d25565b1633036117ad576115fa6115f53685611b64565b61272c565b805f525f60205260405f20966001885414611641575b60208960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556040519015158152f35b9091929394959697505f6001985560405196338852826020890152606060408901528161166d8761187f565b166060890152602484013590606219018112156101825783019060a060808901528061169b6004840161187f565b166101008901526116ae6024830161187f565b16610120880152604481013560221982360301811215610182570190602460048301359201988211610182578136038913610182577f09d18501db0080ca2d6cd7c17fa7255daff4b2d503ea93b76ff68b6752ea8e63878061066595608461177661028f9a60209f611735906117a09f9a606061014061064e9d0152610160880191611d39565b61176761175c6117486044880185611d59565b605f198a8603810160a08c01529491611d8e565b926064870190611d59565b918784030160c0880152611d8e565b91013560e08301520390a13390919060405192600284526020840152604083015260608201604052565b8280808080808080611610565b6024866117b985611d25565b6040516335252be360e01b815291166004820152fd5b34610182576020366003190112610182576004359063ffffffff60e01b82168092036101825760209163e414309160e01b8114908115611811575b5015158152f35b6301ffc9a760e01b1490508361180a565b9181601f840112156101825782359167ffffffffffffffff8311610182576020808501948460051b01011161018257565b600435906001600160a01b038216820361018257565b602435906001600160a01b038216820361018257565b35906001600160a01b038216820361018257565b906080600319830112610182576004356001600160a01b0381168103610182579160243591604435916064359067ffffffffffffffff8211610182576118db91600401611822565b9091565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b60a0810190811067ffffffffffffffff82111761191f57604052565b634e487b7160e01b5f52604160045260245ffd5b6060810190811067ffffffffffffffff82111761191f57604052565b6040810190811067ffffffffffffffff82111761191f57604052565b6080810190811067ffffffffffffffff82111761191f57604052565b67ffffffffffffffff811161191f57604052565b60e0810190811067ffffffffffffffff82111761191f57604052565b6020810190811067ffffffffffffffff82111761191f57604052565b90601f8019910116810190811067ffffffffffffffff82111761191f57604052565b92919267ffffffffffffffff821161191f5760405191611a1f601f8201601f1916602001846119d3565b829481845281830111610182578281602093845f960137010152565b9080601f8301121561018257816020611a56933591016119f5565b90565b91906060838203126101825760405190611a7282611933565b8193611a7d8161187f565b8352611a8b6020820161187f565b602084015260408101359167ffffffffffffffff831161018257604092611ab29201611a3b565b910152565b67ffffffffffffffff811161191f5760051b60200190565b929192611adb82611ab7565b604092611aeb60405192836119d3565b819581835260208093019160061b84019381851161018257915b848310611b1457505050505050565b8583830312610182578386918251611b2b8161194f565b611b348661187f565b81528286013583820152815201920191611b05565b9080601f8301121561018257816020611a5693359101611acf565b91909160a0818403126101825760405190611b7e82611903565b8193611b898261187f565b835267ffffffffffffffff9160208101358381116101825782611bad918301611a59565b602085015260408101358381116101825782611bca918301611b49565b6040850152606081013592831161018257611beb6080939284938301611b49565b60608501520135910152565b909291611c0384611ab7565b916040611c1360405194856119d3565b839580855260208095019160059160051b8401948086116101825784935b868510611c42575050505050505050565b67ffffffffffffffff90853582811161018257870190606082850312610182578451611c6d81611933565b611c768361187f565b81528a83013584811161018257830185601f8201121561018257803590611c9c82611ab7565b91611ca9895193846119d3565b8083528d808401918b1b83010191888311610182578e809101915b838310611cfa57509150508201528583013593841161018257611ceb858c95869501611a3b565b86820152815201940193611c31565b82358152918101918f9101611cc4565b9080601f8301121561018257816020611a5693359101611bf7565b356001600160a01b03811681036101825790565b908060209392818452848401375f828201840152601f01601f1916010190565b9035601e198236030181121561018257016020813591019167ffffffffffffffff8211610182578160061b3603831361018257565b9190808252602080920192915f905b828210611dab575050505090565b909192936001906001600160a01b03611dc38761187f565b16815285830135838201526040908101950193920190611d9d565b90929192611deb81611ab7565b91604091611dfc60405194856119d3565b839581855260208095019160051b8301938185116101825783925b858410611e275750505050505050565b67ffffffffffffffff908435828111610182578601908382860312610182578351611e518161194f565b82358481116101825786611e66918501611a59565b81528983013593841161018257611e81868b95869501611d0a565b83820152815201930192611e17565b903590601e1981360301821215610182570180359067ffffffffffffffff821161018257602001918160051b3603831361018257565b60405190611ed382611933565b60606040835f81525f60208201520152565b60405190611ef282611903565b5f608083828152611f01611ec6565b6020820152606060408201526060808201520152565b9015610e6457803590607e1981360301821215610182570190565b903590609e1981360301821215610182570190565b903590601e1981360301821215610182570180359067ffffffffffffffff821161018257602001918160061b3603831361018257565b9190811015610e645760061b0190565b805115610e645760200190565b805160011015610e645760400190565b805160021015610e645760600190565b805160031015610e645760800190565b805160041015610e645760a00190565b8051821015610e645760209160051b010190565b3580151581036101825790565b9081518082526020808093019301915f5b82811061201a575050505090565b835180516001600160a01b03168652820151858301526040909401939281019260010161200c565b906080806120b86120a661209460406001600160a01b0380895116885260208901519060a060208a01528082511660a08a015260208201511660c08901520151606060e08801526101008701906118df565b60408701518682036040880152611ffb565b60608601518582036060870152611ffb565b93015191015290565b9081518082526020808093019301915f5b8281106120e0575050505090565b8351855293810193928101926001016120d2565b903590601e1981360301821215610182570180359067ffffffffffffffff82116101825760200191813603831361018257565b903590605e1981360301821215610182570190565b6121536115f561214c8380611f32565b3690611b64565b5f525f602052600160405f2054036121ef5780612173816121df93611f32565b6121d76121926121976020850135938460408701359384923690611b64565b6130d2565b6121af6121a48580611f32565b946060810190611e90565b92906121cf604051966121c1886119b7565b5f88525f3681373690611b64565b933691611bf7565b923392613107565b6040810151606090910151600192565b505f905f905f90565b5f5b60808110612206575050565b6060828201526020016121fa565b5f5b82811061222257505050565b606082820152602001612216565b926001600160a01b038451166001600160a01b03835116146126d8576001600160a01b03612265606086015160643590611fda565b515116906040830151916001600160a01b036122846084358095611fda565b51511614801590612698575b610e1e576040850151906001600160a01b036122af6044358094611fda565b5151166001600160a01b036122ca60643560608a0151611fda565b51511614612686576122db8661272c565b805f525f60205260405f20541561263357506122f68461272c565b805f525f60205260405f2054156125df57506123d992916123b3917f6fa7f4c28634b0a9d6831401c45ae468195fb63aed07308935c35374ff5d9e396040518061235e61235061012033845280602085015283018d612042565b82810360408401528a612042565b85606083015260643560808301528760a083015260a43560c083015260c43560e083015260e4356101008301520390a16001600160a01b03865116604051926123a6846119b7565b5f8452606435908a613107565b936001600160a01b03865116604051926123cc846119b7565b5f845260a4359086613107565b916123e76040820151612791565b1580156125cb575b80156125b8575b80156125a5575b612593576040519161240e8361196b565b5f83525f60208401525f60408401525f606084015261242d848361479b565b84526040840152612453612441838661479b565b6020860152806060860152845161352b565b94612467602085015160408601519061352b565b936124718761343d565b8015612584575b6125725761253961256b957fd9fa84dd790c969daa5c33d8050dc06b4a9b59d5b42e2be5f5e8ae20447f618d9461251b6125709a60a0966124ba8a885161357f565b6124c88c602089015161357f565b6124d68a60408901516135dd565b6124e48c60608901516135dd565b6124ed8a6138c8565b6124f68c6138c8565b6001600160a01b0361251260c435926060606435910151611fda565b51511633612881565b50506001600160a01b0361251260e43592606060a435910151611fda565b5050606060405191338352805160208401526020810151604084015260408101518284015201516080820152a16136ef565b6136ef565b565b604051630d86822160e01b8152600490fd5b5061258e8561343d565b612478565b6040516321badf1f60e01b8152600490fd5b506125b3606084015161343d565b6123fd565b506125c6606082015161343d565b6123f6565b506125d96040840151612791565b156123ef565b9351604080513381526001600160a01b039092166020830152810194909452507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f3945091925082915050606081015b0390a1565b9551604080513381526001600160a01b039092166020830152810196909652507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f39493508392505060608201905061262e565b604051631cd2f1c760e21b8152600490fd5b506001600160a01b036126b2606085015160a43590611fda565b5151166001600160a01b036126ce604088015160443590611fda565b5151161415612290565b604051630a98f1f360e21b8152600490fd5b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00600281541461271a5760029055565b604051633ee5aeb560e01b8152600490fd5b604051612757816127496020820194602086526040830190612042565b03601f1981018352826119d3565b51902090565b909115612768575050565b6040516305dbdfd960e41b81526001600160a01b03918216600482015291166024820152604490fd5b6127b0905f60e01d906001600160e01b038160e01d9116601b0b6147fe565b1290565b906127b0916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b61487f565b9291926127e782613ac3565b936127f18161343d565b61286f5784816001600160e01b036128109360e01d9116601b0b6148fe565b9290809315612846575b5082908161282a575b5050509190565b61283e926001600160a01b03309216612fa5565b5f8181612823565b9092505f19811461285b57600101915f61281a565b634e487b7160e01b5f52601160045260245ffd5b604051632eaefac360e21b8152600490fd5b9392919361288e8361343d565b61292c57846128aa576128a2939450613069565b50505f905f90565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f5281526128e7835f20549485613555565b956128f18761343d565b612914575f97885260018252838820908852815282872091875252909320829055565b835163c5e12af560e01b815260048101889052602490fd5b60405163793a8f5560e01b815260048101849052602490fd5b919060408382031261018257825167ffffffffffffffff908181116101825784019082601f8301121561018257815160209261298082611ab7565b9161298e60405193846119d3565b808352848084019160051b830101918683116101825785809101915b838310612a1d5750505050948281015191821161018257019180601f840112156101825782516129d981611ab7565b936129e760405195866119d3565b818552838086019260051b820101928311610182578301905b828210612a0e575050505090565b81518152908301908301612a00565b82518152918101918691016129aa565b90808251908181526020809101926020808460051b8301019501935f915b848310612a5b5750505050505090565b9091929394958480612a79600193601f198682030187528a516120c1565b9801930193019194939290612a4b565b91906020928381526001600160a01b0382511684820152838201516040820152612ac3604083015160e060608401526101008301906118df565b9060608301516080820152612aea608084015192601f1993848483030160a0850152612a2d565b9260a081015193838382030160c08401528680865192838152019501905f5b818110612b2d57505050611a5694955060c060e091015192828503019101526120c1565b825187529588019591880191600101612b09565b90604082019082526020606081936040838201528551809452019301915f5b828110612b6e575050505090565b835185529381019392810192600101612b60565b916040805191612b9183611903565b60048084526020612ba38186016121f8565b5f5b8751811015612bd85780612bbb6001928a611fda565b51612bc68289611fda565b52612bd18188611fda565b5001612ba5565b5092955092939093335f52308352855f2091865190612bf68261194f565b612bfe611ec6565b8252606085819301528751612c12816119b7565b5f8152885191612c21836119b7565b5f83525f3681375f5b8151811015612d8f57612c3d8183611fda565b5190888c8b84519189818401518d8d8251612c65575b50505050505050506001915001612c2a565b5f612cd497948197948c9794612c928c956001600160a01b039d8e81818d51169c0151169b015190613ba2565b94865199612c9f8b61199b565b8a528901528488015286015260808501528a60a08501528b60c08501525180958194829363d04dfe2360e01b84528301612a89565b03915afa938415612d85578b915f95612d5f575b508451612cfd575b50908b8e89838d8d612c53565b51015116803b1561018257612d2c925f918c8f84905180978195829463012c676d60e21b845233908401612b41565b03925af1918215612d5557600192612d46575b8981612cf0565b612d4f90611987565b5f612d3f565b8c513d5f823e3d90fd5b612d7c9195503d805f833e612d7481836119d3565b810190612945565b9050935f612ce8565b8e513d5f823e3d90fd5b5050505050505050509050565b8215612dd1576001600160a01b038091165f52600160205260405f2091165f5260205260405f20905f5260205260405f205490565b909150612ddd82613dd4565b6001600160a01b03809316906040918251946370a0823160e01b86528416938460048701526020928387602481865afa968715612ef3575f97612efd575b5083612e34612e2d83612e649a614ab3565b509061423e565b508651636eb1769f60e11b81526001600160a01b0390941660048501523060248501529297889081906044820190565b0381865afa968715612ef3575f97612ec2575b50612e2d612e8891611a5698614ab3565b50612e938183613460565b15612eba5750935b5f5260018252825f20905f528152815f20905f8052525f205490613555565b905093612e9b565b96508387813d8311612eec575b612ed981836119d3565b8101031261018257955195612e2d612e77565b503d612ecf565b85513d5f823e3d90fd5b96508387813d8311612f25575b612f1481836119d3565b810103126101825795519583612e1b565b503d612f0a565b6040519263a9059cbb60e01b5f526001600160a01b0380931660045260245260205f60448180855af160015f5114811615612f86575b8360405215612f7057505050565b635274afe760e01b835216600482015260249150fd5b6001811516612f9c57813b15153d151616612f62565b833d5f823e3d90fd5b9092604051936323b872dd60e01b5f526001600160a01b0393848092166004521660245260445260205f60648180855af160015f5114811615612ff5575b836040525f60605215612f7057505050565b6001811516612f9c57813b15153d151616612fe3565b939291936130188361343d565b61292c578461302c576128a29394506127db565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f5281526128e7835f2054948561352b565b9092919261307681613ac3565b936130808161343d565b6130c05784816001600160e01b0361309f9360e01d9116601b0b6148fe565b508092816130ae575050509190565b6001600160a01b0361283e9316612f2c565b604051632d1671a360e11b8152600490fd5b916130fd9060606130f2936001600160a01b039485916040880151611fda565b515116940151611fda565b5151161461268657565b949193613346919360c0915f6132cd6040928351946131258661199b565b61312d611ee5565b86526020958487820152848682015260609781868a809401528260808201528660a0820152015261327d85519161316383611903565b600483526131728884016121f8565b8d61317c8161272c565b9c896001600160a01b039e8f94859182865116908d5194600386528501528c840152168c820152608081018a526131b286611f8d565b526131bc85611f8d565b5088516131c881611933565b6002815289368c8301376131db86611f9a565b526131e585611f9a565b5060ff8a6132488b8501936132328761320b81613203858a51611fda565b515116613dd4565b9751168861321a848951611fda565b51511685613229858a51611fda565b51015191612d9c565b9661323e828751611fda565b5151169451611fda565b51015192169093929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b61328682611faa565b5261329081611faa565b506132b48a8d8d60ff8a6132488d8501936132328761320b81613203858a51611fda565b6132bd82611fba565b526132c781611fba565b50613ba2565b95878a511697848b0191825191868184511693015116928a855230875285808620915101518651916132fe836119b7565b86835287519561330d8761199b565b86528886015286850152848885015289608085015260a084015260c08301528351808098819463d04dfe2360e01b835260048301612a89565b03915afa968715613433575f945f98613411575b508451600281106133fa5750818386015195015161338061337a88611fca565b51611fba565b5161338b8183613460565b156133f25750925b6133b58685919060405192600284526020840152604083015260608201604052565b6133be88611faa565b526133c887611faa565b508251996133d58b61199b565b8a52890152870152850152608084015260a083015260c082015290565b905092613393565b602490835190630fbb8e5560e21b82526004820152fd5b9097506134299194503d805f833e612d7481836119d3565b939093965f61335a565b50513d5f823e3d90fd5b61345c905f60e01d906001600160e01b038160e01d9116601b0b6147fe565b1390565b9061345c916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b61487f565b6134ae6001600160e01b0392838316601b0b9260e01d938160e01d9116601b0b8484613ff5565b90637ffffff582136134fe575b906134c59161423e565b92909215806134f6575b6134d857505090565b6044925060405191638eba4d0760e01b835260048301526024820152fd5b5082156134cf565b6135088282614ede565b156134bb57604483856040519163d556b11160e01b835260048301526024820152fd5b611a5691610c18916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614444565b611a5691610c18916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614608565b6135d991608081018261359b6135958351611fca565b51611fca565b526135d26135cc6001600160a01b038094515116936135c36135bd8551611fca565b51611f8d565b51169251611fca565b51611faa565b519161300b565b5050565b906080810191806135f16135958551611fba565b526001600160a01b0380925151169161360d6135bd8551611fba565b511661361c6135cc8551611fba565b5190816136b75761362c8361343d565b61292c579183917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a959361262e955f5260209060018252613682604094855f20835f528452855f20855f528452855f2054613555565b945f5260018252835f20905f528152825f20915f52525f20555b51604051918291338352604060208401526040830190612a2d565b916136e8917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a959361262e95612881565b505061369c565b60c0810151908151915f92613863575b506137a46020918281510151926001600160a01b039081818187511696015116928660a082019485518252308452604097888320898686510151015160808601518b519161374c836119b7565b8683528c519361375b856119b7565b8785528d519661376a8861199b565b8752898701528c86015260016060860152608085015260a084015260c08301528851808099819463d04dfe2360e01b835260048301612a89565b03915afa94851561385957879561383b575b5084516137c7575b50505050505050565b81905101510151169051813b15613837579184918493836137fc965180978195829463012c676d60e21b845260048401612b41565b03925af190811561382e5750613817575b80808080806137be565b6138218291611987565b61382b578061380d565b80fd5b513d84823e3d90fd5b8480fd5b6138509195503d8089833e612d7481836119d3565b9050935f6137b6565b86513d89823e3d90fd5b6001600160a01b03602080845101510151169060a083015190823b15610182576138a6925f928360405180968195829463012c676d60e21b845260048401612b41565b03925af1801561022c57156136ff576138c0919250611987565b5f905f6136ff565b608081016138d96135cc8251611fba565b519182156138e657505050565b6139006135bd6001600160a01b0380935151169351611fba565b5116815f5260209160018352604092835f20835f528152835f20855f528152835f2054936001600160e01b03851661393b575b505050505050565b61395f955f9284845260018152828420868552815282842091845252812055613069565b5f808080613933565b8115613972570490565b634e487b7160e01b5f52601260045260245ffd5b60408151106139ce576020810151908051603f19810190811161285b5760051c82116139ba5760016020920160051b010190565b50506040516139c8816119b7565b5f815290565b506040516139c8816119b7565b8051156139eb57602001515f1a90565b505f90565b905f8091602081519101845af48080613a6e575b15613a245750506040513d81523d5f602083013e60203d82010160405290565b15613a4b57604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b3d15613a5c576040513d5f823e3d90fd5b60405163d6bda27560e01b8152600490fd5b503d151580613a045750813b1515613a04565b60041115613a8b57565b634e487b7160e01b5f52602160045260245ffd5b602090939291936001600160a01b036040820195168152613abf83613a81565b0152565b613acb614fcc565b6040805163b7bad1b160e01b81526001600160a01b0383166004820152909182826024815f73200e12d10bb0c5e4a17e7018f0f1161919bb93895af1928315613b99575f925f94613b64575b50613b2183613a81565b600183141580613b52575b613b365750505090565b5163ee07877f60e01b8152918291610725919060048401613a9f565b50613b5c83613a81565b821515613b2c565b90809450613b889293503d8511613b92575b613b8081836119d3565b8101906148d4565b919091925f613b17565b503d613b76565b513d5f823e3d90fd5b90805191613baf83611ab7565b91613bca604094613bc2865195866119d3565b808552611ab7565b601f199460209186013686840137835183519095908015613dc9576001613c209101965b6001978891010197613c17613c028a611ab7565b99613c0f86519b8c6119d3565b808b52611ab7565b01848901612214565b85805f9684516002815233878201523086820152606081018652613c438b611f8d565b52613c4d8a611f8d565b505f925b613d85575b5050508351613c69575b50505050505090565b85809598979692980181613c7d8289611fda565b52613c888188611fda565b505f925b613c9b575b5085969750613c60565b8451831015613d80576001600160a01b03613d1281613cba8689611fda565b51511686613cc8878a611fda565b51015187815160051b9101207f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f52601c52603c5f208c613d09888b611fda565b51015191614a2a565b15613d6857868098999a928192613d29878a611fda565b515116613d368787611fda565b52019385613d448289611fda565b510151613d51868c611fda565b52613d5c858b611fda565b50019290989796613c8c565b8951630a57f30960e31b815260048101859052602490fd5b613c91565b9091968151881015613dc0578280910197613da08184611fda565b51613dab8a8d611fda565b52613db6898c611fda565b5001919081613c51565b96829150613c56565b50613c205f96613bee565b613ddc614fcc565b60408051630782d7e160e01b81526001600160a01b03831660048201529091828260248173200e12d10bb0c5e4a17e7018f0f1161919bb93895afa928315613b99575f925f94613b645750613b2183613a81565b9091939284158215175f14613e4a5750505090505f905f90565b82810192600160fd1b8082019083011760fe1c613f81575b5050613e6d81614ba3565b93613e7781614ba3565b94613e828682614bc3565b90918215613f72575f9083986f0785ee10d5da46d900f436a000000000808611613f64575b50670de0b6b3a7640000808b11613f55575b50633b9aca00808b11613f46575b50612710808b11613f38575b5098805b613f27575081906118db989982600a0a9109960195817fcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccd0a93838211900382610100031b9203901c170291614bd6565b60019290920191600a900480613ed7565b60049a04998a930192613ed3565b600991939a049901915f613ec7565b601291939a049901915f613eb9565b85049950602592505f613ea7565b509290506118db949550614bd6565b5f821215613fd557808413613fc7575b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb2841315613e62579092506118db939491614ae1565b9092506118db939491614b48565b80841215613f91579092506118db939491614ae1565b6134c5828261423e565b9290918061401b576044848460405191637a97930f60e01b835260048301526024820152fd5b90919280155f1461403057505050505f905f90565b6140499361403d91614c90565b92919490938492614c90565b909391928461405788614ba3565b9161406186614ba3565b947f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000094604c91868810614208575b030191600160ff1b98838a018112155f146141d5575050035b5f955f8212806141cc575b6141ae575b5f81128061419c575b61417e5786820103966001600160ff1b0388149081614174575b508061416b575b80614162575b6141445750906140f89291614e3c565b915f811361410b575b506118db93614bd6565b9091604c82136141395761412291600a0a90613968565b90811561412f575f614101565b505050505f905f90565b50505050505f905f90565b876044916040519163d556b11160e01b835260048301526024820152fd5b505f85126140e8565b508284146140e2565b905088145f6140db565b604489836040519163d556b11160e01b835260048301526024820152fd5b50806001600160ff1b030182136140c1565b95508087018613156141c65786818703015b956140b8565b5f6141c0565b505f81136140b3565b89985090920390506001600160ff1b03819003870182136141f957018601946140a8565b5050505050505050505f905f90565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009650604b925061408f565b8115613972570590565b8082601b82810b8314614433577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e100000000000000000084056143df575b8380820b036143ce57507b199999999999999999999999999999999999999999999999999999987b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc8401111561437f575b838060030b03614303575b8084136142e75750506001600160e01b036001925b60e01b91161791565b8303600a0a8015613972576001600160e01b03910715926142de565b92915f8413156143535750906143198383614ede565b61433557637ffffffe1901600a0a810290637fffffff926142c9565b506044916040519163d556b11160e01b835260048301526024820152fd5b637fffffff1992830390604382136141395761437291600a0a90614234565b91821561412f57926142c9565b5f198401808060030b1461439357506142be565b90506001600160e01b039293507b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff915060e01b9260ff1d181617905f90565b600190940193600a90930592614271565b937f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000840515614420576305f5e100600894058094819201955b915050614271565b620186a060059405809481920195614418565b50826142be57505050505f90600190565b919291600160ff1b840161445c576118db9350614ef7565b906118db935f0391614608565b919291600160ff1b91908015806145f657509061448591614c90565b9490929091905f8685858582821380156145ed575b6145d0575b505050508682841860ff1c94860391039081604c0381116145b55701600a0a80820591908461459b575b505081019182821860ff1c111561459357826001600160ff1b031461457557905f600192135f1461454657600a9004915b01925b8115811761450a57509190565b80614523575b50801561451b579190565b505f91508190565b91926145399203600160ff1b01600a0a90614234565b600160ff1b91905f614510565b600a60037fe66666666666666666666666666666666666666666666666666666666666666792010401916144fa565b604490836040519163d556b11160e01b835260048301526024820152fd5b5090926144fd565b81076145a8575b806144c9565b60ff1d600117015f6145a2565b5050509193506145c3579190565b60018160ff1d1790039190565b5f9a50909750909550600160ff1b9450925090508680808061449f565b50835f1261449a565b156146015750509190565b9350919050565b93929193841581158181176147595750509061462391614c90565b919490829561463482958294614c90565b8096929491969387868482138015614750575b614737575b5050505050508682841860ff1c94860391039081604c0381116145b55701600a0a80820591908461471d575b505081019182821860ff1c111561471557826001600160ff1b031461457557905f600192135f146146e657600a9004915b01925b811581176146b957509190565b806146c95750801561451b579190565b600160ff1b936146e09291038401600a0a90614234565b5f614510565b600a60037fe66666666666666666666666666666666666666666666666666666666666666792010401916146a9565b5090926146ac565b810761472a575b80614678565b60ff1d600117015f614724565b929b5098509196509450925090505f808080808061464c565b50858412614647565b939593909291901561476f57505061451b579190565b945092915050565b60088151106139eb576008015167ffffffffffffffff1667ff0a89c674ee78741490565b91604083019260406147d5610c18606087519401938451906001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b613e30565b945193016147e48151866127b4565b6147ec575050565b909350611a5691925051925183613487565b92915f9060018184145f87128715171717614878575f9280821361486a575b03604c81135f82121761485e57600a0a908461483c8382029384614234565b146148515750501561484d575f9190565b5f90565b9093509015611a56579190565b50501561484d575f9190565b5f956001945092509061481d565b5050505f90565b93929190918083145f83125f871218831587151717176148ce575f928082136148c15703604c81135f82121761485e57600a0a908461483c8382029384614234565b919460019350919061481d565b50919050565b919082604091031261018257815160048110156101825760209092015160ff811681036101825790565b91925f831215614926576044838360405191634a7d166b60e01b835260048301526024820152fd5b91928361493857505090505f90600190565b60ff8116820191808312614a00575f831215614970575050604c19811261451b575f03600a0a916149698382613968565b9283021490565b909293915f81135f146149f657604d81136149cb57600a0a92831561397257835f190483116149a25750500290600190565b60405163c849483b60e01b815260048101849052602481019290925260ff166044820152606490fd5b5060405163c849483b60e01b81526004810192909252602482015260ff919091166044820152606490fd5b5050905090600190565b60405163c849483b60e01b815260048101869052602481019190915260ff82166044820152606490fd5b9091813b614a6557614a3c9192615035565b50614a4681613a81565b159182614a5257505090565b6001600160a01b03918216911614919050565b6020918160645f935160405192630b135d3f60e11b9788855260048501526040602485015286820190604485015e8281018201859052601f01601f191601915afa905f5114601f3d11161690565b9060ff165f03916001600160ff1b0382115f14614ad957600a6001818404940192061590565b909190600190565b909392915f614af1918184613e30565b9490945f8483019182019412159081614b3e575b8115614b34575b50614b1657505090565b604492506040519163d556b11160e01b835260048301526024820152fd5b905083125f614b0c565b8281129150614b05565b614b5d93600160fe1b90810193920190613e30565b9081815f821215614b94575050604b1982126128a257614b82915f03600a0a90614234565b9081614b8c575f90565b600160ff1b90565b93600160ff1b90910192509050565b5f811215611a5657600160ff1b90808203614bbc575090565b90505f0390565b905f198183099102908180821091030391565b92939291905f8184181215614c6b576001600160ff1b039283831115614c5557600160ff1b93838503614c0b57505050509190565b90919293508514614c25575050600a600191045f03920190565b604051630ed8062160e21b8152600481019190915260248101919091526044810182905260648101849052608490fd5b5090915050600160ff1b811461285b575f039190565b90916001600160ff1b0380841115612823578514614c25575050600a60019104920190565b9190918015614e3257827f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000080830515614d40575b507f19999999999999999999999999999999999999999999999999999999999999997f0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc830110614d31575b8313614d1b5791905f90565b919060018060ff1b926001600160ff1b03030190565b9290600a02905f190192614d0f565b6f4b3b4ca85a86c47a098a22400000000080840515614e20575b507728c87cb5c89a2571ebfdcb54864ada834a00000000000000830515614e09575b7b097edd871cfda3a5697758bf0e3cbb5ac5741c640000000000000000830515614df5575b7e3899162693736ac531a5a58f1fbb4b746504382ca7e4000000000000000000830515614de557820515614dd6575b5f614cc4565b9290600a02905f190192614dd0565b9391606402916001190193614da1565b93916402540be40002916009190193614da1565b9391678ac7230489e8000002916012190193614d7c565b6025198301955092909202915f614d5a565b505f915081908190565b90915f198383099280830292838086109503948086039584871015614eba5714614eb2579082910960018219018216809204600280826003021880830282030280830282030280830282030280830282030280830282030280920290030293600183805f03040190848311900302920304170290565b505091500490565b60648386866040519263362ced0960e11b8452600484015260248301526044820152fd5b611a5691905f811215614ef2575f0361506f565b61506f565b909291600160ff1b91828101614f895750808414614f7f57808413918215614f77578185035b604c811115614f665750505f915b15614f5757507f8000000000000000000000000000000000000000000000000000000000000001019190565b92506001600160ff1b03039190565b600a0a908115613972570491614f2b565b848203614f1d565b505090505f905f90565b93614f9692945f03614469565b80939180928114614faa575b50505f039190565b915092506001600160ff1b03831461457557600a600191059201915f80614fa2565b73200e12d10bb0c5e4a17e7018f0f1161919bb9389803b15801561500a575b614ff25750565b602490604051906373e6d7b360e01b82526004820152fd5b507f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d41813f1415614feb565b81519190604183036150655761505e9250602082015190606060408401519301515f1a906150fe565b9192909190565b50505f9160029190565b90637ffffff58113156150f857637ffffffe19810190604382136150f1575f8212156150c557637fffffff91505f0301600a0a7b8000000000000000000000000000000000000000000000000000000202111590565b50600a0a8015613972577b80000000000000000000000000000000000000000000000000000001041090565b5050151590565b50505f90565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411615175579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa1561022c575f516001600160a01b0381161561516b57905f905f90565b505f906001905f90565b5050505f916003919056000000000000000000000000200e12d10bb0c5e4a17e7018f0f1161919bb93890000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000044b608060405234801561000f575f80fd5b506004361061004a575f3560e01c80630782d7e11461004e57806354636d2b14610078578063b7bad1b11461009d578063f5c36eaf146100b0575b5f80fd5b61006161005c366004610363565b6100c3565b60405161006f929190610403565b60405180910390f35b61008b610086366004610363565b6100d8565b60405160ff909116815260200161006f565b6100616100ab366004610363565b6100e9565b61008b6100be366004610363565b6100f5565b5f806100cf5f84610100565b91509150915091565b5f6100e35f836101f0565b92915050565b5f806100cf5f84610281565b5f6100e35f83610356565b73ffffffffffffffffffffffffffffffffffffffff81165f9081526020838152604080832081518083019092525460ff8082161515835261010090910416818301527f313ce56700000000000000000000000000000000000000000000000000000000808452839283908190816004818a5afa915060203d1015610182575f91505b811561019857505f5160ff811115610198575f91505b816101af57505050602001516003925090506101e9565b83516101c3575f955093506101e992505050565b836020015160ff1681146101d85760026101db565b60015b846020015195509550505050505b9250929050565b5f805f6101fd8585610281565b909250905060018260038111156102165761021661039d565b1415801561023557505f8260038111156102325761023261039d565b14155b156102795783826040517fee07877f000000000000000000000000000000000000000000000000000000008152600401610270929190610421565b60405180910390fd5b949350505050565b5f805f8061028f8686610100565b90925090505f8260038111156102a7576102a761039d565b0361034b576040805180820182526001815260ff838116602080840191825273ffffffffffffffffffffffffffffffffffffffff8a165f908152908b9052939093209151825493517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009094169015157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff161761010093909116929092029190911790555b909590945092505050565b5f805f6101fd8585610100565b5f60208284031215610373575f80fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114610396575f80fd5b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b600481106103ff577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b9052565b6040810161041182856103ca565b60ff831660208301529392505050565b73ffffffffffffffffffffffffffffffffffffffff831681526040810161039660208301846103ca560000000000000000000000000000000000000000000000000000000000000000006e2d0e71d900474b262e545bc4c98b71ab368d2100000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000003d486080604052600436106100d65760003560e01c80638456cb591161007f5780639a1f3406116100595780639a1f340614610200578063cd0fb7a714610220578063f2fde38b14610260578063fa461e331461028057600080fd5b80638456cb59146101ad5780638da5cb5b146101c257806393b3774c146101ed57600080fd5b80632c8958f6116100b05780632c8958f6146100f95780636b2ace871461013f578063715018a61461019857600080fd5b8063046f7da2146100e257806323a69e75146100f95780632646478b1461011957600080fd5b366100dd57005b600080fd5b3480156100ee57600080fd5b506100f76102a0565b005b34801561010557600080fd5b506100f7610114366004613579565b6103a8565b61012c6101273660046136f5565b6103ba565b6040519081526020015b60405180910390f35b34801561014b57600080fd5b506101737f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610136565b3480156101a457600080fd5b506100f7610564565b3480156101b957600080fd5b506100f7610578565b3480156101ce57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff16610173565b61012c6101fb36600461377c565b61067b565b34801561020c57600080fd5b506100f761021b36600461382f565b61089a565b34801561022c57600080fd5b5061025061023b366004613868565b60016020526000908152604090205460ff1681565b6040519015158152602001610136565b34801561026c57600080fd5b506100f761027b366004613868565b6108f8565b34801561028c57600080fd5b506100f761029b366004613579565b6109af565b60005473ffffffffffffffffffffffffffffffffffffffff163314806102d557503360009081526001602052604090205460ff165b610366576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f52503a2063616c6c6572206973206e6f7420746865206f776e6572206f72206160448201527f2070726976696c6567656420757365720000000000000000000000000000000060648201526084015b60405180910390fd5b600280547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff167501000000000000000000000000000000000000000000179055565b6103b4848484846109af565b50505050565b60025460009074010000000000000000000000000000000000000000900460ff16600114610444576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f526f75746550726f636573736f72206973206c6f636b65640000000000000000604482015260640161035d565b6002547501000000000000000000000000000000000000000000900460ff166001146104cc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f526f75746550726f636573736f72206973207061757365640000000000000000604482015260640161035d565b600280547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1674020000000000000000000000000000000000000000179055610519878787878787610b5d565b9050600280547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790559695505050505050565b61056c6111a3565b6105766000611224565b565b60005473ffffffffffffffffffffffffffffffffffffffff163314806105ad57503360009081526001602052604090205460ff165b610639576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f52503a2063616c6c6572206973206e6f7420746865206f776e6572206f72206160448201527f2070726976696c65676564207573657200000000000000000000000000000000606482015260840161035d565b600280547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff167502000000000000000000000000000000000000000000179055565b60025460009074010000000000000000000000000000000000000000900460ff16600114610705576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f526f75746550726f636573736f72206973206c6f636b65640000000000000000604482015260640161035d565b6002547501000000000000000000000000000000000000000000900460ff1660011461078d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f526f75746550726f636573736f72206973207061757365640000000000000000604482015260640161035d565b600280547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1674020000000000000000000000000000000000000000179055604051600090819073ffffffffffffffffffffffffffffffffffffffff8c16908b908381818185875af1925050503d8060008114610826576040519150601f19603f3d011682016040523d82523d6000602084013e61082b565b606091505b50915091508161083d57805181602001fd5b61084b898989898989610b5d565b92505050600280547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000017905598975050505050505050565b6108a26111a3565b73ffffffffffffffffffffffffffffffffffffffff91909116600090815260016020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b6109006111a3565b73ffffffffffffffffffffffffffffffffffffffff81166109a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161035d565b6109ac81611224565b50565b60025473ffffffffffffffffffffffffffffffffffffffff163314610a56576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f526f75746550726f636573736f722e756e697377617056335377617043616c6c60448201527f6261636b3a2063616c6c2066726f6d20756e6b6e6f776e20736f757263650000606482015260840161035d565b6000808513610a655783610a67565b845b905060008113610af9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f526f75746550726f636573736f722e756e697377617056335377617043616c6c60448201527f6261636b3a206e6f7420706f73697469766520616d6f756e7400000000000000606482015260840161035d565b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001660011790556000610b3283850185613868565b9050610b5573ffffffffffffffffffffffffffffffffffffffff82163384611299565b505050505050565b60008073ffffffffffffffffffffffffffffffffffffffff881673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14610c24576040517f70a0823100000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff8916906370a0823190602401602060405180830381865afa158015610bfb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c1f919061388c565b610c27565b60005b9050600073ffffffffffffffffffffffffffffffffffffffff871673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14610cf1576040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301528816906370a0823190602401602060405180830381865afa158015610cc8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cec919061388c565b610d0a565b8473ffffffffffffffffffffffffffffffffffffffff16315b905087600080610d2e87604080518082019091528181528151909101602082015290565b90505b805160208201511115610e84576000610d508280516001018051915290565b90508060ff1660011415610d7a576000610d6983611372565b905083610d74578094505b50610e73565b8060ff1660021415610d9557610d90828d611437565b610e73565b8060ff1660031415610dac576000610d6983611457565b8060ff1660041415610dc157610d908261147d565b8060ff1660051415610dd657610d90826114a3565b8060ff1660061415610dec57610d908d836115a8565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f526f75746550726f636573736f723a20556e6b6e6f776e20636f6d6d616e642060448201527f636f646500000000000000000000000000000000000000000000000000000000606482015260840161035d565b610e7c836138d4565b925050610d31565b506000905073ffffffffffffffffffffffffffffffffffffffff8b1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14610f4d576040517f70a0823100000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff8c16906370a0823190602401602060405180830381865afa158015610f24573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f48919061388c565b610f50565b60005b905083610f5d8b8361390d565b1015610feb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f526f75746550726f636573736f723a204d696e696d616c20696e70757420626160448201527f6c616e63652076696f6c6174696f6e0000000000000000000000000000000000606482015260840161035d565b600073ffffffffffffffffffffffffffffffffffffffff8a1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee146110b3576040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff89811660048301528b16906370a0823190602401602060405180830381865afa15801561108a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110ae919061388c565b6110cc565b8773ffffffffffffffffffffffffffffffffffffffff16315b90506110d8898561390d565b81101561111e576110e98482613925565b6040517f963b34a500000000000000000000000000000000000000000000000000000000815260040161035d91815260200190565b6111288482613925565b6040805173ffffffffffffffffffffffffffffffffffffffff8b81168252602082018790529181018c905260608101839052919750808c1691908e169033907f2db5ddd0b42bdbca0d69ea16f234a870a485854ae0d91f16643d6f317d8b89949060800160405180910390a450505050509695505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610576576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161035d565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905261136d9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915261163b565b505050565b6000806113858380516014018051915290565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290915073ffffffffffffffffffffffffffffffffffffffff8216906370a0823190602401602060405180830381865afa1580156113f2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611416919061388c565b91508115611425576001820391505b61143183308385611747565b50919050565b60006114498380516014018051915290565b905061136d83338385611747565b47611478823073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee84611747565b919050565b600061148f8280516014018051915290565b905061149f8260008360006117a2565b5050565b60006114b58280516014018051915290565b6040517ff7888aec00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff80831660048301523060248301529192506000917f0000000000000000000000000000000000000000000000000000000000000000169063f7888aec90604401602060405180830381865afa15801561154d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611571919061388c565b9050801561159c577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff015b61136d83308484611747565b60006115ba8280516020018051915290565b905060006115ce8380516020018051915290565b905060006115e28480516001018051915290565b905060006115f68580516020018051915290565b9050600061160a8680516020018051915290565b905061163273ffffffffffffffffffffffffffffffffffffffff8816333088888888886118d6565b50505050505050565b600061169d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16611b569092919063ffffffff16565b80519091501561136d57808060200190518101906116bb919061393c565b61136d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840161035d565b60006117598580516001018051915290565b905060005b8160ff16811015610b5557600061177b8780516002018051915290565b61ffff8082168602049485900394909150611798888888846117a2565b505060010161175e565b60006117b48580516001018051915290565b905060ff81166117cf576117ca85858585611b6d565b6118cf565b8060ff16600114156117e7576117ca85858585611f22565b8060ff16600214156117ff576117ca85858585612162565b8060ff1660031415611817576117ca85858585612410565b8060ff166004141561182f576117ca85858585612a98565b8060ff1660051415611847576117ca85858585612c26565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f526f75746550726f636573736f723a20556e6b6e6f776e20706f6f6c2074797060448201527f6500000000000000000000000000000000000000000000000000000000000000606482015260840161035d565b5050505050565b6040517f7ecebe0000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8881166004830152600091908a1690637ecebe0090602401602060405180830381865afa158015611946573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061196a919061388c565b6040517fd505accf00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a811660048301528981166024830152604482018990526064820188905260ff8716608483015260a4820186905260c48201859052919250908a169063d505accf9060e401600060405180830381600087803b158015611a0457600080fd5b505af1158015611a18573d6000803e3d6000fd5b50506040517f7ecebe0000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8b81166004830152600093508c169150637ecebe0090602401602060405180830381865afa158015611a8b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aaf919061388c565b9050611abc82600161390d565b8114611b4a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f5361666545524332303a207065726d697420646964206e6f742073756363656560448201527f6400000000000000000000000000000000000000000000000000000000000000606482015260840161035d565b50505050505050505050565b6060611b6584846000856131e1565b949350505050565b6000611b7f8580516014018051915290565b90506000611b938680516001018051915290565b90506000611ba78780516014018051915290565b90506000611bbb8880516003018051915290565b905073ffffffffffffffffffffffffffffffffffffffff8716301415611c0157611bfc73ffffffffffffffffffffffffffffffffffffffff87168587611299565b611c41565b73ffffffffffffffffffffffffffffffffffffffff8716331415611c4157611c4173ffffffffffffffffffffffffffffffffffffffff87163386886132fa565b6000808573ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015611c8f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cb39190613977565b506dffffffffffffffffffffffffffff1691506dffffffffffffffffffffffffffff169150600082118015611ce85750600081115b611d4e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f57726f6e6720706f6f6c20726573657276657300000000000000000000000000604482015260640161035d565b6000808660ff16600114611d63578284611d66565b83835b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8b8116600483015292945090925083918c16906370a0823190602401602060405180830381865afa158015611dda573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dfe919061388c565b611e089190613925565b98506000611e1986620f42406139c7565b611e289062ffffff168b6139eb565b9050600081611e3a85620f42406139eb565b611e44919061390d565b611e4e84846139eb565b611e589190613a28565b90506000808a60ff16600114611e7057826000611e74565b6000835b604080516000815260208101918290527f022c0d9f00000000000000000000000000000000000000000000000000000000909152919350915073ffffffffffffffffffffffffffffffffffffffff8d169063022c0d9f90611ede90859085908f9060248101613ad9565b600060405180830381600087803b158015611ef857600080fd5b505af1158015611f0c573d6000803e3d6000fd5b5050505050505050505050505050505050505050565b6000611f348580516014018051915290565b9050600080611f498780516001018051915290565b60ff161190506000611f618780516014018051915290565b905073ffffffffffffffffffffffffffffffffffffffff8616331415611fa357611fa373ffffffffffffffffffffffffffffffffffffffff86163330876132fa565b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff851690811790915563128acb088284878161201757612012600173fffd8963efd1fc6a506488495d951d5263988d26613b14565b612027565b6120276401000276a36001613b41565b6040805173ffffffffffffffffffffffffffffffffffffffff8d166020820152016040516020818303038152906040526040518663ffffffff1660e01b8152600401612077959493929190613b79565b60408051808303816000875af1158015612095573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120b99190613bc0565b505060025473ffffffffffffffffffffffffffffffffffffffff16600114611632576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f526f75746550726f636573736f722e73776170556e6956333a20756e6578706560448201527f6374656400000000000000000000000000000000000000000000000000000000606482015260840161035d565b60006121748580516001018051915290565b905060006121888680516014018051915290565b9050600180831614156122575760006121a78780516014018051915290565b905060028316612213578073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b1580156121f957600080fd5b505af115801561220d573d6000803e3d6000fd5b50505050505b73ffffffffffffffffffffffffffffffffffffffff821630146122515761225173ffffffffffffffffffffffffffffffffffffffff82168386611299565b50610b55565b600282166123205773ffffffffffffffffffffffffffffffffffffffff851633141561229f5761229f73ffffffffffffffffffffffffffffffffffffffff85163330866132fa565b6040517f2e1a7d4d0000000000000000000000000000000000000000000000000000000081526004810184905273ffffffffffffffffffffffffffffffffffffffff851690632e1a7d4d90602401600060405180830381600087803b15801561230757600080fd5b505af115801561231b573d6000803e3d6000fd5b505050505b60008173ffffffffffffffffffffffffffffffffffffffff168460405160006040518083038185875af1925050503d806000811461237a576040519150601f19603f3d011682016040523d82523d6000602084013e61237f565b606091505b5050905080611632576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f526f75746550726f636573736f722e777261704e61746976653a204e6174697660448201527f6520746f6b656e207472616e73666572206661696c6564000000000000000000606482015260840161035d565b60006124228580516001018051915290565b905060006124368680516014018051915290565b905060ff8216156128315773ffffffffffffffffffffffffffffffffffffffff85163014156124a5576124a073ffffffffffffffffffffffffffffffffffffffff85167f000000000000000000000000000000000000000000000000000000000000000085611299565b61275b565b73ffffffffffffffffffffffffffffffffffffffff8516331415612505576124a073ffffffffffffffffffffffffffffffffffffffff8516337f0000000000000000000000000000000000000000000000000000000000000000866132fa565b6040517f4ffe34db00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85811660048301527f00000000000000000000000000000000000000000000000000000000000000001690634ffe34db906024016040805180830381865afa158015612590573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125b49190613c04565b516040517fdf23b45b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301526fffffffffffffffffffffffffffffffff909216917f0000000000000000000000000000000000000000000000000000000000000000169063df23b45b90602401606060405180830381865afa158015612656573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061267a9190613c77565b60409081015190517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811660048301526fffffffffffffffffffffffffffffffff909216918716906370a0823190602401602060405180830381865afa158015612720573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612744919061388c565b61274e919061390d565b6127589190613925565b92505b6040517f02b9446c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85811660048301527f000000000000000000000000000000000000000000000000000000000000000081166024830181905290831660448301526064820185905260006084830152906302b9446c9060a40160408051808303816000875af1158015612806573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061282a9190613bc0565b5050610b55565b73ffffffffffffffffffffffffffffffffffffffff851615612908576040517ff18d03cc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85811660048301528681166024830152306044830152606482018590527f0000000000000000000000000000000000000000000000000000000000000000169063f18d03cc90608401600060405180830381600087803b1580156128eb57600080fd5b505af11580156128ff573d6000803e3d6000fd5b505050506129c1565b6040517ff7888aec00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85811660048301523060248301527f0000000000000000000000000000000000000000000000000000000000000000169063f7888aec90604401602060405180830381865afa15801561299a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129be919061388c565b92505b6040517f97da6d3000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152306024830152828116604483015260006064830152608482018590527f000000000000000000000000000000000000000000000000000000000000000016906397da6d309060a40160408051808303816000875af1158015612a6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a8e9190613bc0565b5050505050505050565b6000612aaa8580516014018051915290565b85516020808201805190920101875290915073ffffffffffffffffffffffffffffffffffffffff851615612b91576040517ff18d03cc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff858116600483015286811660248301528381166044830152606482018590527f0000000000000000000000000000000000000000000000000000000000000000169063f18d03cc90608401600060405180830381600087803b158015612b7857600080fd5b505af1158015612b8c573d6000803e3d6000fd5b505050505b6040517f627dd56a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83169063627dd56a90612be3908490600401613ce3565b6020604051808303816000875af1158015612c02573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611632919061388c565b6000612c388580516014018051915290565b90506000612c4c8680516001018051915290565b90506000612c608780516001018051915290565b60000b90506000612c778880516001018051915290565b60000b90506000612c8e8980516014018051915290565b90506000612ca28a80516014018051915290565b9050600073ffffffffffffffffffffffffffffffffffffffff891673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1415612d8b576040517f3df02124000000000000000000000000000000000000000000000000000000008152600f86810b600483015285900b6024820152604481018990526000606482015273ffffffffffffffffffffffffffffffffffffffff881690633df02124908a9060840160206040518083038185885af1158015612d5f573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612d84919061388c565b905061306e565b73ffffffffffffffffffffffffffffffffffffffff8a16331415612dcb57612dcb73ffffffffffffffffffffffffffffffffffffffff8a1633308b6132fa565b612dec73ffffffffffffffffffffffffffffffffffffffff8a16888a613358565b5060ff8616612e9f576040517f3df02124000000000000000000000000000000000000000000000000000000008152600f86810b600483015285900b6024820152604481018990526000606482015273ffffffffffffffffffffffffffffffffffffffff881690633df02124906084016020604051808303816000875af1158015612e7b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d84919061388c565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8416906370a0823190602401602060405180830381865afa158015612f0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f30919061388c565b6040517f3df02124000000000000000000000000000000000000000000000000000000008152600f88810b600483015287900b6024820152604481018b90526000606482015290915073ffffffffffffffffffffffffffffffffffffffff891690633df0212490608401600060405180830381600087803b158015612fb457600080fd5b505af1158015612fc8573d6000803e3d6000fd5b50506040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000925073ffffffffffffffffffffffffffffffffffffffff861691506370a0823190602401602060405180830381865afa158015613039573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061305d919061388c565b90506130698282613925565b925050505b73ffffffffffffffffffffffffffffffffffffffff831630146131d45773ffffffffffffffffffffffffffffffffffffffff821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14156131b35760008373ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114613117576040519150601f19603f3d011682016040523d82523d6000602084013e61311c565b606091505b50509050806131ad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f526f75746550726f636573736f722e7377617043757276653a204e617469766560448201527f20746f6b656e207472616e73666572206661696c656400000000000000000000606482015260840161035d565b506131d4565b6131d473ffffffffffffffffffffffffffffffffffffffff83168483611299565b5050505050505050505050565b606082471015613273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c0000000000000000000000000000000000000000000000000000606482015260840161035d565b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161329c9190613cf6565b60006040518083038185875af1925050503d80600081146132d9576040519150601f19603f3d011682016040523d82523d6000602084013e6132de565b606091505b50915091506132ef87838387613389565b979650505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526103b49085907f23b872dd00000000000000000000000000000000000000000000000000000000906084016112eb565b6000613365848484613426565b80611b65575061337784846000613426565b8015611b655750611b65848484613426565b6060831561341c5782516134155773ffffffffffffffffffffffffffffffffffffffff85163b613415576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161035d565b5081611b65565b611b658383613535565b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f095ea7b300000000000000000000000000000000000000000000000000000000179052915160009283928392918816916134bf9190613cf6565b6000604051808303816000865af19150503d80600081146134fc576040519150601f19603f3d011682016040523d82523d6000602084013e613501565b606091505b509150915081801561352b57508051158061352b57508080602001905181019061352b919061393c565b9695505050505050565b8151156135455781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161035d9190613ce3565b6000806000806060858703121561358f57600080fd5b8435935060208501359250604085013567ffffffffffffffff808211156135b557600080fd5b818701915087601f8301126135c957600080fd5b8135818111156135d857600080fd5b8860208285010111156135ea57600080fd5b95989497505060200194505050565b73ffffffffffffffffffffffffffffffffffffffff811681146109ac57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f83011261365b57600080fd5b813567ffffffffffffffff808211156136765761367661361b565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156136bc576136bc61361b565b816040528381528660208588010111156136d557600080fd5b836020870160208301376000602085830101528094505050505092915050565b60008060008060008060c0878903121561370e57600080fd5b8635613719816135f9565b9550602087013594506040870135613730816135f9565b9350606087013592506080870135613747816135f9565b915060a087013567ffffffffffffffff81111561376357600080fd5b61376f89828a0161364a565b9150509295509295509295565b600080600080600080600080610100898b03121561379957600080fd5b88356137a4816135f9565b97506020890135965060408901356137bb816135f9565b95506060890135945060808901356137d2816135f9565b935060a0890135925060c08901356137e9816135f9565b915060e089013567ffffffffffffffff81111561380557600080fd5b6138118b828c0161364a565b9150509295985092959890939650565b80151581146109ac57600080fd5b6000806040838503121561384257600080fd5b823561384d816135f9565b9150602083013561385d81613821565b809150509250929050565b60006020828403121561387a57600080fd5b8135613885816135f9565b9392505050565b60006020828403121561389e57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613906576139066138a5565b5060010190565b60008219821115613920576139206138a5565b500190565b600082821015613937576139376138a5565b500390565b60006020828403121561394e57600080fd5b815161388581613821565b80516dffffffffffffffffffffffffffff8116811461147857600080fd5b60008060006060848603121561398c57600080fd5b61399584613959565b92506139a360208501613959565b9150604084015163ffffffff811681146139bc57600080fd5b809150509250925092565b600062ffffff838116908316818110156139e3576139e36138a5565b039392505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613a2357613a236138a5565b500290565b600082613a5e577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60005b83811015613a7e578181015183820152602001613a66565b838111156103b45750506000910152565b60008151808452613aa7816020860160208601613a63565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b84815283602082015273ffffffffffffffffffffffffffffffffffffffff8316604082015260806060820152600061352b6080830184613a8f565b600073ffffffffffffffffffffffffffffffffffffffff838116908316818110156139e3576139e36138a5565b600073ffffffffffffffffffffffffffffffffffffffff808316818516808303821115613b7057613b706138a5565b01949350505050565b600073ffffffffffffffffffffffffffffffffffffffff8088168352861515602084015285604084015280851660608401525060a060808301526132ef60a0830184613a8f565b60008060408385031215613bd357600080fd5b505080516020909101519092909150565b80516fffffffffffffffffffffffffffffffff8116811461147857600080fd5b600060408284031215613c1657600080fd5b6040516040810181811067ffffffffffffffff82111715613c3957613c3961361b565b604052613c4583613be4565b8152613c5360208401613be4565b60208201529392505050565b805167ffffffffffffffff8116811461147857600080fd5b600060608284031215613c8957600080fd5b6040516060810181811067ffffffffffffffff82111715613cac57613cac61361b565b604052613cb883613c5f565b8152613cc660208401613c5f565b6020820152613cd760408401613be4565b60408201529392505050565b6020815260006138856020830184613a8f565b60008251613d08818460208701613a63565b919091019291505056fea26469706673582212201ff294929b57776d43429e47ba13e7bb550e4a27be6afbadf8c8a0d6ad6324b364736f6c634300080a0033000000000000000000000000000000000000000000000000"; + hex"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000052e000000000000000000000000000000000000000000000000000000000000057a00000000000000000000000002eb98f9489cff4a429368e389f5ffc6f8d9c5ede000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000052046080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a7146117b4575080632cb77e9f1461178857806341d1514f146117515780635343c1b7146116b65780635cffe9de1461155a5780635d003c44146113d6578063613255ab14611353578063687cf02a1461103c578063ac9650d814610eee578063b0460f07146105f3578063b845b83e1461059b578063ca9109ba1461044c578063d9d98ce41461039b578063ddebc96f146103475763df6db3c2146100c1575f80fd5b34610321576003196040368201126103215767ffffffffffffffff9060043582811161032157806004019160a0823603918201126103215760243584811161032157610111903690600401611c76565b909361011b61289f565b5f946001600160a01b0394856101308461257a565b163303610325576101496101443685611aa8565b6128e1565b805f525f60205260405f20966001885414610190575b60208960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556040519015158152f35b9091929394959697505f600198556040519633885282602089015260606040890152816101bc87611833565b166060890152602484013590606219018112156103215783019060a06080890152806101ea60048401611833565b166101008901526101fd60248301611833565b16610120880152604481013560221982360301811215610321570190602460048301359201988211610321578136038913610321577f09d18501db0080ca2d6cd7c17fa7255daff4b2d503ea93b76ff68b6752ea8e6387806103069560846102c561030e9a60209f610284906103149f9a60606101406102ef9d015261016088019161232b565b6102b66102ab610297604488018561268a565b605f198a8603810160a08c015294916126bf565b92606487019061268a565b918784030160c08801526126bf565b91013560e08301520390a13390919060405192600284526020840152604083015260608201604052565b906040519160018352602083015260408201604052565b92369161234b565b906135db565b5f8080808080808061015f565b5f80fd5b6024866103318561257a565b6040516335252be360e01b815291166004820152fd5b3461032157600319602036820112610321576004359067ffffffffffffffff8211610321576080908236030112610321576103866060916004016125ce565b90604051921515835260208301526040820152f35b34610321576040366003190112610321576001600160a01b036103bc611807565b166040516370a0823160e01b8152306004820152602081602481855afa908115610441575f9161040f575b50156103f75760206040515f8152f35b60249060405190633c5bf76960e21b82526004820152fd5b90506020813d602011610439575b8161042a60209383611917565b810103126103215751826103e7565b3d915061041d565b6040513d5f823e3d90fd5b346103215761045a36611ca7565b9280949261046661289f565b6104718285336134d7565b61047a81612e4c565b15610567578061048e6104dd928633613a1d565b9790957f7f9dfa19cf1cc2f806f2f860fbc9c056b601fb1afc0e9b843dfe5c63616268e660806040513381526001600160a01b038416998a60208301528560408301526060820152a133613133565b9390918561050c575b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b61055b9661030e956103069460ff93604051956005875260208701526040860152606085015260808401521660a082015260c08101604052906040519160018352602083015260408201604052565b808080808080806104e6565b506040516306dde9c360e41b81523360048201526001600160a01b03841660248201526044810191909152606490fd5b0390fd5b346103215760203660031901126103215760043567ffffffffffffffff81116103215761030e6105d26104e6923690600401611c76565b91906105dc61289f565b604051926105e9846118fb565b5f8452369161234b565b34610321576003196020368201126103215767ffffffffffffffff600435116103215760c090600435360301126103215761062c61289f565b5f8080610641600480356084810191016124b3565b905015610edc57602460043501359261065984612e4c565b15610eca5760608060405161066d816118af565b610675612508565b81525f60208201525f6040820152015261068d612508565b506106ed6106e86106c76106bd6106b76106b16084600435016004356004016124b3565b9061253a565b80612555565b6040810190612445565b60206106e06106b16084600435016004356004016124b3565b01359161256a565b61257a565b936001600160a01b0361073c6106e86107236107196106b76106b16084600435016004356004016124b3565b6060810190612445565b60406106e06106b16084600435016004356004016124b3565b816040519761074a89611877565b168752166020860152604085015261076c6084600435016004356004016124b3565b9490506001604051955f87520160051b85016040525f905f5b6107996084600435016004356004016124b3565b9050811080610eb7575b15610d04576107bc6084600435016004356004016124b3565b821015610cf0578160051b810135607e198236030181121561032157608081830136031261032157604051916107f1836118af565b8181013567ffffffffffffffff81116103215761081390369084840101611aa8565b835280820160208181013590850152604080820135908501526060013567ffffffffffffffff81116103215761084c9236920101611c5b565b606082015280516001600160a01b0361086e6040830151602085015190611d64565b5151166001600160a01b0385511614801590610cbc575b610caa5761089d60208301516040840151908361391a565b6108a6816128e1565b91825f525f60205260405f2054155f1461090a575051604080513381526001600160a01b039092166020830152810191909152600191907fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f390606090a15b01610785565b919061093b602084979597015160408501519060608601519060405192610930846118fb565b5f8452339186612b0e565b925f9361095360608201516044600435013590612e6f565b156109ba57505051604080513381526001600160a01b03909216602083015281019190915260019291907fe3151dc8cb7a54ffc4baabd28c1f241c94d510b5e5b502491ac3cad6c16316d590606090a15b81156109b2575b5092610904565b9050886109ab565b6109c76040820151612e4c565b158015610c97575b15610a2457505051604080513381526001600160a01b03909216602083015281019190915260019291907f500b713857325f9e6dcb52ae832eca9109d107ed1aae9cb4928b4c1e13f051aa90606090a16109a4565b9250925050600196959691610a3d60646004350161258e565b15610c045796610aad97610abd60408401516040880151610a5e8183612eb9565b15610bfc5750925b610ab7848592610aa0610a9a60608a01516001600160e01b03601b918660e01d92828816810b928260e01d9216900b613f6a565b90613edf565b9d8e9260408d0151612ee0565b60408c01526139f3565b996139f3565b98610ac88484612f0a565b610ad28482612f68565b60405192338452608060208501526060610af88451608080880152610100870190611dbf565b93602081015160a0870152604081015160c0870152015192607f198582030160e0860152835180825260208201906020808260051b8501019601925f5b828110610b9457505050505092806001979695937fbae4dbf76931c547f765e9def16d693d86daaa596f491de979008831789185ae93610b8f96604084015260608301520390a180858c5101808d5260051b8c015261321f565b6109a4565b9091929396602080610bef600193601f198782030189528b51906001600160a01b03825116815283820151848201526060610bde604084015160806040850152608084019061259b565b920151906060818403910152611cf3565b9901950193929101610b35565b905092610a66565b610aad90610abd6060840151610ab7610c42610a9a60408801516001600160e01b0394601b90868360e01d9316820b91878260e01d9216900b613f6a565b60408a0151610c518183612eb9565b15610c8f5750915b829c8d916060890151908116155f14610c80575060408801515b96879460408d0151612ee0565b610c8a908561394f565b610c73565b905091610c59565b50610ca56060820151612e96565b6109cf565b60405163936bb5ad60e01b8152600490fd5b506001600160a01b03610cd86060830151604085015190611d64565b5151166001600160a01b036020860151161415610885565b634e487b7160e01b5f52603260045260245ffd5b50919390610d1660646004350161258e565b15610eb157835b6004356004013590610d2f8282612eb9565b610e935750508490610d4f856001600160a01b0360208701511633613569565b505060a46004350190610d6782600435600401612412565b905015159081610e8b575b50610dea575b506001600160a01b03610d8e9293511633613a1d565b50505b8351811015610db65780610db0610daa60019387611d64565b51613093565b01610d91565b5060409160017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005582519182526020820152f35b90506001600160a01b03602084015116610e146001600160a01b0385511692600435600401612412565b929091333b1561032157610e5c5f93604051958694859463691f9ed760e01b8652600486015260248501528960448501528a606485015260a0608485015260a484019161232b565b038183335af190811561044157859115610d78579050610e7c91506118cb565b5f836001600160a01b03610d78565b905088610d72565b604492506040519163573b6f4160e01b835260048301526024820152fd5b84610d1d565b50610ec56040830151612e4c565b6107a3565b60405163315f9e2360e21b8152600490fd5b604051639c95219f60e01b8152600490fd5b34610321576020806003193601126103215760043567ffffffffffffffff811161032157610f20903690600401611c76565b919060405192610f2f846118fb565b5f8452828401610f3e826119fb565b94610f4c6040519687611917565b828652610f58836119fb565b93610f6a86880195601f190186612497565b5f5b848110610fce57604080518881528951818a018190525f92600582901b83018101918a918c9085015b828710610fa25785850386f35b909192938280610fbe600193603f198a82030186528851611cf3565b9601920196019592919092610f95565b8061101d88611017610fea60019560059d9c9d1b870187612412565b929089846040519586938585013782018381015f81528b519283915e015f83820152038084520182611917565b30613889565b611027828a611d64565b526110328189611d64565b5001969596610f6c565b34610321576003196040368201126103215760043567ffffffffffffffff8082116103215760c0826004019383360301126103215760243590811161032157611089903690600401611c76565b9061109261289f565b6110c36110be6110b96110b26110a888806123fd565b6040810190612412565b3691611939565b61380b565b613874565b8015611341576001101561132f57602483016110df8186612445565b90501561131d5760448401946110f58682612445565b90501561130b5761115b6111239661114f61111a61111385806123fd565b9585612445565b99909285612445565b9190926111406040519761113689611847565b338952369061199d565b9a60209b8c8901523691611a13565b60408601523691611a13565b606083015260648501356080830152611173826128e1565b91825f525f875260405f209586541596876111b7575b888860017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055604051908152f35b6001905560a46001600160a01b03917f87491344dfbcf91f6cbbc610cbbeedc85313d37a02df0c93527f7ea5f8db717f83855116604051908152878c820152606060408201528061120b6060820188611dbf565b0390a1019161121a8385612412565b905061125f575b5050505061125392916103066102ef61030e933390919060405192600284526020840152604083015260608201604052565b82808080808080611189565b61126c6110b28486612412565b61127581613f46565b156112e85750937fd46c2c56b35c8210e9e712ec3f02242d5fc90187c0ac8ed80cc33626846ec369896112539897956112db6112be610306976102ef9761030e9b511693612412565b86604051958695865285015260606040850152606084019161232b565b0390a19383959650611221565b89610597604051928392630c89984b60e31b845260048401526024830190611cf3565b60405163540e5f0b60e01b8152600490fd5b604051636c44ef8f60e01b8152600490fd5b604051633c8270bd60e21b8152600490fd5b604051632cff108b60e21b8152600490fd5b3461032157602080600319360112610321576024816001600160a01b03611378611807565b16604051928380926370a0823160e01b82523060048301525afa908115610441575f916113a9575b50604051908152f35b90508181813d83116113cf575b6113c08183611917565b810103126103215751826113a0565b503d6113b6565b34610321576113e436611ca7565b92916113f194919461289f565b6113fc8383336134d7565b61140581612e4c565b15611529578160ff9161141d856114e096953361270f565b6114278183612eb9565b15611523575080935b61143c8582853361350b565b917f8045c25080b0868951141ed0a91720bcad09a8364a2b3109ee1fd49c1f0bc8b860c061146b898833613569565b97906001600160a01b0360405192338452169a8b6020840152856040840152886060840152608083015260a0820152a16040519660068852602088015260408701526060860152608085015260a08401521660c082015260e08101604052906040519160018352602083015260408201604052565b908061150c5760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b61151b9261030e91369161234b565b8080806104e6565b93611430565b50604051623a3a4d60e21b81523360048201526001600160a01b039190911660248201526044810191909152606490fd5b34610321576080366003190112610321576004356001600160a01b03908181168091036103215761158961181d565b6044359167ffffffffffffffff916064358381116103215736602382011215610321578060040135938411610321573660248583010111610321576116169560209216936115d88685876133f8565b60405196879283926323e30c8b60e01b84523360048501528760248501528860448501525f606485015260a06084850152602460a48501920161232b565b03815f855af1938415610441575f94611682575b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd984036116695761165e93503091613471565b602060405160018152f35b604051630b6c58a960e31b815260048101859052602490fd5b9093506020813d6020116116ae575b8161169e60209383611917565b810103126103215751928461162a565b3d9150611691565b34610321576101403660031901126103215767ffffffffffffffff600435818111610321576116e9903690600401611aa8565b60243582811161032157611701903690600401611aa8565b60c0366043190112610321576101043583811161032157611726903690600401611c5b565b9061012435938411610321576117436104e6943690600401611c5b565b9261174c61289f565b611e70565b3461032157606036600319011261032157602061178061176f611807565b61177761181d565b6044359161270f565b604051908152f35b34610321576020366003190112610321576004355f525f6020526020600160405f205414604051908152f35b34610321576020366003190112610321576004359063ffffffff60e01b82168092036103215760209163e414309160e01b81149081156117f6575b5015158152f35b6301ffc9a760e01b149050836117ef565b600435906001600160a01b038216820361032157565b602435906001600160a01b038216820361032157565b35906001600160a01b038216820361032157565b60a0810190811067ffffffffffffffff82111761186357604052565b634e487b7160e01b5f52604160045260245ffd5b6060810190811067ffffffffffffffff82111761186357604052565b6040810190811067ffffffffffffffff82111761186357604052565b6080810190811067ffffffffffffffff82111761186357604052565b67ffffffffffffffff811161186357604052565b60e0810190811067ffffffffffffffff82111761186357604052565b6020810190811067ffffffffffffffff82111761186357604052565b90601f8019910116810190811067ffffffffffffffff82111761186357604052565b92919267ffffffffffffffff82116118635760405191611963601f8201601f191660200184611917565b829481845281830111610321578281602093845f960137010152565b9080601f830112156103215781602061199a93359101611939565b90565b919060608382031261032157604051906119b682611877565b81936119c181611833565b83526119cf60208201611833565b602084015260408101359167ffffffffffffffff8311610321576040926119f6920161197f565b910152565b67ffffffffffffffff81116118635760051b60200190565b929192611a1f826119fb565b604092611a2f6040519283611917565b819581835260208093019160061b84019381851161032157915b848310611a5857505050505050565b8583830312610321578386918251611a6f81611893565b611a7886611833565b81528286013583820152815201920191611a49565b9080601f830112156103215781602061199a93359101611a13565b91909160a0818403126103215760405190611ac282611847565b8193611acd82611833565b835267ffffffffffffffff9160208101358381116103215782611af191830161199d565b602085015260408101358381116103215782611b0e918301611a8d565b6040850152606081013592831161032157611b2f6080939284938301611a8d565b60608501520135910152565b90929192611b48816119fb565b91604094611b596040519485611917565b839583855260208095019160059460051b8401948186116103215784935b868510611b88575050505050505050565b67ffffffffffffffff90853582811161032157870190608082860312610321578551611bb3816118af565b611bbc83611833565b81528a8301358b8201528683013584811161032157830186601f8201121561032157803590611bea826119fb565b91611bf78a519384611917565b8083528d80840191891b83010191898311610321578e809101915b838310611c4b57505050508782015260608084013594851161032157611c3c878d9687960161197f565b90820152815201940193611b77565b82358152918101918f9101611c12565b9080601f830112156103215781602061199a93359101611b3b565b9181601f840112156103215782359167ffffffffffffffff8311610321576020808501948460051b01011161032157565b906080600319830112610321576004356001600160a01b0381168103610321579160243591604435916064359067ffffffffffffffff821161032157611cef91600401611c76565b9091565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b805115610cf05760200190565b805160011015610cf05760400190565b805160021015610cf05760600190565b805160031015610cf05760800190565b805160041015610cf05760a00190565b8051821015610cf05760209160051b010190565b9081518082526020808093019301915f5b828110611d97575050505090565b835180516001600160a01b031686528201518583015260409094019392810192600101611d89565b90608080611e35611e23611e1160406001600160a01b0380895116885260208901519060a060208a01528082511660a08a015260208201511660c08901520151606060e0880152610100870190611cf3565b60408701518682036040880152611d78565b60608601518582036060870152611d78565b93015191015290565b90611e48826119fb565b611e556040519182611917565b8281528092611e66601f19916119fb565b0190602036910137565b92916001600160a01b038451166001600160a01b0383511614612319576001600160a01b03611ea6606086015160643590611d64565b515116906040830151916001600160a01b03611ec56084358095611d64565b515116148015906122d9575b610caa576040850151906001600160a01b03611ef06044358094611d64565b5151166001600160a01b03611f0b60643560608a0151611d64565b515116146122c757611f1c866128e1565b805f525f60205260405f2054156122745750611f37846128e1565b805f525f60205260405f205415612220575061201a9291611ff4917f6fa7f4c28634b0a9d6831401c45ae468195fb63aed07308935c35374ff5d9e3960405180611f9f611f9161012033845280602085015283018d611dbf565b82810360408401528a611dbf565b85606083015260643560808301528760a083015260a43560c083015260c43560e083015260e4356101008301520390a16001600160a01b0386511660405192611fe7846118fb565b5f8452606435908a612b0e565b936001600160a01b038651166040519261200d846118fb565b5f845260a4359086612b0e565b916120286040820151612e4c565b15801561220c575b80156121f9575b80156121e6575b6121d4576040519161204f836118af565b5f83525f60208401525f60408401525f606084015261206e8483613e57565b845260408401526120946120828386613e57565b60208601528060608601528451612ee0565b946120a86020850151604086015190612ee0565b936120b287612e96565b80156121c5575b6121b35761217a6121ac957fd9fa84dd790c969daa5c33d8050dc06b4a9b59d5b42e2be5f5e8ae20447f618d9461215c6121b19a60a0966120fb8a8851612f0a565b6121098c6020890151612f0a565b6121178a6040890151612f68565b6121258c6060890151612f68565b61212e8a613093565b6121378c613093565b6001600160a01b0361215360c435926060606435910151611d64565b51511633613133565b50506001600160a01b0361215360e43592606060a435910151611d64565b5050606060405191338352805160208401526020810151604084015260408101518284015201516080820152a161321f565b61321f565b565b604051630d86822160e01b8152600490fd5b506121cf85612e96565b6120b9565b6040516321badf1f60e01b8152600490fd5b506121f46060840151612e96565b61203e565b506122076060820151612e96565b612037565b5061221a6040840151612e4c565b15612030565b9351604080513381526001600160a01b039092166020830152810194909452507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f3945091925082915050606081015b0390a1565b9551604080513381526001600160a01b039092166020830152810196909652507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f39493508392505060608201905061226f565b604051631cd2f1c760e21b8152600490fd5b506001600160a01b036122f3606085015160a43590611d64565b5151166001600160a01b0361230f604088015160443590611d64565b5151161415611ed1565b604051630a98f1f360e21b8152600490fd5b908060209392818452848401375f828201840152601f01601f1916010190565b90929192612358816119fb565b916040916123696040519485611917565b839581855260208095019160051b8301938185116103215783925b8584106123945750505050505050565b67ffffffffffffffff9084358281116103215786019083828603126103215783516123be81611893565b823584811161032157866123d391850161199d565b815289830135938411610321576123ee868b95869501611c5b565b83820152815201930192612384565b903590605e1981360301821215610321570190565b903590601e1981360301821215610321570180359067ffffffffffffffff82116103215760200191813603831361032157565b903590601e1981360301821215610321570180359067ffffffffffffffff821161032157602001918160061b3603831361032157565b5f5b60808110612489575050565b60608282015260200161247d565b5f5b8281106124a557505050565b606082820152602001612499565b903590601e1981360301821215610321570180359067ffffffffffffffff821161032157602001918160051b3603831361032157565b604051906124f682611877565b60606040835f81525f60208201520152565b6040519061251582611847565b5f6080838281526125246124e9565b6020820152606060408201526060808201520152565b9015610cf057803590607e1981360301821215610321570190565b903590609e1981360301821215610321570190565b9190811015610cf05760061b0190565b356001600160a01b03811681036103215790565b3580151581036103215790565b9081518082526020808093019301915f5b8281106125ba575050505090565b8351855293810193928101926001016125ac565b6125e56101446125de8380612555565b3690611aa8565b5f525f602052600160405f20540361268157806126058161267193612555565b6126696126246126296020850135938460408701359384923690611aa8565b61391a565b6126416126368580612555565b9460608101906124b3565b929061266160405196612653886118fb565b5f88525f3681373690611aa8565b933691611b3b565b923392612b0e565b6040810151606090910151600192565b505f905f905f90565b9035601e198236030181121561032157016020813591019167ffffffffffffffff8211610321578160061b3603831361032157565b9190808252602080920192915f905b8282106126dc575050505090565b909192936001906001600160a01b036126f487611833565b168152858301358382015260409081019501939201906126ce565b8215612744576001600160a01b038091165f52600160205260405f2091165f5260205260405f20905f5260205260405f205490565b90915061275082613ae8565b6001600160a01b03809316906040918251946370a0823160e01b86528416938460048701526020928387602481865afa968715612866575f97612870575b50836127a76127a0836127d79a6148ac565b509061436e565b508651636eb1769f60e11b81526001600160a01b0390941660048501523060248501529297889081906044820190565b0381865afa968715612866575f97612835575b506127a06127fb9161199a986148ac565b506128068183612eb9565b1561282d5750935b5f5260018252825f20905f528152815f20905f8052525f2054906139f3565b90509361280e565b96508387813d831161285f575b61284c8183611917565b81010312610321579551956127a06127ea565b503d612842565b85513d5f823e3d90fd5b96508387813d8311612898575b6128878183611917565b81010312610321579551958361278e565b503d61287d565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0060028154146128cf5760029055565b604051633ee5aeb560e01b8152600490fd5b60405161290c816128fe6020820194602086526040830190611dbf565b03601f198101835282611917565b51902090565b919060408382031261032157825167ffffffffffffffff908181116103215784019082601f8301121561032157815160209261294d826119fb565b9161295b6040519384611917565b808352848084019160051b830101918683116103215785809101915b8383106129ea5750505050948281015191821161032157019180601f840112156103215782516129a6816119fb565b936129b46040519586611917565b818552838086019260051b820101928311610321578301905b8282106129db575050505090565b815181529083019083016129cd565b8251815291810191869101612977565b90808251908181526020809101926020808460051b8301019501935f915b848310612a285750505050505090565b9091929394958480612a46600193601f198682030187528a5161259b565b9801930193019194939290612a18565b91906020928381526001600160a01b0382511684820152838201516040820152612a90604083015160e06060840152610100830190611cf3565b9060608301516080820152612ab7608084015192601f1993848483030160a08501526129fa565b9260a081015193838382030160c08401528680865192838152019501905f5b818110612afa5750505061199a94955060c060e0910151928285030191015261259b565b825187529588019591880191600101612ad6565b949193612d4d919360c0915f612cd4604092835194612b2c866118df565b612b34612508565b86526020958487820152848682015260609781868a809401528260808201528660a08201520152612c84855191612b6a83611847565b60048352612b7988840161247b565b8d612b83816128e1565b9c896001600160a01b039e8f94859182865116908d5194600386528501528c840152168c820152608081018a52612bb986611d17565b52612bc385611d17565b508851612bcf81611877565b6002815289368c830137612be286611d24565b52612bec85611d24565b5060ff8a612c4f8b850193612c3987612c1281612c0a858a51611d64565b515116613ae8565b97511688612c21848951611d64565b51511685612c30858a51611d64565b5101519161270f565b96612c45828751611d64565b5151169451611d64565b51015192169093929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b612c8d82611d34565b52612c9781611d34565b50612cbb8a8d8d60ff8a612c4f8d850193612c3987612c1281612c0a858a51611d64565b612cc482611d44565b52612cce81611d44565b50613bc6565b95878a511697848b0191825191868184511693015116928a85523087528580862091510151865191612d05836118fb565b868352875195612d14876118df565b86528886015286850152848885015289608085015260a084015260c08301528351808098819463d04dfe2360e01b835260048301612a56565b03915afa968715612e42575f945f98612e18575b50845160028110612e0157508183860151950151612d87612d8188611d54565b51611d44565b51612d928183612eb9565b15612df95750925b612dbc8685919060405192600284526020840152604083015260608201604052565b612dc588611d34565b52612dcf87611d34565b50825199612ddc8b6118df565b8a52890152870152850152608084015260a083015260c082015290565b905092612d9a565b602490835190630fbb8e5560e21b82526004820152fd5b909750612e389194503d805f833e612e308183611917565b810190612912565b939093965f612d61565b50513d5f823e3d90fd5b612e6b905f60e01d906001600160e01b038160e01d9116601b0b614963565b1290565b90612e6b916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6149e4565b612eb5905f60e01d906001600160e01b038160e01d9116601b0b614963565b1390565b90612eb5916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6149e4565b61199a91610a9a916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b613eba565b612f64916080810182612f26612f208351611d54565b51611d54565b52612f5d612f576001600160a01b03809451511693612f4e612f488551611d54565b51611d17565b51169251611d54565b51611d34565b519161350b565b5050565b90608081019180612f7c612f208551611d44565b526001600160a01b03809251511691612f98612f488551611d44565b5116612fa7612f578551611d44565b51908161305b57612fb783612e96565b613042579183917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a959361226f955f526020906001825261300d604094855f20835f528452855f20855f528452855f20546139f3565b945f5260018252835f20905f528152825f20915f52525f20555b516040519182913383526040602084015260408301906129fa565b60405163793a8f5560e01b815260048101849052602490fd5b9161308c917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a959361226f95613133565b5050613027565b608081016130a4612f578251611d44565b519182156130b157505050565b6130cb612f486001600160a01b0380935151169351611d44565b5116815f5260209160018352604092835f20835f528152835f20855f528152835f2054936001600160e01b038516613106575b505050505050565b61312a955f9284845260018152828420868552815282842091845252812055613569565b5f8080806130fe565b9392919361314083612e96565b613042578461315c57613154939450613569565b50505f905f90565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f528152613199835f205494856139f3565b956131a387612e96565b6131c6575f97885260018252838820908852815282872091875252909320829055565b835163c5e12af560e01b815260048101889052602490fd5b90604082019082526020606081936040838201528551809452019301915f5b82811061320b575050505090565b8351855293810193928101926001016131fd565b60c0810151908151915f92613393575b506132d46020918281510151926001600160a01b039081818187511696015116928660a082019485518252308452604097888320898686510151015160808601518b519161327c836118fb565b8683528c519361328b856118fb565b8785528d519661329a886118df565b8752898701528c86015260016060860152608085015260a084015260c08301528851808099819463d04dfe2360e01b835260048301612a56565b03915afa94851561338957879561336b575b5084516132f7575b50505050505050565b81905101510151169051813b156133675791849184938361332c965180978195829463012c676d60e21b8452600484016131de565b03925af190811561335e5750613347575b80808080806132ee565b61335182916118cb565b61335b578061333d565b80fd5b513d84823e3d90fd5b8480fd5b6133809195503d8089833e612e308183611917565b9050935f6132e6565b86513d89823e3d90fd5b6001600160a01b03602080845101510151169060a083015190823b15610321576133d6925f928360405180968195829463012c676d60e21b8452600484016131de565b03925af18015610441571561322f576133f09192506118cb565b5f905f61322f565b6040519263a9059cbb60e01b5f526001600160a01b0380931660045260245260205f60448180855af160015f5114811615613452575b836040521561343c57505050565b635274afe760e01b835216600482015260249150fd5b600181151661346857813b15153d15161661342e565b833d5f823e3d90fd5b9092604051936323b872dd60e01b5f526001600160a01b0393848092166004521660245260445260205f60648180855af160015f51148116156134c1575b836040525f6060521561343c57505050565b600181151661346857813b15153d1516166134af565b9091156134e2575050565b6040516305dbdfd960e41b81526001600160a01b03918216600482015291166024820152604490fd5b9392919361351883612e96565b613042578461352c57613154939450613a1d565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f528152613199835f20549485612ee0565b9092919261357681613ee9565b9361358081612e96565b6135c95784816001600160e01b0361359f9360e01d9116601b0b614b0e565b508092816135af575b5050509190565b6001600160a01b036135c193166133f8565b5f81816135a8565b604051632d1671a360e11b8152600490fd5b9160408051916135ea83611847565b600480845260206135fc81860161247b565b5f5b875181101561363157806136146001928a611d64565b5161361f8289611d64565b5261362a8188611d64565b50016135fe565b5092955092939093335f52308352855f209186519061364f82611893565b6136576124e9565b825260608581930152875161366b816118fb565b5f815288519161367a836118fb565b5f83525f3681375f5b81518110156137e0576136968183611d64565b5190888c8b84519189818401518d8d82516136be575b50505050505050506001915001613683565b5f61372d97948197948c97946136eb8c956001600160a01b039d8e81818d51169c0151169b015190613bc6565b948651996136f88b6118df565b8a528901528488015286015260808501528a60a08501528b60c08501525180958194829363d04dfe2360e01b84528301612a56565b03915afa9384156137d6578b915f956137b8575b508451613756575b50908b8e89838d8d6136ac565b51015116803b1561032157613785925f918c8f84905180978195829463012c676d60e21b8452339084016131de565b03925af19182156137ae5760019261379f575b8981613749565b6137a8906118cb565b5f613798565b8c513d5f823e3d90fd5b6137cd9195503d805f833e612e308183611917565b9050935f613741565b8e513d5f823e3d90fd5b5050505050505050509050565b81156137f7570490565b634e487b7160e01b5f52601260045260245ffd5b6040815110613867576020810151908051603f1981019081116138535760051c821161383f5760016020920160051b010190565b505060405161384d816118fb565b5f815290565b634e487b7160e01b5f52601160045260245ffd5b5060405161384d816118fb565b80511561388457602001515f1a90565b505f90565b905f8091602081519101845af48080613907575b156138bd5750506040513d81523d5f602083013e60203d82010160405290565b156138e457604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b3d156138f5576040513d5f823e3d90fd5b60405163d6bda27560e01b8152600490fd5b503d15158061389d5750813b151561389d565b9161394590606061393a936001600160a01b039485916040880151611d64565b515116940151611d64565b515116146122c757565b6139766001600160e01b0392838316601b0b9260e01d938160e01d9116601b0b8484614125565b90637ffffff582136139c6575b9061398d9161436e565b92909215806139be575b6139a057505090565b6044925060405191638eba4d0760e01b835260048301526024820152fd5b508215613997565b6139d08282615037565b1561398357604483856040519163d556b11160e01b835260048301526024820152fd5b61199a91610a9a916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614713565b929192613a2982613ee9565b93613a3381612e96565b613a945784816001600160e01b03613a529360e01d9116601b0b614b0e565b9290809315613a7f575b50829081613a6b575050509190565b6135c1926001600160a01b03309216613471565b9092505f19811461385357600101915f613a5c565b604051632eaefac360e21b8152600490fd5b60041115613ab057565b634e487b7160e01b5f52602160045260245ffd5b602090939291936001600160a01b036040820195168152613ae483613aa6565b0152565b613af0615050565b60408051630782d7e160e01b81526001600160a01b03831660048201529091828260248173200e12d10bb0c5e4a17e7018f0f1161919bb93895afa928315613bbd575f925f94613b88575b50613b4583613aa6565b600183141580613b76575b613b5a5750505090565b5163ee07877f60e01b8152918291610597919060048401613ac4565b50613b8083613aa6565b821515613b50565b90809450613bac9293503d8511613bb6575b613ba48183611917565b810190614882565b919091925f613b3b565b503d613b9a565b513d5f823e3d90fd5b613bd08251611e3e565b613bda8351611e3e565b9282519281518015155f14613e4f57600201935b60019401840190613bfe826119fb565b95613c19604093613c118551998a611917565b8089526119fb565b613c2b602091601f1901828a01612497565b5f9584519389896002926002885233868901523089890152606097606081018a52613c5584611d17565b52613c5f83611d17565b505f825b613e0f575b505050508651613c7f575b50505050505050505090565b90919293600288613ca28c86613c9b8e809c9d9e018093611d64565b528d611d64565b500185613caf828d611d64565b52613cba818c611d64565b505f965b613cc9575b50613c73565b8851871015613e0a576001600160a01b03613d75898b85613d6c8c60428c88613cf28488611d64565b515116968582613d02868a611d64565b51015192613d10868a611d64565b51838d82511691015182815160051b910120908451927f6ec4dff745ec96dbde88c5d41f8aa5ac13aa1664afb47b8406b44fa945a650c88452830152838201522090519161190160f01b83528d83015260228201522093611d64565b510151916148da565b15613df25787613de18b8e8c8f9e9d9c9b9a999897968f613dce918d613dc4898f8f613db083889f613da7828f611d64565b51511692611d64565b52613dbb828b611d64565b51015192611d64565b52019c8d94611d64565b510151613ddb8383611d64565b52611d64565b500196979895909192939495613cbe565b8851630a57f30960e31b815260048101899052602490fd5b613cc3565b9091929a8251821015613e475790613e3b84809301809d613e308487611d64565b51613ddb8383611d64565b50019082918d93613c63565b9a9291613c68565b505f93613bee565b9160408301926040613e91610a9a606087519401938451906001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b613f6a565b94519301613ea0815186612e6f565b613ea8575050565b90935061199a9192505192518361394f565b919291600160ff1b8401613ed257611cef9350614a39565b90611cef935f0391614713565b61398d828261436e565b613ef1615050565b6040805163b7bad1b160e01b81526001600160a01b0383166004820152909182826024815f73200e12d10bb0c5e4a17e7018f0f1161919bb93895af1928315613bbd575f925f94613b885750613b4583613aa6565b6008815110613884576008015167ffffffffffffffff1667ff0a89c674ee78741490565b9091939284158215175f14613f845750505090505f905f90565b82810192600160fd1b8082019083011760fe1c6140bb575b5050613fa781614cfc565b93613fb181614cfc565b94613fbc8682614d1c565b909182156140ac575f9083986f0785ee10d5da46d900f436a00000000080861161409e575b50670de0b6b3a7640000808b1161408f575b50633b9aca00808b11614080575b50612710808b11614072575b5098805b61406157508190611cef989982600a0a9109960195817fcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccd0a93838211900382610100031b9203901c170291614d2f565b60019290920191600a900480614011565b60049a04998a93019261400d565b600991939a049901915f614001565b601291939a049901915f613ff3565b85049950602592505f613fe1565b50929050611cef949550614d2f565b5f82121561410f57808413614101575b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb2841315613f9c57909250611cef939491614c3a565b909250611cef939491614ca1565b808412156140cb57909250611cef939491614c3a565b9290918061414b576044848460405191637a97930f60e01b835260048301526024820152fd5b90919280155f1461416057505050505f905f90565b6141799361416d91614de9565b92919490938492614de9565b909391928461418788614cfc565b9161419186614cfc565b947f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000094604c91868810614338575b030191600160ff1b98838a018112155f14614305575050035b5f955f8212806142fc575b6142de575b5f8112806142cc575b6142ae5786820103966001600160ff1b03881490816142a4575b508061429b575b80614292575b6142745750906142289291614f95565b915f811361423b575b50611cef93614d2f565b9091604c82136142695761425291600a0a906137ed565b90811561425f575f614231565b505050505f905f90565b50505050505f905f90565b876044916040519163d556b11160e01b835260048301526024820152fd5b505f8512614218565b50828414614212565b905088145f61420b565b604489836040519163d556b11160e01b835260048301526024820152fd5b50806001600160ff1b030182136141f1565b95508087018613156142f65786818703015b956141e8565b5f6142f0565b505f81136141e3565b89985090920390506001600160ff1b038190038701821361432957018601946141d8565b5050505050505050505f905f90565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009650604b92506141bf565b81156137f7570590565b8082601b82810b8314614563577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e1000000000000000000840561450f575b8380820b036144fe57507b199999999999999999999999999999999999999999999999999999987b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc840111156144af575b838060030b03614433575b8084136144175750506001600160e01b036001925b60e01b91161791565b8303600a0a80156137f7576001600160e01b039107159261440e565b92915f8413156144835750906144498383615037565b61446557637ffffffe1901600a0a810290637fffffff926143f9565b506044916040519163d556b11160e01b835260048301526024820152fd5b637fffffff199283039060438213614269576144a291600a0a90614364565b91821561425f57926143f9565b5f198401808060030b146144c357506143ee565b90506001600160e01b039293507b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff915060e01b9260ff1d181617905f90565b600190940193600a909305926143a1565b937f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000840515614550576305f5e100600894058094819201955b9150506143a1565b620186a060059405809481920195614548565b50826143ee57505050505f90600190565b919291600160ff1b919080158061470157509061459091614de9565b9490929091905f8685858582821380156146f8575b6146db575b505050508682841860ff1c94860391039081604c0381116146c05701600a0a8082059190846146a6575b505081019182821860ff1c111561469e57826001600160ff1b031461468057905f600192135f1461465157600a9004915b01925b8115811761461557509190565b8061462e575b508015614626579190565b505f91508190565b91926146449203600160ff1b01600a0a90614364565b600160ff1b91905f61461b565b600a60037fe6666666666666666666666666666666666666666666666666666666666666679201040191614605565b604490836040519163d556b11160e01b835260048301526024820152fd5b509092614608565b81076146b3575b806145d4565b60ff1d600117015f6146ad565b5050509193506146ce579190565b60018160ff1d1790039190565b5f9a50909750909550600160ff1b945092509050868080806145aa565b50835f126145a5565b1561470c5750509190565b9350919050565b93929193841581158181176148645750509061472e91614de9565b919490829561473f82958294614de9565b809692949196938786848213801561485b575b614842575b5050505050508682841860ff1c94860391039081604c0381116146c05701600a0a808205919084614828575b505081019182821860ff1c111561482057826001600160ff1b031461468057905f600192135f146147f157600a9004915b01925b811581176147c457509190565b806147d457508015614626579190565b600160ff1b936147eb9291038401600a0a90614364565b5f61461b565b600a60037fe66666666666666666666666666666666666666666666666666666666666666792010401916147b4565b5090926147b7565b8107614835575b80614783565b60ff1d600117015f61482f565b929b5098509196509450925090505f8080808080614757565b50858412614752565b939593909291901561487a575050614626579190565b945092915050565b919082604091031261032157815160048110156103215760209092015160ff811681036103215790565b9060ff165f03916001600160ff1b0382115f146148d257600a6001818404940192061590565b909190600190565b9091813b614915576148ec91926150b9565b506148f681613aa6565b15918261490257505090565b6001600160a01b03918216911614919050565b6020918160645f935160405192630b135d3f60e11b9788855260048501526040602485015286820190604485015e8281018201859052601f01601f191601915afa905f5114601f3d11161690565b92915f9060018184145f871287151717176149dd575f928082136149cf575b03604c81135f8212176149c357600a0a90846149a18382029384614364565b146149b6575050156149b2575f9190565b5f90565b909350901561199a579190565b5050156149b2575f9190565b5f9560019450925090614982565b5050505f90565b93929190918083145f83125f87121883158715171717614a33575f92808213614a265703604c81135f8212176149c357600a0a90846149a18382029384614364565b9194600193509190614982565b50919050565b909291600160ff1b91828101614acb5750808414614ac157808413918215614ab9578185035b604c811115614aa85750505f915b15614a9957507f8000000000000000000000000000000000000000000000000000000000000001019190565b92506001600160ff1b03039190565b600a0a9081156137f7570491614a6d565b848203614a5f565b505090505f905f90565b93614ad892945f03614574565b80939180928114614aec575b50505f039190565b915092506001600160ff1b03831461468057600a600191059201915f80614ae4565b91925f831215614b36576044838360405191634a7d166b60e01b835260048301526024820152fd5b919283614b4857505090505f90600190565b60ff8116820191808312614c10575f831215614b80575050604c198112614626575f03600a0a91614b7983826137ed565b9283021490565b909293915f81135f14614c0657604d8113614bdb57600a0a9283156137f757835f19048311614bb25750500290600190565b60405163c849483b60e01b815260048101849052602481019290925260ff166044820152606490fd5b5060405163c849483b60e01b81526004810192909252602482015260ff919091166044820152606490fd5b5050905090600190565b60405163c849483b60e01b815260048101869052602481019190915260ff82166044820152606490fd5b909392915f614c4a918184613f6a565b9490945f8483019182019412159081614c97575b8115614c8d575b50614c6f57505090565b604492506040519163d556b11160e01b835260048301526024820152fd5b905083125f614c65565b8281129150614c5e565b614cb693600160fe1b90810193920190613f6a565b9081815f821215614ced575050604b19821261315457614cdb915f03600a0a90614364565b9081614ce5575f90565b600160ff1b90565b93600160ff1b90910192509050565b5f81121561199a57600160ff1b90808203614d15575090565b90505f0390565b905f198183099102908180821091030391565b92939291905f8184181215614dc4576001600160ff1b039283831115614dae57600160ff1b93838503614d6457505050509190565b90919293508514614d7e575050600a600191045f03920190565b604051630ed8062160e21b8152600481019190915260248101919091526044810182905260648101849052608490fd5b5090915050600160ff1b8114613853575f039190565b90916001600160ff1b03808411156135a8578514614d7e575050600a60019104920190565b9190918015614f8b57827f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000080830515614e99575b507f19999999999999999999999999999999999999999999999999999999999999997f0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc830110614e8a575b8313614e745791905f90565b919060018060ff1b926001600160ff1b03030190565b9290600a02905f190192614e68565b6f4b3b4ca85a86c47a098a22400000000080840515614f79575b507728c87cb5c89a2571ebfdcb54864ada834a00000000000000830515614f62575b7b097edd871cfda3a5697758bf0e3cbb5ac5741c640000000000000000830515614f4e575b7e3899162693736ac531a5a58f1fbb4b746504382ca7e4000000000000000000830515614f3e57820515614f2f575b5f614e1d565b9290600a02905f190192614f29565b9391606402916001190193614efa565b93916402540be40002916009190193614efa565b9391678ac7230489e8000002916012190193614ed5565b6025198301955092909202915f614eb3565b505f915081908190565b90915f198383099280830292838086109503948086039584871015615013571461500b579082910960018219018216809204600280826003021880830282030280830282030280830282030280830282030280830282030280920290030293600183805f03040190848311900302920304170290565b505091500490565b60648386866040519263362ced0960e11b8452600484015260248301526044820152fd5b61199a91905f81121561504b575f036150f3565b6150f3565b73200e12d10bb0c5e4a17e7018f0f1161919bb9389803b15801561508e575b6150765750565b602490604051906373e6d7b360e01b82526004820152fd5b507f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d41813f141561506f565b81519190604183036150e9576150e29250602082015190606060408401519301515f1a90615182565b9192909190565b50505f9160029190565b90637ffffff581131561517c57637ffffffe1981019060438213615175575f82121561514957637fffffff91505f0301600a0a7b8000000000000000000000000000000000000000000000000000000202111590565b50600a0a80156137f7577b80000000000000000000000000000000000000000000000000000001041090565b5050151590565b50505f90565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084116151f9579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa15610441575f516001600160a01b038116156151ef57905f905f90565b505f906001905f90565b5050505f91600391905600000000000000000000000000000000000000000000000000000000000000000000000000000000200e12d10bb0c5e4a17e7018f0f1161919bb93890000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000044b608060405234801561000f575f80fd5b506004361061004a575f3560e01c80630782d7e11461004e57806354636d2b14610078578063b7bad1b11461009d578063f5c36eaf146100b0575b5f80fd5b61006161005c366004610363565b6100c3565b60405161006f929190610403565b60405180910390f35b61008b610086366004610363565b6100d8565b60405160ff909116815260200161006f565b6100616100ab366004610363565b6100e9565b61008b6100be366004610363565b6100f5565b5f806100cf5f84610100565b91509150915091565b5f6100e35f836101f0565b92915050565b5f806100cf5f84610281565b5f6100e35f83610356565b73ffffffffffffffffffffffffffffffffffffffff81165f9081526020838152604080832081518083019092525460ff8082161515835261010090910416818301527f313ce56700000000000000000000000000000000000000000000000000000000808452839283908190816004818a5afa915060203d1015610182575f91505b811561019857505f5160ff811115610198575f91505b816101af57505050602001516003925090506101e9565b83516101c3575f955093506101e992505050565b836020015160ff1681146101d85760026101db565b60015b846020015195509550505050505b9250929050565b5f805f6101fd8585610281565b909250905060018260038111156102165761021661039d565b1415801561023557505f8260038111156102325761023261039d565b14155b156102795783826040517fee07877f000000000000000000000000000000000000000000000000000000008152600401610270929190610421565b60405180910390fd5b949350505050565b5f805f8061028f8686610100565b90925090505f8260038111156102a7576102a761039d565b0361034b576040805180820182526001815260ff838116602080840191825273ffffffffffffffffffffffffffffffffffffffff8a165f908152908b9052939093209151825493517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009094169015157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff161761010093909116929092029190911790555b909590945092505050565b5f805f6101fd8585610100565b5f60208284031215610373575f80fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114610396575f80fd5b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b600481106103ff577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b9052565b6040810161041182856103ca565b60ff831660208301529392505050565b73ffffffffffffffffffffffffffffffffffffffff831681526040810161039660208301846103ca560000000000000000000000000000000000000000000000000000000000000000006e2d0e71d900474b262e545bc4c98b71ab368d2100000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000003d486080604052600436106100d65760003560e01c80638456cb591161007f5780639a1f3406116100595780639a1f340614610200578063cd0fb7a714610220578063f2fde38b14610260578063fa461e331461028057600080fd5b80638456cb59146101ad5780638da5cb5b146101c257806393b3774c146101ed57600080fd5b80632c8958f6116100b05780632c8958f6146100f95780636b2ace871461013f578063715018a61461019857600080fd5b8063046f7da2146100e257806323a69e75146100f95780632646478b1461011957600080fd5b366100dd57005b600080fd5b3480156100ee57600080fd5b506100f76102a0565b005b34801561010557600080fd5b506100f7610114366004613579565b6103a8565b61012c6101273660046136f5565b6103ba565b6040519081526020015b60405180910390f35b34801561014b57600080fd5b506101737f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610136565b3480156101a457600080fd5b506100f7610564565b3480156101b957600080fd5b506100f7610578565b3480156101ce57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff16610173565b61012c6101fb36600461377c565b61067b565b34801561020c57600080fd5b506100f761021b36600461382f565b61089a565b34801561022c57600080fd5b5061025061023b366004613868565b60016020526000908152604090205460ff1681565b6040519015158152602001610136565b34801561026c57600080fd5b506100f761027b366004613868565b6108f8565b34801561028c57600080fd5b506100f761029b366004613579565b6109af565b60005473ffffffffffffffffffffffffffffffffffffffff163314806102d557503360009081526001602052604090205460ff165b610366576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f52503a2063616c6c6572206973206e6f7420746865206f776e6572206f72206160448201527f2070726976696c6567656420757365720000000000000000000000000000000060648201526084015b60405180910390fd5b600280547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff167501000000000000000000000000000000000000000000179055565b6103b4848484846109af565b50505050565b60025460009074010000000000000000000000000000000000000000900460ff16600114610444576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f526f75746550726f636573736f72206973206c6f636b65640000000000000000604482015260640161035d565b6002547501000000000000000000000000000000000000000000900460ff166001146104cc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f526f75746550726f636573736f72206973207061757365640000000000000000604482015260640161035d565b600280547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1674020000000000000000000000000000000000000000179055610519878787878787610b5d565b9050600280547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790559695505050505050565b61056c6111a3565b6105766000611224565b565b60005473ffffffffffffffffffffffffffffffffffffffff163314806105ad57503360009081526001602052604090205460ff165b610639576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f52503a2063616c6c6572206973206e6f7420746865206f776e6572206f72206160448201527f2070726976696c65676564207573657200000000000000000000000000000000606482015260840161035d565b600280547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff167502000000000000000000000000000000000000000000179055565b60025460009074010000000000000000000000000000000000000000900460ff16600114610705576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f526f75746550726f636573736f72206973206c6f636b65640000000000000000604482015260640161035d565b6002547501000000000000000000000000000000000000000000900460ff1660011461078d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f526f75746550726f636573736f72206973207061757365640000000000000000604482015260640161035d565b600280547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1674020000000000000000000000000000000000000000179055604051600090819073ffffffffffffffffffffffffffffffffffffffff8c16908b908381818185875af1925050503d8060008114610826576040519150601f19603f3d011682016040523d82523d6000602084013e61082b565b606091505b50915091508161083d57805181602001fd5b61084b898989898989610b5d565b92505050600280547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000017905598975050505050505050565b6108a26111a3565b73ffffffffffffffffffffffffffffffffffffffff91909116600090815260016020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b6109006111a3565b73ffffffffffffffffffffffffffffffffffffffff81166109a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161035d565b6109ac81611224565b50565b60025473ffffffffffffffffffffffffffffffffffffffff163314610a56576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f526f75746550726f636573736f722e756e697377617056335377617043616c6c60448201527f6261636b3a2063616c6c2066726f6d20756e6b6e6f776e20736f757263650000606482015260840161035d565b6000808513610a655783610a67565b845b905060008113610af9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f526f75746550726f636573736f722e756e697377617056335377617043616c6c60448201527f6261636b3a206e6f7420706f73697469766520616d6f756e7400000000000000606482015260840161035d565b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001660011790556000610b3283850185613868565b9050610b5573ffffffffffffffffffffffffffffffffffffffff82163384611299565b505050505050565b60008073ffffffffffffffffffffffffffffffffffffffff881673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14610c24576040517f70a0823100000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff8916906370a0823190602401602060405180830381865afa158015610bfb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c1f919061388c565b610c27565b60005b9050600073ffffffffffffffffffffffffffffffffffffffff871673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14610cf1576040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301528816906370a0823190602401602060405180830381865afa158015610cc8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cec919061388c565b610d0a565b8473ffffffffffffffffffffffffffffffffffffffff16315b905087600080610d2e87604080518082019091528181528151909101602082015290565b90505b805160208201511115610e84576000610d508280516001018051915290565b90508060ff1660011415610d7a576000610d6983611372565b905083610d74578094505b50610e73565b8060ff1660021415610d9557610d90828d611437565b610e73565b8060ff1660031415610dac576000610d6983611457565b8060ff1660041415610dc157610d908261147d565b8060ff1660051415610dd657610d90826114a3565b8060ff1660061415610dec57610d908d836115a8565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f526f75746550726f636573736f723a20556e6b6e6f776e20636f6d6d616e642060448201527f636f646500000000000000000000000000000000000000000000000000000000606482015260840161035d565b610e7c836138d4565b925050610d31565b506000905073ffffffffffffffffffffffffffffffffffffffff8b1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14610f4d576040517f70a0823100000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff8c16906370a0823190602401602060405180830381865afa158015610f24573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f48919061388c565b610f50565b60005b905083610f5d8b8361390d565b1015610feb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f526f75746550726f636573736f723a204d696e696d616c20696e70757420626160448201527f6c616e63652076696f6c6174696f6e0000000000000000000000000000000000606482015260840161035d565b600073ffffffffffffffffffffffffffffffffffffffff8a1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee146110b3576040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff89811660048301528b16906370a0823190602401602060405180830381865afa15801561108a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110ae919061388c565b6110cc565b8773ffffffffffffffffffffffffffffffffffffffff16315b90506110d8898561390d565b81101561111e576110e98482613925565b6040517f963b34a500000000000000000000000000000000000000000000000000000000815260040161035d91815260200190565b6111288482613925565b6040805173ffffffffffffffffffffffffffffffffffffffff8b81168252602082018790529181018c905260608101839052919750808c1691908e169033907f2db5ddd0b42bdbca0d69ea16f234a870a485854ae0d91f16643d6f317d8b89949060800160405180910390a450505050509695505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610576576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161035d565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905261136d9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915261163b565b505050565b6000806113858380516014018051915290565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290915073ffffffffffffffffffffffffffffffffffffffff8216906370a0823190602401602060405180830381865afa1580156113f2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611416919061388c565b91508115611425576001820391505b61143183308385611747565b50919050565b60006114498380516014018051915290565b905061136d83338385611747565b47611478823073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee84611747565b919050565b600061148f8280516014018051915290565b905061149f8260008360006117a2565b5050565b60006114b58280516014018051915290565b6040517ff7888aec00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff80831660048301523060248301529192506000917f0000000000000000000000000000000000000000000000000000000000000000169063f7888aec90604401602060405180830381865afa15801561154d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611571919061388c565b9050801561159c577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff015b61136d83308484611747565b60006115ba8280516020018051915290565b905060006115ce8380516020018051915290565b905060006115e28480516001018051915290565b905060006115f68580516020018051915290565b9050600061160a8680516020018051915290565b905061163273ffffffffffffffffffffffffffffffffffffffff8816333088888888886118d6565b50505050505050565b600061169d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16611b569092919063ffffffff16565b80519091501561136d57808060200190518101906116bb919061393c565b61136d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840161035d565b60006117598580516001018051915290565b905060005b8160ff16811015610b5557600061177b8780516002018051915290565b61ffff8082168602049485900394909150611798888888846117a2565b505060010161175e565b60006117b48580516001018051915290565b905060ff81166117cf576117ca85858585611b6d565b6118cf565b8060ff16600114156117e7576117ca85858585611f22565b8060ff16600214156117ff576117ca85858585612162565b8060ff1660031415611817576117ca85858585612410565b8060ff166004141561182f576117ca85858585612a98565b8060ff1660051415611847576117ca85858585612c26565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f526f75746550726f636573736f723a20556e6b6e6f776e20706f6f6c2074797060448201527f6500000000000000000000000000000000000000000000000000000000000000606482015260840161035d565b5050505050565b6040517f7ecebe0000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8881166004830152600091908a1690637ecebe0090602401602060405180830381865afa158015611946573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061196a919061388c565b6040517fd505accf00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a811660048301528981166024830152604482018990526064820188905260ff8716608483015260a4820186905260c48201859052919250908a169063d505accf9060e401600060405180830381600087803b158015611a0457600080fd5b505af1158015611a18573d6000803e3d6000fd5b50506040517f7ecebe0000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8b81166004830152600093508c169150637ecebe0090602401602060405180830381865afa158015611a8b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aaf919061388c565b9050611abc82600161390d565b8114611b4a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f5361666545524332303a207065726d697420646964206e6f742073756363656560448201527f6400000000000000000000000000000000000000000000000000000000000000606482015260840161035d565b50505050505050505050565b6060611b6584846000856131e1565b949350505050565b6000611b7f8580516014018051915290565b90506000611b938680516001018051915290565b90506000611ba78780516014018051915290565b90506000611bbb8880516003018051915290565b905073ffffffffffffffffffffffffffffffffffffffff8716301415611c0157611bfc73ffffffffffffffffffffffffffffffffffffffff87168587611299565b611c41565b73ffffffffffffffffffffffffffffffffffffffff8716331415611c4157611c4173ffffffffffffffffffffffffffffffffffffffff87163386886132fa565b6000808573ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015611c8f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cb39190613977565b506dffffffffffffffffffffffffffff1691506dffffffffffffffffffffffffffff169150600082118015611ce85750600081115b611d4e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f57726f6e6720706f6f6c20726573657276657300000000000000000000000000604482015260640161035d565b6000808660ff16600114611d63578284611d66565b83835b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8b8116600483015292945090925083918c16906370a0823190602401602060405180830381865afa158015611dda573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dfe919061388c565b611e089190613925565b98506000611e1986620f42406139c7565b611e289062ffffff168b6139eb565b9050600081611e3a85620f42406139eb565b611e44919061390d565b611e4e84846139eb565b611e589190613a28565b90506000808a60ff16600114611e7057826000611e74565b6000835b604080516000815260208101918290527f022c0d9f00000000000000000000000000000000000000000000000000000000909152919350915073ffffffffffffffffffffffffffffffffffffffff8d169063022c0d9f90611ede90859085908f9060248101613ad9565b600060405180830381600087803b158015611ef857600080fd5b505af1158015611f0c573d6000803e3d6000fd5b5050505050505050505050505050505050505050565b6000611f348580516014018051915290565b9050600080611f498780516001018051915290565b60ff161190506000611f618780516014018051915290565b905073ffffffffffffffffffffffffffffffffffffffff8616331415611fa357611fa373ffffffffffffffffffffffffffffffffffffffff86163330876132fa565b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff851690811790915563128acb088284878161201757612012600173fffd8963efd1fc6a506488495d951d5263988d26613b14565b612027565b6120276401000276a36001613b41565b6040805173ffffffffffffffffffffffffffffffffffffffff8d166020820152016040516020818303038152906040526040518663ffffffff1660e01b8152600401612077959493929190613b79565b60408051808303816000875af1158015612095573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120b99190613bc0565b505060025473ffffffffffffffffffffffffffffffffffffffff16600114611632576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f526f75746550726f636573736f722e73776170556e6956333a20756e6578706560448201527f6374656400000000000000000000000000000000000000000000000000000000606482015260840161035d565b60006121748580516001018051915290565b905060006121888680516014018051915290565b9050600180831614156122575760006121a78780516014018051915290565b905060028316612213578073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b1580156121f957600080fd5b505af115801561220d573d6000803e3d6000fd5b50505050505b73ffffffffffffffffffffffffffffffffffffffff821630146122515761225173ffffffffffffffffffffffffffffffffffffffff82168386611299565b50610b55565b600282166123205773ffffffffffffffffffffffffffffffffffffffff851633141561229f5761229f73ffffffffffffffffffffffffffffffffffffffff85163330866132fa565b6040517f2e1a7d4d0000000000000000000000000000000000000000000000000000000081526004810184905273ffffffffffffffffffffffffffffffffffffffff851690632e1a7d4d90602401600060405180830381600087803b15801561230757600080fd5b505af115801561231b573d6000803e3d6000fd5b505050505b60008173ffffffffffffffffffffffffffffffffffffffff168460405160006040518083038185875af1925050503d806000811461237a576040519150601f19603f3d011682016040523d82523d6000602084013e61237f565b606091505b5050905080611632576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f526f75746550726f636573736f722e777261704e61746976653a204e6174697660448201527f6520746f6b656e207472616e73666572206661696c6564000000000000000000606482015260840161035d565b60006124228580516001018051915290565b905060006124368680516014018051915290565b905060ff8216156128315773ffffffffffffffffffffffffffffffffffffffff85163014156124a5576124a073ffffffffffffffffffffffffffffffffffffffff85167f000000000000000000000000000000000000000000000000000000000000000085611299565b61275b565b73ffffffffffffffffffffffffffffffffffffffff8516331415612505576124a073ffffffffffffffffffffffffffffffffffffffff8516337f0000000000000000000000000000000000000000000000000000000000000000866132fa565b6040517f4ffe34db00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85811660048301527f00000000000000000000000000000000000000000000000000000000000000001690634ffe34db906024016040805180830381865afa158015612590573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125b49190613c04565b516040517fdf23b45b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301526fffffffffffffffffffffffffffffffff909216917f0000000000000000000000000000000000000000000000000000000000000000169063df23b45b90602401606060405180830381865afa158015612656573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061267a9190613c77565b60409081015190517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811660048301526fffffffffffffffffffffffffffffffff909216918716906370a0823190602401602060405180830381865afa158015612720573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612744919061388c565b61274e919061390d565b6127589190613925565b92505b6040517f02b9446c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85811660048301527f000000000000000000000000000000000000000000000000000000000000000081166024830181905290831660448301526064820185905260006084830152906302b9446c9060a40160408051808303816000875af1158015612806573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061282a9190613bc0565b5050610b55565b73ffffffffffffffffffffffffffffffffffffffff851615612908576040517ff18d03cc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85811660048301528681166024830152306044830152606482018590527f0000000000000000000000000000000000000000000000000000000000000000169063f18d03cc90608401600060405180830381600087803b1580156128eb57600080fd5b505af11580156128ff573d6000803e3d6000fd5b505050506129c1565b6040517ff7888aec00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85811660048301523060248301527f0000000000000000000000000000000000000000000000000000000000000000169063f7888aec90604401602060405180830381865afa15801561299a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129be919061388c565b92505b6040517f97da6d3000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152306024830152828116604483015260006064830152608482018590527f000000000000000000000000000000000000000000000000000000000000000016906397da6d309060a40160408051808303816000875af1158015612a6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a8e9190613bc0565b5050505050505050565b6000612aaa8580516014018051915290565b85516020808201805190920101875290915073ffffffffffffffffffffffffffffffffffffffff851615612b91576040517ff18d03cc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff858116600483015286811660248301528381166044830152606482018590527f0000000000000000000000000000000000000000000000000000000000000000169063f18d03cc90608401600060405180830381600087803b158015612b7857600080fd5b505af1158015612b8c573d6000803e3d6000fd5b505050505b6040517f627dd56a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83169063627dd56a90612be3908490600401613ce3565b6020604051808303816000875af1158015612c02573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611632919061388c565b6000612c388580516014018051915290565b90506000612c4c8680516001018051915290565b90506000612c608780516001018051915290565b60000b90506000612c778880516001018051915290565b60000b90506000612c8e8980516014018051915290565b90506000612ca28a80516014018051915290565b9050600073ffffffffffffffffffffffffffffffffffffffff891673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1415612d8b576040517f3df02124000000000000000000000000000000000000000000000000000000008152600f86810b600483015285900b6024820152604481018990526000606482015273ffffffffffffffffffffffffffffffffffffffff881690633df02124908a9060840160206040518083038185885af1158015612d5f573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612d84919061388c565b905061306e565b73ffffffffffffffffffffffffffffffffffffffff8a16331415612dcb57612dcb73ffffffffffffffffffffffffffffffffffffffff8a1633308b6132fa565b612dec73ffffffffffffffffffffffffffffffffffffffff8a16888a613358565b5060ff8616612e9f576040517f3df02124000000000000000000000000000000000000000000000000000000008152600f86810b600483015285900b6024820152604481018990526000606482015273ffffffffffffffffffffffffffffffffffffffff881690633df02124906084016020604051808303816000875af1158015612e7b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d84919061388c565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8416906370a0823190602401602060405180830381865afa158015612f0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f30919061388c565b6040517f3df02124000000000000000000000000000000000000000000000000000000008152600f88810b600483015287900b6024820152604481018b90526000606482015290915073ffffffffffffffffffffffffffffffffffffffff891690633df0212490608401600060405180830381600087803b158015612fb457600080fd5b505af1158015612fc8573d6000803e3d6000fd5b50506040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000925073ffffffffffffffffffffffffffffffffffffffff861691506370a0823190602401602060405180830381865afa158015613039573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061305d919061388c565b90506130698282613925565b925050505b73ffffffffffffffffffffffffffffffffffffffff831630146131d45773ffffffffffffffffffffffffffffffffffffffff821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14156131b35760008373ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114613117576040519150601f19603f3d011682016040523d82523d6000602084013e61311c565b606091505b50509050806131ad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f526f75746550726f636573736f722e7377617043757276653a204e617469766560448201527f20746f6b656e207472616e73666572206661696c656400000000000000000000606482015260840161035d565b506131d4565b6131d473ffffffffffffffffffffffffffffffffffffffff83168483611299565b5050505050505050505050565b606082471015613273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c0000000000000000000000000000000000000000000000000000606482015260840161035d565b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161329c9190613cf6565b60006040518083038185875af1925050503d80600081146132d9576040519150601f19603f3d011682016040523d82523d6000602084013e6132de565b606091505b50915091506132ef87838387613389565b979650505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526103b49085907f23b872dd00000000000000000000000000000000000000000000000000000000906084016112eb565b6000613365848484613426565b80611b65575061337784846000613426565b8015611b655750611b65848484613426565b6060831561341c5782516134155773ffffffffffffffffffffffffffffffffffffffff85163b613415576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161035d565b5081611b65565b611b658383613535565b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f095ea7b300000000000000000000000000000000000000000000000000000000179052915160009283928392918816916134bf9190613cf6565b6000604051808303816000865af19150503d80600081146134fc576040519150601f19603f3d011682016040523d82523d6000602084013e613501565b606091505b509150915081801561352b57508051158061352b57508080602001905181019061352b919061393c565b9695505050505050565b8151156135455781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161035d9190613ce3565b6000806000806060858703121561358f57600080fd5b8435935060208501359250604085013567ffffffffffffffff808211156135b557600080fd5b818701915087601f8301126135c957600080fd5b8135818111156135d857600080fd5b8860208285010111156135ea57600080fd5b95989497505060200194505050565b73ffffffffffffffffffffffffffffffffffffffff811681146109ac57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f83011261365b57600080fd5b813567ffffffffffffffff808211156136765761367661361b565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156136bc576136bc61361b565b816040528381528660208588010111156136d557600080fd5b836020870160208301376000602085830101528094505050505092915050565b60008060008060008060c0878903121561370e57600080fd5b8635613719816135f9565b9550602087013594506040870135613730816135f9565b9350606087013592506080870135613747816135f9565b915060a087013567ffffffffffffffff81111561376357600080fd5b61376f89828a0161364a565b9150509295509295509295565b600080600080600080600080610100898b03121561379957600080fd5b88356137a4816135f9565b97506020890135965060408901356137bb816135f9565b95506060890135945060808901356137d2816135f9565b935060a0890135925060c08901356137e9816135f9565b915060e089013567ffffffffffffffff81111561380557600080fd5b6138118b828c0161364a565b9150509295985092959890939650565b80151581146109ac57600080fd5b6000806040838503121561384257600080fd5b823561384d816135f9565b9150602083013561385d81613821565b809150509250929050565b60006020828403121561387a57600080fd5b8135613885816135f9565b9392505050565b60006020828403121561389e57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613906576139066138a5565b5060010190565b60008219821115613920576139206138a5565b500190565b600082821015613937576139376138a5565b500390565b60006020828403121561394e57600080fd5b815161388581613821565b80516dffffffffffffffffffffffffffff8116811461147857600080fd5b60008060006060848603121561398c57600080fd5b61399584613959565b92506139a360208501613959565b9150604084015163ffffffff811681146139bc57600080fd5b809150509250925092565b600062ffffff838116908316818110156139e3576139e36138a5565b039392505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613a2357613a236138a5565b500290565b600082613a5e577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60005b83811015613a7e578181015183820152602001613a66565b838111156103b45750506000910152565b60008151808452613aa7816020860160208601613a63565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b84815283602082015273ffffffffffffffffffffffffffffffffffffffff8316604082015260806060820152600061352b6080830184613a8f565b600073ffffffffffffffffffffffffffffffffffffffff838116908316818110156139e3576139e36138a5565b600073ffffffffffffffffffffffffffffffffffffffff808316818516808303821115613b7057613b706138a5565b01949350505050565b600073ffffffffffffffffffffffffffffffffffffffff8088168352861515602084015285604084015280851660608401525060a060808301526132ef60a0830184613a8f565b60008060408385031215613bd357600080fd5b505080516020909101519092909150565b80516fffffffffffffffffffffffffffffffff8116811461147857600080fd5b600060408284031215613c1657600080fd5b6040516040810181811067ffffffffffffffff82111715613c3957613c3961361b565b604052613c4583613be4565b8152613c5360208401613be4565b60208201529392505050565b805167ffffffffffffffff8116811461147857600080fd5b600060608284031215613c8957600080fd5b6040516060810181811067ffffffffffffffff82111715613cac57613cac61361b565b604052613cb883613c5f565b8152613cc660208401613c5f565b6020820152613cd760408401613be4565b60408201529392505050565b6020815260006138856020830184613a8f565b60008251613d08818460208701613a63565b919091019291505056fea26469706673582212201ff294929b57776d43429e47ba13e7bb550e4a27be6afbadf8c8a0d6ad6324b364736f6c634300080a0033000000000000000000000000000000000000000000000000"; diff --git a/subgraph/abis/Raindex.json b/subgraph/abis/Raindex.json index 0ac5c40e4f..e49e08fb9f 100644 --- a/subgraph/abis/Raindex.json +++ b/subgraph/abis/Raindex.json @@ -2,7 +2,7 @@ "abi": [ { "type": "function", - "name": "addOrder4", + "name": "addOrder5", "inputs": [ { "name": "orderConfig", @@ -85,7 +85,7 @@ { "name": "post", "type": "tuple[]", - "internalType": "struct TaskV2[]", + "internalType": "struct TaskV3[]", "components": [ { "name": "evaluable", @@ -112,13 +112,18 @@ { "name": "signedContext", "type": "tuple[]", - "internalType": "struct SignedContextV1[]", + "internalType": "struct SignedContextV2[]", "components": [ { "name": "signer", "type": "address", "internalType": "address" }, + { + "name": "domainSeparator", + "type": "bytes32", + "internalType": "bytes32" + }, { "name": "context", "type": "bytes32[]", @@ -333,13 +338,18 @@ { "name": "aliceSignedContext", "type": "tuple[]", - "internalType": "struct SignedContextV1[]", + "internalType": "struct SignedContextV2[]", "components": [ { "name": "signer", "type": "address", "internalType": "address" }, + { + "name": "domainSeparator", + "type": "bytes32", + "internalType": "bytes32" + }, { "name": "context", "type": "bytes32[]", @@ -355,13 +365,18 @@ { "name": "bobSignedContext", "type": "tuple[]", - "internalType": "struct SignedContextV1[]", + "internalType": "struct SignedContextV2[]", "components": [ { "name": "signer", "type": "address", "internalType": "address" }, + { + "name": "domainSeparator", + "type": "bytes32", + "internalType": "bytes32" + }, { "name": "context", "type": "bytes32[]", @@ -380,7 +395,7 @@ }, { "type": "function", - "name": "deposit4", + "name": "deposit5", "inputs": [ { "name": "token", @@ -400,7 +415,7 @@ { "name": "post", "type": "tuple[]", - "internalType": "struct TaskV2[]", + "internalType": "struct TaskV3[]", "components": [ { "name": "evaluable", @@ -427,13 +442,18 @@ { "name": "signedContext", "type": "tuple[]", - "internalType": "struct SignedContextV1[]", + "internalType": "struct SignedContextV2[]", "components": [ { "name": "signer", "type": "address", "internalType": "address" }, + { + "name": "domainSeparator", + "type": "bytes32", + "internalType": "bytes32" + }, { "name": "context", "type": "bytes32[]", @@ -454,12 +474,12 @@ }, { "type": "function", - "name": "entask2", + "name": "entask3", "inputs": [ { "name": "post", "type": "tuple[]", - "internalType": "struct TaskV2[]", + "internalType": "struct TaskV3[]", "components": [ { "name": "evaluable", @@ -486,13 +506,18 @@ { "name": "signedContext", "type": "tuple[]", - "internalType": "struct SignedContextV1[]", + "internalType": "struct SignedContextV2[]", "components": [ { "name": "signer", "type": "address", "internalType": "address" }, + { + "name": "domainSeparator", + "type": "bytes32", + "internalType": "bytes32" + }, { "name": "context", "type": "bytes32[]", @@ -628,12 +653,12 @@ }, { "type": "function", - "name": "quote2", + "name": "quote3", "inputs": [ { "name": "quoteConfig", "type": "tuple", - "internalType": "struct QuoteV2", + "internalType": "struct QuoteV3", "components": [ { "name": "order", @@ -721,13 +746,18 @@ { "name": "signedContext", "type": "tuple[]", - "internalType": "struct SignedContextV1[]", + "internalType": "struct SignedContextV2[]", "components": [ { "name": "signer", "type": "address", "internalType": "address" }, + { + "name": "domainSeparator", + "type": "bytes32", + "internalType": "bytes32" + }, { "name": "context", "type": "bytes32[]", @@ -764,7 +794,7 @@ }, { "type": "function", - "name": "removeOrder3", + "name": "removeOrder4", "inputs": [ { "name": "order", @@ -842,7 +872,7 @@ { "name": "post", "type": "tuple[]", - "internalType": "struct TaskV2[]", + "internalType": "struct TaskV3[]", "components": [ { "name": "evaluable", @@ -869,13 +899,18 @@ { "name": "signedContext", "type": "tuple[]", - "internalType": "struct SignedContextV1[]", + "internalType": "struct SignedContextV2[]", "components": [ { "name": "signer", "type": "address", "internalType": "address" }, + { + "name": "domainSeparator", + "type": "bytes32", + "internalType": "bytes32" + }, { "name": "context", "type": "bytes32[]", @@ -921,12 +956,12 @@ }, { "type": "function", - "name": "takeOrders4", + "name": "takeOrders5", "inputs": [ { "name": "config", "type": "tuple", - "internalType": "struct TakeOrdersConfigV5", + "internalType": "struct TakeOrdersConfigV6", "components": [ { "name": "minimumIO", @@ -951,7 +986,7 @@ { "name": "orders", "type": "tuple[]", - "internalType": "struct TakeOrderConfigV4[]", + "internalType": "struct TakeOrderConfigV5[]", "components": [ { "name": "order", @@ -1039,13 +1074,18 @@ { "name": "signedContext", "type": "tuple[]", - "internalType": "struct SignedContextV1[]", + "internalType": "struct SignedContextV2[]", "components": [ { "name": "signer", "type": "address", "internalType": "address" }, + { + "name": "domainSeparator", + "type": "bytes32", + "internalType": "bytes32" + }, { "name": "context", "type": "bytes32[]", @@ -1113,7 +1153,7 @@ }, { "type": "function", - "name": "withdraw4", + "name": "withdraw5", "inputs": [ { "name": "token", @@ -1133,7 +1173,7 @@ { "name": "post", "type": "tuple[]", - "internalType": "struct TaskV2[]", + "internalType": "struct TaskV3[]", "components": [ { "name": "evaluable", @@ -1160,13 +1200,18 @@ { "name": "signedContext", "type": "tuple[]", - "internalType": "struct SignedContextV1[]", + "internalType": "struct SignedContextV2[]", "components": [ { "name": "signer", "type": "address", "internalType": "address" }, + { + "name": "domainSeparator", + "type": "bytes32", + "internalType": "bytes32" + }, { "name": "context", "type": "bytes32[]", @@ -1763,7 +1808,7 @@ }, { "type": "event", - "name": "TakeOrderV3", + "name": "TakeOrderV4", "inputs": [ { "name": "sender", @@ -1775,7 +1820,7 @@ "name": "config", "type": "tuple", "indexed": false, - "internalType": "struct TakeOrderConfigV4", + "internalType": "struct TakeOrderConfigV5", "components": [ { "name": "order", @@ -1863,13 +1908,18 @@ { "name": "signedContext", "type": "tuple[]", - "internalType": "struct SignedContextV1[]", + "internalType": "struct SignedContextV2[]", "components": [ { "name": "signer", "type": "address", "internalType": "address" }, + { + "name": "domainSeparator", + "type": "bytes32", + "internalType": "bytes32" + }, { "name": "context", "type": "bytes32[]", diff --git a/test/concrete/raindex/RaindexV6.takeOrder.freshMutation.t.sol b/test/concrete/raindex/RaindexV6.takeOrder.freshMutation.t.sol index e08ad6c005..ac572f6e3d 100644 --- a/test/concrete/raindex/RaindexV6.takeOrder.freshMutation.t.sol +++ b/test/concrete/raindex/RaindexV6.takeOrder.freshMutation.t.sol @@ -521,7 +521,7 @@ contract RaindexV6TakeOrderFreshMutationTest is RaindexV6FreshTakeOrderTest { // B26: TakeOrderV4 is emitted on a successful fill with the taker's input // and output. Order outputMax=3, ratio=2, max input 3 => input 3, output 6. // --------------------------------------------------------------------- - function testTakeOrderV3EmittedWithAmounts() external { + function testTakeOrderV4EmittedWithAmounts() external { _depositOutput(alice, 10, VAULT1); OrderV4 memory order = _order(alice, "_ _:3 2;:;"); @@ -643,7 +643,7 @@ contract RaindexV6TakeOrderFreshMutationTest is RaindexV6FreshTakeOrderTest { assertTrue(totalTakerOutput.eq(LibDecimalFloat.packLossless(8, 0)), "total output == 8"); // Exactly two TakeOrderV4 events (one per filled order). - assertEq(_countTakeOrderV3(vm.getRecordedLogs()), 2, "both orders emit TakeOrderV4"); + assertEq(_countTakeOrderV4(vm.getRecordedLogs()), 2, "both orders emit TakeOrderV4"); // Both owners' output vaults were debited by their fill (alice 3, carol // 5): pins that BOTH orders' recordVaultOutput + handleIO ran, not just @@ -686,7 +686,7 @@ contract RaindexV6TakeOrderFreshMutationTest is RaindexV6FreshTakeOrderTest { assertTrue(totalTakerInput.eq(LibDecimalFloat.packLossless(3, 0)), "total input capped at 3 (only first fills)"); assertTrue(totalTakerOutput.eq(LibDecimalFloat.packLossless(3, 0)), "total output == 3"); - assertEq(_countTakeOrderV3(vm.getRecordedLogs()), 1, "only the first order fills; loop stops when exhausted"); + assertEq(_countTakeOrderV4(vm.getRecordedLogs()), 1, "only the first order fills; loop stops when exhausted"); } // --------------------------------------------------------------------- @@ -720,7 +720,7 @@ contract RaindexV6TakeOrderFreshMutationTest is RaindexV6FreshTakeOrderTest { assertTrue(totalTakerInput.eq(LibDecimalFloat.packLossless(5, 0)), "total input == 3+2 == 5"); assertTrue(totalTakerOutput.eq(LibDecimalFloat.packLossless(10, 0)), "total output == 6+4 == 10"); // Both orders filled, proving remaining was decremented by input not output. - assertEq(_countTakeOrderV3(vm.getRecordedLogs()), 2, "both orders fill (remaining tracks input)"); + assertEq(_countTakeOrderV4(vm.getRecordedLogs()), 2, "both orders fill (remaining tracks input)"); } // --------------------------------------------------------------------- @@ -811,7 +811,7 @@ contract RaindexV6TakeOrderFreshMutationTest is RaindexV6FreshTakeOrderTest { totalTakerOutput.eq(LibDecimalFloat.packLossless(6, 0)), "total output capped at 6 (only first fills)" ); assertTrue(totalTakerInput.eq(LibDecimalFloat.packLossless(3, 0)), "total input == 6/2 == 3"); - assertEq(_countTakeOrderV3(vm.getRecordedLogs()), 1, "only first order fills (remaining tracks output)"); + assertEq(_countTakeOrderV4(vm.getRecordedLogs()), 1, "only first order fills (remaining tracks output)"); } // --------------------------------------------------------------------- @@ -836,18 +836,13 @@ contract RaindexV6TakeOrderFreshMutationTest is RaindexV6FreshTakeOrderTest { iRaindex.takeOrders5(config); } - /// Count TakeOrderV4 events in the recorded logs. The topic is the keccak of - /// the fully-expanded event signature (TakeOrderConfigV5 -> OrderV4 -> - /// EvaluableV4/IOV2[]/SignedContextV2[]; Float is a `bytes32` user type, so - /// the two trailing input/output args canonicalize to `bytes32`). - function _countTakeOrderV3(Vm.Log[] memory logs) internal pure returns (uint256 count) { - bytes32 takeSig = keccak256( - "TakeOrderV4(address,((address,(address,address,bytes),(address,bytes32)[],(address,bytes32)[],bytes32),uint256,uint256,(address,bytes32[],bytes)[]),bytes32,bytes32)" - ); + function _countTakeOrderV4(Vm.Log[] memory logs) internal pure returns (uint256) { + uint256 count = 0; for (uint256 i = 0; i < logs.length; i++) { - if (logs[i].topics.length > 0 && logs[i].topics[0] == takeSig) { + if (logs[i].topics.length > 0 && logs[i].topics[0] == IRaindexV7.TakeOrderV4.selector) { count++; } } + return count; } } From 15bb0d736d4cd4540562873ea85bbf9d71cce9b3 Mon Sep 17 00:00:00 2001 From: David Meister Date: Mon, 26 Oct 2026 14:45:38 +0000 Subject: [PATCH 05/15] Pin rainlang-interface 0.2.14 from Soldeer and raindex.interface#79 head d7e43ba; derive CONTEXT_COLUMNS_EXTENDED from the signed context start column Co-Authored-By: Claude Opus 5.5 --- foundry.toml | 4 ++-- soldeer.lock | 7 ++++--- src/generated/RaindexV6SubParserPointers.sol | 6 +++--- src/generated/candidate/RaindexV6SubParser.sol | 8 ++++---- src/lib/LibRaindex.sol | 8 ++++---- 5 files changed, 17 insertions(+), 16 deletions(-) diff --git a/foundry.toml b/foundry.toml index 55dbf9d516..21016add46 100644 --- a/foundry.toml +++ b/foundry.toml @@ -78,13 +78,13 @@ rainlang = "0.2.19" # rainlanguage/rain.interpreter.interface was renamed to # rainlanguage/rainlang.interface; its Soldeer registry name moved from # `rain-interpreter-interface` (0.1.x) to `rainlang-interface` (0.2.x). -rainlang-interface = { version = "0.2.14", git = "https://github.com/rainlanguage/rainlang.interface.git", rev = "f665f7fcbeade38f525853c94d61570080e07621" } +rainlang-interface = "0.2.14" # `rainlang` 0.2.19 imports `rainlang-interface-0.2.13/`; flat resolution keeps # that version alongside until `rainlang` republishes against 0.2.14. rainlang-interface-rainlang = { version = "0.2.13", url = "https://soldeer-revisions.s3.amazonaws.com/rainlang-interface/0_2_13_11-10-2026_17:54:59_rainlang.zip" } # rainlanguage/rain.raindex.interface was renamed to # rainlanguage/raindex.interface; Soldeer registry name follows. -raindex-interface = { version = "0.1.10", git = "https://github.com/rainlanguage/raindex.interface.git", rev = "cee2eff1ed714d3c2238d845ea5ecdfb432ee1c1" } +raindex-interface = { version = "0.1.10", git = "https://github.com/rainlanguage/raindex.interface.git", rev = "d7e43badcd35b13239f6c0196c44636c8d98e58d" } rain-metadata = "0.1.43" # The MetaBoard split out of `rain.metadata` into its own deploy repo. The # deploy pin lives there now; `rain-metadata` keeps the interfaces and libs. diff --git a/soldeer.lock b/soldeer.lock index 848c07b5dd..81eda1c3b5 100644 --- a/soldeer.lock +++ b/soldeer.lock @@ -135,7 +135,7 @@ integrity = "a2832c32c4a13a592c4c66072be5dca8b956e535467d8ce3cb6c51e9b4d5fc89" name = "raindex-interface" version = "0.1.10" git = "https://github.com/rainlanguage/raindex.interface.git" -rev = "cee2eff1ed714d3c2238d845ea5ecdfb432ee1c1" +rev = "d7e43badcd35b13239f6c0196c44636c8d98e58d" [[dependencies]] name = "rainlang" @@ -147,8 +147,9 @@ integrity = "b7e5e97ea63d89649f5cb4d82f630a22fc6a3cd1b529ce1deda61f7b22a3325a" [[dependencies]] name = "rainlang-interface" version = "0.2.14" -git = "https://github.com/rainlanguage/rainlang.interface.git" -rev = "f665f7fcbeade38f525853c94d61570080e07621" +url = "https://soldeer-revisions.s3.amazonaws.com/rainlang-interface/0_2_14_26-10-2026_13:25:43_rainlang.zip" +checksum = "854b90ada2a8756d1c3292fa1272c5630fc0ebf48955bf18f60db9d48e4f210e" +integrity = "d3c5c2983c62b09c3dda643150a3a2a8533c0526fa530b1ded91be69ac64bda5" [[dependencies]] name = "rainlang-interface-rainlang" diff --git a/src/generated/RaindexV6SubParserPointers.sol b/src/generated/RaindexV6SubParserPointers.sol index 6ecc78f608..f911f7cac3 100644 --- a/src/generated/RaindexV6SubParserPointers.sol +++ b/src/generated/RaindexV6SubParserPointers.sol @@ -5,7 +5,7 @@ pragma solidity ^0.8.25; // THIS FILE IS AUTOGENERATED BY THE BUILD SCRIPT. DO NOT EDIT BY HAND. /// @dev Hash of the known bytecode. -bytes32 constant BYTECODE_HASH = bytes32(0xa97dd44eacfb2527934079d037d4baa6ceffe1e9e12fd5a17d79c3e9cfd9e974); +bytes32 constant BYTECODE_HASH = bytes32(0x94c0af1d573bd9d570edd410a30be087c13fd8269e6276721fa124bc160fb0ca); /// @dev The hash of the meta that describes the contract. bytes32 constant DESCRIBED_BY_META_HASH = bytes32(0x828494fa15dec168f2372c71a11064dc163f7783fb7f3a9a84df40a87861a368); @@ -39,13 +39,13 @@ uint8 constant PARSE_META_BUILD_DEPTH = 1; /// to things that happen entirely on the interpreter such as well known /// constants and references to the context grid. bytes constant SUB_PARSER_WORD_PARSERS = - hex"18431860186f187e188d189d18ac18bc18cb18db18eb18fa190a19191929193919491958196719801843186f187e188d19cc19dc1843186f187e188d19cc19dc19ec"; + hex"182d184a1859186818771887189618a618b518c518d518e418f4190319131923193319421951196a182d18591868187719b619c6182d18591868187719b619c619d6"; /// @dev Every two bytes is a function pointer for an operand handler. /// These positional indexes all map to the same indexes looked up in the parse /// meta. bytes constant OPERAND_HANDLER_FUNCTION_POINTERS = - hex"1d931d931d931d931d931d931d931d931d931d931d931d931d931d931d931d931d931dbc1dbc1e581d931d931d931d931d931d931d931d931d931d931d931d931d93"; + hex"1d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1da61da61e421d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d"; /// @dev Every two bytes is a function pointer for a literal parser. /// Literal dispatches are determined by the first byte(s) of the literal diff --git a/src/generated/candidate/RaindexV6SubParser.sol b/src/generated/candidate/RaindexV6SubParser.sol index dc863ad3ef..b1844f37b8 100644 --- a/src/generated/candidate/RaindexV6SubParser.sol +++ b/src/generated/candidate/RaindexV6SubParser.sol @@ -5,19 +5,19 @@ pragma solidity ^0.8.25; // THIS FILE IS AUTOGENERATED BY THE BUILD SCRIPT. DO NOT EDIT BY HAND. /// @dev Hash of the known bytecode. -bytes32 constant BYTECODE_HASH = bytes32(0xa97dd44eacfb2527934079d037d4baa6ceffe1e9e12fd5a17d79c3e9cfd9e974); +bytes32 constant BYTECODE_HASH = bytes32(0x94c0af1d573bd9d570edd410a30be087c13fd8269e6276721fa124bc160fb0ca); /// @dev The deterministic deploy address of the contract when deployed via /// the Zoltu factory. -address constant DEPLOYED_ADDRESS = address(0xA909a8be688EDB80d2018C99fce528D59A3392C2); +address constant DEPLOYED_ADDRESS = address(0xff7E872256a17979B4207b2d39725330DEb78cA8); /// @dev The creation bytecode of the contract. bytes constant CREATION_CODE = - hex"6080604052348015600e575f80fd5b506127e68061001c5f395ff3fe608060405234801561000f575f80fd5b506004361061007a575f3560e01c80636f5aa28d116100585780636f5aa28d146100dd578063c6c0cbb61461010b578063ccf4477514610135578063d6d8c9a814610148575f80fd5b806301ffc9a71461007e578063336284d4146100a6578063570c7a63146100bb575b5f80fd5b61009161008c366004612499565b610150565b60405190151581526020015b60405180910390f35b6100ae6101d7565b60405161009d91906124f5565b6100ce6100c936600461251b565b610c8c565b60405161009d939291906125c5565b6040517f828494fa15dec168f2372c71a11064dc163f7783fb7f3a9a84df40a87861a368815260200161009d565b61011e61011936600461251b565b610dd0565b60408051921515835260208301919091520161009d565b60408051602081019091525f81526100ae565b6100ae610e08565b5f6001600160e01b031982166391ccb1d560e01b148061018057506001600160e01b03198216636f5aa28d60e01b145b8061019b57506001600160e01b03198216631a2c8edd60e01b145b806101b657506001600160e01b03198216630cd8a13560e21b145b806101d157506301ffc9a760e01b6001600160e01b03198316145b92915050565b60605f6101e660046001612636565b6101f1906003612636565b6101fc906001612636565b610207906001612636565b6001600160401b0381111561021e5761021e612507565b60405190808252806020026020018201604052801561025157816020015b606081526020019060019003908161023c5790505b50604080516002808252606082019092529192505f9190816020015b61248f81526020019060019003908161026d579050509050611843815f8151811061029a5761029a612649565b60200260200101906001600160401b031690816001600160401b031681525050611860816001815181106102d0576102d0612649565b6001600160401b039290921660209283029190910190910152604080516003808252608082019092525f91816020015b61248f81526020019060019003908161030057905050905061186f815f8151811061032d5761032d612649565b60200260200101906001600160401b031690816001600160401b03168152505061187e8160018151811061036357610363612649565b60200260200101906001600160401b031690816001600160401b03168152505061188d8160028151811061039957610399612649565b6001600160401b039290921660209283029190910190910152604080516002808252606082019092525f91816020015b61248f8152602001906001900390816103c957905050905061189d815f815181106103f6576103f6612649565b60200260200101906001600160401b031690816001600160401b0316815250506118ac8160018151811061042c5761042c612649565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b61248f81526020019060019003908161045c5790505090506118bc815f8151811061048957610489612649565b60200260200101906001600160401b031690816001600160401b0316815250506118cb816001815181106104bf576104bf612649565b60200260200101906001600160401b031690816001600160401b0316815250506118db816002815181106104f5576104f5612649565b60200260200101906001600160401b031690816001600160401b0316815250506118eb8160038151811061052b5761052b612649565b60200260200101906001600160401b031690816001600160401b0316815250506118fa8160048151811061056157610561612649565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b61248f81526020019060019003908161059157905050905061190a815f815181106105be576105be612649565b60200260200101906001600160401b031690816001600160401b031681525050611919816001815181106105f4576105f4612649565b60200260200101906001600160401b031690816001600160401b0316815250506119298160028151811061062a5761062a612649565b60200260200101906001600160401b031690816001600160401b0316815250506119398160038151811061066057610660612649565b60200260200101906001600160401b031690816001600160401b0316815250506119498160048151811061069657610696612649565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b61248f8152602001906001900390816106c5579050509050611958815f815181106106f2576106f2612649565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b61248f815260200190600190039081610721579050509050611967815f8151811061074e5761074e612649565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b61248f81526020019060019003908161077d579050509050611980815f815181106107aa576107aa612649565b60200260200101906001600160401b031690816001600160401b03168152505087895f815181106107dd576107dd612649565b602002602001018190525086896001815181106107fc576107fc612649565b6020026020010181905250858960028151811061081b5761081b612649565b6020026020010181905250848960038151811061083a5761083a612649565b6020026020010181905250838960048151811061085957610859612649565b6020026020010181905250828960058151811061087857610878612649565b6020908102919091010152818961089160056001612636565b815181106108a1576108a1612649565b602090810291909101015280896108ba60056001612636565b6108c5906001612636565b815181106108d5576108d5612649565b602090810291909101015260408051600680825260e082019092525f91816020015b61248f8152602001906001900390816108f7579050509050611843815f8151811061092457610924612649565b60200260200101906001600160401b031690816001600160401b03168152505061186f8160018151811061095a5761095a612649565b60200260200101906001600160401b031690816001600160401b03168152505061187e8160028151811061099057610990612649565b60200260200101906001600160401b031690816001600160401b03168152505061188d816003815181106109c6576109c6612649565b60200260200101906001600160401b031690816001600160401b0316815250506119cc816004815181106109fc576109fc612649565b60200260200101906001600160401b031690816001600160401b0316815250506119dc81600581518110610a3257610a32612649565b6001600160401b0390921660209283029190910190910152808a610a5860056001612636565b610a63906001612636565b610a6e906001612636565b81518110610a7e57610a7e612649565b602090810291909101015260408051600780825261010082019092525f91816020015b61248f815260200190600190039081610aa1579050509050611843815f81518110610ace57610ace612649565b60200260200101906001600160401b031690816001600160401b03168152505061186f81600181518110610b0457610b04612649565b60200260200101906001600160401b031690816001600160401b03168152505061187e81600281518110610b3a57610b3a612649565b60200260200101906001600160401b031690816001600160401b03168152505061188d81600381518110610b7057610b70612649565b60200260200101906001600160401b031690816001600160401b0316815250506119cc81600481518110610ba657610ba6612649565b60200260200101906001600160401b031690816001600160401b0316815250506119dc81600581518110610bdc57610bdc612649565b60200260200101906001600160401b031690816001600160401b0316815250506119ec81600681518110610c1257610c12612649565b6001600160401b0390921660209283029190910190910152808b610c3860056001612636565b610c43906001612636565b610c4e906002612636565b81518110610c5e57610c5e612649565b60209081029190910101528a610c7b610c76826119fc565b611a11565b9c5050505050505050505050505090565b5f6060805f805f610cac87610c9f611aa0565b610ca7611ac0565b611ae0565b9250925092505f610cc282610220015160200190565b90505f8261022001515182610cd79190612636565b90505f610cf583836f07fffffe0000000003ff200000000000611bd1565b80925081945050505f80610d0e86610240015184611c6d565b915091508115610da3575f610d238783611d44565b905061248f5f610d31611d73565b90505f60028251610d429190612671565b9050808510610d73576040516303bdd1b160e51b815260048101869052602481018290526044015b60405180910390fd5b6001850160020282015161ffff169250610d8c8c8c8686565b9e509e509e50505050505050505050505050610dc9565b5050604080515f80825281830190925260208101828152919a5090985096505050505050505b9193909250565b5f805f805f610df8866002810151815160228084019461ffff93909316840101920160200190565b505f988998509650505050505050565b60605f610e1760046001612636565b610e22906003612636565b610e2d906001612636565b610e38906001612636565b6001600160401b03811115610e4f57610e4f612507565b604051908082528060200260200182016040528015610e8257816020015b6060815260200190600190039081610e6d5790505b50604080516002808252606082019092529192505f9190816020015b61248f815260200190600190039081610e9e579050509050611d93815f81518110610ecb57610ecb612649565b60200260200101906001600160401b031690816001600160401b031681525050611d9381600181518110610f0157610f01612649565b6001600160401b039290921660209283029190910190910152604080516003808252608082019092525f91816020015b61248f815260200190600190039081610f31579050509050611d93815f81518110610f5e57610f5e612649565b60200260200101906001600160401b031690816001600160401b031681525050611d9381600181518110610f9457610f94612649565b60200260200101906001600160401b031690816001600160401b031681525050611d9381600281518110610fca57610fca612649565b6001600160401b039290921660209283029190910190910152604080516002808252606082019092525f91816020015b61248f815260200190600190039081610ffa579050509050611d93815f8151811061102757611027612649565b60200260200101906001600160401b031690816001600160401b031681525050611d938160018151811061105d5761105d612649565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b61248f81526020019060019003908161108d579050509050611d93815f815181106110ba576110ba612649565b60200260200101906001600160401b031690816001600160401b031681525050611d93816001815181106110f0576110f0612649565b60200260200101906001600160401b031690816001600160401b031681525050611d938160028151811061112657611126612649565b60200260200101906001600160401b031690816001600160401b031681525050611d938160038151811061115c5761115c612649565b60200260200101906001600160401b031690816001600160401b031681525050611d938160048151811061119257611192612649565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b61248f8152602001906001900390816111c2579050509050611d93815f815181106111ef576111ef612649565b60200260200101906001600160401b031690816001600160401b031681525050611d938160018151811061122557611225612649565b60200260200101906001600160401b031690816001600160401b031681525050611d938160028151811061125b5761125b612649565b60200260200101906001600160401b031690816001600160401b031681525050611d938160038151811061129157611291612649565b60200260200101906001600160401b031690816001600160401b031681525050611d93816004815181106112c7576112c7612649565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b61248f8152602001906001900390816112f6579050509050611dbc815f8151811061132357611323612649565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b61248f815260200190600190039081611352579050509050611dbc815f8151811061137f5761137f612649565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b61248f8152602001906001900390816113ae579050509050611e58815f815181106113db576113db612649565b60200260200101906001600160401b031690816001600160401b03168152505087895f8151811061140e5761140e612649565b6020026020010181905250868960018151811061142d5761142d612649565b6020026020010181905250858960028151811061144c5761144c612649565b6020026020010181905250848960038151811061146b5761146b612649565b6020026020010181905250838960048151811061148a5761148a612649565b602002602001018190525082896005815181106114a9576114a9612649565b602090810291909101015281896114c260056001612636565b815181106114d2576114d2612649565b602090810291909101015280896114eb60056001612636565b6114f6906001612636565b8151811061150657611506612649565b602090810291909101015260408051600680825260e082019092525f91816020015b61248f815260200190600190039081611528579050509050611d93815f8151811061155557611555612649565b60200260200101906001600160401b031690816001600160401b031681525050611d938160018151811061158b5761158b612649565b60200260200101906001600160401b031690816001600160401b031681525050611d93816002815181106115c1576115c1612649565b60200260200101906001600160401b031690816001600160401b031681525050611d93816003815181106115f7576115f7612649565b60200260200101906001600160401b031690816001600160401b031681525050611d938160048151811061162d5761162d612649565b60200260200101906001600160401b031690816001600160401b031681525050611d938160058151811061166357611663612649565b6001600160401b0390921660209283029190910190910152808a61168960056001612636565b611694906001612636565b61169f906001612636565b815181106116af576116af612649565b602090810291909101015260408051600780825261010082019092525f91816020015b61248f8152602001906001900390816116d2579050509050611d93815f815181106116ff576116ff612649565b60200260200101906001600160401b031690816001600160401b031681525050611d938160018151811061173557611735612649565b60200260200101906001600160401b031690816001600160401b031681525050611d938160028151811061176b5761176b612649565b60200260200101906001600160401b031690816001600160401b031681525050611d93816003815181106117a1576117a1612649565b60200260200101906001600160401b031690816001600160401b031681525050611d93816004815181106117d7576117d7612649565b60200260200101906001600160401b031690816001600160401b031681525050611d938160058151811061180d5761180d612649565b60200260200101906001600160401b031690816001600160401b031681525050611d9381600681518110610c1257610c12612649565b5f6060806118515f80611f10565b92509250925093509350939050565b5f6060806118515f6001611f10565b5f60608061185160015f611f10565b5f606080611851600180611f10565b5f60608061185160016002611f10565b5f60608061185160025f611f10565b5f60608061185160026001611f10565b5f60608061185160035f611f10565b5f60608061185160036001611f10565b5f60608061185160036002611f10565b5f606080611851600380611f10565b5f60608061185160036004611f10565b5f60608061185160045f611f10565b5f60608061185160046001611f10565b5f60608061185160046002611f10565b5f60608061185160046003611f10565b5f606080611851600480611f10565b5f606080611851600585611f10565b5f60608061185161197a60056001612636565b85611f10565b5f60608060ff80851690600886901c166119bb826119a060056001612636565b6119ab906001612636565b6119b59190612636565b82611f10565b945094509450505093509350939050565b5f60608061185160016003611f10565b5f60608061185160016004611f10565b5f60608061185160016005611f10565b6060815f611a0982611f92565b949350505050565b60605f82516002026001600160401b03811115611a3057611a30612507565b6040519080825280601f01601f191660200182016040528015611a5a576020820181803683370190505b50905061ffff80196020850160208651028101600285015b81831015611a9457805183518616908516178152602090920191600201611a72565b50939695505050505050565b60606040518060e0016040528060a6815260200161274060a69139905090565b60606040518060800160405280604281526020016126bc60429139905090565b5f80611b6f6040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020016060815260200160608152602001606081526020015f815260200160608152602001606081525090565b606061ffff600288015116935060ff600388015116925061ffff600588015116600588019750808852602081018801915050611bbb87878760405180602001604052805f815250612000565b915080826101e001819052505093509350939050565b5f808060018187870360208111611be85780611beb565b60205b915050875192505b8519600184841a1b16158183101615611c1157600182019150611bf3565b9681019660208290036008810293841c90931b92611c5c5760408051602081018590520160408051601f198184030181529082905263e47fe8b760e01b8252610d6a916004016124f5565b50869350909150505b935093915050565b600182810180515f928392600560ff93909316602102870192830192909101835b81831015611d325760018301516021909301805190935f90819060ff168180611cb7838e6121b1565b915091508186165f03611cd9575f809b509b5050505050505050505050611d3d565b5f87611ce96001850389166121dc565b016004028b015195505062ffffff9081169350841683039150611d1d9050575060019750601c1a9550611d3d945050505050565b611d26836121dc565b84019350505050611c8e565b5f8095509550505050505b9250929050565b6101c08201516002828102820101516101e08401515f9261ffff9092169190611d6a9083565b95945050505050565b60606040518060800160405280604281526020016126fe60429139905090565b5f81515f14611db5576040516304f8b58160e51b815260040160405180910390fd5b505f919050565b5f8151600103611e19575060208101516001600160e01b038116601b0b60e082901d5f611dea838383612295565b905061ffff811115611e0f57604051631e4e01d760e21b815260040160405180910390fd5b9250611e53915050565b81515f03611e3a57604051630f16066b60e41b815260040160405180910390fd5b604051630358cd2160e31b815260040160405180910390fd5b919050565b5f8151600203611eed57602082015160408301516001600160e01b038216601b0b60e083901d5f611e8a838383612295565b6001600160e01b038516601b0b935060e085901d925090505f611eae848483612295565b905060ff821180611ebf575060ff81115b15611edd57604051631e4e01d760e21b815260040160405180910390fd5b60081b179450611e539350505050565b600282511015611e3a57604051630f16066b60e41b815260040160405180910390fd5b5f60608060ff851180611f23575060ff84115b15611f4b57604051639b0f326160e01b81526004810186905260248101859052604401610d6a565b6040805160248101909152600386602383015385602283015360106021830153806020830153506004815260408051602081019091525f8152600197919650945092505050565b60605f611f9e836122d7565b90505f611fac826020612690565b9050606060405190508160200181016040528281526020850160208651028101602083015b81831015611ff457602083515102806020855101835e6020939093019201611fd1565b50919695505050505050565b61208d6040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020016060815260200160608152602001606081526020015f815260200160608152602001606081525090565b5f6040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f801b81526020015f8152602001600481526020015f81526020015f81526020015f81526020015f801b815260200184815260200185815260200160046001600160401b0381111561211257612112612507565b60405190808252806020026020018201604052801561213b578160200160208202803683370190505b5081525f602080830182905260408084018b905260609384018a90528051601f01601f19168281528083018252835161ffff191681178452855290840182905283018190529082018190526080820181905260a08201819052610120820181905261014082018190526102008201529050611d6a565b5f80825f528360205360215f2090506001815f1a1b915062ffffff8116611d3d575060019250929050565b5f5f1982036121ee5750610100919050565b507f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f7f5555555555555555555555555555555555555555555555555555555555555555600183901c16909103600281901c7f3333333333333333333333333333333333333333333333333333333333333333908116911601600481901c01167f01010101010101010101010101010101010101010101010101010101010101010260f81c90565b5f805f6122a3868686612320565b91509150806122ce5760405162bc8ecf60e31b81526004810187905260248101869052604401610d6a565b50949350505050565b5f60208201602083510281015b8082101561231957815151928301928084101561230d57634e487b715f5260116020526024601cfd5b506020820191506122e4565b5050919050565b5f805f85121561234d57604051634a7d166b60e01b81526004810186905260248101859052604401610d6a565b845f0361235f57505f90506001611c65565b8460ff841685018581121561239a5760405163c849483b60e01b8152600481018890526024810187905260ff86166044820152606401610d6a565b5f805f8312156123e657604c198312156123bd575f809550955050505050611c65565b825f03600a0a91508184816123d4576123d461265d565b0495505084029091149150611c659050565b5f83131561247f57604d8313156124235760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610d6a565b82600a0a9150815f19816124395761243961265d565b0484111561246d5760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610d6a565b5091909102925060019150611c659050565b8360019550955050505050611c65565b6124976126a7565b565b5f602082840312156124a9575f80fd5b81356001600160e01b0319811681146124c0575f80fd5b9392505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6124c060208301846124c7565b634e487b7160e01b5f52604160045260245ffd5b5f6020828403121561252b575f80fd5b81356001600160401b0380821115612541575f80fd5b818401915084601f830112612554575f80fd5b81358181111561256657612566612507565b604051601f8201601f19908116603f0116810190838211818310171561258e5761258e612507565b816040528281528760208487010111156125a6575f80fd5b826020860160208301375f928101602001929092525095945050505050565b83151581525f6020606060208401526125e160608401866124c7565b8381036040850152845180825260208087019201905f5b81811015612614578351835292840192918401916001016125f8565b509098975050505050505050565b634e487b7160e01b5f52601160045260245ffd5b808201808211156101d1576101d1612622565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601260045260245ffd5b5f8261268b57634e487b7160e01b5f52601260045260245ffd5b500490565b80820281158282048414176101d1576101d1612622565b634e487b7160e01b5f52605160045260245ffdfe1d931d931d931d931d931d931d931d931d931d931d931d931d931d931d931d931d931dbc1dbc1e581d931d931d931d931d931d931d931d931d931d931d931d931d9318431860186f187e188d189d18ac18bc18cb18db18eb18fa190a19191929193919491958196719801843186f187e188d19cc19dc1843186f187e188d19cc19dc19ec0101180010800082000100010480300038412a001810000010020004200005002038038ff54900cc66c620f3dcab0616592212c9ec8109895f0b17fec9301c02e0920c5bfe561e21609201e959460b1974270f844db208bcd3bf1f989376111049db14b934301b0ae9a00af82a7805c138f40d28083f0742ef2104d561fd1515a13318716a611ad260cc107b9bfc0eec7ade16cba2891d6b14a513792bdb02e0f14719565589"; + hex"6080604052348015600e575f80fd5b506127d08061001c5f395ff3fe608060405234801561000f575f80fd5b506004361061007a575f3560e01c80636f5aa28d116100585780636f5aa28d146100dd578063c6c0cbb61461010b578063ccf4477514610135578063d6d8c9a814610148575f80fd5b806301ffc9a71461007e578063336284d4146100a6578063570c7a63146100bb575b5f80fd5b61009161008c366004612483565b610150565b60405190151581526020015b60405180910390f35b6100ae6101d7565b60405161009d91906124df565b6100ce6100c9366004612505565b610c81565b60405161009d939291906125af565b6040517f828494fa15dec168f2372c71a11064dc163f7783fb7f3a9a84df40a87861a368815260200161009d565b61011e610119366004612505565b610dc5565b60408051921515835260208301919091520161009d565b60408051602081019091525f81526100ae565b6100ae610dfd565b5f6001600160e01b031982166391ccb1d560e01b148061018057506001600160e01b03198216636f5aa28d60e01b145b8061019b57506001600160e01b03198216631a2c8edd60e01b145b806101b657506001600160e01b03198216630cd8a13560e21b145b806101d157506301ffc9a760e01b6001600160e01b03198316145b92915050565b60605f6101e660056001612620565b6101f1906001612620565b6101fc906003612620565b6001600160401b03811115610213576102136124f1565b60405190808252806020026020018201604052801561024657816020015b60608152602001906001900390816102315790505b50604080516002808252606082019092529192505f9190816020015b61247981526020019060019003908161026257905050905061182d815f8151811061028f5761028f612633565b60200260200101906001600160401b031690816001600160401b03168152505061184a816001815181106102c5576102c5612633565b6001600160401b039290921660209283029190910190910152604080516003808252608082019092525f91816020015b6124798152602001906001900390816102f5579050509050611859815f8151811061032257610322612633565b60200260200101906001600160401b031690816001600160401b0316815250506118688160018151811061035857610358612633565b60200260200101906001600160401b031690816001600160401b0316815250506118778160028151811061038e5761038e612633565b6001600160401b039290921660209283029190910190910152604080516002808252606082019092525f91816020015b6124798152602001906001900390816103be579050509050611887815f815181106103eb576103eb612633565b60200260200101906001600160401b031690816001600160401b0316815250506118968160018151811061042157610421612633565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b6124798152602001906001900390816104515790505090506118a6815f8151811061047e5761047e612633565b60200260200101906001600160401b031690816001600160401b0316815250506118b5816001815181106104b4576104b4612633565b60200260200101906001600160401b031690816001600160401b0316815250506118c5816002815181106104ea576104ea612633565b60200260200101906001600160401b031690816001600160401b0316815250506118d58160038151811061052057610520612633565b60200260200101906001600160401b031690816001600160401b0316815250506118e48160048151811061055657610556612633565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b6124798152602001906001900390816105865790505090506118f4815f815181106105b3576105b3612633565b60200260200101906001600160401b031690816001600160401b031681525050611903816001815181106105e9576105e9612633565b60200260200101906001600160401b031690816001600160401b0316815250506119138160028151811061061f5761061f612633565b60200260200101906001600160401b031690816001600160401b0316815250506119238160038151811061065557610655612633565b60200260200101906001600160401b031690816001600160401b0316815250506119338160048151811061068b5761068b612633565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6124798152602001906001900390816106ba579050509050611942815f815181106106e7576106e7612633565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b612479815260200190600190039081610716579050509050611951815f8151811061074357610743612633565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b61247981526020019060019003908161077257905050905061196a815f8151811061079f5761079f612633565b60200260200101906001600160401b031690816001600160401b03168152505087895f815181106107d2576107d2612633565b602002602001018190525086896001815181106107f1576107f1612633565b6020026020010181905250858960028151811061081057610810612633565b6020026020010181905250848960038151811061082f5761082f612633565b6020026020010181905250838960048151811061084e5761084e612633565b6020026020010181905250828960058151811061086d5761086d612633565b6020908102919091010152818961088660056001612620565b8151811061089657610896612633565b602090810291909101015280896108af60056001612620565b6108ba906001612620565b815181106108ca576108ca612633565b602090810291909101015260408051600680825260e082019092525f91816020015b6124798152602001906001900390816108ec57905050905061182d815f8151811061091957610919612633565b60200260200101906001600160401b031690816001600160401b0316815250506118598160018151811061094f5761094f612633565b60200260200101906001600160401b031690816001600160401b0316815250506118688160028151811061098557610985612633565b60200260200101906001600160401b031690816001600160401b031681525050611877816003815181106109bb576109bb612633565b60200260200101906001600160401b031690816001600160401b0316815250506119b6816004815181106109f1576109f1612633565b60200260200101906001600160401b031690816001600160401b0316815250506119c681600581518110610a2757610a27612633565b6001600160401b0390921660209283029190910190910152808a610a4d60056001612620565b610a58906001612620565b610a63906001612620565b81518110610a7357610a73612633565b602090810291909101015260408051600780825261010082019092525f91816020015b612479815260200190600190039081610a9657905050905061182d815f81518110610ac357610ac3612633565b60200260200101906001600160401b031690816001600160401b03168152505061185981600181518110610af957610af9612633565b60200260200101906001600160401b031690816001600160401b03168152505061186881600281518110610b2f57610b2f612633565b60200260200101906001600160401b031690816001600160401b03168152505061187781600381518110610b6557610b65612633565b60200260200101906001600160401b031690816001600160401b0316815250506119b681600481518110610b9b57610b9b612633565b60200260200101906001600160401b031690816001600160401b0316815250506119c681600581518110610bd157610bd1612633565b60200260200101906001600160401b031690816001600160401b0316815250506119d681600681518110610c0757610c07612633565b6001600160401b0390921660209283029190910190910152808b610c2d60056001612620565b610c38906001612620565b610c43906002612620565b81518110610c5357610c53612633565b60209081029190910101528a610c70610c6b826119e6565b6119fb565b9c5050505050505050505050505090565b5f6060805f805f610ca187610c94611a8a565b610c9c611aaa565b611aca565b9250925092505f610cb782610220015160200190565b90505f8261022001515182610ccc9190612620565b90505f610cea83836f07fffffe0000000003ff200000000000611bbb565b80925081945050505f80610d0386610240015184611c57565b915091508115610d98575f610d188783611d2e565b90506124795f610d26611d5d565b90505f60028251610d37919061265b565b9050808510610d68576040516303bdd1b160e51b815260048101869052602481018290526044015b60405180910390fd5b6001850160020282015161ffff169250610d818c8c8686565b9e509e509e50505050505050505050505050610dbe565b5050604080515f80825281830190925260208101828152919a5090985096505050505050505b9193909250565b5f805f805f610ded866002810151815160228084019461ffff93909316840101920160200190565b505f988998509650505050505050565b60605f610e0c60056001612620565b610e17906001612620565b610e22906003612620565b6001600160401b03811115610e3957610e396124f1565b604051908082528060200260200182016040528015610e6c57816020015b6060815260200190600190039081610e575790505b50604080516002808252606082019092529192505f9190816020015b612479815260200190600190039081610e88579050509050611d7d815f81518110610eb557610eb5612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d81600181518110610eeb57610eeb612633565b6001600160401b039290921660209283029190910190910152604080516003808252608082019092525f91816020015b612479815260200190600190039081610f1b579050509050611d7d815f81518110610f4857610f48612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d81600181518110610f7e57610f7e612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d81600281518110610fb457610fb4612633565b6001600160401b039290921660209283029190910190910152604080516002808252606082019092525f91816020015b612479815260200190600190039081610fe4579050509050611d7d815f8151811061101157611011612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d8160018151811061104757611047612633565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b612479815260200190600190039081611077579050509050611d7d815f815181106110a4576110a4612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d816001815181106110da576110da612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d8160028151811061111057611110612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d8160038151811061114657611146612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d8160048151811061117c5761117c612633565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b6124798152602001906001900390816111ac579050509050611d7d815f815181106111d9576111d9612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d8160018151811061120f5761120f612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d8160028151811061124557611245612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d8160038151811061127b5761127b612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d816004815181106112b1576112b1612633565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6124798152602001906001900390816112e0579050509050611da6815f8151811061130d5761130d612633565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b61247981526020019060019003908161133c579050509050611da6815f8151811061136957611369612633565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b612479815260200190600190039081611398579050509050611e42815f815181106113c5576113c5612633565b60200260200101906001600160401b031690816001600160401b03168152505087895f815181106113f8576113f8612633565b6020026020010181905250868960018151811061141757611417612633565b6020026020010181905250858960028151811061143657611436612633565b6020026020010181905250848960038151811061145557611455612633565b6020026020010181905250838960048151811061147457611474612633565b6020026020010181905250828960058151811061149357611493612633565b602090810291909101015281896114ac60056001612620565b815181106114bc576114bc612633565b602090810291909101015280896114d560056001612620565b6114e0906001612620565b815181106114f0576114f0612633565b602090810291909101015260408051600680825260e082019092525f91816020015b612479815260200190600190039081611512579050509050611d7d815f8151811061153f5761153f612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d8160018151811061157557611575612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d816002815181106115ab576115ab612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d816003815181106115e1576115e1612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d8160048151811061161757611617612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d8160058151811061164d5761164d612633565b6001600160401b0390921660209283029190910190910152808a61167360056001612620565b61167e906001612620565b611689906001612620565b8151811061169957611699612633565b602090810291909101015260408051600780825261010082019092525f91816020015b6124798152602001906001900390816116bc579050509050611d7d815f815181106116e9576116e9612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d8160018151811061171f5761171f612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d8160028151811061175557611755612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d8160038151811061178b5761178b612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d816004815181106117c1576117c1612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d816005815181106117f7576117f7612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d81600681518110610c0757610c07612633565b5f60608061183b5f80611efa565b92509250925093509350939050565b5f60608061183b5f6001611efa565b5f60608061183b60015f611efa565b5f60608061183b600180611efa565b5f60608061183b60016002611efa565b5f60608061183b60025f611efa565b5f60608061183b60026001611efa565b5f60608061183b60035f611efa565b5f60608061183b60036001611efa565b5f60608061183b60036002611efa565b5f60608061183b600380611efa565b5f60608061183b60036004611efa565b5f60608061183b60045f611efa565b5f60608061183b60046001611efa565b5f60608061183b60046002611efa565b5f60608061183b60046003611efa565b5f60608061183b600480611efa565b5f60608061183b600585611efa565b5f60608061183b61196460056001612620565b85611efa565b5f60608060ff80851690600886901c166119a58261198a60056001612620565b611995906001612620565b61199f9190612620565b82611efa565b945094509450505093509350939050565b5f60608061183b60016003611efa565b5f60608061183b60016004611efa565b5f60608061183b60016005611efa565b6060815f6119f382611f7c565b949350505050565b60605f82516002026001600160401b03811115611a1a57611a1a6124f1565b6040519080825280601f01601f191660200182016040528015611a44576020820181803683370190505b50905061ffff80196020850160208651028101600285015b81831015611a7e57805183518616908516178152602090920191600201611a5c565b50939695505050505050565b60606040518060e0016040528060a681526020016126e860a69139905090565b606060405180608001604052806042815260200161278e60429139905090565b5f80611b596040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020016060815260200160608152602001606081526020015f815260200160608152602001606081525090565b606061ffff600288015116935060ff600388015116925061ffff600588015116600588019750808852602081018801915050611ba587878760405180602001604052805f815250611fea565b915080826101e001819052505093509350939050565b5f808060018187870360208111611bd25780611bd5565b60205b915050875192505b8519600184841a1b16158183101615611bfb57600182019150611bdd565b9681019660208290036008810293841c90931b92611c465760408051602081018590520160408051601f198184030181529082905263e47fe8b760e01b8252610d5f916004016124df565b50869350909150505b935093915050565b600182810180515f928392600560ff93909316602102870192830192909101835b81831015611d1c5760018301516021909301805190935f90819060ff168180611ca1838e61219b565b915091508186165f03611cc3575f809b509b5050505050505050505050611d27565b5f87611cd36001850389166121c6565b016004028b015195505062ffffff9081169350841683039150611d079050575060019750601c1a9550611d27945050505050565b611d10836121c6565b84019350505050611c78565b5f8095509550505050505b9250929050565b6101c08201516002828102820101516101e08401515f9261ffff9092169190611d549083565b95945050505050565b60606040518060800160405280604281526020016126a660429139905090565b5f81515f14611d9f576040516304f8b58160e51b815260040160405180910390fd5b505f919050565b5f8151600103611e03575060208101516001600160e01b038116601b0b60e082901d5f611dd483838361227f565b905061ffff811115611df957604051631e4e01d760e21b815260040160405180910390fd5b9250611e3d915050565b81515f03611e2457604051630f16066b60e41b815260040160405180910390fd5b604051630358cd2160e31b815260040160405180910390fd5b919050565b5f8151600203611ed757602082015160408301516001600160e01b038216601b0b60e083901d5f611e7483838361227f565b6001600160e01b038516601b0b935060e085901d925090505f611e9884848361227f565b905060ff821180611ea9575060ff81115b15611ec757604051631e4e01d760e21b815260040160405180910390fd5b60081b179450611e3d9350505050565b600282511015611e2457604051630f16066b60e41b815260040160405180910390fd5b5f60608060ff851180611f0d575060ff84115b15611f3557604051639b0f326160e01b81526004810186905260248101859052604401610d5f565b6040805160248101909152600386602383015385602283015360106021830153806020830153506004815260408051602081019091525f8152600197919650945092505050565b60605f611f88836122c1565b90505f611f9682602061267a565b9050606060405190508160200181016040528281526020850160208651028101602083015b81831015611fde57602083515102806020855101835e6020939093019201611fbb565b50919695505050505050565b6120776040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020016060815260200160608152602001606081526020015f815260200160608152602001606081525090565b5f6040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f801b81526020015f8152602001600481526020015f81526020015f81526020015f81526020015f801b815260200184815260200185815260200160046001600160401b038111156120fc576120fc6124f1565b604051908082528060200260200182016040528015612125578160200160208202803683370190505b5081525f602080830182905260408084018b905260609384018a90528051601f01601f19168281528083018252835161ffff191681178452855290840182905283018190529082018190526080820181905260a08201819052610120820181905261014082018190526102008201529050611d54565b5f80825f528360205360215f2090506001815f1a1b915062ffffff8116611d27575060019250929050565b5f5f1982036121d85750610100919050565b507f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f7f5555555555555555555555555555555555555555555555555555555555555555600183901c16909103600281901c7f3333333333333333333333333333333333333333333333333333333333333333908116911601600481901c01167f01010101010101010101010101010101010101010101010101010101010101010260f81c90565b5f805f61228d86868661230a565b91509150806122b85760405162bc8ecf60e31b81526004810187905260248101869052604401610d5f565b50949350505050565b5f60208201602083510281015b808210156123035781515192830192808410156122f757634e487b715f5260116020526024601cfd5b506020820191506122ce565b5050919050565b5f805f85121561233757604051634a7d166b60e01b81526004810186905260248101859052604401610d5f565b845f0361234957505f90506001611c4f565b8460ff84168501858112156123845760405163c849483b60e01b8152600481018890526024810187905260ff86166044820152606401610d5f565b5f805f8312156123d057604c198312156123a7575f809550955050505050611c4f565b825f03600a0a91508184816123be576123be612647565b0495505084029091149150611c4f9050565b5f83131561246957604d83131561240d5760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610d5f565b82600a0a9150815f198161242357612423612647565b048411156124575760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610d5f565b5091909102925060019150611c4f9050565b8360019550955050505050611c4f565b612481612691565b565b5f60208284031215612493575f80fd5b81356001600160e01b0319811681146124aa575f80fd5b9392505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6124aa60208301846124b1565b634e487b7160e01b5f52604160045260245ffd5b5f60208284031215612515575f80fd5b81356001600160401b038082111561252b575f80fd5b818401915084601f83011261253e575f80fd5b813581811115612550576125506124f1565b604051601f8201601f19908116603f01168101908382118183101715612578576125786124f1565b81604052828152876020848701011115612590575f80fd5b826020860160208301375f928101602001929092525095945050505050565b83151581525f6020606060208401526125cb60608401866124b1565b8381036040850152845180825260208087019201905f5b818110156125fe578351835292840192918401916001016125e2565b509098975050505050505050565b634e487b7160e01b5f52601160045260245ffd5b808201808211156101d1576101d161260c565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601260045260245ffd5b5f8261267557634e487b7160e01b5f52601260045260245ffd5b500490565b80820281158282048414176101d1576101d161260c565b634e487b7160e01b5f52605160045260245ffdfe182d184a1859186818771887189618a618b518c518d518e418f4190319131923193319421951196a182d18591868187719b619c6182d18591868187719b619c619d60101180010800082000100010480300038412a001810000010020004200005002038038ff54900cc66c620f3dcab0616592212c9ec8109895f0b17fec9301c02e0920c5bfe561e21609201e959460b1974270f844db208bcd3bf1f989376111049db14b934301b0ae9a00af82a7805c138f40d28083f0742ef2104d561fd1515a13318716a611ad260cc107b9bfc0eec7ade16cba2891d6b14a513792bdb02e0f147195655891d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1da61da61e421d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d"; /// @dev The runtime bytecode of the contract. bytes constant RUNTIME_CODE = - hex"608060405234801561000f575f80fd5b506004361061007a575f3560e01c80636f5aa28d116100585780636f5aa28d146100dd578063c6c0cbb61461010b578063ccf4477514610135578063d6d8c9a814610148575f80fd5b806301ffc9a71461007e578063336284d4146100a6578063570c7a63146100bb575b5f80fd5b61009161008c366004612499565b610150565b60405190151581526020015b60405180910390f35b6100ae6101d7565b60405161009d91906124f5565b6100ce6100c936600461251b565b610c8c565b60405161009d939291906125c5565b6040517f828494fa15dec168f2372c71a11064dc163f7783fb7f3a9a84df40a87861a368815260200161009d565b61011e61011936600461251b565b610dd0565b60408051921515835260208301919091520161009d565b60408051602081019091525f81526100ae565b6100ae610e08565b5f6001600160e01b031982166391ccb1d560e01b148061018057506001600160e01b03198216636f5aa28d60e01b145b8061019b57506001600160e01b03198216631a2c8edd60e01b145b806101b657506001600160e01b03198216630cd8a13560e21b145b806101d157506301ffc9a760e01b6001600160e01b03198316145b92915050565b60605f6101e660046001612636565b6101f1906003612636565b6101fc906001612636565b610207906001612636565b6001600160401b0381111561021e5761021e612507565b60405190808252806020026020018201604052801561025157816020015b606081526020019060019003908161023c5790505b50604080516002808252606082019092529192505f9190816020015b61248f81526020019060019003908161026d579050509050611843815f8151811061029a5761029a612649565b60200260200101906001600160401b031690816001600160401b031681525050611860816001815181106102d0576102d0612649565b6001600160401b039290921660209283029190910190910152604080516003808252608082019092525f91816020015b61248f81526020019060019003908161030057905050905061186f815f8151811061032d5761032d612649565b60200260200101906001600160401b031690816001600160401b03168152505061187e8160018151811061036357610363612649565b60200260200101906001600160401b031690816001600160401b03168152505061188d8160028151811061039957610399612649565b6001600160401b039290921660209283029190910190910152604080516002808252606082019092525f91816020015b61248f8152602001906001900390816103c957905050905061189d815f815181106103f6576103f6612649565b60200260200101906001600160401b031690816001600160401b0316815250506118ac8160018151811061042c5761042c612649565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b61248f81526020019060019003908161045c5790505090506118bc815f8151811061048957610489612649565b60200260200101906001600160401b031690816001600160401b0316815250506118cb816001815181106104bf576104bf612649565b60200260200101906001600160401b031690816001600160401b0316815250506118db816002815181106104f5576104f5612649565b60200260200101906001600160401b031690816001600160401b0316815250506118eb8160038151811061052b5761052b612649565b60200260200101906001600160401b031690816001600160401b0316815250506118fa8160048151811061056157610561612649565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b61248f81526020019060019003908161059157905050905061190a815f815181106105be576105be612649565b60200260200101906001600160401b031690816001600160401b031681525050611919816001815181106105f4576105f4612649565b60200260200101906001600160401b031690816001600160401b0316815250506119298160028151811061062a5761062a612649565b60200260200101906001600160401b031690816001600160401b0316815250506119398160038151811061066057610660612649565b60200260200101906001600160401b031690816001600160401b0316815250506119498160048151811061069657610696612649565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b61248f8152602001906001900390816106c5579050509050611958815f815181106106f2576106f2612649565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b61248f815260200190600190039081610721579050509050611967815f8151811061074e5761074e612649565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b61248f81526020019060019003908161077d579050509050611980815f815181106107aa576107aa612649565b60200260200101906001600160401b031690816001600160401b03168152505087895f815181106107dd576107dd612649565b602002602001018190525086896001815181106107fc576107fc612649565b6020026020010181905250858960028151811061081b5761081b612649565b6020026020010181905250848960038151811061083a5761083a612649565b6020026020010181905250838960048151811061085957610859612649565b6020026020010181905250828960058151811061087857610878612649565b6020908102919091010152818961089160056001612636565b815181106108a1576108a1612649565b602090810291909101015280896108ba60056001612636565b6108c5906001612636565b815181106108d5576108d5612649565b602090810291909101015260408051600680825260e082019092525f91816020015b61248f8152602001906001900390816108f7579050509050611843815f8151811061092457610924612649565b60200260200101906001600160401b031690816001600160401b03168152505061186f8160018151811061095a5761095a612649565b60200260200101906001600160401b031690816001600160401b03168152505061187e8160028151811061099057610990612649565b60200260200101906001600160401b031690816001600160401b03168152505061188d816003815181106109c6576109c6612649565b60200260200101906001600160401b031690816001600160401b0316815250506119cc816004815181106109fc576109fc612649565b60200260200101906001600160401b031690816001600160401b0316815250506119dc81600581518110610a3257610a32612649565b6001600160401b0390921660209283029190910190910152808a610a5860056001612636565b610a63906001612636565b610a6e906001612636565b81518110610a7e57610a7e612649565b602090810291909101015260408051600780825261010082019092525f91816020015b61248f815260200190600190039081610aa1579050509050611843815f81518110610ace57610ace612649565b60200260200101906001600160401b031690816001600160401b03168152505061186f81600181518110610b0457610b04612649565b60200260200101906001600160401b031690816001600160401b03168152505061187e81600281518110610b3a57610b3a612649565b60200260200101906001600160401b031690816001600160401b03168152505061188d81600381518110610b7057610b70612649565b60200260200101906001600160401b031690816001600160401b0316815250506119cc81600481518110610ba657610ba6612649565b60200260200101906001600160401b031690816001600160401b0316815250506119dc81600581518110610bdc57610bdc612649565b60200260200101906001600160401b031690816001600160401b0316815250506119ec81600681518110610c1257610c12612649565b6001600160401b0390921660209283029190910190910152808b610c3860056001612636565b610c43906001612636565b610c4e906002612636565b81518110610c5e57610c5e612649565b60209081029190910101528a610c7b610c76826119fc565b611a11565b9c5050505050505050505050505090565b5f6060805f805f610cac87610c9f611aa0565b610ca7611ac0565b611ae0565b9250925092505f610cc282610220015160200190565b90505f8261022001515182610cd79190612636565b90505f610cf583836f07fffffe0000000003ff200000000000611bd1565b80925081945050505f80610d0e86610240015184611c6d565b915091508115610da3575f610d238783611d44565b905061248f5f610d31611d73565b90505f60028251610d429190612671565b9050808510610d73576040516303bdd1b160e51b815260048101869052602481018290526044015b60405180910390fd5b6001850160020282015161ffff169250610d8c8c8c8686565b9e509e509e50505050505050505050505050610dc9565b5050604080515f80825281830190925260208101828152919a5090985096505050505050505b9193909250565b5f805f805f610df8866002810151815160228084019461ffff93909316840101920160200190565b505f988998509650505050505050565b60605f610e1760046001612636565b610e22906003612636565b610e2d906001612636565b610e38906001612636565b6001600160401b03811115610e4f57610e4f612507565b604051908082528060200260200182016040528015610e8257816020015b6060815260200190600190039081610e6d5790505b50604080516002808252606082019092529192505f9190816020015b61248f815260200190600190039081610e9e579050509050611d93815f81518110610ecb57610ecb612649565b60200260200101906001600160401b031690816001600160401b031681525050611d9381600181518110610f0157610f01612649565b6001600160401b039290921660209283029190910190910152604080516003808252608082019092525f91816020015b61248f815260200190600190039081610f31579050509050611d93815f81518110610f5e57610f5e612649565b60200260200101906001600160401b031690816001600160401b031681525050611d9381600181518110610f9457610f94612649565b60200260200101906001600160401b031690816001600160401b031681525050611d9381600281518110610fca57610fca612649565b6001600160401b039290921660209283029190910190910152604080516002808252606082019092525f91816020015b61248f815260200190600190039081610ffa579050509050611d93815f8151811061102757611027612649565b60200260200101906001600160401b031690816001600160401b031681525050611d938160018151811061105d5761105d612649565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b61248f81526020019060019003908161108d579050509050611d93815f815181106110ba576110ba612649565b60200260200101906001600160401b031690816001600160401b031681525050611d93816001815181106110f0576110f0612649565b60200260200101906001600160401b031690816001600160401b031681525050611d938160028151811061112657611126612649565b60200260200101906001600160401b031690816001600160401b031681525050611d938160038151811061115c5761115c612649565b60200260200101906001600160401b031690816001600160401b031681525050611d938160048151811061119257611192612649565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b61248f8152602001906001900390816111c2579050509050611d93815f815181106111ef576111ef612649565b60200260200101906001600160401b031690816001600160401b031681525050611d938160018151811061122557611225612649565b60200260200101906001600160401b031690816001600160401b031681525050611d938160028151811061125b5761125b612649565b60200260200101906001600160401b031690816001600160401b031681525050611d938160038151811061129157611291612649565b60200260200101906001600160401b031690816001600160401b031681525050611d93816004815181106112c7576112c7612649565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b61248f8152602001906001900390816112f6579050509050611dbc815f8151811061132357611323612649565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b61248f815260200190600190039081611352579050509050611dbc815f8151811061137f5761137f612649565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b61248f8152602001906001900390816113ae579050509050611e58815f815181106113db576113db612649565b60200260200101906001600160401b031690816001600160401b03168152505087895f8151811061140e5761140e612649565b6020026020010181905250868960018151811061142d5761142d612649565b6020026020010181905250858960028151811061144c5761144c612649565b6020026020010181905250848960038151811061146b5761146b612649565b6020026020010181905250838960048151811061148a5761148a612649565b602002602001018190525082896005815181106114a9576114a9612649565b602090810291909101015281896114c260056001612636565b815181106114d2576114d2612649565b602090810291909101015280896114eb60056001612636565b6114f6906001612636565b8151811061150657611506612649565b602090810291909101015260408051600680825260e082019092525f91816020015b61248f815260200190600190039081611528579050509050611d93815f8151811061155557611555612649565b60200260200101906001600160401b031690816001600160401b031681525050611d938160018151811061158b5761158b612649565b60200260200101906001600160401b031690816001600160401b031681525050611d93816002815181106115c1576115c1612649565b60200260200101906001600160401b031690816001600160401b031681525050611d93816003815181106115f7576115f7612649565b60200260200101906001600160401b031690816001600160401b031681525050611d938160048151811061162d5761162d612649565b60200260200101906001600160401b031690816001600160401b031681525050611d938160058151811061166357611663612649565b6001600160401b0390921660209283029190910190910152808a61168960056001612636565b611694906001612636565b61169f906001612636565b815181106116af576116af612649565b602090810291909101015260408051600780825261010082019092525f91816020015b61248f8152602001906001900390816116d2579050509050611d93815f815181106116ff576116ff612649565b60200260200101906001600160401b031690816001600160401b031681525050611d938160018151811061173557611735612649565b60200260200101906001600160401b031690816001600160401b031681525050611d938160028151811061176b5761176b612649565b60200260200101906001600160401b031690816001600160401b031681525050611d93816003815181106117a1576117a1612649565b60200260200101906001600160401b031690816001600160401b031681525050611d93816004815181106117d7576117d7612649565b60200260200101906001600160401b031690816001600160401b031681525050611d938160058151811061180d5761180d612649565b60200260200101906001600160401b031690816001600160401b031681525050611d9381600681518110610c1257610c12612649565b5f6060806118515f80611f10565b92509250925093509350939050565b5f6060806118515f6001611f10565b5f60608061185160015f611f10565b5f606080611851600180611f10565b5f60608061185160016002611f10565b5f60608061185160025f611f10565b5f60608061185160026001611f10565b5f60608061185160035f611f10565b5f60608061185160036001611f10565b5f60608061185160036002611f10565b5f606080611851600380611f10565b5f60608061185160036004611f10565b5f60608061185160045f611f10565b5f60608061185160046001611f10565b5f60608061185160046002611f10565b5f60608061185160046003611f10565b5f606080611851600480611f10565b5f606080611851600585611f10565b5f60608061185161197a60056001612636565b85611f10565b5f60608060ff80851690600886901c166119bb826119a060056001612636565b6119ab906001612636565b6119b59190612636565b82611f10565b945094509450505093509350939050565b5f60608061185160016003611f10565b5f60608061185160016004611f10565b5f60608061185160016005611f10565b6060815f611a0982611f92565b949350505050565b60605f82516002026001600160401b03811115611a3057611a30612507565b6040519080825280601f01601f191660200182016040528015611a5a576020820181803683370190505b50905061ffff80196020850160208651028101600285015b81831015611a9457805183518616908516178152602090920191600201611a72565b50939695505050505050565b60606040518060e0016040528060a6815260200161274060a69139905090565b60606040518060800160405280604281526020016126bc60429139905090565b5f80611b6f6040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020016060815260200160608152602001606081526020015f815260200160608152602001606081525090565b606061ffff600288015116935060ff600388015116925061ffff600588015116600588019750808852602081018801915050611bbb87878760405180602001604052805f815250612000565b915080826101e001819052505093509350939050565b5f808060018187870360208111611be85780611beb565b60205b915050875192505b8519600184841a1b16158183101615611c1157600182019150611bf3565b9681019660208290036008810293841c90931b92611c5c5760408051602081018590520160408051601f198184030181529082905263e47fe8b760e01b8252610d6a916004016124f5565b50869350909150505b935093915050565b600182810180515f928392600560ff93909316602102870192830192909101835b81831015611d325760018301516021909301805190935f90819060ff168180611cb7838e6121b1565b915091508186165f03611cd9575f809b509b5050505050505050505050611d3d565b5f87611ce96001850389166121dc565b016004028b015195505062ffffff9081169350841683039150611d1d9050575060019750601c1a9550611d3d945050505050565b611d26836121dc565b84019350505050611c8e565b5f8095509550505050505b9250929050565b6101c08201516002828102820101516101e08401515f9261ffff9092169190611d6a9083565b95945050505050565b60606040518060800160405280604281526020016126fe60429139905090565b5f81515f14611db5576040516304f8b58160e51b815260040160405180910390fd5b505f919050565b5f8151600103611e19575060208101516001600160e01b038116601b0b60e082901d5f611dea838383612295565b905061ffff811115611e0f57604051631e4e01d760e21b815260040160405180910390fd5b9250611e53915050565b81515f03611e3a57604051630f16066b60e41b815260040160405180910390fd5b604051630358cd2160e31b815260040160405180910390fd5b919050565b5f8151600203611eed57602082015160408301516001600160e01b038216601b0b60e083901d5f611e8a838383612295565b6001600160e01b038516601b0b935060e085901d925090505f611eae848483612295565b905060ff821180611ebf575060ff81115b15611edd57604051631e4e01d760e21b815260040160405180910390fd5b60081b179450611e539350505050565b600282511015611e3a57604051630f16066b60e41b815260040160405180910390fd5b5f60608060ff851180611f23575060ff84115b15611f4b57604051639b0f326160e01b81526004810186905260248101859052604401610d6a565b6040805160248101909152600386602383015385602283015360106021830153806020830153506004815260408051602081019091525f8152600197919650945092505050565b60605f611f9e836122d7565b90505f611fac826020612690565b9050606060405190508160200181016040528281526020850160208651028101602083015b81831015611ff457602083515102806020855101835e6020939093019201611fd1565b50919695505050505050565b61208d6040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020016060815260200160608152602001606081526020015f815260200160608152602001606081525090565b5f6040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f801b81526020015f8152602001600481526020015f81526020015f81526020015f81526020015f801b815260200184815260200185815260200160046001600160401b0381111561211257612112612507565b60405190808252806020026020018201604052801561213b578160200160208202803683370190505b5081525f602080830182905260408084018b905260609384018a90528051601f01601f19168281528083018252835161ffff191681178452855290840182905283018190529082018190526080820181905260a08201819052610120820181905261014082018190526102008201529050611d6a565b5f80825f528360205360215f2090506001815f1a1b915062ffffff8116611d3d575060019250929050565b5f5f1982036121ee5750610100919050565b507f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f7f5555555555555555555555555555555555555555555555555555555555555555600183901c16909103600281901c7f3333333333333333333333333333333333333333333333333333333333333333908116911601600481901c01167f01010101010101010101010101010101010101010101010101010101010101010260f81c90565b5f805f6122a3868686612320565b91509150806122ce5760405162bc8ecf60e31b81526004810187905260248101869052604401610d6a565b50949350505050565b5f60208201602083510281015b8082101561231957815151928301928084101561230d57634e487b715f5260116020526024601cfd5b506020820191506122e4565b5050919050565b5f805f85121561234d57604051634a7d166b60e01b81526004810186905260248101859052604401610d6a565b845f0361235f57505f90506001611c65565b8460ff841685018581121561239a5760405163c849483b60e01b8152600481018890526024810187905260ff86166044820152606401610d6a565b5f805f8312156123e657604c198312156123bd575f809550955050505050611c65565b825f03600a0a91508184816123d4576123d461265d565b0495505084029091149150611c659050565b5f83131561247f57604d8313156124235760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610d6a565b82600a0a9150815f19816124395761243961265d565b0484111561246d5760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610d6a565b5091909102925060019150611c659050565b8360019550955050505050611c65565b6124976126a7565b565b5f602082840312156124a9575f80fd5b81356001600160e01b0319811681146124c0575f80fd5b9392505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6124c060208301846124c7565b634e487b7160e01b5f52604160045260245ffd5b5f6020828403121561252b575f80fd5b81356001600160401b0380821115612541575f80fd5b818401915084601f830112612554575f80fd5b81358181111561256657612566612507565b604051601f8201601f19908116603f0116810190838211818310171561258e5761258e612507565b816040528281528760208487010111156125a6575f80fd5b826020860160208301375f928101602001929092525095945050505050565b83151581525f6020606060208401526125e160608401866124c7565b8381036040850152845180825260208087019201905f5b81811015612614578351835292840192918401916001016125f8565b509098975050505050505050565b634e487b7160e01b5f52601160045260245ffd5b808201808211156101d1576101d1612622565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601260045260245ffd5b5f8261268b57634e487b7160e01b5f52601260045260245ffd5b500490565b80820281158282048414176101d1576101d1612622565b634e487b7160e01b5f52605160045260245ffdfe1d931d931d931d931d931d931d931d931d931d931d931d931d931d931d931d931d931dbc1dbc1e581d931d931d931d931d931d931d931d931d931d931d931d931d9318431860186f187e188d189d18ac18bc18cb18db18eb18fa190a19191929193919491958196719801843186f187e188d19cc19dc1843186f187e188d19cc19dc19ec0101180010800082000100010480300038412a001810000010020004200005002038038ff54900cc66c620f3dcab0616592212c9ec8109895f0b17fec9301c02e0920c5bfe561e21609201e959460b1974270f844db208bcd3bf1f989376111049db14b934301b0ae9a00af82a7805c138f40d28083f0742ef2104d561fd1515a13318716a611ad260cc107b9bfc0eec7ade16cba2891d6b14a513792bdb02e0f14719565589"; + hex"608060405234801561000f575f80fd5b506004361061007a575f3560e01c80636f5aa28d116100585780636f5aa28d146100dd578063c6c0cbb61461010b578063ccf4477514610135578063d6d8c9a814610148575f80fd5b806301ffc9a71461007e578063336284d4146100a6578063570c7a63146100bb575b5f80fd5b61009161008c366004612483565b610150565b60405190151581526020015b60405180910390f35b6100ae6101d7565b60405161009d91906124df565b6100ce6100c9366004612505565b610c81565b60405161009d939291906125af565b6040517f828494fa15dec168f2372c71a11064dc163f7783fb7f3a9a84df40a87861a368815260200161009d565b61011e610119366004612505565b610dc5565b60408051921515835260208301919091520161009d565b60408051602081019091525f81526100ae565b6100ae610dfd565b5f6001600160e01b031982166391ccb1d560e01b148061018057506001600160e01b03198216636f5aa28d60e01b145b8061019b57506001600160e01b03198216631a2c8edd60e01b145b806101b657506001600160e01b03198216630cd8a13560e21b145b806101d157506301ffc9a760e01b6001600160e01b03198316145b92915050565b60605f6101e660056001612620565b6101f1906001612620565b6101fc906003612620565b6001600160401b03811115610213576102136124f1565b60405190808252806020026020018201604052801561024657816020015b60608152602001906001900390816102315790505b50604080516002808252606082019092529192505f9190816020015b61247981526020019060019003908161026257905050905061182d815f8151811061028f5761028f612633565b60200260200101906001600160401b031690816001600160401b03168152505061184a816001815181106102c5576102c5612633565b6001600160401b039290921660209283029190910190910152604080516003808252608082019092525f91816020015b6124798152602001906001900390816102f5579050509050611859815f8151811061032257610322612633565b60200260200101906001600160401b031690816001600160401b0316815250506118688160018151811061035857610358612633565b60200260200101906001600160401b031690816001600160401b0316815250506118778160028151811061038e5761038e612633565b6001600160401b039290921660209283029190910190910152604080516002808252606082019092525f91816020015b6124798152602001906001900390816103be579050509050611887815f815181106103eb576103eb612633565b60200260200101906001600160401b031690816001600160401b0316815250506118968160018151811061042157610421612633565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b6124798152602001906001900390816104515790505090506118a6815f8151811061047e5761047e612633565b60200260200101906001600160401b031690816001600160401b0316815250506118b5816001815181106104b4576104b4612633565b60200260200101906001600160401b031690816001600160401b0316815250506118c5816002815181106104ea576104ea612633565b60200260200101906001600160401b031690816001600160401b0316815250506118d58160038151811061052057610520612633565b60200260200101906001600160401b031690816001600160401b0316815250506118e48160048151811061055657610556612633565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b6124798152602001906001900390816105865790505090506118f4815f815181106105b3576105b3612633565b60200260200101906001600160401b031690816001600160401b031681525050611903816001815181106105e9576105e9612633565b60200260200101906001600160401b031690816001600160401b0316815250506119138160028151811061061f5761061f612633565b60200260200101906001600160401b031690816001600160401b0316815250506119238160038151811061065557610655612633565b60200260200101906001600160401b031690816001600160401b0316815250506119338160048151811061068b5761068b612633565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6124798152602001906001900390816106ba579050509050611942815f815181106106e7576106e7612633565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b612479815260200190600190039081610716579050509050611951815f8151811061074357610743612633565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b61247981526020019060019003908161077257905050905061196a815f8151811061079f5761079f612633565b60200260200101906001600160401b031690816001600160401b03168152505087895f815181106107d2576107d2612633565b602002602001018190525086896001815181106107f1576107f1612633565b6020026020010181905250858960028151811061081057610810612633565b6020026020010181905250848960038151811061082f5761082f612633565b6020026020010181905250838960048151811061084e5761084e612633565b6020026020010181905250828960058151811061086d5761086d612633565b6020908102919091010152818961088660056001612620565b8151811061089657610896612633565b602090810291909101015280896108af60056001612620565b6108ba906001612620565b815181106108ca576108ca612633565b602090810291909101015260408051600680825260e082019092525f91816020015b6124798152602001906001900390816108ec57905050905061182d815f8151811061091957610919612633565b60200260200101906001600160401b031690816001600160401b0316815250506118598160018151811061094f5761094f612633565b60200260200101906001600160401b031690816001600160401b0316815250506118688160028151811061098557610985612633565b60200260200101906001600160401b031690816001600160401b031681525050611877816003815181106109bb576109bb612633565b60200260200101906001600160401b031690816001600160401b0316815250506119b6816004815181106109f1576109f1612633565b60200260200101906001600160401b031690816001600160401b0316815250506119c681600581518110610a2757610a27612633565b6001600160401b0390921660209283029190910190910152808a610a4d60056001612620565b610a58906001612620565b610a63906001612620565b81518110610a7357610a73612633565b602090810291909101015260408051600780825261010082019092525f91816020015b612479815260200190600190039081610a9657905050905061182d815f81518110610ac357610ac3612633565b60200260200101906001600160401b031690816001600160401b03168152505061185981600181518110610af957610af9612633565b60200260200101906001600160401b031690816001600160401b03168152505061186881600281518110610b2f57610b2f612633565b60200260200101906001600160401b031690816001600160401b03168152505061187781600381518110610b6557610b65612633565b60200260200101906001600160401b031690816001600160401b0316815250506119b681600481518110610b9b57610b9b612633565b60200260200101906001600160401b031690816001600160401b0316815250506119c681600581518110610bd157610bd1612633565b60200260200101906001600160401b031690816001600160401b0316815250506119d681600681518110610c0757610c07612633565b6001600160401b0390921660209283029190910190910152808b610c2d60056001612620565b610c38906001612620565b610c43906002612620565b81518110610c5357610c53612633565b60209081029190910101528a610c70610c6b826119e6565b6119fb565b9c5050505050505050505050505090565b5f6060805f805f610ca187610c94611a8a565b610c9c611aaa565b611aca565b9250925092505f610cb782610220015160200190565b90505f8261022001515182610ccc9190612620565b90505f610cea83836f07fffffe0000000003ff200000000000611bbb565b80925081945050505f80610d0386610240015184611c57565b915091508115610d98575f610d188783611d2e565b90506124795f610d26611d5d565b90505f60028251610d37919061265b565b9050808510610d68576040516303bdd1b160e51b815260048101869052602481018290526044015b60405180910390fd5b6001850160020282015161ffff169250610d818c8c8686565b9e509e509e50505050505050505050505050610dbe565b5050604080515f80825281830190925260208101828152919a5090985096505050505050505b9193909250565b5f805f805f610ded866002810151815160228084019461ffff93909316840101920160200190565b505f988998509650505050505050565b60605f610e0c60056001612620565b610e17906001612620565b610e22906003612620565b6001600160401b03811115610e3957610e396124f1565b604051908082528060200260200182016040528015610e6c57816020015b6060815260200190600190039081610e575790505b50604080516002808252606082019092529192505f9190816020015b612479815260200190600190039081610e88579050509050611d7d815f81518110610eb557610eb5612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d81600181518110610eeb57610eeb612633565b6001600160401b039290921660209283029190910190910152604080516003808252608082019092525f91816020015b612479815260200190600190039081610f1b579050509050611d7d815f81518110610f4857610f48612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d81600181518110610f7e57610f7e612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d81600281518110610fb457610fb4612633565b6001600160401b039290921660209283029190910190910152604080516002808252606082019092525f91816020015b612479815260200190600190039081610fe4579050509050611d7d815f8151811061101157611011612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d8160018151811061104757611047612633565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b612479815260200190600190039081611077579050509050611d7d815f815181106110a4576110a4612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d816001815181106110da576110da612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d8160028151811061111057611110612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d8160038151811061114657611146612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d8160048151811061117c5761117c612633565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b6124798152602001906001900390816111ac579050509050611d7d815f815181106111d9576111d9612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d8160018151811061120f5761120f612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d8160028151811061124557611245612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d8160038151811061127b5761127b612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d816004815181106112b1576112b1612633565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6124798152602001906001900390816112e0579050509050611da6815f8151811061130d5761130d612633565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b61247981526020019060019003908161133c579050509050611da6815f8151811061136957611369612633565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b612479815260200190600190039081611398579050509050611e42815f815181106113c5576113c5612633565b60200260200101906001600160401b031690816001600160401b03168152505087895f815181106113f8576113f8612633565b6020026020010181905250868960018151811061141757611417612633565b6020026020010181905250858960028151811061143657611436612633565b6020026020010181905250848960038151811061145557611455612633565b6020026020010181905250838960048151811061147457611474612633565b6020026020010181905250828960058151811061149357611493612633565b602090810291909101015281896114ac60056001612620565b815181106114bc576114bc612633565b602090810291909101015280896114d560056001612620565b6114e0906001612620565b815181106114f0576114f0612633565b602090810291909101015260408051600680825260e082019092525f91816020015b612479815260200190600190039081611512579050509050611d7d815f8151811061153f5761153f612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d8160018151811061157557611575612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d816002815181106115ab576115ab612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d816003815181106115e1576115e1612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d8160048151811061161757611617612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d8160058151811061164d5761164d612633565b6001600160401b0390921660209283029190910190910152808a61167360056001612620565b61167e906001612620565b611689906001612620565b8151811061169957611699612633565b602090810291909101015260408051600780825261010082019092525f91816020015b6124798152602001906001900390816116bc579050509050611d7d815f815181106116e9576116e9612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d8160018151811061171f5761171f612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d8160028151811061175557611755612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d8160038151811061178b5761178b612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d816004815181106117c1576117c1612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d816005815181106117f7576117f7612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d81600681518110610c0757610c07612633565b5f60608061183b5f80611efa565b92509250925093509350939050565b5f60608061183b5f6001611efa565b5f60608061183b60015f611efa565b5f60608061183b600180611efa565b5f60608061183b60016002611efa565b5f60608061183b60025f611efa565b5f60608061183b60026001611efa565b5f60608061183b60035f611efa565b5f60608061183b60036001611efa565b5f60608061183b60036002611efa565b5f60608061183b600380611efa565b5f60608061183b60036004611efa565b5f60608061183b60045f611efa565b5f60608061183b60046001611efa565b5f60608061183b60046002611efa565b5f60608061183b60046003611efa565b5f60608061183b600480611efa565b5f60608061183b600585611efa565b5f60608061183b61196460056001612620565b85611efa565b5f60608060ff80851690600886901c166119a58261198a60056001612620565b611995906001612620565b61199f9190612620565b82611efa565b945094509450505093509350939050565b5f60608061183b60016003611efa565b5f60608061183b60016004611efa565b5f60608061183b60016005611efa565b6060815f6119f382611f7c565b949350505050565b60605f82516002026001600160401b03811115611a1a57611a1a6124f1565b6040519080825280601f01601f191660200182016040528015611a44576020820181803683370190505b50905061ffff80196020850160208651028101600285015b81831015611a7e57805183518616908516178152602090920191600201611a5c565b50939695505050505050565b60606040518060e0016040528060a681526020016126e860a69139905090565b606060405180608001604052806042815260200161278e60429139905090565b5f80611b596040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020016060815260200160608152602001606081526020015f815260200160608152602001606081525090565b606061ffff600288015116935060ff600388015116925061ffff600588015116600588019750808852602081018801915050611ba587878760405180602001604052805f815250611fea565b915080826101e001819052505093509350939050565b5f808060018187870360208111611bd25780611bd5565b60205b915050875192505b8519600184841a1b16158183101615611bfb57600182019150611bdd565b9681019660208290036008810293841c90931b92611c465760408051602081018590520160408051601f198184030181529082905263e47fe8b760e01b8252610d5f916004016124df565b50869350909150505b935093915050565b600182810180515f928392600560ff93909316602102870192830192909101835b81831015611d1c5760018301516021909301805190935f90819060ff168180611ca1838e61219b565b915091508186165f03611cc3575f809b509b5050505050505050505050611d27565b5f87611cd36001850389166121c6565b016004028b015195505062ffffff9081169350841683039150611d079050575060019750601c1a9550611d27945050505050565b611d10836121c6565b84019350505050611c78565b5f8095509550505050505b9250929050565b6101c08201516002828102820101516101e08401515f9261ffff9092169190611d549083565b95945050505050565b60606040518060800160405280604281526020016126a660429139905090565b5f81515f14611d9f576040516304f8b58160e51b815260040160405180910390fd5b505f919050565b5f8151600103611e03575060208101516001600160e01b038116601b0b60e082901d5f611dd483838361227f565b905061ffff811115611df957604051631e4e01d760e21b815260040160405180910390fd5b9250611e3d915050565b81515f03611e2457604051630f16066b60e41b815260040160405180910390fd5b604051630358cd2160e31b815260040160405180910390fd5b919050565b5f8151600203611ed757602082015160408301516001600160e01b038216601b0b60e083901d5f611e7483838361227f565b6001600160e01b038516601b0b935060e085901d925090505f611e9884848361227f565b905060ff821180611ea9575060ff81115b15611ec757604051631e4e01d760e21b815260040160405180910390fd5b60081b179450611e3d9350505050565b600282511015611e2457604051630f16066b60e41b815260040160405180910390fd5b5f60608060ff851180611f0d575060ff84115b15611f3557604051639b0f326160e01b81526004810186905260248101859052604401610d5f565b6040805160248101909152600386602383015385602283015360106021830153806020830153506004815260408051602081019091525f8152600197919650945092505050565b60605f611f88836122c1565b90505f611f9682602061267a565b9050606060405190508160200181016040528281526020850160208651028101602083015b81831015611fde57602083515102806020855101835e6020939093019201611fbb565b50919695505050505050565b6120776040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020016060815260200160608152602001606081526020015f815260200160608152602001606081525090565b5f6040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f801b81526020015f8152602001600481526020015f81526020015f81526020015f81526020015f801b815260200184815260200185815260200160046001600160401b038111156120fc576120fc6124f1565b604051908082528060200260200182016040528015612125578160200160208202803683370190505b5081525f602080830182905260408084018b905260609384018a90528051601f01601f19168281528083018252835161ffff191681178452855290840182905283018190529082018190526080820181905260a08201819052610120820181905261014082018190526102008201529050611d54565b5f80825f528360205360215f2090506001815f1a1b915062ffffff8116611d27575060019250929050565b5f5f1982036121d85750610100919050565b507f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f7f5555555555555555555555555555555555555555555555555555555555555555600183901c16909103600281901c7f3333333333333333333333333333333333333333333333333333333333333333908116911601600481901c01167f01010101010101010101010101010101010101010101010101010101010101010260f81c90565b5f805f61228d86868661230a565b91509150806122b85760405162bc8ecf60e31b81526004810187905260248101869052604401610d5f565b50949350505050565b5f60208201602083510281015b808210156123035781515192830192808410156122f757634e487b715f5260116020526024601cfd5b506020820191506122ce565b5050919050565b5f805f85121561233757604051634a7d166b60e01b81526004810186905260248101859052604401610d5f565b845f0361234957505f90506001611c4f565b8460ff84168501858112156123845760405163c849483b60e01b8152600481018890526024810187905260ff86166044820152606401610d5f565b5f805f8312156123d057604c198312156123a7575f809550955050505050611c4f565b825f03600a0a91508184816123be576123be612647565b0495505084029091149150611c4f9050565b5f83131561246957604d83131561240d5760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610d5f565b82600a0a9150815f198161242357612423612647565b048411156124575760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610d5f565b5091909102925060019150611c4f9050565b8360019550955050505050611c4f565b612481612691565b565b5f60208284031215612493575f80fd5b81356001600160e01b0319811681146124aa575f80fd5b9392505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6124aa60208301846124b1565b634e487b7160e01b5f52604160045260245ffd5b5f60208284031215612515575f80fd5b81356001600160401b038082111561252b575f80fd5b818401915084601f83011261253e575f80fd5b813581811115612550576125506124f1565b604051601f8201601f19908116603f01168101908382118183101715612578576125786124f1565b81604052828152876020848701011115612590575f80fd5b826020860160208301375f928101602001929092525095945050505050565b83151581525f6020606060208401526125cb60608401866124b1565b8381036040850152845180825260208087019201905f5b818110156125fe578351835292840192918401916001016125e2565b509098975050505050505050565b634e487b7160e01b5f52601160045260245ffd5b808201808211156101d1576101d161260c565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601260045260245ffd5b5f8261267557634e487b7160e01b5f52601260045260245ffd5b500490565b80820281158282048414176101d1576101d161260c565b634e487b7160e01b5f52605160045260245ffdfe182d184a1859186818771887189618a618b518c518d518e418f4190319131923193319421951196a182d18591868187719b619c6182d18591868187719b619c619d60101180010800082000100010480300038412a001810000010020004200005002038038ff54900cc66c620f3dcab0616592212c9ec8109895f0b17fec9301c02e0920c5bfe561e21609201e959460b1974270f844db208bcd3bf1f989376111049db14b934301b0ae9a00af82a7805c138f40d28083f0742ef2104d561fd1515a13318716a611ad260cc107b9bfc0eec7ade16cba2891d6b14a513792bdb02e0f147195655891d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1da61da61e421d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d"; /// @dev What MUST already be on a network before this release can be /// broadcast there: an address, and the runtime code that belongs at it. diff --git a/src/lib/LibRaindex.sol b/src/lib/LibRaindex.sol index c50d57ae92..92eb400b58 100644 --- a/src/lib/LibRaindex.sol +++ b/src/lib/LibRaindex.sol @@ -23,10 +23,10 @@ uint256 constant CALLING_CONTEXT_COLUMNS = 4; uint256 constant CONTEXT_COLUMNS = CALLING_CONTEXT_COLUMNS + 1; -/// @dev Total number of context columns including extensions: base columns -/// plus 3 for signers, signer domains and signed context start, 1 for deposit, -/// 1 for withdraw. -uint256 constant CONTEXT_COLUMNS_EXTENDED = CONTEXT_COLUMNS + 3 + 1 + 1; +/// @dev Total number of context columns including extensions: everything up +/// to the signed context start column, then signed context start, deposit and +/// withdraw. +uint256 constant CONTEXT_COLUMNS_EXTENDED = CONTEXT_SIGNED_CONTEXT_START_COLUMN + 3; /// @dev Contextual data available to both calculate order and handle IO. The /// order hash, order owner and order counterparty. IMPORTANT NOTE that the From d5f29113aaf049acbc25ed22d79d9593bd5c2906 Mon Sep 17 00:00:00 2001 From: David Meister Date: Mon, 26 Oct 2026 15:06:13 +0000 Subject: [PATCH 06/15] Subgraph: index TakeOrderV4 (SignedContextV2); regen bindings and test_fixtures ABIs for IRaindexV7 Co-Authored-By: Claude Opus 5.5 --- crates/bindings/abis/IRaindexV7.json | 104 ++- crates/bindings/abis/RaindexV6.json | 104 ++- crates/test_fixtures/abis/RaindexV6.json | 108 ++- .../abis/RaindexV6SubParser.json | 2 +- subgraph/generated/Raindex/Raindex.ts | 694 ++++++++++-------- subgraph/src/handlers.ts | 4 +- subgraph/src/takeorder.ts | 8 +- subgraph/subgraph.yaml | 2 +- subgraph/tests/event-mocks.test.ts | 15 +- 9 files changed, 625 insertions(+), 416 deletions(-) diff --git a/crates/bindings/abis/IRaindexV7.json b/crates/bindings/abis/IRaindexV7.json index c46c99838b..38cc12cb5d 100644 --- a/crates/bindings/abis/IRaindexV7.json +++ b/crates/bindings/abis/IRaindexV7.json @@ -2,7 +2,7 @@ "abi": [ { "type": "function", - "name": "addOrder4", + "name": "addOrder5", "inputs": [ { "name": "config", @@ -85,7 +85,7 @@ { "name": "tasks", "type": "tuple[]", - "internalType": "struct TaskV2[]", + "internalType": "struct TaskV3[]", "components": [ { "name": "evaluable", @@ -112,13 +112,18 @@ { "name": "signedContext", "type": "tuple[]", - "internalType": "struct SignedContextV1[]", + "internalType": "struct SignedContextV2[]", "components": [ { "name": "signer", "type": "address", "internalType": "address" }, + { + "name": "domainSeparator", + "type": "bytes32", + "internalType": "bytes32" + }, { "name": "context", "type": "bytes32[]", @@ -333,13 +338,18 @@ { "name": "aliceSignedContext", "type": "tuple[]", - "internalType": "struct SignedContextV1[]", + "internalType": "struct SignedContextV2[]", "components": [ { "name": "signer", "type": "address", "internalType": "address" }, + { + "name": "domainSeparator", + "type": "bytes32", + "internalType": "bytes32" + }, { "name": "context", "type": "bytes32[]", @@ -355,13 +365,18 @@ { "name": "bobSignedContext", "type": "tuple[]", - "internalType": "struct SignedContextV1[]", + "internalType": "struct SignedContextV2[]", "components": [ { "name": "signer", "type": "address", "internalType": "address" }, + { + "name": "domainSeparator", + "type": "bytes32", + "internalType": "bytes32" + }, { "name": "context", "type": "bytes32[]", @@ -380,7 +395,7 @@ }, { "type": "function", - "name": "deposit4", + "name": "deposit5", "inputs": [ { "name": "token", @@ -400,7 +415,7 @@ { "name": "tasks", "type": "tuple[]", - "internalType": "struct TaskV2[]", + "internalType": "struct TaskV3[]", "components": [ { "name": "evaluable", @@ -427,13 +442,18 @@ { "name": "signedContext", "type": "tuple[]", - "internalType": "struct SignedContextV1[]", + "internalType": "struct SignedContextV2[]", "components": [ { "name": "signer", "type": "address", "internalType": "address" }, + { + "name": "domainSeparator", + "type": "bytes32", + "internalType": "bytes32" + }, { "name": "context", "type": "bytes32[]", @@ -454,12 +474,12 @@ }, { "type": "function", - "name": "entask2", + "name": "entask3", "inputs": [ { "name": "tasks", "type": "tuple[]", - "internalType": "struct TaskV2[]", + "internalType": "struct TaskV3[]", "components": [ { "name": "evaluable", @@ -486,13 +506,18 @@ { "name": "signedContext", "type": "tuple[]", - "internalType": "struct SignedContextV1[]", + "internalType": "struct SignedContextV2[]", "components": [ { "name": "signer", "type": "address", "internalType": "address" }, + { + "name": "domainSeparator", + "type": "bytes32", + "internalType": "bytes32" + }, { "name": "context", "type": "bytes32[]", @@ -609,12 +634,12 @@ }, { "type": "function", - "name": "quote2", + "name": "quote3", "inputs": [ { "name": "quoteConfig", "type": "tuple", - "internalType": "struct QuoteV2", + "internalType": "struct QuoteV3", "components": [ { "name": "order", @@ -702,13 +727,18 @@ { "name": "signedContext", "type": "tuple[]", - "internalType": "struct SignedContextV1[]", + "internalType": "struct SignedContextV2[]", "components": [ { "name": "signer", "type": "address", "internalType": "address" }, + { + "name": "domainSeparator", + "type": "bytes32", + "internalType": "bytes32" + }, { "name": "context", "type": "bytes32[]", @@ -745,7 +775,7 @@ }, { "type": "function", - "name": "removeOrder3", + "name": "removeOrder4", "inputs": [ { "name": "order", @@ -823,7 +853,7 @@ { "name": "tasks", "type": "tuple[]", - "internalType": "struct TaskV2[]", + "internalType": "struct TaskV3[]", "components": [ { "name": "evaluable", @@ -850,13 +880,18 @@ { "name": "signedContext", "type": "tuple[]", - "internalType": "struct SignedContextV1[]", + "internalType": "struct SignedContextV2[]", "components": [ { "name": "signer", "type": "address", "internalType": "address" }, + { + "name": "domainSeparator", + "type": "bytes32", + "internalType": "bytes32" + }, { "name": "context", "type": "bytes32[]", @@ -883,12 +918,12 @@ }, { "type": "function", - "name": "takeOrders4", + "name": "takeOrders5", "inputs": [ { "name": "config", "type": "tuple", - "internalType": "struct TakeOrdersConfigV5", + "internalType": "struct TakeOrdersConfigV6", "components": [ { "name": "minimumIO", @@ -913,7 +948,7 @@ { "name": "orders", "type": "tuple[]", - "internalType": "struct TakeOrderConfigV4[]", + "internalType": "struct TakeOrderConfigV5[]", "components": [ { "name": "order", @@ -1001,13 +1036,18 @@ { "name": "signedContext", "type": "tuple[]", - "internalType": "struct SignedContextV1[]", + "internalType": "struct SignedContextV2[]", "components": [ { "name": "signer", "type": "address", "internalType": "address" }, + { + "name": "domainSeparator", + "type": "bytes32", + "internalType": "bytes32" + }, { "name": "context", "type": "bytes32[]", @@ -1075,7 +1115,7 @@ }, { "type": "function", - "name": "withdraw4", + "name": "withdraw5", "inputs": [ { "name": "token", @@ -1095,7 +1135,7 @@ { "name": "tasks", "type": "tuple[]", - "internalType": "struct TaskV2[]", + "internalType": "struct TaskV3[]", "components": [ { "name": "evaluable", @@ -1122,13 +1162,18 @@ { "name": "signedContext", "type": "tuple[]", - "internalType": "struct SignedContextV1[]", + "internalType": "struct SignedContextV2[]", "components": [ { "name": "signer", "type": "address", "internalType": "address" }, + { + "name": "domainSeparator", + "type": "bytes32", + "internalType": "bytes32" + }, { "name": "context", "type": "bytes32[]", @@ -1700,7 +1745,7 @@ }, { "type": "event", - "name": "TakeOrderV3", + "name": "TakeOrderV4", "inputs": [ { "name": "sender", @@ -1712,7 +1757,7 @@ "name": "config", "type": "tuple", "indexed": false, - "internalType": "struct TakeOrderConfigV4", + "internalType": "struct TakeOrderConfigV5", "components": [ { "name": "order", @@ -1800,13 +1845,18 @@ { "name": "signedContext", "type": "tuple[]", - "internalType": "struct SignedContextV1[]", + "internalType": "struct SignedContextV2[]", "components": [ { "name": "signer", "type": "address", "internalType": "address" }, + { + "name": "domainSeparator", + "type": "bytes32", + "internalType": "bytes32" + }, { "name": "context", "type": "bytes32[]", diff --git a/crates/bindings/abis/RaindexV6.json b/crates/bindings/abis/RaindexV6.json index 0ac5c40e4f..e49e08fb9f 100644 --- a/crates/bindings/abis/RaindexV6.json +++ b/crates/bindings/abis/RaindexV6.json @@ -2,7 +2,7 @@ "abi": [ { "type": "function", - "name": "addOrder4", + "name": "addOrder5", "inputs": [ { "name": "orderConfig", @@ -85,7 +85,7 @@ { "name": "post", "type": "tuple[]", - "internalType": "struct TaskV2[]", + "internalType": "struct TaskV3[]", "components": [ { "name": "evaluable", @@ -112,13 +112,18 @@ { "name": "signedContext", "type": "tuple[]", - "internalType": "struct SignedContextV1[]", + "internalType": "struct SignedContextV2[]", "components": [ { "name": "signer", "type": "address", "internalType": "address" }, + { + "name": "domainSeparator", + "type": "bytes32", + "internalType": "bytes32" + }, { "name": "context", "type": "bytes32[]", @@ -333,13 +338,18 @@ { "name": "aliceSignedContext", "type": "tuple[]", - "internalType": "struct SignedContextV1[]", + "internalType": "struct SignedContextV2[]", "components": [ { "name": "signer", "type": "address", "internalType": "address" }, + { + "name": "domainSeparator", + "type": "bytes32", + "internalType": "bytes32" + }, { "name": "context", "type": "bytes32[]", @@ -355,13 +365,18 @@ { "name": "bobSignedContext", "type": "tuple[]", - "internalType": "struct SignedContextV1[]", + "internalType": "struct SignedContextV2[]", "components": [ { "name": "signer", "type": "address", "internalType": "address" }, + { + "name": "domainSeparator", + "type": "bytes32", + "internalType": "bytes32" + }, { "name": "context", "type": "bytes32[]", @@ -380,7 +395,7 @@ }, { "type": "function", - "name": "deposit4", + "name": "deposit5", "inputs": [ { "name": "token", @@ -400,7 +415,7 @@ { "name": "post", "type": "tuple[]", - "internalType": "struct TaskV2[]", + "internalType": "struct TaskV3[]", "components": [ { "name": "evaluable", @@ -427,13 +442,18 @@ { "name": "signedContext", "type": "tuple[]", - "internalType": "struct SignedContextV1[]", + "internalType": "struct SignedContextV2[]", "components": [ { "name": "signer", "type": "address", "internalType": "address" }, + { + "name": "domainSeparator", + "type": "bytes32", + "internalType": "bytes32" + }, { "name": "context", "type": "bytes32[]", @@ -454,12 +474,12 @@ }, { "type": "function", - "name": "entask2", + "name": "entask3", "inputs": [ { "name": "post", "type": "tuple[]", - "internalType": "struct TaskV2[]", + "internalType": "struct TaskV3[]", "components": [ { "name": "evaluable", @@ -486,13 +506,18 @@ { "name": "signedContext", "type": "tuple[]", - "internalType": "struct SignedContextV1[]", + "internalType": "struct SignedContextV2[]", "components": [ { "name": "signer", "type": "address", "internalType": "address" }, + { + "name": "domainSeparator", + "type": "bytes32", + "internalType": "bytes32" + }, { "name": "context", "type": "bytes32[]", @@ -628,12 +653,12 @@ }, { "type": "function", - "name": "quote2", + "name": "quote3", "inputs": [ { "name": "quoteConfig", "type": "tuple", - "internalType": "struct QuoteV2", + "internalType": "struct QuoteV3", "components": [ { "name": "order", @@ -721,13 +746,18 @@ { "name": "signedContext", "type": "tuple[]", - "internalType": "struct SignedContextV1[]", + "internalType": "struct SignedContextV2[]", "components": [ { "name": "signer", "type": "address", "internalType": "address" }, + { + "name": "domainSeparator", + "type": "bytes32", + "internalType": "bytes32" + }, { "name": "context", "type": "bytes32[]", @@ -764,7 +794,7 @@ }, { "type": "function", - "name": "removeOrder3", + "name": "removeOrder4", "inputs": [ { "name": "order", @@ -842,7 +872,7 @@ { "name": "post", "type": "tuple[]", - "internalType": "struct TaskV2[]", + "internalType": "struct TaskV3[]", "components": [ { "name": "evaluable", @@ -869,13 +899,18 @@ { "name": "signedContext", "type": "tuple[]", - "internalType": "struct SignedContextV1[]", + "internalType": "struct SignedContextV2[]", "components": [ { "name": "signer", "type": "address", "internalType": "address" }, + { + "name": "domainSeparator", + "type": "bytes32", + "internalType": "bytes32" + }, { "name": "context", "type": "bytes32[]", @@ -921,12 +956,12 @@ }, { "type": "function", - "name": "takeOrders4", + "name": "takeOrders5", "inputs": [ { "name": "config", "type": "tuple", - "internalType": "struct TakeOrdersConfigV5", + "internalType": "struct TakeOrdersConfigV6", "components": [ { "name": "minimumIO", @@ -951,7 +986,7 @@ { "name": "orders", "type": "tuple[]", - "internalType": "struct TakeOrderConfigV4[]", + "internalType": "struct TakeOrderConfigV5[]", "components": [ { "name": "order", @@ -1039,13 +1074,18 @@ { "name": "signedContext", "type": "tuple[]", - "internalType": "struct SignedContextV1[]", + "internalType": "struct SignedContextV2[]", "components": [ { "name": "signer", "type": "address", "internalType": "address" }, + { + "name": "domainSeparator", + "type": "bytes32", + "internalType": "bytes32" + }, { "name": "context", "type": "bytes32[]", @@ -1113,7 +1153,7 @@ }, { "type": "function", - "name": "withdraw4", + "name": "withdraw5", "inputs": [ { "name": "token", @@ -1133,7 +1173,7 @@ { "name": "post", "type": "tuple[]", - "internalType": "struct TaskV2[]", + "internalType": "struct TaskV3[]", "components": [ { "name": "evaluable", @@ -1160,13 +1200,18 @@ { "name": "signedContext", "type": "tuple[]", - "internalType": "struct SignedContextV1[]", + "internalType": "struct SignedContextV2[]", "components": [ { "name": "signer", "type": "address", "internalType": "address" }, + { + "name": "domainSeparator", + "type": "bytes32", + "internalType": "bytes32" + }, { "name": "context", "type": "bytes32[]", @@ -1763,7 +1808,7 @@ }, { "type": "event", - "name": "TakeOrderV3", + "name": "TakeOrderV4", "inputs": [ { "name": "sender", @@ -1775,7 +1820,7 @@ "name": "config", "type": "tuple", "indexed": false, - "internalType": "struct TakeOrderConfigV4", + "internalType": "struct TakeOrderConfigV5", "components": [ { "name": "order", @@ -1863,13 +1908,18 @@ { "name": "signedContext", "type": "tuple[]", - "internalType": "struct SignedContextV1[]", + "internalType": "struct SignedContextV2[]", "components": [ { "name": "signer", "type": "address", "internalType": "address" }, + { + "name": "domainSeparator", + "type": "bytes32", + "internalType": "bytes32" + }, { "name": "context", "type": "bytes32[]", diff --git a/crates/test_fixtures/abis/RaindexV6.json b/crates/test_fixtures/abis/RaindexV6.json index db6e17cf14..dcce448cbf 100644 --- a/crates/test_fixtures/abis/RaindexV6.json +++ b/crates/test_fixtures/abis/RaindexV6.json @@ -2,7 +2,7 @@ "abi": [ { "type": "function", - "name": "addOrder4", + "name": "addOrder5", "inputs": [ { "name": "orderConfig", @@ -85,7 +85,7 @@ { "name": "post", "type": "tuple[]", - "internalType": "struct TaskV2[]", + "internalType": "struct TaskV3[]", "components": [ { "name": "evaluable", @@ -112,13 +112,18 @@ { "name": "signedContext", "type": "tuple[]", - "internalType": "struct SignedContextV1[]", + "internalType": "struct SignedContextV2[]", "components": [ { "name": "signer", "type": "address", "internalType": "address" }, + { + "name": "domainSeparator", + "type": "bytes32", + "internalType": "bytes32" + }, { "name": "context", "type": "bytes32[]", @@ -145,7 +150,7 @@ }, { "type": "function", - "name": "clear3", + "name": "clear4", "inputs": [ { "name": "aliceOrder", @@ -333,13 +338,18 @@ { "name": "aliceSignedContext", "type": "tuple[]", - "internalType": "struct SignedContextV1[]", + "internalType": "struct SignedContextV2[]", "components": [ { "name": "signer", "type": "address", "internalType": "address" }, + { + "name": "domainSeparator", + "type": "bytes32", + "internalType": "bytes32" + }, { "name": "context", "type": "bytes32[]", @@ -355,13 +365,18 @@ { "name": "bobSignedContext", "type": "tuple[]", - "internalType": "struct SignedContextV1[]", + "internalType": "struct SignedContextV2[]", "components": [ { "name": "signer", "type": "address", "internalType": "address" }, + { + "name": "domainSeparator", + "type": "bytes32", + "internalType": "bytes32" + }, { "name": "context", "type": "bytes32[]", @@ -380,7 +395,7 @@ }, { "type": "function", - "name": "deposit4", + "name": "deposit5", "inputs": [ { "name": "token", @@ -400,7 +415,7 @@ { "name": "post", "type": "tuple[]", - "internalType": "struct TaskV2[]", + "internalType": "struct TaskV3[]", "components": [ { "name": "evaluable", @@ -427,13 +442,18 @@ { "name": "signedContext", "type": "tuple[]", - "internalType": "struct SignedContextV1[]", + "internalType": "struct SignedContextV2[]", "components": [ { "name": "signer", "type": "address", "internalType": "address" }, + { + "name": "domainSeparator", + "type": "bytes32", + "internalType": "bytes32" + }, { "name": "context", "type": "bytes32[]", @@ -454,12 +474,12 @@ }, { "type": "function", - "name": "entask2", + "name": "entask3", "inputs": [ { "name": "post", "type": "tuple[]", - "internalType": "struct TaskV2[]", + "internalType": "struct TaskV3[]", "components": [ { "name": "evaluable", @@ -486,13 +506,18 @@ { "name": "signedContext", "type": "tuple[]", - "internalType": "struct SignedContextV1[]", + "internalType": "struct SignedContextV2[]", "components": [ { "name": "signer", "type": "address", "internalType": "address" }, + { + "name": "domainSeparator", + "type": "bytes32", + "internalType": "bytes32" + }, { "name": "context", "type": "bytes32[]", @@ -628,12 +653,12 @@ }, { "type": "function", - "name": "quote2", + "name": "quote3", "inputs": [ { "name": "quoteConfig", "type": "tuple", - "internalType": "struct QuoteV2", + "internalType": "struct QuoteV3", "components": [ { "name": "order", @@ -721,13 +746,18 @@ { "name": "signedContext", "type": "tuple[]", - "internalType": "struct SignedContextV1[]", + "internalType": "struct SignedContextV2[]", "components": [ { "name": "signer", "type": "address", "internalType": "address" }, + { + "name": "domainSeparator", + "type": "bytes32", + "internalType": "bytes32" + }, { "name": "context", "type": "bytes32[]", @@ -764,7 +794,7 @@ }, { "type": "function", - "name": "removeOrder3", + "name": "removeOrder4", "inputs": [ { "name": "order", @@ -842,7 +872,7 @@ { "name": "post", "type": "tuple[]", - "internalType": "struct TaskV2[]", + "internalType": "struct TaskV3[]", "components": [ { "name": "evaluable", @@ -869,13 +899,18 @@ { "name": "signedContext", "type": "tuple[]", - "internalType": "struct SignedContextV1[]", + "internalType": "struct SignedContextV2[]", "components": [ { "name": "signer", "type": "address", "internalType": "address" }, + { + "name": "domainSeparator", + "type": "bytes32", + "internalType": "bytes32" + }, { "name": "context", "type": "bytes32[]", @@ -921,12 +956,12 @@ }, { "type": "function", - "name": "takeOrders4", + "name": "takeOrders5", "inputs": [ { "name": "config", "type": "tuple", - "internalType": "struct TakeOrdersConfigV5", + "internalType": "struct TakeOrdersConfigV6", "components": [ { "name": "minimumIO", @@ -951,7 +986,7 @@ { "name": "orders", "type": "tuple[]", - "internalType": "struct TakeOrderConfigV4[]", + "internalType": "struct TakeOrderConfigV5[]", "components": [ { "name": "order", @@ -1039,13 +1074,18 @@ { "name": "signedContext", "type": "tuple[]", - "internalType": "struct SignedContextV1[]", + "internalType": "struct SignedContextV2[]", "components": [ { "name": "signer", "type": "address", "internalType": "address" }, + { + "name": "domainSeparator", + "type": "bytes32", + "internalType": "bytes32" + }, { "name": "context", "type": "bytes32[]", @@ -1113,7 +1153,7 @@ }, { "type": "function", - "name": "withdraw4", + "name": "withdraw5", "inputs": [ { "name": "token", @@ -1133,7 +1173,7 @@ { "name": "post", "type": "tuple[]", - "internalType": "struct TaskV2[]", + "internalType": "struct TaskV3[]", "components": [ { "name": "evaluable", @@ -1160,13 +1200,18 @@ { "name": "signedContext", "type": "tuple[]", - "internalType": "struct SignedContextV1[]", + "internalType": "struct SignedContextV2[]", "components": [ { "name": "signer", "type": "address", "internalType": "address" }, + { + "name": "domainSeparator", + "type": "bytes32", + "internalType": "bytes32" + }, { "name": "context", "type": "bytes32[]", @@ -1763,7 +1808,7 @@ }, { "type": "event", - "name": "TakeOrderV3", + "name": "TakeOrderV4", "inputs": [ { "name": "sender", @@ -1775,7 +1820,7 @@ "name": "config", "type": "tuple", "indexed": false, - "internalType": "struct TakeOrderConfigV4", + "internalType": "struct TakeOrderConfigV5", "components": [ { "name": "order", @@ -1863,13 +1908,18 @@ { "name": "signedContext", "type": "tuple[]", - "internalType": "struct SignedContextV1[]", + "internalType": "struct SignedContextV2[]", "components": [ { "name": "signer", "type": "address", "internalType": "address" }, + { + "name": "domainSeparator", + "type": "bytes32", + "internalType": "bytes32" + }, { "name": "context", "type": "bytes32[]", @@ -2362,7 +2412,7 @@ } ], "bytecode": { - "object": "0x6080806040523460395760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055615180908161003e8239f35b5f80fdfe6080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a7146117cf575080631f69cb75146115725780632cb77e9f146115465780632fbc4ba0146113fc57806341d1514f146113c55780635cffe9de1461126957806360746119146110e5578063613255ab1461106257806369c7285614610771578063709fb8a5146104375780639235084d146103e3578063ac9650d814610295578063d7e442ec14610237578063d9d98ce4146101865763fa501182146100c1575f80fd5b34610182576101403660031901126101825767ffffffffffffffff600435818111610182576100f4903690600401611b64565b6024358281116101825761010c903690600401611b64565b60c0366043190112610182576101043583811161018257610131903690600401611d0a565b90610124359384116101825761014e61015c943690600401611d0a565b926101576126ea565b612230565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b5f80fd5b34610182576040366003190112610182576001600160a01b036101a7611853565b166040516370a0823160e01b8152306004820152602081602481855afa90811561022c575f916101fa575b50156101e25760206040515f8152f35b60249060405190633c5bf76960e21b82526004820152fd5b90506020813d602011610224575b81610215602093836119d3565b810103126101825751826101d2565b3d9150610208565b6040513d5f823e3d90fd5b346101825760203660031901126101825760043567ffffffffffffffff81116101825761028f61026e61015c923690600401611822565b91906102786126ea565b60405192610285846119b7565b5f84523691611dde565b90612b82565b34610182576020806003193601126101825760043567ffffffffffffffff8111610182576102c7903690600401611822565b9190604051926102d6846119b7565b5f84528284016102e582611ab7565b946102f360405196876119d3565b8286526102ff83611ab7565b9361031186880195601f190186612214565b5f5b84811061037557604080518881528951818a018190525f92600582901b83018101918a918c9085015b8287106103495785850386f35b909192938280610365600193603f198a820301865288516118df565b960192019601959291909261033c565b806103c4886103be61039160019560059d9c9d1b8701876120f4565b929089846040519586938585013782018381015f81528b519283915e015f838201520380845201826119d3565b306139f0565b6103ce828a611fda565b526103d98189611fda565b5001969596610313565b3461018257600319602036820112610182576004359067ffffffffffffffff82116101825760809082360301126101825761042260609160040161213c565b90604051921515835260208301526040820152f35b34610182576003196040368201126101825760043567ffffffffffffffff8082116101825760c0826004019383360301126101825760243590811161018257610484903690600401611822565b9061048d6126ea565b6104be6104b96104b46104ad6104a38880612127565b60408101906120f4565b36916119f5565b613986565b6139db565b801561075f576001101561074d57602483016104da8186611f47565b90501561073b5760448401946104f08682611f47565b9050156107295761055661051e9661054a61051561050e8580612127565b9585611f47565b99909285611f47565b91909261053b6040519761053189611903565b3389523690611a59565b9a60209b8c8901523691611acf565b60408601523691611acf565b60608301526064850135608083015261056e8261272c565b91825f525f875260405f209586541596876105b2575b888860017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055604051908152f35b6001905560a46001600160a01b03917f87491344dfbcf91f6cbbc610cbbeedc85313d37a02df0c93527f7ea5f8db717f83855116604051908152878c82015260606040820152806106066060820188612042565b0390a1019161061583856120f4565b9050610679575b5050505061066d929161066561064e61028f933390919060405192600284526020840152604083015260608201604052565b906040519160018352602083015260408201604052565b923691611dde565b82808080808080610584565b6106866104ad84866120f4565b61068f81614777565b156107025750937fd46c2c56b35c8210e9e712ec3f02242d5fc90187c0ac8ed80cc33626846ec3698961066d9897956106f56106d86106659761064e9761028f9b5116936120f4565b866040519586958652850152606060408501526060840191611d39565b0390a1938395965061061c565b89610725604051928392630c89984b60e31b8452600484015260248301906118df565b0390fd5b60405163540e5f0b60e01b8152600490fd5b604051636c44ef8f60e01b8152600490fd5b604051633c8270bd60e21b8152600490fd5b604051632cff108b60e21b8152600490fd5b34610182576003196020368201126101825767ffffffffffffffff600435116101825760c09060043536030112610182576107aa6126ea565b5f80806107bf60048035608481019101611e90565b9050156110505760246004350135926107d784612791565b1561103e576060806040516107eb8161196b565b6107f3611ee5565b81525f60208201525f6040820152015261080b611ee5565b5061086b61086661084561083b61083561082f608460043501600435600401611e90565b90611f17565b80611f32565b6040810190611f47565b602061085e61082f608460043501600435600401611e90565b013591611f7d565b611d25565b936001600160a01b036108ba6108666108a161089761083561082f608460043501600435600401611e90565b6060810190611f47565b604061085e61082f608460043501600435600401611e90565b81604051976108c889611933565b16875216602086015260408501526108ea608460043501600435600401611e90565b9490506001604051955f87520160051b85016040525f905f5b610917608460043501600435600401611e90565b905081108061102b575b15610e785761093a608460043501600435600401611e90565b821015610e64578160051b810135607e1982360301811215610182576080818301360312610182576040519161096f8361196b565b8181013567ffffffffffffffff81116101825761099190369084840101611b64565b835280820160208181013590850152604080820135908501526060013567ffffffffffffffff8111610182576109ca9236920101611d0a565b606082015280516001600160a01b036109ec6040830151602085015190611fda565b5151166001600160a01b0385511614801590610e30575b610e1e57610a1b6020830151604084015190836130d2565b610a248161272c565b91825f525f60205260405f2054155f14610a88575051604080513381526001600160a01b039092166020830152810191909152600191907fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f390606090a15b01610903565b9190610ab9602084979597015160408501519060608601519060405192610aae846119b7565b5f8452339186613107565b925f93610ad1606082015160446004350135906127b4565b15610b3857505051604080513381526001600160a01b03909216602083015281019190915260019291907fe3151dc8cb7a54ffc4baabd28c1f241c94d510b5e5b502491ac3cad6c16316d590606090a15b8115610b30575b5092610a82565b905088610b29565b610b456040820151612791565b158015610e0b575b15610ba257505051604080513381526001600160a01b03909216602083015281019190915260019291907f500b713857325f9e6dcb52ae832eca9109d107ed1aae9cb4928b4c1e13f051aa90606090a1610b22565b9250925050600196959691610bbb606460043501611fee565b15610d785796610c2b97610c3b60408401516040880151610bdc8183613460565b15610d705750925b610c35848592610c1e610c1860608a01516001600160e01b03601b918660e01d92828816810b928260e01d9216900b613e30565b90613feb565b9d8e9260408d015161352b565b60408c0152613555565b99613555565b98610c46848461357f565b610c5084826135dd565b60405192338452608060208501526060610c768451608080880152610100870190612042565b93602081015160a0870152604081015160c0870152015192607f198582030160e0860152835180825260208201906020808260051b8501019601925f5b828110610d1257505050505092806001979695937f194f1feb3b4d7076a2c272e774e792e0c48bb8c7aa1a9a3671c1cd6da9e6b4c193610d0d96604084015260608301520390a180858c5101808d5260051b8c01526136ef565b610b22565b9091929396602080610d63600193601f198782030189528b51906001600160a01b0382511681526040610d528584015160608785015260608401906120c1565b9201519060408184039101526118df565b9901950193929101610cb3565b905092610be4565b610c2b90610c3b6060840151610c35610db6610c1860408801516001600160e01b0394601b90868360e01d9316820b91878260e01d9216900b613e30565b60408a0151610dc58183613460565b15610e035750915b829c8d916060890151908116155f14610df4575060408801515b96879460408d015161352b565b610dfe9085613487565b610de7565b905091610dcd565b50610e19606082015161343d565b610b4d565b60405163936bb5ad60e01b8152600490fd5b506001600160a01b03610e4c6060830151604085015190611fda565b5151166001600160a01b036020860151161415610a03565b634e487b7160e01b5f52603260045260245ffd5b50919390610e8a606460043501611fee565b1561102557835b6004356004013590610ea38282613460565b6110075750508490610ec3856001600160a01b0360208701511633613069565b505060a46004350190610edb826004356004016120f4565b905015159081610fff575b50610f5e575b506001600160a01b03610f0292935116336127db565b50505b8351811015610f2a5780610f24610f1e60019387611fda565b516138c8565b01610f05565b5060409160017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005582519182526020820152f35b90506001600160a01b03602084015116610f886001600160a01b03855116926004356004016120f4565b929091333b1561018257610fd05f93604051958694859463691f9ed760e01b8652600486015260248501528960448501528a606485015260a0608485015260a4840191611d39565b038183335af190811561022c57859115610eec579050610ff09150611987565b5f836001600160a01b03610eec565b905088610ee6565b604492506040519163573b6f4160e01b835260048301526024820152fd5b84610e91565b506110396040830151612791565b610921565b60405163315f9e2360e21b8152600490fd5b604051639c95219f60e01b8152600490fd5b3461018257602080600319360112610182576024816001600160a01b03611087611853565b16604051928380926370a0823160e01b82523060048301525afa90811561022c575f916110b8575b50604051908152f35b90508181813d83116110de575b6110cf81836119d3565b810103126101825751826110af565b503d6110c5565b34610182576110f336611893565b92916111009491946126ea565b61110b83833361275d565b61111481612791565b15611238578160ff9161112c856111ef969533612d9c565b6111368183613460565b15611232575080935b61114b8582853361300b565b917f8045c25080b0868951141ed0a91720bcad09a8364a2b3109ee1fd49c1f0bc8b860c061117a898833613069565b97906001600160a01b0360405192338452169a8b6020840152856040840152886060840152608083015260a0820152a16040519660068852602088015260408701526060860152608085015260a08401521660c082015260e08101604052906040519160018352602083015260408201604052565b908061121b5760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b61122a9261028f913691611dde565b80808061015c565b9361113f565b50604051623a3a4d60e21b81523360048201526001600160a01b039190911660248201526044810191909152606490fd5b34610182576080366003190112610182576004356001600160a01b039081811680910361018257611298611869565b6044359167ffffffffffffffff916064358381116101825736602382011215610182578060040135938411610182573660248583010111610182576113259560209216936112e7868587612f2c565b60405196879283926323e30c8b60e01b84523360048501528760248501528860448501525f606485015260a06084850152602460a485019201611d39565b03815f855af193841561022c575f94611391575b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd984036113785761136d93503091612fa5565b602060405160018152f35b604051630b6c58a960e31b815260048101859052602490fd5b9093506020813d6020116113bd575b816113ad602093836119d3565b8101031261018257519284611339565b3d91506113a0565b346101825760603660031901126101825760206113f46113e3611853565b6113eb611869565b60443591612d9c565b604051908152f35b346101825761140a36611893565b928094926114166126ea565b61142182853361275d565b61142a81612791565b15611516578061143e61148d9286336127db565b9790957f7f9dfa19cf1cc2f806f2f860fbc9c056b601fb1afc0e9b843dfe5c63616268e660806040513381526001600160a01b038416998a60208301528560408301526060820152a133612881565b939091856114bb5760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b61150a9661028f956106659460ff93604051956005875260208701526040860152606085015260808401521660a082015260c08101604052906040519160018352602083015260408201604052565b8080808080808061015c565b506040516306dde9c360e41b81523360048201526001600160a01b03841660248201526044810191909152606490fd5b34610182576020366003190112610182576004355f525f6020526020600160405f205414604051908152f35b34610182576003196040368201126101825767ffffffffffffffff9060043582811161018257806004019160a08236039182011261018257602435848111610182576115c2903690600401611822565b90936115cc6126ea565b5f946001600160a01b0394856115e184611d25565b1633036117ad576115fa6115f53685611b64565b61272c565b805f525f60205260405f20966001885414611641575b60208960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556040519015158152f35b9091929394959697505f6001985560405196338852826020890152606060408901528161166d8761187f565b166060890152602484013590606219018112156101825783019060a060808901528061169b6004840161187f565b166101008901526116ae6024830161187f565b16610120880152604481013560221982360301811215610182570190602460048301359201988211610182578136038913610182577f09d18501db0080ca2d6cd7c17fa7255daff4b2d503ea93b76ff68b6752ea8e63878061066595608461177661028f9a60209f611735906117a09f9a606061014061064e9d0152610160880191611d39565b61176761175c6117486044880185611d59565b605f198a8603810160a08c01529491611d8e565b926064870190611d59565b918784030160c0880152611d8e565b91013560e08301520390a13390919060405192600284526020840152604083015260608201604052565b8280808080808080611610565b6024866117b985611d25565b6040516335252be360e01b815291166004820152fd5b34610182576020366003190112610182576004359063ffffffff60e01b82168092036101825760209163e414309160e01b8114908115611811575b5015158152f35b6301ffc9a760e01b1490508361180a565b9181601f840112156101825782359167ffffffffffffffff8311610182576020808501948460051b01011161018257565b600435906001600160a01b038216820361018257565b602435906001600160a01b038216820361018257565b35906001600160a01b038216820361018257565b906080600319830112610182576004356001600160a01b0381168103610182579160243591604435916064359067ffffffffffffffff8211610182576118db91600401611822565b9091565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b60a0810190811067ffffffffffffffff82111761191f57604052565b634e487b7160e01b5f52604160045260245ffd5b6060810190811067ffffffffffffffff82111761191f57604052565b6040810190811067ffffffffffffffff82111761191f57604052565b6080810190811067ffffffffffffffff82111761191f57604052565b67ffffffffffffffff811161191f57604052565b60e0810190811067ffffffffffffffff82111761191f57604052565b6020810190811067ffffffffffffffff82111761191f57604052565b90601f8019910116810190811067ffffffffffffffff82111761191f57604052565b92919267ffffffffffffffff821161191f5760405191611a1f601f8201601f1916602001846119d3565b829481845281830111610182578281602093845f960137010152565b9080601f8301121561018257816020611a56933591016119f5565b90565b91906060838203126101825760405190611a7282611933565b8193611a7d8161187f565b8352611a8b6020820161187f565b602084015260408101359167ffffffffffffffff831161018257604092611ab29201611a3b565b910152565b67ffffffffffffffff811161191f5760051b60200190565b929192611adb82611ab7565b604092611aeb60405192836119d3565b819581835260208093019160061b84019381851161018257915b848310611b1457505050505050565b8583830312610182578386918251611b2b8161194f565b611b348661187f565b81528286013583820152815201920191611b05565b9080601f8301121561018257816020611a5693359101611acf565b91909160a0818403126101825760405190611b7e82611903565b8193611b898261187f565b835267ffffffffffffffff9160208101358381116101825782611bad918301611a59565b602085015260408101358381116101825782611bca918301611b49565b6040850152606081013592831161018257611beb6080939284938301611b49565b60608501520135910152565b909291611c0384611ab7565b916040611c1360405194856119d3565b839580855260208095019160059160051b8401948086116101825784935b868510611c42575050505050505050565b67ffffffffffffffff90853582811161018257870190606082850312610182578451611c6d81611933565b611c768361187f565b81528a83013584811161018257830185601f8201121561018257803590611c9c82611ab7565b91611ca9895193846119d3565b8083528d808401918b1b83010191888311610182578e809101915b838310611cfa57509150508201528583013593841161018257611ceb858c95869501611a3b565b86820152815201940193611c31565b82358152918101918f9101611cc4565b9080601f8301121561018257816020611a5693359101611bf7565b356001600160a01b03811681036101825790565b908060209392818452848401375f828201840152601f01601f1916010190565b9035601e198236030181121561018257016020813591019167ffffffffffffffff8211610182578160061b3603831361018257565b9190808252602080920192915f905b828210611dab575050505090565b909192936001906001600160a01b03611dc38761187f565b16815285830135838201526040908101950193920190611d9d565b90929192611deb81611ab7565b91604091611dfc60405194856119d3565b839581855260208095019160051b8301938185116101825783925b858410611e275750505050505050565b67ffffffffffffffff908435828111610182578601908382860312610182578351611e518161194f565b82358481116101825786611e66918501611a59565b81528983013593841161018257611e81868b95869501611d0a565b83820152815201930192611e17565b903590601e1981360301821215610182570180359067ffffffffffffffff821161018257602001918160051b3603831361018257565b60405190611ed382611933565b60606040835f81525f60208201520152565b60405190611ef282611903565b5f608083828152611f01611ec6565b6020820152606060408201526060808201520152565b9015610e6457803590607e1981360301821215610182570190565b903590609e1981360301821215610182570190565b903590601e1981360301821215610182570180359067ffffffffffffffff821161018257602001918160061b3603831361018257565b9190811015610e645760061b0190565b805115610e645760200190565b805160011015610e645760400190565b805160021015610e645760600190565b805160031015610e645760800190565b805160041015610e645760a00190565b8051821015610e645760209160051b010190565b3580151581036101825790565b9081518082526020808093019301915f5b82811061201a575050505090565b835180516001600160a01b03168652820151858301526040909401939281019260010161200c565b906080806120b86120a661209460406001600160a01b0380895116885260208901519060a060208a01528082511660a08a015260208201511660c08901520151606060e08801526101008701906118df565b60408701518682036040880152611ffb565b60608601518582036060870152611ffb565b93015191015290565b9081518082526020808093019301915f5b8281106120e0575050505090565b8351855293810193928101926001016120d2565b903590601e1981360301821215610182570180359067ffffffffffffffff82116101825760200191813603831361018257565b903590605e1981360301821215610182570190565b6121536115f561214c8380611f32565b3690611b64565b5f525f602052600160405f2054036121ef5780612173816121df93611f32565b6121d76121926121976020850135938460408701359384923690611b64565b6130d2565b6121af6121a48580611f32565b946060810190611e90565b92906121cf604051966121c1886119b7565b5f88525f3681373690611b64565b933691611bf7565b923392613107565b6040810151606090910151600192565b505f905f905f90565b5f5b60808110612206575050565b6060828201526020016121fa565b5f5b82811061222257505050565b606082820152602001612216565b926001600160a01b038451166001600160a01b03835116146126d8576001600160a01b03612265606086015160643590611fda565b515116906040830151916001600160a01b036122846084358095611fda565b51511614801590612698575b610e1e576040850151906001600160a01b036122af6044358094611fda565b5151166001600160a01b036122ca60643560608a0151611fda565b51511614612686576122db8661272c565b805f525f60205260405f20541561263357506122f68461272c565b805f525f60205260405f2054156125df57506123d992916123b3917f6fa7f4c28634b0a9d6831401c45ae468195fb63aed07308935c35374ff5d9e396040518061235e61235061012033845280602085015283018d612042565b82810360408401528a612042565b85606083015260643560808301528760a083015260a43560c083015260c43560e083015260e4356101008301520390a16001600160a01b03865116604051926123a6846119b7565b5f8452606435908a613107565b936001600160a01b03865116604051926123cc846119b7565b5f845260a4359086613107565b916123e76040820151612791565b1580156125cb575b80156125b8575b80156125a5575b612593576040519161240e8361196b565b5f83525f60208401525f60408401525f606084015261242d848361479b565b84526040840152612453612441838661479b565b6020860152806060860152845161352b565b94612467602085015160408601519061352b565b936124718761343d565b8015612584575b6125725761253961256b957fd9fa84dd790c969daa5c33d8050dc06b4a9b59d5b42e2be5f5e8ae20447f618d9461251b6125709a60a0966124ba8a885161357f565b6124c88c602089015161357f565b6124d68a60408901516135dd565b6124e48c60608901516135dd565b6124ed8a6138c8565b6124f68c6138c8565b6001600160a01b0361251260c435926060606435910151611fda565b51511633612881565b50506001600160a01b0361251260e43592606060a435910151611fda565b5050606060405191338352805160208401526020810151604084015260408101518284015201516080820152a16136ef565b6136ef565b565b604051630d86822160e01b8152600490fd5b5061258e8561343d565b612478565b6040516321badf1f60e01b8152600490fd5b506125b3606084015161343d565b6123fd565b506125c6606082015161343d565b6123f6565b506125d96040840151612791565b156123ef565b9351604080513381526001600160a01b039092166020830152810194909452507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f3945091925082915050606081015b0390a1565b9551604080513381526001600160a01b039092166020830152810196909652507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f39493508392505060608201905061262e565b604051631cd2f1c760e21b8152600490fd5b506001600160a01b036126b2606085015160a43590611fda565b5151166001600160a01b036126ce604088015160443590611fda565b5151161415612290565b604051630a98f1f360e21b8152600490fd5b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00600281541461271a5760029055565b604051633ee5aeb560e01b8152600490fd5b604051612757816127496020820194602086526040830190612042565b03601f1981018352826119d3565b51902090565b909115612768575050565b6040516305dbdfd960e41b81526001600160a01b03918216600482015291166024820152604490fd5b6127b0905f60e01d906001600160e01b038160e01d9116601b0b6147fe565b1290565b906127b0916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b61487f565b9291926127e782613ac3565b936127f18161343d565b61286f5784816001600160e01b036128109360e01d9116601b0b6148fe565b9290809315612846575b5082908161282a575b5050509190565b61283e926001600160a01b03309216612fa5565b5f8181612823565b9092505f19811461285b57600101915f61281a565b634e487b7160e01b5f52601160045260245ffd5b604051632eaefac360e21b8152600490fd5b9392919361288e8361343d565b61292c57846128aa576128a2939450613069565b50505f905f90565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f5281526128e7835f20549485613555565b956128f18761343d565b612914575f97885260018252838820908852815282872091875252909320829055565b835163c5e12af560e01b815260048101889052602490fd5b60405163793a8f5560e01b815260048101849052602490fd5b919060408382031261018257825167ffffffffffffffff908181116101825784019082601f8301121561018257815160209261298082611ab7565b9161298e60405193846119d3565b808352848084019160051b830101918683116101825785809101915b838310612a1d5750505050948281015191821161018257019180601f840112156101825782516129d981611ab7565b936129e760405195866119d3565b818552838086019260051b820101928311610182578301905b828210612a0e575050505090565b81518152908301908301612a00565b82518152918101918691016129aa565b90808251908181526020809101926020808460051b8301019501935f915b848310612a5b5750505050505090565b9091929394958480612a79600193601f198682030187528a516120c1565b9801930193019194939290612a4b565b91906020928381526001600160a01b0382511684820152838201516040820152612ac3604083015160e060608401526101008301906118df565b9060608301516080820152612aea608084015192601f1993848483030160a0850152612a2d565b9260a081015193838382030160c08401528680865192838152019501905f5b818110612b2d57505050611a5694955060c060e091015192828503019101526120c1565b825187529588019591880191600101612b09565b90604082019082526020606081936040838201528551809452019301915f5b828110612b6e575050505090565b835185529381019392810192600101612b60565b916040805191612b9183611903565b60048084526020612ba38186016121f8565b5f5b8751811015612bd85780612bbb6001928a611fda565b51612bc68289611fda565b52612bd18188611fda565b5001612ba5565b5092955092939093335f52308352855f2091865190612bf68261194f565b612bfe611ec6565b8252606085819301528751612c12816119b7565b5f8152885191612c21836119b7565b5f83525f3681375f5b8151811015612d8f57612c3d8183611fda565b5190888c8b84519189818401518d8d8251612c65575b50505050505050506001915001612c2a565b5f612cd497948197948c9794612c928c956001600160a01b039d8e81818d51169c0151169b015190613ba2565b94865199612c9f8b61199b565b8a528901528488015286015260808501528a60a08501528b60c08501525180958194829363d04dfe2360e01b84528301612a89565b03915afa938415612d85578b915f95612d5f575b508451612cfd575b50908b8e89838d8d612c53565b51015116803b1561018257612d2c925f918c8f84905180978195829463012c676d60e21b845233908401612b41565b03925af1918215612d5557600192612d46575b8981612cf0565b612d4f90611987565b5f612d3f565b8c513d5f823e3d90fd5b612d7c9195503d805f833e612d7481836119d3565b810190612945565b9050935f612ce8565b8e513d5f823e3d90fd5b5050505050505050509050565b8215612dd1576001600160a01b038091165f52600160205260405f2091165f5260205260405f20905f5260205260405f205490565b909150612ddd82613dd4565b6001600160a01b03809316906040918251946370a0823160e01b86528416938460048701526020928387602481865afa968715612ef3575f97612efd575b5083612e34612e2d83612e649a614ab3565b509061423e565b508651636eb1769f60e11b81526001600160a01b0390941660048501523060248501529297889081906044820190565b0381865afa968715612ef3575f97612ec2575b50612e2d612e8891611a5698614ab3565b50612e938183613460565b15612eba5750935b5f5260018252825f20905f528152815f20905f8052525f205490613555565b905093612e9b565b96508387813d8311612eec575b612ed981836119d3565b8101031261018257955195612e2d612e77565b503d612ecf565b85513d5f823e3d90fd5b96508387813d8311612f25575b612f1481836119d3565b810103126101825795519583612e1b565b503d612f0a565b6040519263a9059cbb60e01b5f526001600160a01b0380931660045260245260205f60448180855af160015f5114811615612f86575b8360405215612f7057505050565b635274afe760e01b835216600482015260249150fd5b6001811516612f9c57813b15153d151616612f62565b833d5f823e3d90fd5b9092604051936323b872dd60e01b5f526001600160a01b0393848092166004521660245260445260205f60648180855af160015f5114811615612ff5575b836040525f60605215612f7057505050565b6001811516612f9c57813b15153d151616612fe3565b939291936130188361343d565b61292c578461302c576128a29394506127db565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f5281526128e7835f2054948561352b565b9092919261307681613ac3565b936130808161343d565b6130c05784816001600160e01b0361309f9360e01d9116601b0b6148fe565b508092816130ae575050509190565b6001600160a01b0361283e9316612f2c565b604051632d1671a360e11b8152600490fd5b916130fd9060606130f2936001600160a01b039485916040880151611fda565b515116940151611fda565b5151161461268657565b949193613346919360c0915f6132cd6040928351946131258661199b565b61312d611ee5565b86526020958487820152848682015260609781868a809401528260808201528660a0820152015261327d85519161316383611903565b600483526131728884016121f8565b8d61317c8161272c565b9c896001600160a01b039e8f94859182865116908d5194600386528501528c840152168c820152608081018a526131b286611f8d565b526131bc85611f8d565b5088516131c881611933565b6002815289368c8301376131db86611f9a565b526131e585611f9a565b5060ff8a6132488b8501936132328761320b81613203858a51611fda565b515116613dd4565b9751168861321a848951611fda565b51511685613229858a51611fda565b51015191612d9c565b9661323e828751611fda565b5151169451611fda565b51015192169093929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b61328682611faa565b5261329081611faa565b506132b48a8d8d60ff8a6132488d8501936132328761320b81613203858a51611fda565b6132bd82611fba565b526132c781611fba565b50613ba2565b95878a511697848b0191825191868184511693015116928a855230875285808620915101518651916132fe836119b7565b86835287519561330d8761199b565b86528886015286850152848885015289608085015260a084015260c08301528351808098819463d04dfe2360e01b835260048301612a89565b03915afa968715613433575f945f98613411575b508451600281106133fa5750818386015195015161338061337a88611fca565b51611fba565b5161338b8183613460565b156133f25750925b6133b58685919060405192600284526020840152604083015260608201604052565b6133be88611faa565b526133c887611faa565b508251996133d58b61199b565b8a52890152870152850152608084015260a083015260c082015290565b905092613393565b602490835190630fbb8e5560e21b82526004820152fd5b9097506134299194503d805f833e612d7481836119d3565b939093965f61335a565b50513d5f823e3d90fd5b61345c905f60e01d906001600160e01b038160e01d9116601b0b6147fe565b1390565b9061345c916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b61487f565b6134ae6001600160e01b0392838316601b0b9260e01d938160e01d9116601b0b8484613ff5565b90637ffffff582136134fe575b906134c59161423e565b92909215806134f6575b6134d857505090565b6044925060405191638eba4d0760e01b835260048301526024820152fd5b5082156134cf565b6135088282614ede565b156134bb57604483856040519163d556b11160e01b835260048301526024820152fd5b611a5691610c18916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614444565b611a5691610c18916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614608565b6135d991608081018261359b6135958351611fca565b51611fca565b526135d26135cc6001600160a01b038094515116936135c36135bd8551611fca565b51611f8d565b51169251611fca565b51611faa565b519161300b565b5050565b906080810191806135f16135958551611fba565b526001600160a01b0380925151169161360d6135bd8551611fba565b511661361c6135cc8551611fba565b5190816136b75761362c8361343d565b61292c579183917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a959361262e955f5260209060018252613682604094855f20835f528452855f20855f528452855f2054613555565b945f5260018252835f20905f528152825f20915f52525f20555b51604051918291338352604060208401526040830190612a2d565b916136e8917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a959361262e95612881565b505061369c565b60c0810151908151915f92613863575b506137a46020918281510151926001600160a01b039081818187511696015116928660a082019485518252308452604097888320898686510151015160808601518b519161374c836119b7565b8683528c519361375b856119b7565b8785528d519661376a8861199b565b8752898701528c86015260016060860152608085015260a084015260c08301528851808099819463d04dfe2360e01b835260048301612a89565b03915afa94851561385957879561383b575b5084516137c7575b50505050505050565b81905101510151169051813b15613837579184918493836137fc965180978195829463012c676d60e21b845260048401612b41565b03925af190811561382e5750613817575b80808080806137be565b6138218291611987565b61382b578061380d565b80fd5b513d84823e3d90fd5b8480fd5b6138509195503d8089833e612d7481836119d3565b9050935f6137b6565b86513d89823e3d90fd5b6001600160a01b03602080845101510151169060a083015190823b15610182576138a6925f928360405180968195829463012c676d60e21b845260048401612b41565b03925af1801561022c57156136ff576138c0919250611987565b5f905f6136ff565b608081016138d96135cc8251611fba565b519182156138e657505050565b6139006135bd6001600160a01b0380935151169351611fba565b5116815f5260209160018352604092835f20835f528152835f20855f528152835f2054936001600160e01b03851661393b575b505050505050565b61395f955f9284845260018152828420868552815282842091845252812055613069565b5f808080613933565b8115613972570490565b634e487b7160e01b5f52601260045260245ffd5b60408151106139ce576020810151908051603f19810190811161285b5760051c82116139ba5760016020920160051b010190565b50506040516139c8816119b7565b5f815290565b506040516139c8816119b7565b8051156139eb57602001515f1a90565b505f90565b905f8091602081519101845af48080613a6e575b15613a245750506040513d81523d5f602083013e60203d82010160405290565b15613a4b57604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b3d15613a5c576040513d5f823e3d90fd5b60405163d6bda27560e01b8152600490fd5b503d151580613a045750813b1515613a04565b60041115613a8b57565b634e487b7160e01b5f52602160045260245ffd5b602090939291936001600160a01b036040820195168152613abf83613a81565b0152565b613acb614fcc565b6040805163b7bad1b160e01b81526001600160a01b0383166004820152909182826024815f73200e12d10bb0c5e4a17e7018f0f1161919bb93895af1928315613b99575f925f94613b64575b50613b2183613a81565b600183141580613b52575b613b365750505090565b5163ee07877f60e01b8152918291610725919060048401613a9f565b50613b5c83613a81565b821515613b2c565b90809450613b889293503d8511613b92575b613b8081836119d3565b8101906148d4565b919091925f613b17565b503d613b76565b513d5f823e3d90fd5b90805191613baf83611ab7565b91613bca604094613bc2865195866119d3565b808552611ab7565b601f199460209186013686840137835183519095908015613dc9576001613c209101965b6001978891010197613c17613c028a611ab7565b99613c0f86519b8c6119d3565b808b52611ab7565b01848901612214565b85805f9684516002815233878201523086820152606081018652613c438b611f8d565b52613c4d8a611f8d565b505f925b613d85575b5050508351613c69575b50505050505090565b85809598979692980181613c7d8289611fda565b52613c888188611fda565b505f925b613c9b575b5085969750613c60565b8451831015613d80576001600160a01b03613d1281613cba8689611fda565b51511686613cc8878a611fda565b51015187815160051b9101207f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f52601c52603c5f208c613d09888b611fda565b51015191614a2a565b15613d6857868098999a928192613d29878a611fda565b515116613d368787611fda565b52019385613d448289611fda565b510151613d51868c611fda565b52613d5c858b611fda565b50019290989796613c8c565b8951630a57f30960e31b815260048101859052602490fd5b613c91565b9091968151881015613dc0578280910197613da08184611fda565b51613dab8a8d611fda565b52613db6898c611fda565b5001919081613c51565b96829150613c56565b50613c205f96613bee565b613ddc614fcc565b60408051630782d7e160e01b81526001600160a01b03831660048201529091828260248173200e12d10bb0c5e4a17e7018f0f1161919bb93895afa928315613b99575f925f94613b645750613b2183613a81565b9091939284158215175f14613e4a5750505090505f905f90565b82810192600160fd1b8082019083011760fe1c613f81575b5050613e6d81614ba3565b93613e7781614ba3565b94613e828682614bc3565b90918215613f72575f9083986f0785ee10d5da46d900f436a000000000808611613f64575b50670de0b6b3a7640000808b11613f55575b50633b9aca00808b11613f46575b50612710808b11613f38575b5098805b613f27575081906118db989982600a0a9109960195817fcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccd0a93838211900382610100031b9203901c170291614bd6565b60019290920191600a900480613ed7565b60049a04998a930192613ed3565b600991939a049901915f613ec7565b601291939a049901915f613eb9565b85049950602592505f613ea7565b509290506118db949550614bd6565b5f821215613fd557808413613fc7575b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb2841315613e62579092506118db939491614ae1565b9092506118db939491614b48565b80841215613f91579092506118db939491614ae1565b6134c5828261423e565b9290918061401b576044848460405191637a97930f60e01b835260048301526024820152fd5b90919280155f1461403057505050505f905f90565b6140499361403d91614c90565b92919490938492614c90565b909391928461405788614ba3565b9161406186614ba3565b947f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000094604c91868810614208575b030191600160ff1b98838a018112155f146141d5575050035b5f955f8212806141cc575b6141ae575b5f81128061419c575b61417e5786820103966001600160ff1b0388149081614174575b508061416b575b80614162575b6141445750906140f89291614e3c565b915f811361410b575b506118db93614bd6565b9091604c82136141395761412291600a0a90613968565b90811561412f575f614101565b505050505f905f90565b50505050505f905f90565b876044916040519163d556b11160e01b835260048301526024820152fd5b505f85126140e8565b508284146140e2565b905088145f6140db565b604489836040519163d556b11160e01b835260048301526024820152fd5b50806001600160ff1b030182136140c1565b95508087018613156141c65786818703015b956140b8565b5f6141c0565b505f81136140b3565b89985090920390506001600160ff1b03819003870182136141f957018601946140a8565b5050505050505050505f905f90565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009650604b925061408f565b8115613972570590565b8082601b82810b8314614433577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e100000000000000000084056143df575b8380820b036143ce57507b199999999999999999999999999999999999999999999999999999987b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc8401111561437f575b838060030b03614303575b8084136142e75750506001600160e01b036001925b60e01b91161791565b8303600a0a8015613972576001600160e01b03910715926142de565b92915f8413156143535750906143198383614ede565b61433557637ffffffe1901600a0a810290637fffffff926142c9565b506044916040519163d556b11160e01b835260048301526024820152fd5b637fffffff1992830390604382136141395761437291600a0a90614234565b91821561412f57926142c9565b5f198401808060030b1461439357506142be565b90506001600160e01b039293507b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff915060e01b9260ff1d181617905f90565b600190940193600a90930592614271565b937f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000840515614420576305f5e100600894058094819201955b915050614271565b620186a060059405809481920195614418565b50826142be57505050505f90600190565b919291600160ff1b840161445c576118db9350614ef7565b906118db935f0391614608565b919291600160ff1b91908015806145f657509061448591614c90565b9490929091905f8685858582821380156145ed575b6145d0575b505050508682841860ff1c94860391039081604c0381116145b55701600a0a80820591908461459b575b505081019182821860ff1c111561459357826001600160ff1b031461457557905f600192135f1461454657600a9004915b01925b8115811761450a57509190565b80614523575b50801561451b579190565b505f91508190565b91926145399203600160ff1b01600a0a90614234565b600160ff1b91905f614510565b600a60037fe66666666666666666666666666666666666666666666666666666666666666792010401916144fa565b604490836040519163d556b11160e01b835260048301526024820152fd5b5090926144fd565b81076145a8575b806144c9565b60ff1d600117015f6145a2565b5050509193506145c3579190565b60018160ff1d1790039190565b5f9a50909750909550600160ff1b9450925090508680808061449f565b50835f1261449a565b156146015750509190565b9350919050565b93929193841581158181176147595750509061462391614c90565b919490829561463482958294614c90565b8096929491969387868482138015614750575b614737575b5050505050508682841860ff1c94860391039081604c0381116145b55701600a0a80820591908461471d575b505081019182821860ff1c111561471557826001600160ff1b031461457557905f600192135f146146e657600a9004915b01925b811581176146b957509190565b806146c95750801561451b579190565b600160ff1b936146e09291038401600a0a90614234565b5f614510565b600a60037fe66666666666666666666666666666666666666666666666666666666666666792010401916146a9565b5090926146ac565b810761472a575b80614678565b60ff1d600117015f614724565b929b5098509196509450925090505f808080808061464c565b50858412614647565b939593909291901561476f57505061451b579190565b945092915050565b60088151106139eb576008015167ffffffffffffffff1667ff0a89c674ee78741490565b91604083019260406147d5610c18606087519401938451906001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b613e30565b945193016147e48151866127b4565b6147ec575050565b909350611a5691925051925183613487565b92915f9060018184145f87128715171717614878575f9280821361486a575b03604c81135f82121761485e57600a0a908461483c8382029384614234565b146148515750501561484d575f9190565b5f90565b9093509015611a56579190565b50501561484d575f9190565b5f956001945092509061481d565b5050505f90565b93929190918083145f83125f871218831587151717176148ce575f928082136148c15703604c81135f82121761485e57600a0a908461483c8382029384614234565b919460019350919061481d565b50919050565b919082604091031261018257815160048110156101825760209092015160ff811681036101825790565b91925f831215614926576044838360405191634a7d166b60e01b835260048301526024820152fd5b91928361493857505090505f90600190565b60ff8116820191808312614a00575f831215614970575050604c19811261451b575f03600a0a916149698382613968565b9283021490565b909293915f81135f146149f657604d81136149cb57600a0a92831561397257835f190483116149a25750500290600190565b60405163c849483b60e01b815260048101849052602481019290925260ff166044820152606490fd5b5060405163c849483b60e01b81526004810192909252602482015260ff919091166044820152606490fd5b5050905090600190565b60405163c849483b60e01b815260048101869052602481019190915260ff82166044820152606490fd5b9091813b614a6557614a3c9192615035565b50614a4681613a81565b159182614a5257505090565b6001600160a01b03918216911614919050565b6020918160645f935160405192630b135d3f60e11b9788855260048501526040602485015286820190604485015e8281018201859052601f01601f191601915afa905f5114601f3d11161690565b9060ff165f03916001600160ff1b0382115f14614ad957600a6001818404940192061590565b909190600190565b909392915f614af1918184613e30565b9490945f8483019182019412159081614b3e575b8115614b34575b50614b1657505090565b604492506040519163d556b11160e01b835260048301526024820152fd5b905083125f614b0c565b8281129150614b05565b614b5d93600160fe1b90810193920190613e30565b9081815f821215614b94575050604b1982126128a257614b82915f03600a0a90614234565b9081614b8c575f90565b600160ff1b90565b93600160ff1b90910192509050565b5f811215611a5657600160ff1b90808203614bbc575090565b90505f0390565b905f198183099102908180821091030391565b92939291905f8184181215614c6b576001600160ff1b039283831115614c5557600160ff1b93838503614c0b57505050509190565b90919293508514614c25575050600a600191045f03920190565b604051630ed8062160e21b8152600481019190915260248101919091526044810182905260648101849052608490fd5b5090915050600160ff1b811461285b575f039190565b90916001600160ff1b0380841115612823578514614c25575050600a60019104920190565b9190918015614e3257827f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000080830515614d40575b507f19999999999999999999999999999999999999999999999999999999999999997f0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc830110614d31575b8313614d1b5791905f90565b919060018060ff1b926001600160ff1b03030190565b9290600a02905f190192614d0f565b6f4b3b4ca85a86c47a098a22400000000080840515614e20575b507728c87cb5c89a2571ebfdcb54864ada834a00000000000000830515614e09575b7b097edd871cfda3a5697758bf0e3cbb5ac5741c640000000000000000830515614df5575b7e3899162693736ac531a5a58f1fbb4b746504382ca7e4000000000000000000830515614de557820515614dd6575b5f614cc4565b9290600a02905f190192614dd0565b9391606402916001190193614da1565b93916402540be40002916009190193614da1565b9391678ac7230489e8000002916012190193614d7c565b6025198301955092909202915f614d5a565b505f915081908190565b90915f198383099280830292838086109503948086039584871015614eba5714614eb2579082910960018219018216809204600280826003021880830282030280830282030280830282030280830282030280830282030280920290030293600183805f03040190848311900302920304170290565b505091500490565b60648386866040519263362ced0960e11b8452600484015260248301526044820152fd5b611a5691905f811215614ef2575f0361506f565b61506f565b909291600160ff1b91828101614f895750808414614f7f57808413918215614f77578185035b604c811115614f665750505f915b15614f5757507f8000000000000000000000000000000000000000000000000000000000000001019190565b92506001600160ff1b03039190565b600a0a908115613972570491614f2b565b848203614f1d565b505090505f905f90565b93614f9692945f03614469565b80939180928114614faa575b50505f039190565b915092506001600160ff1b03831461457557600a600191059201915f80614fa2565b73200e12d10bb0c5e4a17e7018f0f1161919bb9389803b15801561500a575b614ff25750565b602490604051906373e6d7b360e01b82526004820152fd5b507f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d41813f1415614feb565b81519190604183036150655761505e9250602082015190606060408401519301515f1a906150fe565b9192909190565b50505f9160029190565b90637ffffff58113156150f857637ffffffe19810190604382136150f1575f8212156150c557637fffffff91505f0301600a0a7b8000000000000000000000000000000000000000000000000000000202111590565b50600a0a8015613972577b80000000000000000000000000000000000000000000000000000001041090565b5050151590565b50505f90565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411615175579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa1561022c575f516001600160a01b0381161561516b57905f905f90565b505f906001905f90565b5050505f916003919056", + "object": "0x6080806040523460395760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055615204908161003e8239f35b5f80fdfe6080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a7146117b4575080632cb77e9f1461178857806341d1514f146117515780635343c1b7146116b65780635cffe9de1461155a5780635d003c44146113d6578063613255ab14611353578063687cf02a1461103c578063ac9650d814610eee578063b0460f07146105f3578063b845b83e1461059b578063ca9109ba1461044c578063d9d98ce41461039b578063ddebc96f146103475763df6db3c2146100c1575f80fd5b34610321576003196040368201126103215767ffffffffffffffff9060043582811161032157806004019160a0823603918201126103215760243584811161032157610111903690600401611c76565b909361011b61289f565b5f946001600160a01b0394856101308461257a565b163303610325576101496101443685611aa8565b6128e1565b805f525f60205260405f20966001885414610190575b60208960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556040519015158152f35b9091929394959697505f600198556040519633885282602089015260606040890152816101bc87611833565b166060890152602484013590606219018112156103215783019060a06080890152806101ea60048401611833565b166101008901526101fd60248301611833565b16610120880152604481013560221982360301811215610321570190602460048301359201988211610321578136038913610321577f09d18501db0080ca2d6cd7c17fa7255daff4b2d503ea93b76ff68b6752ea8e6387806103069560846102c561030e9a60209f610284906103149f9a60606101406102ef9d015261016088019161232b565b6102b66102ab610297604488018561268a565b605f198a8603810160a08c015294916126bf565b92606487019061268a565b918784030160c08801526126bf565b91013560e08301520390a13390919060405192600284526020840152604083015260608201604052565b906040519160018352602083015260408201604052565b92369161234b565b906135db565b5f8080808080808061015f565b5f80fd5b6024866103318561257a565b6040516335252be360e01b815291166004820152fd5b3461032157600319602036820112610321576004359067ffffffffffffffff8211610321576080908236030112610321576103866060916004016125ce565b90604051921515835260208301526040820152f35b34610321576040366003190112610321576001600160a01b036103bc611807565b166040516370a0823160e01b8152306004820152602081602481855afa908115610441575f9161040f575b50156103f75760206040515f8152f35b60249060405190633c5bf76960e21b82526004820152fd5b90506020813d602011610439575b8161042a60209383611917565b810103126103215751826103e7565b3d915061041d565b6040513d5f823e3d90fd5b346103215761045a36611ca7565b9280949261046661289f565b6104718285336134d7565b61047a81612e4c565b15610567578061048e6104dd928633613a1d565b9790957f7f9dfa19cf1cc2f806f2f860fbc9c056b601fb1afc0e9b843dfe5c63616268e660806040513381526001600160a01b038416998a60208301528560408301526060820152a133613133565b9390918561050c575b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b61055b9661030e956103069460ff93604051956005875260208701526040860152606085015260808401521660a082015260c08101604052906040519160018352602083015260408201604052565b808080808080806104e6565b506040516306dde9c360e41b81523360048201526001600160a01b03841660248201526044810191909152606490fd5b0390fd5b346103215760203660031901126103215760043567ffffffffffffffff81116103215761030e6105d26104e6923690600401611c76565b91906105dc61289f565b604051926105e9846118fb565b5f8452369161234b565b34610321576003196020368201126103215767ffffffffffffffff600435116103215760c090600435360301126103215761062c61289f565b5f8080610641600480356084810191016124b3565b905015610edc57602460043501359261065984612e4c565b15610eca5760608060405161066d816118af565b610675612508565b81525f60208201525f6040820152015261068d612508565b506106ed6106e86106c76106bd6106b76106b16084600435016004356004016124b3565b9061253a565b80612555565b6040810190612445565b60206106e06106b16084600435016004356004016124b3565b01359161256a565b61257a565b936001600160a01b0361073c6106e86107236107196106b76106b16084600435016004356004016124b3565b6060810190612445565b60406106e06106b16084600435016004356004016124b3565b816040519761074a89611877565b168752166020860152604085015261076c6084600435016004356004016124b3565b9490506001604051955f87520160051b85016040525f905f5b6107996084600435016004356004016124b3565b9050811080610eb7575b15610d04576107bc6084600435016004356004016124b3565b821015610cf0578160051b810135607e198236030181121561032157608081830136031261032157604051916107f1836118af565b8181013567ffffffffffffffff81116103215761081390369084840101611aa8565b835280820160208181013590850152604080820135908501526060013567ffffffffffffffff81116103215761084c9236920101611c5b565b606082015280516001600160a01b0361086e6040830151602085015190611d64565b5151166001600160a01b0385511614801590610cbc575b610caa5761089d60208301516040840151908361391a565b6108a6816128e1565b91825f525f60205260405f2054155f1461090a575051604080513381526001600160a01b039092166020830152810191909152600191907fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f390606090a15b01610785565b919061093b602084979597015160408501519060608601519060405192610930846118fb565b5f8452339186612b0e565b925f9361095360608201516044600435013590612e6f565b156109ba57505051604080513381526001600160a01b03909216602083015281019190915260019291907fe3151dc8cb7a54ffc4baabd28c1f241c94d510b5e5b502491ac3cad6c16316d590606090a15b81156109b2575b5092610904565b9050886109ab565b6109c76040820151612e4c565b158015610c97575b15610a2457505051604080513381526001600160a01b03909216602083015281019190915260019291907f500b713857325f9e6dcb52ae832eca9109d107ed1aae9cb4928b4c1e13f051aa90606090a16109a4565b9250925050600196959691610a3d60646004350161258e565b15610c045796610aad97610abd60408401516040880151610a5e8183612eb9565b15610bfc5750925b610ab7848592610aa0610a9a60608a01516001600160e01b03601b918660e01d92828816810b928260e01d9216900b613f6a565b90613edf565b9d8e9260408d0151612ee0565b60408c01526139f3565b996139f3565b98610ac88484612f0a565b610ad28482612f68565b60405192338452608060208501526060610af88451608080880152610100870190611dbf565b93602081015160a0870152604081015160c0870152015192607f198582030160e0860152835180825260208201906020808260051b8501019601925f5b828110610b9457505050505092806001979695937fbae4dbf76931c547f765e9def16d693d86daaa596f491de979008831789185ae93610b8f96604084015260608301520390a180858c5101808d5260051b8c015261321f565b6109a4565b9091929396602080610bef600193601f198782030189528b51906001600160a01b03825116815283820151848201526060610bde604084015160806040850152608084019061259b565b920151906060818403910152611cf3565b9901950193929101610b35565b905092610a66565b610aad90610abd6060840151610ab7610c42610a9a60408801516001600160e01b0394601b90868360e01d9316820b91878260e01d9216900b613f6a565b60408a0151610c518183612eb9565b15610c8f5750915b829c8d916060890151908116155f14610c80575060408801515b96879460408d0151612ee0565b610c8a908561394f565b610c73565b905091610c59565b50610ca56060820151612e96565b6109cf565b60405163936bb5ad60e01b8152600490fd5b506001600160a01b03610cd86060830151604085015190611d64565b5151166001600160a01b036020860151161415610885565b634e487b7160e01b5f52603260045260245ffd5b50919390610d1660646004350161258e565b15610eb157835b6004356004013590610d2f8282612eb9565b610e935750508490610d4f856001600160a01b0360208701511633613569565b505060a46004350190610d6782600435600401612412565b905015159081610e8b575b50610dea575b506001600160a01b03610d8e9293511633613a1d565b50505b8351811015610db65780610db0610daa60019387611d64565b51613093565b01610d91565b5060409160017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005582519182526020820152f35b90506001600160a01b03602084015116610e146001600160a01b0385511692600435600401612412565b929091333b1561032157610e5c5f93604051958694859463691f9ed760e01b8652600486015260248501528960448501528a606485015260a0608485015260a484019161232b565b038183335af190811561044157859115610d78579050610e7c91506118cb565b5f836001600160a01b03610d78565b905088610d72565b604492506040519163573b6f4160e01b835260048301526024820152fd5b84610d1d565b50610ec56040830151612e4c565b6107a3565b60405163315f9e2360e21b8152600490fd5b604051639c95219f60e01b8152600490fd5b34610321576020806003193601126103215760043567ffffffffffffffff811161032157610f20903690600401611c76565b919060405192610f2f846118fb565b5f8452828401610f3e826119fb565b94610f4c6040519687611917565b828652610f58836119fb565b93610f6a86880195601f190186612497565b5f5b848110610fce57604080518881528951818a018190525f92600582901b83018101918a918c9085015b828710610fa25785850386f35b909192938280610fbe600193603f198a82030186528851611cf3565b9601920196019592919092610f95565b8061101d88611017610fea60019560059d9c9d1b870187612412565b929089846040519586938585013782018381015f81528b519283915e015f83820152038084520182611917565b30613889565b611027828a611d64565b526110328189611d64565b5001969596610f6c565b34610321576003196040368201126103215760043567ffffffffffffffff8082116103215760c0826004019383360301126103215760243590811161032157611089903690600401611c76565b9061109261289f565b6110c36110be6110b96110b26110a888806123fd565b6040810190612412565b3691611939565b61380b565b613874565b8015611341576001101561132f57602483016110df8186612445565b90501561131d5760448401946110f58682612445565b90501561130b5761115b6111239661114f61111a61111385806123fd565b9585612445565b99909285612445565b9190926111406040519761113689611847565b338952369061199d565b9a60209b8c8901523691611a13565b60408601523691611a13565b606083015260648501356080830152611173826128e1565b91825f525f875260405f209586541596876111b7575b888860017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055604051908152f35b6001905560a46001600160a01b03917f87491344dfbcf91f6cbbc610cbbeedc85313d37a02df0c93527f7ea5f8db717f83855116604051908152878c820152606060408201528061120b6060820188611dbf565b0390a1019161121a8385612412565b905061125f575b5050505061125392916103066102ef61030e933390919060405192600284526020840152604083015260608201604052565b82808080808080611189565b61126c6110b28486612412565b61127581613f46565b156112e85750937fd46c2c56b35c8210e9e712ec3f02242d5fc90187c0ac8ed80cc33626846ec369896112539897956112db6112be610306976102ef9761030e9b511693612412565b86604051958695865285015260606040850152606084019161232b565b0390a19383959650611221565b89610597604051928392630c89984b60e31b845260048401526024830190611cf3565b60405163540e5f0b60e01b8152600490fd5b604051636c44ef8f60e01b8152600490fd5b604051633c8270bd60e21b8152600490fd5b604051632cff108b60e21b8152600490fd5b3461032157602080600319360112610321576024816001600160a01b03611378611807565b16604051928380926370a0823160e01b82523060048301525afa908115610441575f916113a9575b50604051908152f35b90508181813d83116113cf575b6113c08183611917565b810103126103215751826113a0565b503d6113b6565b34610321576113e436611ca7565b92916113f194919461289f565b6113fc8383336134d7565b61140581612e4c565b15611529578160ff9161141d856114e096953361270f565b6114278183612eb9565b15611523575080935b61143c8582853361350b565b917f8045c25080b0868951141ed0a91720bcad09a8364a2b3109ee1fd49c1f0bc8b860c061146b898833613569565b97906001600160a01b0360405192338452169a8b6020840152856040840152886060840152608083015260a0820152a16040519660068852602088015260408701526060860152608085015260a08401521660c082015260e08101604052906040519160018352602083015260408201604052565b908061150c5760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b61151b9261030e91369161234b565b8080806104e6565b93611430565b50604051623a3a4d60e21b81523360048201526001600160a01b039190911660248201526044810191909152606490fd5b34610321576080366003190112610321576004356001600160a01b03908181168091036103215761158961181d565b6044359167ffffffffffffffff916064358381116103215736602382011215610321578060040135938411610321573660248583010111610321576116169560209216936115d88685876133f8565b60405196879283926323e30c8b60e01b84523360048501528760248501528860448501525f606485015260a06084850152602460a48501920161232b565b03815f855af1938415610441575f94611682575b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd984036116695761165e93503091613471565b602060405160018152f35b604051630b6c58a960e31b815260048101859052602490fd5b9093506020813d6020116116ae575b8161169e60209383611917565b810103126103215751928461162a565b3d9150611691565b34610321576101403660031901126103215767ffffffffffffffff600435818111610321576116e9903690600401611aa8565b60243582811161032157611701903690600401611aa8565b60c0366043190112610321576101043583811161032157611726903690600401611c5b565b9061012435938411610321576117436104e6943690600401611c5b565b9261174c61289f565b611e70565b3461032157606036600319011261032157602061178061176f611807565b61177761181d565b6044359161270f565b604051908152f35b34610321576020366003190112610321576004355f525f6020526020600160405f205414604051908152f35b34610321576020366003190112610321576004359063ffffffff60e01b82168092036103215760209163e414309160e01b81149081156117f6575b5015158152f35b6301ffc9a760e01b149050836117ef565b600435906001600160a01b038216820361032157565b602435906001600160a01b038216820361032157565b35906001600160a01b038216820361032157565b60a0810190811067ffffffffffffffff82111761186357604052565b634e487b7160e01b5f52604160045260245ffd5b6060810190811067ffffffffffffffff82111761186357604052565b6040810190811067ffffffffffffffff82111761186357604052565b6080810190811067ffffffffffffffff82111761186357604052565b67ffffffffffffffff811161186357604052565b60e0810190811067ffffffffffffffff82111761186357604052565b6020810190811067ffffffffffffffff82111761186357604052565b90601f8019910116810190811067ffffffffffffffff82111761186357604052565b92919267ffffffffffffffff82116118635760405191611963601f8201601f191660200184611917565b829481845281830111610321578281602093845f960137010152565b9080601f830112156103215781602061199a93359101611939565b90565b919060608382031261032157604051906119b682611877565b81936119c181611833565b83526119cf60208201611833565b602084015260408101359167ffffffffffffffff8311610321576040926119f6920161197f565b910152565b67ffffffffffffffff81116118635760051b60200190565b929192611a1f826119fb565b604092611a2f6040519283611917565b819581835260208093019160061b84019381851161032157915b848310611a5857505050505050565b8583830312610321578386918251611a6f81611893565b611a7886611833565b81528286013583820152815201920191611a49565b9080601f830112156103215781602061199a93359101611a13565b91909160a0818403126103215760405190611ac282611847565b8193611acd82611833565b835267ffffffffffffffff9160208101358381116103215782611af191830161199d565b602085015260408101358381116103215782611b0e918301611a8d565b6040850152606081013592831161032157611b2f6080939284938301611a8d565b60608501520135910152565b90929192611b48816119fb565b91604094611b596040519485611917565b839583855260208095019160059460051b8401948186116103215784935b868510611b88575050505050505050565b67ffffffffffffffff90853582811161032157870190608082860312610321578551611bb3816118af565b611bbc83611833565b81528a8301358b8201528683013584811161032157830186601f8201121561032157803590611bea826119fb565b91611bf78a519384611917565b8083528d80840191891b83010191898311610321578e809101915b838310611c4b57505050508782015260608084013594851161032157611c3c878d9687960161197f565b90820152815201940193611b77565b82358152918101918f9101611c12565b9080601f830112156103215781602061199a93359101611b3b565b9181601f840112156103215782359167ffffffffffffffff8311610321576020808501948460051b01011161032157565b906080600319830112610321576004356001600160a01b0381168103610321579160243591604435916064359067ffffffffffffffff821161032157611cef91600401611c76565b9091565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b805115610cf05760200190565b805160011015610cf05760400190565b805160021015610cf05760600190565b805160031015610cf05760800190565b805160041015610cf05760a00190565b8051821015610cf05760209160051b010190565b9081518082526020808093019301915f5b828110611d97575050505090565b835180516001600160a01b031686528201518583015260409094019392810192600101611d89565b90608080611e35611e23611e1160406001600160a01b0380895116885260208901519060a060208a01528082511660a08a015260208201511660c08901520151606060e0880152610100870190611cf3565b60408701518682036040880152611d78565b60608601518582036060870152611d78565b93015191015290565b90611e48826119fb565b611e556040519182611917565b8281528092611e66601f19916119fb565b0190602036910137565b92916001600160a01b038451166001600160a01b0383511614612319576001600160a01b03611ea6606086015160643590611d64565b515116906040830151916001600160a01b03611ec56084358095611d64565b515116148015906122d9575b610caa576040850151906001600160a01b03611ef06044358094611d64565b5151166001600160a01b03611f0b60643560608a0151611d64565b515116146122c757611f1c866128e1565b805f525f60205260405f2054156122745750611f37846128e1565b805f525f60205260405f205415612220575061201a9291611ff4917f6fa7f4c28634b0a9d6831401c45ae468195fb63aed07308935c35374ff5d9e3960405180611f9f611f9161012033845280602085015283018d611dbf565b82810360408401528a611dbf565b85606083015260643560808301528760a083015260a43560c083015260c43560e083015260e4356101008301520390a16001600160a01b0386511660405192611fe7846118fb565b5f8452606435908a612b0e565b936001600160a01b038651166040519261200d846118fb565b5f845260a4359086612b0e565b916120286040820151612e4c565b15801561220c575b80156121f9575b80156121e6575b6121d4576040519161204f836118af565b5f83525f60208401525f60408401525f606084015261206e8483613e57565b845260408401526120946120828386613e57565b60208601528060608601528451612ee0565b946120a86020850151604086015190612ee0565b936120b287612e96565b80156121c5575b6121b35761217a6121ac957fd9fa84dd790c969daa5c33d8050dc06b4a9b59d5b42e2be5f5e8ae20447f618d9461215c6121b19a60a0966120fb8a8851612f0a565b6121098c6020890151612f0a565b6121178a6040890151612f68565b6121258c6060890151612f68565b61212e8a613093565b6121378c613093565b6001600160a01b0361215360c435926060606435910151611d64565b51511633613133565b50506001600160a01b0361215360e43592606060a435910151611d64565b5050606060405191338352805160208401526020810151604084015260408101518284015201516080820152a161321f565b61321f565b565b604051630d86822160e01b8152600490fd5b506121cf85612e96565b6120b9565b6040516321badf1f60e01b8152600490fd5b506121f46060840151612e96565b61203e565b506122076060820151612e96565b612037565b5061221a6040840151612e4c565b15612030565b9351604080513381526001600160a01b039092166020830152810194909452507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f3945091925082915050606081015b0390a1565b9551604080513381526001600160a01b039092166020830152810196909652507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f39493508392505060608201905061226f565b604051631cd2f1c760e21b8152600490fd5b506001600160a01b036122f3606085015160a43590611d64565b5151166001600160a01b0361230f604088015160443590611d64565b5151161415611ed1565b604051630a98f1f360e21b8152600490fd5b908060209392818452848401375f828201840152601f01601f1916010190565b90929192612358816119fb565b916040916123696040519485611917565b839581855260208095019160051b8301938185116103215783925b8584106123945750505050505050565b67ffffffffffffffff9084358281116103215786019083828603126103215783516123be81611893565b823584811161032157866123d391850161199d565b815289830135938411610321576123ee868b95869501611c5b565b83820152815201930192612384565b903590605e1981360301821215610321570190565b903590601e1981360301821215610321570180359067ffffffffffffffff82116103215760200191813603831361032157565b903590601e1981360301821215610321570180359067ffffffffffffffff821161032157602001918160061b3603831361032157565b5f5b60808110612489575050565b60608282015260200161247d565b5f5b8281106124a557505050565b606082820152602001612499565b903590601e1981360301821215610321570180359067ffffffffffffffff821161032157602001918160051b3603831361032157565b604051906124f682611877565b60606040835f81525f60208201520152565b6040519061251582611847565b5f6080838281526125246124e9565b6020820152606060408201526060808201520152565b9015610cf057803590607e1981360301821215610321570190565b903590609e1981360301821215610321570190565b9190811015610cf05760061b0190565b356001600160a01b03811681036103215790565b3580151581036103215790565b9081518082526020808093019301915f5b8281106125ba575050505090565b8351855293810193928101926001016125ac565b6125e56101446125de8380612555565b3690611aa8565b5f525f602052600160405f20540361268157806126058161267193612555565b6126696126246126296020850135938460408701359384923690611aa8565b61391a565b6126416126368580612555565b9460608101906124b3565b929061266160405196612653886118fb565b5f88525f3681373690611aa8565b933691611b3b565b923392612b0e565b6040810151606090910151600192565b505f905f905f90565b9035601e198236030181121561032157016020813591019167ffffffffffffffff8211610321578160061b3603831361032157565b9190808252602080920192915f905b8282106126dc575050505090565b909192936001906001600160a01b036126f487611833565b168152858301358382015260409081019501939201906126ce565b8215612744576001600160a01b038091165f52600160205260405f2091165f5260205260405f20905f5260205260405f205490565b90915061275082613ae8565b6001600160a01b03809316906040918251946370a0823160e01b86528416938460048701526020928387602481865afa968715612866575f97612870575b50836127a76127a0836127d79a6148ac565b509061436e565b508651636eb1769f60e11b81526001600160a01b0390941660048501523060248501529297889081906044820190565b0381865afa968715612866575f97612835575b506127a06127fb9161199a986148ac565b506128068183612eb9565b1561282d5750935b5f5260018252825f20905f528152815f20905f8052525f2054906139f3565b90509361280e565b96508387813d831161285f575b61284c8183611917565b81010312610321579551956127a06127ea565b503d612842565b85513d5f823e3d90fd5b96508387813d8311612898575b6128878183611917565b81010312610321579551958361278e565b503d61287d565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0060028154146128cf5760029055565b604051633ee5aeb560e01b8152600490fd5b60405161290c816128fe6020820194602086526040830190611dbf565b03601f198101835282611917565b51902090565b919060408382031261032157825167ffffffffffffffff908181116103215784019082601f8301121561032157815160209261294d826119fb565b9161295b6040519384611917565b808352848084019160051b830101918683116103215785809101915b8383106129ea5750505050948281015191821161032157019180601f840112156103215782516129a6816119fb565b936129b46040519586611917565b818552838086019260051b820101928311610321578301905b8282106129db575050505090565b815181529083019083016129cd565b8251815291810191869101612977565b90808251908181526020809101926020808460051b8301019501935f915b848310612a285750505050505090565b9091929394958480612a46600193601f198682030187528a5161259b565b9801930193019194939290612a18565b91906020928381526001600160a01b0382511684820152838201516040820152612a90604083015160e06060840152610100830190611cf3565b9060608301516080820152612ab7608084015192601f1993848483030160a08501526129fa565b9260a081015193838382030160c08401528680865192838152019501905f5b818110612afa5750505061199a94955060c060e0910151928285030191015261259b565b825187529588019591880191600101612ad6565b949193612d4d919360c0915f612cd4604092835194612b2c866118df565b612b34612508565b86526020958487820152848682015260609781868a809401528260808201528660a08201520152612c84855191612b6a83611847565b60048352612b7988840161247b565b8d612b83816128e1565b9c896001600160a01b039e8f94859182865116908d5194600386528501528c840152168c820152608081018a52612bb986611d17565b52612bc385611d17565b508851612bcf81611877565b6002815289368c830137612be286611d24565b52612bec85611d24565b5060ff8a612c4f8b850193612c3987612c1281612c0a858a51611d64565b515116613ae8565b97511688612c21848951611d64565b51511685612c30858a51611d64565b5101519161270f565b96612c45828751611d64565b5151169451611d64565b51015192169093929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b612c8d82611d34565b52612c9781611d34565b50612cbb8a8d8d60ff8a612c4f8d850193612c3987612c1281612c0a858a51611d64565b612cc482611d44565b52612cce81611d44565b50613bc6565b95878a511697848b0191825191868184511693015116928a85523087528580862091510151865191612d05836118fb565b868352875195612d14876118df565b86528886015286850152848885015289608085015260a084015260c08301528351808098819463d04dfe2360e01b835260048301612a56565b03915afa968715612e42575f945f98612e18575b50845160028110612e0157508183860151950151612d87612d8188611d54565b51611d44565b51612d928183612eb9565b15612df95750925b612dbc8685919060405192600284526020840152604083015260608201604052565b612dc588611d34565b52612dcf87611d34565b50825199612ddc8b6118df565b8a52890152870152850152608084015260a083015260c082015290565b905092612d9a565b602490835190630fbb8e5560e21b82526004820152fd5b909750612e389194503d805f833e612e308183611917565b810190612912565b939093965f612d61565b50513d5f823e3d90fd5b612e6b905f60e01d906001600160e01b038160e01d9116601b0b614963565b1290565b90612e6b916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6149e4565b612eb5905f60e01d906001600160e01b038160e01d9116601b0b614963565b1390565b90612eb5916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6149e4565b61199a91610a9a916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b613eba565b612f64916080810182612f26612f208351611d54565b51611d54565b52612f5d612f576001600160a01b03809451511693612f4e612f488551611d54565b51611d17565b51169251611d54565b51611d34565b519161350b565b5050565b90608081019180612f7c612f208551611d44565b526001600160a01b03809251511691612f98612f488551611d44565b5116612fa7612f578551611d44565b51908161305b57612fb783612e96565b613042579183917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a959361226f955f526020906001825261300d604094855f20835f528452855f20855f528452855f20546139f3565b945f5260018252835f20905f528152825f20915f52525f20555b516040519182913383526040602084015260408301906129fa565b60405163793a8f5560e01b815260048101849052602490fd5b9161308c917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a959361226f95613133565b5050613027565b608081016130a4612f578251611d44565b519182156130b157505050565b6130cb612f486001600160a01b0380935151169351611d44565b5116815f5260209160018352604092835f20835f528152835f20855f528152835f2054936001600160e01b038516613106575b505050505050565b61312a955f9284845260018152828420868552815282842091845252812055613569565b5f8080806130fe565b9392919361314083612e96565b613042578461315c57613154939450613569565b50505f905f90565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f528152613199835f205494856139f3565b956131a387612e96565b6131c6575f97885260018252838820908852815282872091875252909320829055565b835163c5e12af560e01b815260048101889052602490fd5b90604082019082526020606081936040838201528551809452019301915f5b82811061320b575050505090565b8351855293810193928101926001016131fd565b60c0810151908151915f92613393575b506132d46020918281510151926001600160a01b039081818187511696015116928660a082019485518252308452604097888320898686510151015160808601518b519161327c836118fb565b8683528c519361328b856118fb565b8785528d519661329a886118df565b8752898701528c86015260016060860152608085015260a084015260c08301528851808099819463d04dfe2360e01b835260048301612a56565b03915afa94851561338957879561336b575b5084516132f7575b50505050505050565b81905101510151169051813b156133675791849184938361332c965180978195829463012c676d60e21b8452600484016131de565b03925af190811561335e5750613347575b80808080806132ee565b61335182916118cb565b61335b578061333d565b80fd5b513d84823e3d90fd5b8480fd5b6133809195503d8089833e612e308183611917565b9050935f6132e6565b86513d89823e3d90fd5b6001600160a01b03602080845101510151169060a083015190823b15610321576133d6925f928360405180968195829463012c676d60e21b8452600484016131de565b03925af18015610441571561322f576133f09192506118cb565b5f905f61322f565b6040519263a9059cbb60e01b5f526001600160a01b0380931660045260245260205f60448180855af160015f5114811615613452575b836040521561343c57505050565b635274afe760e01b835216600482015260249150fd5b600181151661346857813b15153d15161661342e565b833d5f823e3d90fd5b9092604051936323b872dd60e01b5f526001600160a01b0393848092166004521660245260445260205f60648180855af160015f51148116156134c1575b836040525f6060521561343c57505050565b600181151661346857813b15153d1516166134af565b9091156134e2575050565b6040516305dbdfd960e41b81526001600160a01b03918216600482015291166024820152604490fd5b9392919361351883612e96565b613042578461352c57613154939450613a1d565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f528152613199835f20549485612ee0565b9092919261357681613ee9565b9361358081612e96565b6135c95784816001600160e01b0361359f9360e01d9116601b0b614b0e565b508092816135af575b5050509190565b6001600160a01b036135c193166133f8565b5f81816135a8565b604051632d1671a360e11b8152600490fd5b9160408051916135ea83611847565b600480845260206135fc81860161247b565b5f5b875181101561363157806136146001928a611d64565b5161361f8289611d64565b5261362a8188611d64565b50016135fe565b5092955092939093335f52308352855f209186519061364f82611893565b6136576124e9565b825260608581930152875161366b816118fb565b5f815288519161367a836118fb565b5f83525f3681375f5b81518110156137e0576136968183611d64565b5190888c8b84519189818401518d8d82516136be575b50505050505050506001915001613683565b5f61372d97948197948c97946136eb8c956001600160a01b039d8e81818d51169c0151169b015190613bc6565b948651996136f88b6118df565b8a528901528488015286015260808501528a60a08501528b60c08501525180958194829363d04dfe2360e01b84528301612a56565b03915afa9384156137d6578b915f956137b8575b508451613756575b50908b8e89838d8d6136ac565b51015116803b1561032157613785925f918c8f84905180978195829463012c676d60e21b8452339084016131de565b03925af19182156137ae5760019261379f575b8981613749565b6137a8906118cb565b5f613798565b8c513d5f823e3d90fd5b6137cd9195503d805f833e612e308183611917565b9050935f613741565b8e513d5f823e3d90fd5b5050505050505050509050565b81156137f7570490565b634e487b7160e01b5f52601260045260245ffd5b6040815110613867576020810151908051603f1981019081116138535760051c821161383f5760016020920160051b010190565b505060405161384d816118fb565b5f815290565b634e487b7160e01b5f52601160045260245ffd5b5060405161384d816118fb565b80511561388457602001515f1a90565b505f90565b905f8091602081519101845af48080613907575b156138bd5750506040513d81523d5f602083013e60203d82010160405290565b156138e457604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b3d156138f5576040513d5f823e3d90fd5b60405163d6bda27560e01b8152600490fd5b503d15158061389d5750813b151561389d565b9161394590606061393a936001600160a01b039485916040880151611d64565b515116940151611d64565b515116146122c757565b6139766001600160e01b0392838316601b0b9260e01d938160e01d9116601b0b8484614125565b90637ffffff582136139c6575b9061398d9161436e565b92909215806139be575b6139a057505090565b6044925060405191638eba4d0760e01b835260048301526024820152fd5b508215613997565b6139d08282615037565b1561398357604483856040519163d556b11160e01b835260048301526024820152fd5b61199a91610a9a916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614713565b929192613a2982613ee9565b93613a3381612e96565b613a945784816001600160e01b03613a529360e01d9116601b0b614b0e565b9290809315613a7f575b50829081613a6b575050509190565b6135c1926001600160a01b03309216613471565b9092505f19811461385357600101915f613a5c565b604051632eaefac360e21b8152600490fd5b60041115613ab057565b634e487b7160e01b5f52602160045260245ffd5b602090939291936001600160a01b036040820195168152613ae483613aa6565b0152565b613af0615050565b60408051630782d7e160e01b81526001600160a01b03831660048201529091828260248173200e12d10bb0c5e4a17e7018f0f1161919bb93895afa928315613bbd575f925f94613b88575b50613b4583613aa6565b600183141580613b76575b613b5a5750505090565b5163ee07877f60e01b8152918291610597919060048401613ac4565b50613b8083613aa6565b821515613b50565b90809450613bac9293503d8511613bb6575b613ba48183611917565b810190614882565b919091925f613b3b565b503d613b9a565b513d5f823e3d90fd5b613bd08251611e3e565b613bda8351611e3e565b9282519281518015155f14613e4f57600201935b60019401840190613bfe826119fb565b95613c19604093613c118551998a611917565b8089526119fb565b613c2b602091601f1901828a01612497565b5f9584519389896002926002885233868901523089890152606097606081018a52613c5584611d17565b52613c5f83611d17565b505f825b613e0f575b505050508651613c7f575b50505050505050505090565b90919293600288613ca28c86613c9b8e809c9d9e018093611d64565b528d611d64565b500185613caf828d611d64565b52613cba818c611d64565b505f965b613cc9575b50613c73565b8851871015613e0a576001600160a01b03613d75898b85613d6c8c60428c88613cf28488611d64565b515116968582613d02868a611d64565b51015192613d10868a611d64565b51838d82511691015182815160051b910120908451927f6ec4dff745ec96dbde88c5d41f8aa5ac13aa1664afb47b8406b44fa945a650c88452830152838201522090519161190160f01b83528d83015260228201522093611d64565b510151916148da565b15613df25787613de18b8e8c8f9e9d9c9b9a999897968f613dce918d613dc4898f8f613db083889f613da7828f611d64565b51511692611d64565b52613dbb828b611d64565b51015192611d64565b52019c8d94611d64565b510151613ddb8383611d64565b52611d64565b500196979895909192939495613cbe565b8851630a57f30960e31b815260048101899052602490fd5b613cc3565b9091929a8251821015613e475790613e3b84809301809d613e308487611d64565b51613ddb8383611d64565b50019082918d93613c63565b9a9291613c68565b505f93613bee565b9160408301926040613e91610a9a606087519401938451906001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b613f6a565b94519301613ea0815186612e6f565b613ea8575050565b90935061199a9192505192518361394f565b919291600160ff1b8401613ed257611cef9350614a39565b90611cef935f0391614713565b61398d828261436e565b613ef1615050565b6040805163b7bad1b160e01b81526001600160a01b0383166004820152909182826024815f73200e12d10bb0c5e4a17e7018f0f1161919bb93895af1928315613bbd575f925f94613b885750613b4583613aa6565b6008815110613884576008015167ffffffffffffffff1667ff0a89c674ee78741490565b9091939284158215175f14613f845750505090505f905f90565b82810192600160fd1b8082019083011760fe1c6140bb575b5050613fa781614cfc565b93613fb181614cfc565b94613fbc8682614d1c565b909182156140ac575f9083986f0785ee10d5da46d900f436a00000000080861161409e575b50670de0b6b3a7640000808b1161408f575b50633b9aca00808b11614080575b50612710808b11614072575b5098805b61406157508190611cef989982600a0a9109960195817fcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccd0a93838211900382610100031b9203901c170291614d2f565b60019290920191600a900480614011565b60049a04998a93019261400d565b600991939a049901915f614001565b601291939a049901915f613ff3565b85049950602592505f613fe1565b50929050611cef949550614d2f565b5f82121561410f57808413614101575b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb2841315613f9c57909250611cef939491614c3a565b909250611cef939491614ca1565b808412156140cb57909250611cef939491614c3a565b9290918061414b576044848460405191637a97930f60e01b835260048301526024820152fd5b90919280155f1461416057505050505f905f90565b6141799361416d91614de9565b92919490938492614de9565b909391928461418788614cfc565b9161419186614cfc565b947f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000094604c91868810614338575b030191600160ff1b98838a018112155f14614305575050035b5f955f8212806142fc575b6142de575b5f8112806142cc575b6142ae5786820103966001600160ff1b03881490816142a4575b508061429b575b80614292575b6142745750906142289291614f95565b915f811361423b575b50611cef93614d2f565b9091604c82136142695761425291600a0a906137ed565b90811561425f575f614231565b505050505f905f90565b50505050505f905f90565b876044916040519163d556b11160e01b835260048301526024820152fd5b505f8512614218565b50828414614212565b905088145f61420b565b604489836040519163d556b11160e01b835260048301526024820152fd5b50806001600160ff1b030182136141f1565b95508087018613156142f65786818703015b956141e8565b5f6142f0565b505f81136141e3565b89985090920390506001600160ff1b038190038701821361432957018601946141d8565b5050505050505050505f905f90565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009650604b92506141bf565b81156137f7570590565b8082601b82810b8314614563577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e1000000000000000000840561450f575b8380820b036144fe57507b199999999999999999999999999999999999999999999999999999987b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc840111156144af575b838060030b03614433575b8084136144175750506001600160e01b036001925b60e01b91161791565b8303600a0a80156137f7576001600160e01b039107159261440e565b92915f8413156144835750906144498383615037565b61446557637ffffffe1901600a0a810290637fffffff926143f9565b506044916040519163d556b11160e01b835260048301526024820152fd5b637fffffff199283039060438213614269576144a291600a0a90614364565b91821561425f57926143f9565b5f198401808060030b146144c357506143ee565b90506001600160e01b039293507b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff915060e01b9260ff1d181617905f90565b600190940193600a909305926143a1565b937f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000840515614550576305f5e100600894058094819201955b9150506143a1565b620186a060059405809481920195614548565b50826143ee57505050505f90600190565b919291600160ff1b919080158061470157509061459091614de9565b9490929091905f8685858582821380156146f8575b6146db575b505050508682841860ff1c94860391039081604c0381116146c05701600a0a8082059190846146a6575b505081019182821860ff1c111561469e57826001600160ff1b031461468057905f600192135f1461465157600a9004915b01925b8115811761461557509190565b8061462e575b508015614626579190565b505f91508190565b91926146449203600160ff1b01600a0a90614364565b600160ff1b91905f61461b565b600a60037fe6666666666666666666666666666666666666666666666666666666666666679201040191614605565b604490836040519163d556b11160e01b835260048301526024820152fd5b509092614608565b81076146b3575b806145d4565b60ff1d600117015f6146ad565b5050509193506146ce579190565b60018160ff1d1790039190565b5f9a50909750909550600160ff1b945092509050868080806145aa565b50835f126145a5565b1561470c5750509190565b9350919050565b93929193841581158181176148645750509061472e91614de9565b919490829561473f82958294614de9565b809692949196938786848213801561485b575b614842575b5050505050508682841860ff1c94860391039081604c0381116146c05701600a0a808205919084614828575b505081019182821860ff1c111561482057826001600160ff1b031461468057905f600192135f146147f157600a9004915b01925b811581176147c457509190565b806147d457508015614626579190565b600160ff1b936147eb9291038401600a0a90614364565b5f61461b565b600a60037fe66666666666666666666666666666666666666666666666666666666666666792010401916147b4565b5090926147b7565b8107614835575b80614783565b60ff1d600117015f61482f565b929b5098509196509450925090505f8080808080614757565b50858412614752565b939593909291901561487a575050614626579190565b945092915050565b919082604091031261032157815160048110156103215760209092015160ff811681036103215790565b9060ff165f03916001600160ff1b0382115f146148d257600a6001818404940192061590565b909190600190565b9091813b614915576148ec91926150b9565b506148f681613aa6565b15918261490257505090565b6001600160a01b03918216911614919050565b6020918160645f935160405192630b135d3f60e11b9788855260048501526040602485015286820190604485015e8281018201859052601f01601f191601915afa905f5114601f3d11161690565b92915f9060018184145f871287151717176149dd575f928082136149cf575b03604c81135f8212176149c357600a0a90846149a18382029384614364565b146149b6575050156149b2575f9190565b5f90565b909350901561199a579190565b5050156149b2575f9190565b5f9560019450925090614982565b5050505f90565b93929190918083145f83125f87121883158715171717614a33575f92808213614a265703604c81135f8212176149c357600a0a90846149a18382029384614364565b9194600193509190614982565b50919050565b909291600160ff1b91828101614acb5750808414614ac157808413918215614ab9578185035b604c811115614aa85750505f915b15614a9957507f8000000000000000000000000000000000000000000000000000000000000001019190565b92506001600160ff1b03039190565b600a0a9081156137f7570491614a6d565b848203614a5f565b505090505f905f90565b93614ad892945f03614574565b80939180928114614aec575b50505f039190565b915092506001600160ff1b03831461468057600a600191059201915f80614ae4565b91925f831215614b36576044838360405191634a7d166b60e01b835260048301526024820152fd5b919283614b4857505090505f90600190565b60ff8116820191808312614c10575f831215614b80575050604c198112614626575f03600a0a91614b7983826137ed565b9283021490565b909293915f81135f14614c0657604d8113614bdb57600a0a9283156137f757835f19048311614bb25750500290600190565b60405163c849483b60e01b815260048101849052602481019290925260ff166044820152606490fd5b5060405163c849483b60e01b81526004810192909252602482015260ff919091166044820152606490fd5b5050905090600190565b60405163c849483b60e01b815260048101869052602481019190915260ff82166044820152606490fd5b909392915f614c4a918184613f6a565b9490945f8483019182019412159081614c97575b8115614c8d575b50614c6f57505090565b604492506040519163d556b11160e01b835260048301526024820152fd5b905083125f614c65565b8281129150614c5e565b614cb693600160fe1b90810193920190613f6a565b9081815f821215614ced575050604b19821261315457614cdb915f03600a0a90614364565b9081614ce5575f90565b600160ff1b90565b93600160ff1b90910192509050565b5f81121561199a57600160ff1b90808203614d15575090565b90505f0390565b905f198183099102908180821091030391565b92939291905f8184181215614dc4576001600160ff1b039283831115614dae57600160ff1b93838503614d6457505050509190565b90919293508514614d7e575050600a600191045f03920190565b604051630ed8062160e21b8152600481019190915260248101919091526044810182905260648101849052608490fd5b5090915050600160ff1b8114613853575f039190565b90916001600160ff1b03808411156135a8578514614d7e575050600a60019104920190565b9190918015614f8b57827f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000080830515614e99575b507f19999999999999999999999999999999999999999999999999999999999999997f0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc830110614e8a575b8313614e745791905f90565b919060018060ff1b926001600160ff1b03030190565b9290600a02905f190192614e68565b6f4b3b4ca85a86c47a098a22400000000080840515614f79575b507728c87cb5c89a2571ebfdcb54864ada834a00000000000000830515614f62575b7b097edd871cfda3a5697758bf0e3cbb5ac5741c640000000000000000830515614f4e575b7e3899162693736ac531a5a58f1fbb4b746504382ca7e4000000000000000000830515614f3e57820515614f2f575b5f614e1d565b9290600a02905f190192614f29565b9391606402916001190193614efa565b93916402540be40002916009190193614efa565b9391678ac7230489e8000002916012190193614ed5565b6025198301955092909202915f614eb3565b505f915081908190565b90915f198383099280830292838086109503948086039584871015615013571461500b579082910960018219018216809204600280826003021880830282030280830282030280830282030280830282030280830282030280920290030293600183805f03040190848311900302920304170290565b505091500490565b60648386866040519263362ced0960e11b8452600484015260248301526044820152fd5b61199a91905f81121561504b575f036150f3565b6150f3565b73200e12d10bb0c5e4a17e7018f0f1161919bb9389803b15801561508e575b6150765750565b602490604051906373e6d7b360e01b82526004820152fd5b507f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d41813f141561506f565b81519190604183036150e9576150e29250602082015190606060408401519301515f1a90615182565b9192909190565b50505f9160029190565b90637ffffff581131561517c57637ffffffe1981019060438213615175575f82121561514957637fffffff91505f0301600a0a7b8000000000000000000000000000000000000000000000000000000202111590565b50600a0a80156137f7577b80000000000000000000000000000000000000000000000000000001041090565b5050151590565b50505f90565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084116151f9579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa15610441575f516001600160a01b038116156151ef57905f905f90565b505f906001905f90565b5050505f916003919056", "linkReferences": {} } } diff --git a/crates/test_fixtures/abis/RaindexV6SubParser.json b/crates/test_fixtures/abis/RaindexV6SubParser.json index 8ab9fcd5ae..de21ccb33d 100644 --- a/crates/test_fixtures/abis/RaindexV6SubParser.json +++ b/crates/test_fixtures/abis/RaindexV6SubParser.json @@ -242,7 +242,7 @@ } ], "bytecode": { - "object": "0x6080604052348015600e575f80fd5b506126378061001c5f395ff3fe608060405234801561000f575f80fd5b506004361061007a575f3560e01c80636f5aa28d116100585780636f5aa28d146100dd578063c6c0cbb61461010b578063ccf4477514610135578063d6d8c9a814610148575f80fd5b806301ffc9a71461007e578063336284d4146100a6578063570c7a63146100bb575b5f80fd5b61009161008c3660046122f2565b610150565b60405190151581526020015b60405180910390f35b6100ae6101d7565b60405161009d919061234e565b6100ce6100c9366004612374565b610bc5565b60405161009d9392919061241e565b6040517ff2d0eca454c544ab10f9991c019349475a416e38494f112a50807174c3000d0b815260200161009d565b61011e610119366004612374565b610d09565b60408051921515835260208301919091520161009d565b60408051602081019091525f81526100ae565b6100ae610d41565b5f6001600160e01b031982166391ccb1d560e01b148061018057506001600160e01b03198216636f5aa28d60e01b145b8061019b57506001600160e01b03198216631a2c8edd60e01b145b806101b657506001600160e01b03198216630cd8a13560e21b145b806101d157506301ffc9a760e01b6001600160e01b03198316145b92915050565b60605f6101e66004600161248f565b6101f190600261248f565b6101fc90600161248f565b61020790600161248f565b6001600160401b0381111561021e5761021e612360565b60405190808252806020026020018201604052801561025157816020015b606081526020019060019003908161023c5790505b50604080516002808252606082019092529192505f9190816020015b6122e881526020019060019003908161026d5790505090506116cc815f8151811061029a5761029a6124a2565b60200260200101906001600160401b031690816001600160401b0316815250506116e9816001815181106102d0576102d06124a2565b6001600160401b039290921660209283029190910190910152604080516003808252608082019092525f91816020015b6122e88152602001906001900390816103005790505090506116f8815f8151811061032d5761032d6124a2565b60200260200101906001600160401b031690816001600160401b03168152505061170781600181518110610363576103636124a2565b60200260200101906001600160401b031690816001600160401b03168152505061171681600281518110610399576103996124a2565b6001600160401b039290921660209283029190910190910152604080516002808252606082019092525f91816020015b6122e88152602001906001900390816103c9579050509050611726815f815181106103f6576103f66124a2565b60200260200101906001600160401b031690816001600160401b0316815250506117358160018151811061042c5761042c6124a2565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b6122e881526020019060019003908161045c579050509050611745815f81518110610489576104896124a2565b60200260200101906001600160401b031690816001600160401b031681525050611754816001815181106104bf576104bf6124a2565b60200260200101906001600160401b031690816001600160401b031681525050611764816002815181106104f5576104f56124a2565b60200260200101906001600160401b031690816001600160401b0316815250506117748160038151811061052b5761052b6124a2565b60200260200101906001600160401b031690816001600160401b03168152505061178381600481518110610561576105616124a2565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b6122e8815260200190600190039081610591579050509050611793815f815181106105be576105be6124a2565b60200260200101906001600160401b031690816001600160401b0316815250506117a2816001815181106105f4576105f46124a2565b60200260200101906001600160401b031690816001600160401b0316815250506117b28160028151811061062a5761062a6124a2565b60200260200101906001600160401b031690816001600160401b0316815250506117c281600381518110610660576106606124a2565b60200260200101906001600160401b031690816001600160401b0316815250506117d281600481518110610696576106966124a2565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6122e88152602001906001900390816106c55790505090506117e1815f815181106106f2576106f26124a2565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6122e88152602001906001900390816107215790505090506117f0815f8151811061074e5761074e6124a2565b60200260200101906001600160401b031690816001600160401b03168152505086885f81518110610781576107816124a2565b602002602001018190525085886001815181106107a0576107a06124a2565b602002602001018190525084886002815181106107bf576107bf6124a2565b602002602001018190525083886003815181106107de576107de6124a2565b602002602001018190525082886004815181106107fd576107fd6124a2565b6020026020010181905250818860058151811061081c5761081c6124a2565b6020026020010181905250808860068151811061083b5761083b6124a2565b602090810291909101015260408051600680825260e082019092525f91816020015b6122e881526020019060019003908161085d5790505090506116cc815f8151811061088a5761088a6124a2565b60200260200101906001600160401b031690816001600160401b0316815250506116f8816001815181106108c0576108c06124a2565b60200260200101906001600160401b031690816001600160401b031681525050611707816002815181106108f6576108f66124a2565b60200260200101906001600160401b031690816001600160401b0316815250506117168160038151811061092c5761092c6124a2565b60200260200101906001600160401b031690816001600160401b03168152505061182581600481518110610962576109626124a2565b60200260200101906001600160401b031690816001600160401b03168152505061183581600581518110610998576109986124a2565b6001600160401b039092166020928302919091019091015280896109be6006600161248f565b815181106109ce576109ce6124a2565b602090810291909101015260408051600780825261010082019092525f91816020015b6122e88152602001906001900390816109f15790505090506116cc815f81518110610a1e57610a1e6124a2565b60200260200101906001600160401b031690816001600160401b0316815250506116f881600181518110610a5457610a546124a2565b60200260200101906001600160401b031690816001600160401b03168152505061170781600281518110610a8a57610a8a6124a2565b60200260200101906001600160401b031690816001600160401b03168152505061171681600381518110610ac057610ac06124a2565b60200260200101906001600160401b031690816001600160401b03168152505061182581600481518110610af657610af66124a2565b60200260200101906001600160401b031690816001600160401b03168152505061183581600581518110610b2c57610b2c6124a2565b60200260200101906001600160401b031690816001600160401b03168152505061184581600681518110610b6257610b626124a2565b6001600160401b0390921660209283029190910190910152808a610b886006600261248f565b81518110610b9857610b986124a2565b602090810291909101015289610bb5610bb082611855565b61186a565b9b50505050505050505050505090565b5f6060805f805f610be587610bd86118f9565b610be0611919565b611939565b9250925092505f610bfb82610220015160200190565b90505f8261022001515182610c10919061248f565b90505f610c2e83836f07fffffe0000000003ff200000000000611a2a565b80925081945050505f80610c4786610240015184611ac6565b915091508115610cdc575f610c5c8783611b9d565b90506122e85f610c6a611bcc565b90505f60028251610c7b91906124ca565b9050808510610cac576040516303bdd1b160e51b815260048101869052602481018290526044015b60405180910390fd5b6001850160020282015161ffff169250610cc58c8c8686565b9e509e509e50505050505050505050505050610d02565b5050604080515f80825281830190925260208101828152919a5090985096505050505050505b9193909250565b5f805f805f610d31866002810151815160228084019461ffff93909316840101920160200190565b505f988998509650505050505050565b60605f610d506004600161248f565b610d5b90600261248f565b610d6690600161248f565b610d7190600161248f565b6001600160401b03811115610d8857610d88612360565b604051908082528060200260200182016040528015610dbb57816020015b6060815260200190600190039081610da65790505b50604080516002808252606082019092529192505f9190816020015b6122e8815260200190600190039081610dd7579050509050611bec815f81518110610e0457610e046124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec81600181518110610e3a57610e3a6124a2565b6001600160401b039290921660209283029190910190910152604080516003808252608082019092525f91816020015b6122e8815260200190600190039081610e6a579050509050611bec815f81518110610e9757610e976124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec81600181518110610ecd57610ecd6124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec81600281518110610f0357610f036124a2565b6001600160401b039290921660209283029190910190910152604080516002808252606082019092525f91816020015b6122e8815260200190600190039081610f33579050509050611bec815f81518110610f6057610f606124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec81600181518110610f9657610f966124a2565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b6122e8815260200190600190039081610fc6579050509050611bec815f81518110610ff357610ff36124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec81600181518110611029576110296124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec8160028151811061105f5761105f6124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec81600381518110611095576110956124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec816004815181106110cb576110cb6124a2565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b6122e88152602001906001900390816110fb579050509050611bec815f81518110611128576111286124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec8160018151811061115e5761115e6124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec81600281518110611194576111946124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec816003815181106111ca576111ca6124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec81600481518110611200576112006124a2565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6122e881526020019060019003908161122f579050509050611c15815f8151811061125c5761125c6124a2565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6122e881526020019060019003908161128b579050509050611cb1815f815181106112b8576112b86124a2565b60200260200101906001600160401b031690816001600160401b03168152505086885f815181106112eb576112eb6124a2565b6020026020010181905250858860018151811061130a5761130a6124a2565b60200260200101819052508488600281518110611329576113296124a2565b60200260200101819052508388600381518110611348576113486124a2565b60200260200101819052508288600481518110611367576113676124a2565b60200260200101819052508188600581518110611386576113866124a2565b602002602001018190525080886006815181106113a5576113a56124a2565b602090810291909101015260408051600680825260e082019092525f91816020015b6122e88152602001906001900390816113c7579050509050611bec815f815181106113f4576113f46124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec8160018151811061142a5761142a6124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec81600281518110611460576114606124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec81600381518110611496576114966124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec816004815181106114cc576114cc6124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec81600581518110611502576115026124a2565b6001600160401b039092166020928302919091019091015280896115286006600161248f565b81518110611538576115386124a2565b602090810291909101015260408051600780825261010082019092525f91816020015b6122e881526020019060019003908161155b579050509050611bec815f81518110611588576115886124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec816001815181106115be576115be6124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec816002815181106115f4576115f46124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec8160038151811061162a5761162a6124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec81600481518110611660576116606124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec81600581518110611696576116966124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec81600681518110610b6257610b626124a2565b5f6060806116da5f80611d69565b92509250925093509350939050565b5f6060806116da5f6001611d69565b5f6060806116da60015f611d69565b5f6060806116da600180611d69565b5f6060806116da60016002611d69565b5f6060806116da60025f611d69565b5f6060806116da60026001611d69565b5f6060806116da60035f611d69565b5f6060806116da60036001611d69565b5f6060806116da60036002611d69565b5f6060806116da600380611d69565b5f6060806116da60036004611d69565b5f6060806116da60045f611d69565b5f6060806116da60046001611d69565b5f6060806116da60046002611d69565b5f6060806116da60046003611d69565b5f6060806116da600480611d69565b5f6060806116da600585611d69565b5f60608060ff80851690600886901c1661181461180e83600661248f565b82611d69565b945094509450505093509350939050565b5f6060806116da60016003611d69565b5f6060806116da60016004611d69565b5f6060806116da60016005611d69565b6060815f61186282611deb565b949350505050565b60605f82516002026001600160401b0381111561188957611889612360565b6040519080825280601f01601f1916602001820160405280156118b3576020820181803683370190505b50905061ffff80196020850160208651028101600285015b818310156118ed578051835186169085161781526020909201916002016118cb565b50939695505050505050565b60606040518060e0016040528060a2815260200161259560a29139905090565b606060405180606001604052806040815260200161251560409139905090565b5f806119c86040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020016060815260200160608152602001606081526020015f815260200160608152602001606081525090565b606061ffff600288015116935060ff600388015116925061ffff600588015116600588019750808852602081018801915050611a1487878760405180602001604052805f815250611e59565b915080826101e001819052505093509350939050565b5f808060018187870360208111611a415780611a44565b60205b915050875192505b8519600184841a1b16158183101615611a6a57600182019150611a4c565b9681019660208290036008810293841c90931b92611ab55760408051602081018590520160408051601f198184030181529082905263e47fe8b760e01b8252610ca39160040161234e565b50869350909150505b935093915050565b600182810180515f928392600560ff93909316602102870192830192909101835b81831015611b8b5760018301516021909301805190935f90819060ff168180611b10838e61200a565b915091508186165f03611b32575f809b509b5050505050505050505050611b96565b5f87611b42600185038916612035565b016004028b015195505062ffffff9081169350841683039150611b769050575060019750601c1a9550611b96945050505050565b611b7f83612035565b84019350505050611ae7565b5f8095509550505050505b9250929050565b6101c08201516002828102820101516101e08401515f9261ffff9092169190611bc39083565b95945050505050565b606060405180606001604052806040815260200161255560409139905090565b5f81515f14611c0e576040516304f8b58160e51b815260040160405180910390fd5b505f919050565b5f8151600103611c72575060208101516001600160e01b038116601b0b60e082901d5f611c438383836120ee565b905061ffff811115611c6857604051631e4e01d760e21b815260040160405180910390fd5b9250611cac915050565b81515f03611c9357604051630f16066b60e41b815260040160405180910390fd5b604051630358cd2160e31b815260040160405180910390fd5b919050565b5f8151600203611d4657602082015160408301516001600160e01b038216601b0b60e083901d5f611ce38383836120ee565b6001600160e01b038516601b0b935060e085901d925090505f611d078484836120ee565b905060ff821180611d18575060ff81115b15611d3657604051631e4e01d760e21b815260040160405180910390fd5b60081b179450611cac9350505050565b600282511015611c9357604051630f16066b60e41b815260040160405180910390fd5b5f60608060ff851180611d7c575060ff84115b15611da457604051639b0f326160e01b81526004810186905260248101859052604401610ca3565b6040805160248101909152600386602383015385602283015360106021830153806020830153506004815260408051602081019091525f8152600197919650945092505050565b60605f611df783612130565b90505f611e058260206124e9565b9050606060405190508160200181016040528281526020850160208651028101602083015b81831015611e4d57602083515102806020855101835e6020939093019201611e2a565b50919695505050505050565b611ee66040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020016060815260200160608152602001606081526020015f815260200160608152602001606081525090565b5f6040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f801b81526020015f8152602001600481526020015f81526020015f81526020015f81526020015f801b815260200184815260200185815260200160046001600160401b03811115611f6b57611f6b612360565b604051908082528060200260200182016040528015611f94578160200160208202803683370190505b5081525f602080830182905260408084018b905260609384018a90528051601f01601f19168281528083018252835161ffff191681178452855290840182905283018190529082018190526080820181905260a08201819052610120820181905261014082018190526102008201529050611bc3565b5f80825f528360205360215f2090506001815f1a1b915062ffffff8116611b96575060019250929050565b5f5f1982036120475750610100919050565b507f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f7f5555555555555555555555555555555555555555555555555555555555555555600183901c16909103600281901c7f3333333333333333333333333333333333333333333333333333333333333333908116911601600481901c01167f01010101010101010101010101010101010101010101010101010101010101010260f81c90565b5f805f6120fc868686612179565b91509150806121275760405162bc8ecf60e31b81526004810187905260248101869052604401610ca3565b50949350505050565b5f60208201602083510281015b8082101561217257815151928301928084101561216657634e487b715f5260116020526024601cfd5b5060208201915061213d565b5050919050565b5f805f8512156121a657604051634a7d166b60e01b81526004810186905260248101859052604401610ca3565b845f036121b857505f90506001611abe565b8460ff84168501858112156121f35760405163c849483b60e01b8152600481018890526024810187905260ff86166044820152606401610ca3565b5f805f83121561223f57604c19831215612216575f809550955050505050611abe565b825f03600a0a915081848161222d5761222d6124b6565b0495505084029091149150611abe9050565b5f8313156122d857604d83131561227c5760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610ca3565b82600a0a9150815f1981612292576122926124b6565b048411156122c65760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610ca3565b5091909102925060019150611abe9050565b8360019550955050505050611abe565b6122f0612500565b565b5f60208284031215612302575f80fd5b81356001600160e01b031981168114612319575f80fd5b9392505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6123196020830184612320565b634e487b7160e01b5f52604160045260245ffd5b5f60208284031215612384575f80fd5b81356001600160401b038082111561239a575f80fd5b818401915084601f8301126123ad575f80fd5b8135818111156123bf576123bf612360565b604051601f8201601f19908116603f011681019083821181831017156123e7576123e7612360565b816040528281528760208487010111156123ff575f80fd5b826020860160208301375f928101602001929092525095945050505050565b83151581525f60206060602084015261243a6060840186612320565b8381036040850152845180825260208087019201905f5b8181101561246d57835183529284019291840191600101612451565b509098975050505050505050565b634e487b7160e01b5f52601160045260245ffd5b808201808211156101d1576101d161247b565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601260045260245ffd5b5f826124e457634e487b7160e01b5f52601260045260245ffd5b500490565b80820281158282048414176101d1576101d161247b565b634e487b7160e01b5f52605160045260245ffdfe1bec1bec1bec1bec1bec1bec1bec1bec1bec1bec1bec1bec1bec1bec1bec1bec1bec1c151cb11bec1bec1bec1bec1bec1bec1bec1bec1bec1bec1bec1bec1bec16cc16e916f8170717161726173517451754176417741783179317a217b217c217d217e117f016cc16f8170717161825183516cc16f8170717161825183518450101180010800082000100010480300038412a001810000010020004200004002038038ff54900cc66c61ff3dcab0616592209895f0b16fec9301b02e0920c5bfe561d21609201e959460b1974270f844db208bcd3bf1e989376111049db13b934301a0ae9a00af82a7805c138f40d28083f0742ef2104d561fd1415a13317716a6119d260cc107b9bfc0eec7ade15cba2891c6b14a512792bdb02e0f14718565589", + "object": "0x6080604052348015600e575f80fd5b506127d08061001c5f395ff3fe608060405234801561000f575f80fd5b506004361061007a575f3560e01c80636f5aa28d116100585780636f5aa28d146100dd578063c6c0cbb61461010b578063ccf4477514610135578063d6d8c9a814610148575f80fd5b806301ffc9a71461007e578063336284d4146100a6578063570c7a63146100bb575b5f80fd5b61009161008c366004612483565b610150565b60405190151581526020015b60405180910390f35b6100ae6101d7565b60405161009d91906124df565b6100ce6100c9366004612505565b610c81565b60405161009d939291906125af565b6040517f828494fa15dec168f2372c71a11064dc163f7783fb7f3a9a84df40a87861a368815260200161009d565b61011e610119366004612505565b610dc5565b60408051921515835260208301919091520161009d565b60408051602081019091525f81526100ae565b6100ae610dfd565b5f6001600160e01b031982166391ccb1d560e01b148061018057506001600160e01b03198216636f5aa28d60e01b145b8061019b57506001600160e01b03198216631a2c8edd60e01b145b806101b657506001600160e01b03198216630cd8a13560e21b145b806101d157506301ffc9a760e01b6001600160e01b03198316145b92915050565b60605f6101e660056001612620565b6101f1906001612620565b6101fc906003612620565b6001600160401b03811115610213576102136124f1565b60405190808252806020026020018201604052801561024657816020015b60608152602001906001900390816102315790505b50604080516002808252606082019092529192505f9190816020015b61247981526020019060019003908161026257905050905061182d815f8151811061028f5761028f612633565b60200260200101906001600160401b031690816001600160401b03168152505061184a816001815181106102c5576102c5612633565b6001600160401b039290921660209283029190910190910152604080516003808252608082019092525f91816020015b6124798152602001906001900390816102f5579050509050611859815f8151811061032257610322612633565b60200260200101906001600160401b031690816001600160401b0316815250506118688160018151811061035857610358612633565b60200260200101906001600160401b031690816001600160401b0316815250506118778160028151811061038e5761038e612633565b6001600160401b039290921660209283029190910190910152604080516002808252606082019092525f91816020015b6124798152602001906001900390816103be579050509050611887815f815181106103eb576103eb612633565b60200260200101906001600160401b031690816001600160401b0316815250506118968160018151811061042157610421612633565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b6124798152602001906001900390816104515790505090506118a6815f8151811061047e5761047e612633565b60200260200101906001600160401b031690816001600160401b0316815250506118b5816001815181106104b4576104b4612633565b60200260200101906001600160401b031690816001600160401b0316815250506118c5816002815181106104ea576104ea612633565b60200260200101906001600160401b031690816001600160401b0316815250506118d58160038151811061052057610520612633565b60200260200101906001600160401b031690816001600160401b0316815250506118e48160048151811061055657610556612633565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b6124798152602001906001900390816105865790505090506118f4815f815181106105b3576105b3612633565b60200260200101906001600160401b031690816001600160401b031681525050611903816001815181106105e9576105e9612633565b60200260200101906001600160401b031690816001600160401b0316815250506119138160028151811061061f5761061f612633565b60200260200101906001600160401b031690816001600160401b0316815250506119238160038151811061065557610655612633565b60200260200101906001600160401b031690816001600160401b0316815250506119338160048151811061068b5761068b612633565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6124798152602001906001900390816106ba579050509050611942815f815181106106e7576106e7612633565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b612479815260200190600190039081610716579050509050611951815f8151811061074357610743612633565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b61247981526020019060019003908161077257905050905061196a815f8151811061079f5761079f612633565b60200260200101906001600160401b031690816001600160401b03168152505087895f815181106107d2576107d2612633565b602002602001018190525086896001815181106107f1576107f1612633565b6020026020010181905250858960028151811061081057610810612633565b6020026020010181905250848960038151811061082f5761082f612633565b6020026020010181905250838960048151811061084e5761084e612633565b6020026020010181905250828960058151811061086d5761086d612633565b6020908102919091010152818961088660056001612620565b8151811061089657610896612633565b602090810291909101015280896108af60056001612620565b6108ba906001612620565b815181106108ca576108ca612633565b602090810291909101015260408051600680825260e082019092525f91816020015b6124798152602001906001900390816108ec57905050905061182d815f8151811061091957610919612633565b60200260200101906001600160401b031690816001600160401b0316815250506118598160018151811061094f5761094f612633565b60200260200101906001600160401b031690816001600160401b0316815250506118688160028151811061098557610985612633565b60200260200101906001600160401b031690816001600160401b031681525050611877816003815181106109bb576109bb612633565b60200260200101906001600160401b031690816001600160401b0316815250506119b6816004815181106109f1576109f1612633565b60200260200101906001600160401b031690816001600160401b0316815250506119c681600581518110610a2757610a27612633565b6001600160401b0390921660209283029190910190910152808a610a4d60056001612620565b610a58906001612620565b610a63906001612620565b81518110610a7357610a73612633565b602090810291909101015260408051600780825261010082019092525f91816020015b612479815260200190600190039081610a9657905050905061182d815f81518110610ac357610ac3612633565b60200260200101906001600160401b031690816001600160401b03168152505061185981600181518110610af957610af9612633565b60200260200101906001600160401b031690816001600160401b03168152505061186881600281518110610b2f57610b2f612633565b60200260200101906001600160401b031690816001600160401b03168152505061187781600381518110610b6557610b65612633565b60200260200101906001600160401b031690816001600160401b0316815250506119b681600481518110610b9b57610b9b612633565b60200260200101906001600160401b031690816001600160401b0316815250506119c681600581518110610bd157610bd1612633565b60200260200101906001600160401b031690816001600160401b0316815250506119d681600681518110610c0757610c07612633565b6001600160401b0390921660209283029190910190910152808b610c2d60056001612620565b610c38906001612620565b610c43906002612620565b81518110610c5357610c53612633565b60209081029190910101528a610c70610c6b826119e6565b6119fb565b9c5050505050505050505050505090565b5f6060805f805f610ca187610c94611a8a565b610c9c611aaa565b611aca565b9250925092505f610cb782610220015160200190565b90505f8261022001515182610ccc9190612620565b90505f610cea83836f07fffffe0000000003ff200000000000611bbb565b80925081945050505f80610d0386610240015184611c57565b915091508115610d98575f610d188783611d2e565b90506124795f610d26611d5d565b90505f60028251610d37919061265b565b9050808510610d68576040516303bdd1b160e51b815260048101869052602481018290526044015b60405180910390fd5b6001850160020282015161ffff169250610d818c8c8686565b9e509e509e50505050505050505050505050610dbe565b5050604080515f80825281830190925260208101828152919a5090985096505050505050505b9193909250565b5f805f805f610ded866002810151815160228084019461ffff93909316840101920160200190565b505f988998509650505050505050565b60605f610e0c60056001612620565b610e17906001612620565b610e22906003612620565b6001600160401b03811115610e3957610e396124f1565b604051908082528060200260200182016040528015610e6c57816020015b6060815260200190600190039081610e575790505b50604080516002808252606082019092529192505f9190816020015b612479815260200190600190039081610e88579050509050611d7d815f81518110610eb557610eb5612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d81600181518110610eeb57610eeb612633565b6001600160401b039290921660209283029190910190910152604080516003808252608082019092525f91816020015b612479815260200190600190039081610f1b579050509050611d7d815f81518110610f4857610f48612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d81600181518110610f7e57610f7e612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d81600281518110610fb457610fb4612633565b6001600160401b039290921660209283029190910190910152604080516002808252606082019092525f91816020015b612479815260200190600190039081610fe4579050509050611d7d815f8151811061101157611011612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d8160018151811061104757611047612633565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b612479815260200190600190039081611077579050509050611d7d815f815181106110a4576110a4612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d816001815181106110da576110da612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d8160028151811061111057611110612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d8160038151811061114657611146612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d8160048151811061117c5761117c612633565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b6124798152602001906001900390816111ac579050509050611d7d815f815181106111d9576111d9612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d8160018151811061120f5761120f612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d8160028151811061124557611245612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d8160038151811061127b5761127b612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d816004815181106112b1576112b1612633565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6124798152602001906001900390816112e0579050509050611da6815f8151811061130d5761130d612633565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b61247981526020019060019003908161133c579050509050611da6815f8151811061136957611369612633565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b612479815260200190600190039081611398579050509050611e42815f815181106113c5576113c5612633565b60200260200101906001600160401b031690816001600160401b03168152505087895f815181106113f8576113f8612633565b6020026020010181905250868960018151811061141757611417612633565b6020026020010181905250858960028151811061143657611436612633565b6020026020010181905250848960038151811061145557611455612633565b6020026020010181905250838960048151811061147457611474612633565b6020026020010181905250828960058151811061149357611493612633565b602090810291909101015281896114ac60056001612620565b815181106114bc576114bc612633565b602090810291909101015280896114d560056001612620565b6114e0906001612620565b815181106114f0576114f0612633565b602090810291909101015260408051600680825260e082019092525f91816020015b612479815260200190600190039081611512579050509050611d7d815f8151811061153f5761153f612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d8160018151811061157557611575612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d816002815181106115ab576115ab612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d816003815181106115e1576115e1612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d8160048151811061161757611617612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d8160058151811061164d5761164d612633565b6001600160401b0390921660209283029190910190910152808a61167360056001612620565b61167e906001612620565b611689906001612620565b8151811061169957611699612633565b602090810291909101015260408051600780825261010082019092525f91816020015b6124798152602001906001900390816116bc579050509050611d7d815f815181106116e9576116e9612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d8160018151811061171f5761171f612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d8160028151811061175557611755612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d8160038151811061178b5761178b612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d816004815181106117c1576117c1612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d816005815181106117f7576117f7612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d81600681518110610c0757610c07612633565b5f60608061183b5f80611efa565b92509250925093509350939050565b5f60608061183b5f6001611efa565b5f60608061183b60015f611efa565b5f60608061183b600180611efa565b5f60608061183b60016002611efa565b5f60608061183b60025f611efa565b5f60608061183b60026001611efa565b5f60608061183b60035f611efa565b5f60608061183b60036001611efa565b5f60608061183b60036002611efa565b5f60608061183b600380611efa565b5f60608061183b60036004611efa565b5f60608061183b60045f611efa565b5f60608061183b60046001611efa565b5f60608061183b60046002611efa565b5f60608061183b60046003611efa565b5f60608061183b600480611efa565b5f60608061183b600585611efa565b5f60608061183b61196460056001612620565b85611efa565b5f60608060ff80851690600886901c166119a58261198a60056001612620565b611995906001612620565b61199f9190612620565b82611efa565b945094509450505093509350939050565b5f60608061183b60016003611efa565b5f60608061183b60016004611efa565b5f60608061183b60016005611efa565b6060815f6119f382611f7c565b949350505050565b60605f82516002026001600160401b03811115611a1a57611a1a6124f1565b6040519080825280601f01601f191660200182016040528015611a44576020820181803683370190505b50905061ffff80196020850160208651028101600285015b81831015611a7e57805183518616908516178152602090920191600201611a5c565b50939695505050505050565b60606040518060e0016040528060a681526020016126e860a69139905090565b606060405180608001604052806042815260200161278e60429139905090565b5f80611b596040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020016060815260200160608152602001606081526020015f815260200160608152602001606081525090565b606061ffff600288015116935060ff600388015116925061ffff600588015116600588019750808852602081018801915050611ba587878760405180602001604052805f815250611fea565b915080826101e001819052505093509350939050565b5f808060018187870360208111611bd25780611bd5565b60205b915050875192505b8519600184841a1b16158183101615611bfb57600182019150611bdd565b9681019660208290036008810293841c90931b92611c465760408051602081018590520160408051601f198184030181529082905263e47fe8b760e01b8252610d5f916004016124df565b50869350909150505b935093915050565b600182810180515f928392600560ff93909316602102870192830192909101835b81831015611d1c5760018301516021909301805190935f90819060ff168180611ca1838e61219b565b915091508186165f03611cc3575f809b509b5050505050505050505050611d27565b5f87611cd36001850389166121c6565b016004028b015195505062ffffff9081169350841683039150611d079050575060019750601c1a9550611d27945050505050565b611d10836121c6565b84019350505050611c78565b5f8095509550505050505b9250929050565b6101c08201516002828102820101516101e08401515f9261ffff9092169190611d549083565b95945050505050565b60606040518060800160405280604281526020016126a660429139905090565b5f81515f14611d9f576040516304f8b58160e51b815260040160405180910390fd5b505f919050565b5f8151600103611e03575060208101516001600160e01b038116601b0b60e082901d5f611dd483838361227f565b905061ffff811115611df957604051631e4e01d760e21b815260040160405180910390fd5b9250611e3d915050565b81515f03611e2457604051630f16066b60e41b815260040160405180910390fd5b604051630358cd2160e31b815260040160405180910390fd5b919050565b5f8151600203611ed757602082015160408301516001600160e01b038216601b0b60e083901d5f611e7483838361227f565b6001600160e01b038516601b0b935060e085901d925090505f611e9884848361227f565b905060ff821180611ea9575060ff81115b15611ec757604051631e4e01d760e21b815260040160405180910390fd5b60081b179450611e3d9350505050565b600282511015611e2457604051630f16066b60e41b815260040160405180910390fd5b5f60608060ff851180611f0d575060ff84115b15611f3557604051639b0f326160e01b81526004810186905260248101859052604401610d5f565b6040805160248101909152600386602383015385602283015360106021830153806020830153506004815260408051602081019091525f8152600197919650945092505050565b60605f611f88836122c1565b90505f611f9682602061267a565b9050606060405190508160200181016040528281526020850160208651028101602083015b81831015611fde57602083515102806020855101835e6020939093019201611fbb565b50919695505050505050565b6120776040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020016060815260200160608152602001606081526020015f815260200160608152602001606081525090565b5f6040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f801b81526020015f8152602001600481526020015f81526020015f81526020015f81526020015f801b815260200184815260200185815260200160046001600160401b038111156120fc576120fc6124f1565b604051908082528060200260200182016040528015612125578160200160208202803683370190505b5081525f602080830182905260408084018b905260609384018a90528051601f01601f19168281528083018252835161ffff191681178452855290840182905283018190529082018190526080820181905260a08201819052610120820181905261014082018190526102008201529050611d54565b5f80825f528360205360215f2090506001815f1a1b915062ffffff8116611d27575060019250929050565b5f5f1982036121d85750610100919050565b507f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f7f5555555555555555555555555555555555555555555555555555555555555555600183901c16909103600281901c7f3333333333333333333333333333333333333333333333333333333333333333908116911601600481901c01167f01010101010101010101010101010101010101010101010101010101010101010260f81c90565b5f805f61228d86868661230a565b91509150806122b85760405162bc8ecf60e31b81526004810187905260248101869052604401610d5f565b50949350505050565b5f60208201602083510281015b808210156123035781515192830192808410156122f757634e487b715f5260116020526024601cfd5b506020820191506122ce565b5050919050565b5f805f85121561233757604051634a7d166b60e01b81526004810186905260248101859052604401610d5f565b845f0361234957505f90506001611c4f565b8460ff84168501858112156123845760405163c849483b60e01b8152600481018890526024810187905260ff86166044820152606401610d5f565b5f805f8312156123d057604c198312156123a7575f809550955050505050611c4f565b825f03600a0a91508184816123be576123be612647565b0495505084029091149150611c4f9050565b5f83131561246957604d83131561240d5760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610d5f565b82600a0a9150815f198161242357612423612647565b048411156124575760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610d5f565b5091909102925060019150611c4f9050565b8360019550955050505050611c4f565b612481612691565b565b5f60208284031215612493575f80fd5b81356001600160e01b0319811681146124aa575f80fd5b9392505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6124aa60208301846124b1565b634e487b7160e01b5f52604160045260245ffd5b5f60208284031215612515575f80fd5b81356001600160401b038082111561252b575f80fd5b818401915084601f83011261253e575f80fd5b813581811115612550576125506124f1565b604051601f8201601f19908116603f01168101908382118183101715612578576125786124f1565b81604052828152876020848701011115612590575f80fd5b826020860160208301375f928101602001929092525095945050505050565b83151581525f6020606060208401526125cb60608401866124b1565b8381036040850152845180825260208087019201905f5b818110156125fe578351835292840192918401916001016125e2565b509098975050505050505050565b634e487b7160e01b5f52601160045260245ffd5b808201808211156101d1576101d161260c565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601260045260245ffd5b5f8261267557634e487b7160e01b5f52601260045260245ffd5b500490565b80820281158282048414176101d1576101d161260c565b634e487b7160e01b5f52605160045260245ffdfe182d184a1859186818771887189618a618b518c518d518e418f4190319131923193319421951196a182d18591868187719b619c6182d18591868187719b619c619d60101180010800082000100010480300038412a001810000010020004200005002038038ff54900cc66c620f3dcab0616592212c9ec8109895f0b17fec9301c02e0920c5bfe561e21609201e959460b1974270f844db208bcd3bf1f989376111049db14b934301b0ae9a00af82a7805c138f40d28083f0742ef2104d561fd1515a13318716a611ad260cc107b9bfc0eec7ade16cba2891d6b14a513792bdb02e0f147195655891d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1da61da61e421d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d", "linkReferences": {} } } diff --git a/subgraph/generated/Raindex/Raindex.ts b/subgraph/generated/Raindex/Raindex.ts index 5b3246aa8c..a262e2ea3f 100644 --- a/subgraph/generated/Raindex/Raindex.ts +++ b/subgraph/generated/Raindex/Raindex.ts @@ -550,16 +550,16 @@ export class RemoveOrderV3OrderValidOutputsStruct extends ethereum.Tuple { } } -export class TakeOrderV3 extends ethereum.Event { - get params(): TakeOrderV3__Params { - return new TakeOrderV3__Params(this); +export class TakeOrderV4 extends ethereum.Event { + get params(): TakeOrderV4__Params { + return new TakeOrderV4__Params(this); } } -export class TakeOrderV3__Params { - _event: TakeOrderV3; +export class TakeOrderV4__Params { + _event: TakeOrderV4; - constructor(event: TakeOrderV3) { + constructor(event: TakeOrderV4) { this._event = event; } @@ -567,8 +567,8 @@ export class TakeOrderV3__Params { return this._event.parameters[0].value.toAddress(); } - get config(): TakeOrderV3ConfigStruct { - return changetype( + get config(): TakeOrderV4ConfigStruct { + return changetype( this._event.parameters[1].value.toTuple(), ); } @@ -582,9 +582,9 @@ export class TakeOrderV3__Params { } } -export class TakeOrderV3ConfigStruct extends ethereum.Tuple { - get order(): TakeOrderV3ConfigOrderStruct { - return changetype(this[0].toTuple()); +export class TakeOrderV4ConfigStruct extends ethereum.Tuple { + get order(): TakeOrderV4ConfigOrderStruct { + return changetype(this[0].toTuple()); } get inputIOIndex(): BigInt { @@ -595,26 +595,26 @@ export class TakeOrderV3ConfigStruct extends ethereum.Tuple { return this[2].toBigInt(); } - get signedContext(): Array { - return this[3].toTupleArray(); + get signedContext(): Array { + return this[3].toTupleArray(); } } -export class TakeOrderV3ConfigOrderStruct extends ethereum.Tuple { +export class TakeOrderV4ConfigOrderStruct extends ethereum.Tuple { get owner(): Address { return this[0].toAddress(); } - get evaluable(): TakeOrderV3ConfigOrderEvaluableStruct { - return changetype(this[1].toTuple()); + get evaluable(): TakeOrderV4ConfigOrderEvaluableStruct { + return changetype(this[1].toTuple()); } - get validInputs(): Array { - return this[2].toTupleArray(); + get validInputs(): Array { + return this[2].toTupleArray(); } - get validOutputs(): Array { - return this[3].toTupleArray(); + get validOutputs(): Array { + return this[3].toTupleArray(); } get nonce(): Bytes { @@ -622,7 +622,7 @@ export class TakeOrderV3ConfigOrderStruct extends ethereum.Tuple { } } -export class TakeOrderV3ConfigOrderEvaluableStruct extends ethereum.Tuple { +export class TakeOrderV4ConfigOrderEvaluableStruct extends ethereum.Tuple { get interpreter(): Address { return this[0].toAddress(); } @@ -636,7 +636,7 @@ export class TakeOrderV3ConfigOrderEvaluableStruct extends ethereum.Tuple { } } -export class TakeOrderV3ConfigOrderValidInputsStruct extends ethereum.Tuple { +export class TakeOrderV4ConfigOrderValidInputsStruct extends ethereum.Tuple { get token(): Address { return this[0].toAddress(); } @@ -646,7 +646,7 @@ export class TakeOrderV3ConfigOrderValidInputsStruct extends ethereum.Tuple { } } -export class TakeOrderV3ConfigOrderValidOutputsStruct extends ethereum.Tuple { +export class TakeOrderV4ConfigOrderValidOutputsStruct extends ethereum.Tuple { get token(): Address { return this[0].toAddress(); } @@ -656,17 +656,21 @@ export class TakeOrderV3ConfigOrderValidOutputsStruct extends ethereum.Tuple { } } -export class TakeOrderV3ConfigSignedContextStruct extends ethereum.Tuple { +export class TakeOrderV4ConfigSignedContextStruct extends ethereum.Tuple { get signer(): Address { return this[0].toAddress(); } + get domainSeparator(): Bytes { + return this[1].toBytes(); + } + get context(): Array { - return this[1].toBytesArray(); + return this[2].toBytesArray(); } get signature(): Bytes { - return this[2].toBytes(); + return this[3].toBytes(); } } @@ -708,19 +712,19 @@ export class WithdrawV2__Params { } } -export class Raindex__addOrder4InputOrderConfigStruct extends ethereum.Tuple { - get evaluable(): Raindex__addOrder4InputOrderConfigEvaluableStruct { - return changetype( +export class Raindex__addOrder5InputOrderConfigStruct extends ethereum.Tuple { + get evaluable(): Raindex__addOrder5InputOrderConfigEvaluableStruct { + return changetype( this[0].toTuple(), ); } - get validInputs(): Array { - return this[1].toTupleArray(); + get validInputs(): Array { + return this[1].toTupleArray(); } - get validOutputs(): Array { - return this[2].toTupleArray(); + get validOutputs(): Array { + return this[2].toTupleArray(); } get nonce(): Bytes { @@ -736,7 +740,7 @@ export class Raindex__addOrder4InputOrderConfigStruct extends ethereum.Tuple { } } -export class Raindex__addOrder4InputOrderConfigEvaluableStruct extends ethereum.Tuple { +export class Raindex__addOrder5InputOrderConfigEvaluableStruct extends ethereum.Tuple { get interpreter(): Address { return this[0].toAddress(); } @@ -750,7 +754,7 @@ export class Raindex__addOrder4InputOrderConfigEvaluableStruct extends ethereum. } } -export class Raindex__addOrder4InputOrderConfigValidInputsStruct extends ethereum.Tuple { +export class Raindex__addOrder5InputOrderConfigValidInputsStruct extends ethereum.Tuple { get token(): Address { return this[0].toAddress(); } @@ -760,7 +764,7 @@ export class Raindex__addOrder4InputOrderConfigValidInputsStruct extends ethereu } } -export class Raindex__addOrder4InputOrderConfigValidOutputsStruct extends ethereum.Tuple { +export class Raindex__addOrder5InputOrderConfigValidOutputsStruct extends ethereum.Tuple { get token(): Address { return this[0].toAddress(); } @@ -770,19 +774,19 @@ export class Raindex__addOrder4InputOrderConfigValidOutputsStruct extends ethere } } -export class Raindex__addOrder4InputPostStruct extends ethereum.Tuple { - get evaluable(): Raindex__addOrder4InputPostEvaluableStruct { - return changetype( +export class Raindex__addOrder5InputPostStruct extends ethereum.Tuple { + get evaluable(): Raindex__addOrder5InputPostEvaluableStruct { + return changetype( this[0].toTuple(), ); } - get signedContext(): Array { - return this[1].toTupleArray(); + get signedContext(): Array { + return this[1].toTupleArray(); } } -export class Raindex__addOrder4InputPostEvaluableStruct extends ethereum.Tuple { +export class Raindex__addOrder5InputPostEvaluableStruct extends ethereum.Tuple { get interpreter(): Address { return this[0].toAddress(); } @@ -796,21 +800,25 @@ export class Raindex__addOrder4InputPostEvaluableStruct extends ethereum.Tuple { } } -export class Raindex__addOrder4InputPostSignedContextStruct extends ethereum.Tuple { +export class Raindex__addOrder5InputPostSignedContextStruct extends ethereum.Tuple { get signer(): Address { return this[0].toAddress(); } + get domainSeparator(): Bytes { + return this[1].toBytes(); + } + get context(): Array { - return this[1].toBytesArray(); + return this[2].toBytesArray(); } get signature(): Bytes { - return this[2].toBytes(); + return this[3].toBytes(); } } -export class Raindex__quote2Result { +export class Raindex__quote3Result { value0: boolean; value1: Bytes; value2: Bytes; @@ -842,9 +850,9 @@ export class Raindex__quote2Result { } } -export class Raindex__quote2InputQuoteConfigStruct extends ethereum.Tuple { - get order(): Raindex__quote2InputQuoteConfigOrderStruct { - return changetype( +export class Raindex__quote3InputQuoteConfigStruct extends ethereum.Tuple { + get order(): Raindex__quote3InputQuoteConfigOrderStruct { + return changetype( this[0].toTuple(), ); } @@ -857,28 +865,28 @@ export class Raindex__quote2InputQuoteConfigStruct extends ethereum.Tuple { return this[2].toBigInt(); } - get signedContext(): Array { - return this[3].toTupleArray(); + get signedContext(): Array { + return this[3].toTupleArray(); } } -export class Raindex__quote2InputQuoteConfigOrderStruct extends ethereum.Tuple { +export class Raindex__quote3InputQuoteConfigOrderStruct extends ethereum.Tuple { get owner(): Address { return this[0].toAddress(); } - get evaluable(): Raindex__quote2InputQuoteConfigOrderEvaluableStruct { - return changetype( + get evaluable(): Raindex__quote3InputQuoteConfigOrderEvaluableStruct { + return changetype( this[1].toTuple(), ); } - get validInputs(): Array { - return this[2].toTupleArray(); + get validInputs(): Array { + return this[2].toTupleArray(); } - get validOutputs(): Array { - return this[3].toTupleArray(); + get validOutputs(): Array { + return this[3].toTupleArray(); } get nonce(): Bytes { @@ -886,7 +894,7 @@ export class Raindex__quote2InputQuoteConfigOrderStruct extends ethereum.Tuple { } } -export class Raindex__quote2InputQuoteConfigOrderEvaluableStruct extends ethereum.Tuple { +export class Raindex__quote3InputQuoteConfigOrderEvaluableStruct extends ethereum.Tuple { get interpreter(): Address { return this[0].toAddress(); } @@ -900,7 +908,7 @@ export class Raindex__quote2InputQuoteConfigOrderEvaluableStruct extends ethereu } } -export class Raindex__quote2InputQuoteConfigOrderValidInputsStruct extends ethereum.Tuple { +export class Raindex__quote3InputQuoteConfigOrderValidInputsStruct extends ethereum.Tuple { get token(): Address { return this[0].toAddress(); } @@ -910,7 +918,7 @@ export class Raindex__quote2InputQuoteConfigOrderValidInputsStruct extends ether } } -export class Raindex__quote2InputQuoteConfigOrderValidOutputsStruct extends ethereum.Tuple { +export class Raindex__quote3InputQuoteConfigOrderValidOutputsStruct extends ethereum.Tuple { get token(): Address { return this[0].toAddress(); } @@ -920,37 +928,41 @@ export class Raindex__quote2InputQuoteConfigOrderValidOutputsStruct extends ethe } } -export class Raindex__quote2InputQuoteConfigSignedContextStruct extends ethereum.Tuple { +export class Raindex__quote3InputQuoteConfigSignedContextStruct extends ethereum.Tuple { get signer(): Address { return this[0].toAddress(); } + get domainSeparator(): Bytes { + return this[1].toBytes(); + } + get context(): Array { - return this[1].toBytesArray(); + return this[2].toBytesArray(); } get signature(): Bytes { - return this[2].toBytes(); + return this[3].toBytes(); } } -export class Raindex__removeOrder3InputOrderStruct extends ethereum.Tuple { +export class Raindex__removeOrder4InputOrderStruct extends ethereum.Tuple { get owner(): Address { return this[0].toAddress(); } - get evaluable(): Raindex__removeOrder3InputOrderEvaluableStruct { - return changetype( + get evaluable(): Raindex__removeOrder4InputOrderEvaluableStruct { + return changetype( this[1].toTuple(), ); } - get validInputs(): Array { - return this[2].toTupleArray(); + get validInputs(): Array { + return this[2].toTupleArray(); } - get validOutputs(): Array { - return this[3].toTupleArray(); + get validOutputs(): Array { + return this[3].toTupleArray(); } get nonce(): Bytes { @@ -958,7 +970,7 @@ export class Raindex__removeOrder3InputOrderStruct extends ethereum.Tuple { } } -export class Raindex__removeOrder3InputOrderEvaluableStruct extends ethereum.Tuple { +export class Raindex__removeOrder4InputOrderEvaluableStruct extends ethereum.Tuple { get interpreter(): Address { return this[0].toAddress(); } @@ -972,7 +984,7 @@ export class Raindex__removeOrder3InputOrderEvaluableStruct extends ethereum.Tup } } -export class Raindex__removeOrder3InputOrderValidInputsStruct extends ethereum.Tuple { +export class Raindex__removeOrder4InputOrderValidInputsStruct extends ethereum.Tuple { get token(): Address { return this[0].toAddress(); } @@ -982,7 +994,7 @@ export class Raindex__removeOrder3InputOrderValidInputsStruct extends ethereum.T } } -export class Raindex__removeOrder3InputOrderValidOutputsStruct extends ethereum.Tuple { +export class Raindex__removeOrder4InputOrderValidOutputsStruct extends ethereum.Tuple { get token(): Address { return this[0].toAddress(); } @@ -992,19 +1004,19 @@ export class Raindex__removeOrder3InputOrderValidOutputsStruct extends ethereum. } } -export class Raindex__removeOrder3InputPostStruct extends ethereum.Tuple { - get evaluable(): Raindex__removeOrder3InputPostEvaluableStruct { - return changetype( +export class Raindex__removeOrder4InputPostStruct extends ethereum.Tuple { + get evaluable(): Raindex__removeOrder4InputPostEvaluableStruct { + return changetype( this[0].toTuple(), ); } - get signedContext(): Array { - return this[1].toTupleArray(); + get signedContext(): Array { + return this[1].toTupleArray(); } } -export class Raindex__removeOrder3InputPostEvaluableStruct extends ethereum.Tuple { +export class Raindex__removeOrder4InputPostEvaluableStruct extends ethereum.Tuple { get interpreter(): Address { return this[0].toAddress(); } @@ -1018,21 +1030,25 @@ export class Raindex__removeOrder3InputPostEvaluableStruct extends ethereum.Tupl } } -export class Raindex__removeOrder3InputPostSignedContextStruct extends ethereum.Tuple { +export class Raindex__removeOrder4InputPostSignedContextStruct extends ethereum.Tuple { get signer(): Address { return this[0].toAddress(); } + get domainSeparator(): Bytes { + return this[1].toBytes(); + } + get context(): Array { - return this[1].toBytesArray(); + return this[2].toBytesArray(); } get signature(): Bytes { - return this[2].toBytes(); + return this[3].toBytes(); } } -export class Raindex__takeOrders4Result { +export class Raindex__takeOrders5Result { value0: Bytes; value1: Bytes; @@ -1057,7 +1073,7 @@ export class Raindex__takeOrders4Result { } } -export class Raindex__takeOrders4InputConfigStruct extends ethereum.Tuple { +export class Raindex__takeOrders5InputConfigStruct extends ethereum.Tuple { get minimumIO(): Bytes { return this[0].toBytes(); } @@ -1074,8 +1090,8 @@ export class Raindex__takeOrders4InputConfigStruct extends ethereum.Tuple { return this[3].toBoolean(); } - get orders(): Array { - return this[4].toTupleArray(); + get orders(): Array { + return this[4].toTupleArray(); } get data(): Bytes { @@ -1083,9 +1099,9 @@ export class Raindex__takeOrders4InputConfigStruct extends ethereum.Tuple { } } -export class Raindex__takeOrders4InputConfigOrdersStruct extends ethereum.Tuple { - get order(): Raindex__takeOrders4InputConfigOrdersOrderStruct { - return changetype( +export class Raindex__takeOrders5InputConfigOrdersStruct extends ethereum.Tuple { + get order(): Raindex__takeOrders5InputConfigOrdersOrderStruct { + return changetype( this[0].toTuple(), ); } @@ -1098,28 +1114,28 @@ export class Raindex__takeOrders4InputConfigOrdersStruct extends ethereum.Tuple return this[2].toBigInt(); } - get signedContext(): Array { - return this[3].toTupleArray(); + get signedContext(): Array { + return this[3].toTupleArray(); } } -export class Raindex__takeOrders4InputConfigOrdersOrderStruct extends ethereum.Tuple { +export class Raindex__takeOrders5InputConfigOrdersOrderStruct extends ethereum.Tuple { get owner(): Address { return this[0].toAddress(); } - get evaluable(): Raindex__takeOrders4InputConfigOrdersOrderEvaluableStruct { - return changetype( + get evaluable(): Raindex__takeOrders5InputConfigOrdersOrderEvaluableStruct { + return changetype( this[1].toTuple(), ); } - get validInputs(): Array { - return this[2].toTupleArray(); + get validInputs(): Array { + return this[2].toTupleArray(); } - get validOutputs(): Array { - return this[3].toTupleArray(); + get validOutputs(): Array { + return this[3].toTupleArray(); } get nonce(): Bytes { @@ -1127,7 +1143,7 @@ export class Raindex__takeOrders4InputConfigOrdersOrderStruct extends ethereum.T } } -export class Raindex__takeOrders4InputConfigOrdersOrderEvaluableStruct extends ethereum.Tuple { +export class Raindex__takeOrders5InputConfigOrdersOrderEvaluableStruct extends ethereum.Tuple { get interpreter(): Address { return this[0].toAddress(); } @@ -1141,7 +1157,7 @@ export class Raindex__takeOrders4InputConfigOrdersOrderEvaluableStruct extends e } } -export class Raindex__takeOrders4InputConfigOrdersOrderValidInputsStruct extends ethereum.Tuple { +export class Raindex__takeOrders5InputConfigOrdersOrderValidInputsStruct extends ethereum.Tuple { get token(): Address { return this[0].toAddress(); } @@ -1151,7 +1167,7 @@ export class Raindex__takeOrders4InputConfigOrdersOrderValidInputsStruct extends } } -export class Raindex__takeOrders4InputConfigOrdersOrderValidOutputsStruct extends ethereum.Tuple { +export class Raindex__takeOrders5InputConfigOrdersOrderValidOutputsStruct extends ethereum.Tuple { get token(): Address { return this[0].toAddress(); } @@ -1161,17 +1177,21 @@ export class Raindex__takeOrders4InputConfigOrdersOrderValidOutputsStruct extend } } -export class Raindex__takeOrders4InputConfigOrdersSignedContextStruct extends ethereum.Tuple { +export class Raindex__takeOrders5InputConfigOrdersSignedContextStruct extends ethereum.Tuple { get signer(): Address { return this[0].toAddress(); } + get domainSeparator(): Bytes { + return this[1].toBytes(); + } + get context(): Array { - return this[1].toBytesArray(); + return this[2].toBytesArray(); } get signature(): Bytes { - return this[2].toBytes(); + return this[3].toBytes(); } } @@ -1180,13 +1200,13 @@ export class Raindex extends ethereum.SmartContract { return new Raindex("Raindex", address); } - addOrder4( - orderConfig: Raindex__addOrder4InputOrderConfigStruct, - post: Array, + addOrder5( + orderConfig: Raindex__addOrder5InputOrderConfigStruct, + post: Array, ): boolean { let result = super.call( - "addOrder4", - "addOrder4(((address,address,bytes),(address,bytes32)[],(address,bytes32)[],bytes32,bytes32,bytes),((address,address,bytes),(address,bytes32[],bytes)[])[]):(bool)", + "addOrder5", + "addOrder5(((address,address,bytes),(address,bytes32)[],(address,bytes32)[],bytes32,bytes32,bytes),((address,address,bytes),(address,bytes32,bytes32[],bytes)[])[]):(bool)", [ ethereum.Value.fromTuple(orderConfig), ethereum.Value.fromTupleArray(post), @@ -1196,13 +1216,13 @@ export class Raindex extends ethereum.SmartContract { return result[0].toBoolean(); } - try_addOrder4( - orderConfig: Raindex__addOrder4InputOrderConfigStruct, - post: Array, + try_addOrder5( + orderConfig: Raindex__addOrder5InputOrderConfigStruct, + post: Array, ): ethereum.CallResult { let result = super.tryCall( - "addOrder4", - "addOrder4(((address,address,bytes),(address,bytes32)[],(address,bytes32)[],bytes32,bytes32,bytes),((address,address,bytes),(address,bytes32[],bytes)[])[]):(bool)", + "addOrder5", + "addOrder5(((address,address,bytes),(address,bytes32)[],(address,bytes32)[],bytes32,bytes32,bytes),((address,address,bytes),(address,bytes32,bytes32[],bytes)[])[]):(bool)", [ ethereum.Value.fromTuple(orderConfig), ethereum.Value.fromTupleArray(post), @@ -1342,28 +1362,28 @@ export class Raindex extends ethereum.SmartContract { return ethereum.CallResult.fromValue(value[0].toBoolean()); } - quote2( - quoteConfig: Raindex__quote2InputQuoteConfigStruct, - ): Raindex__quote2Result { + quote3( + quoteConfig: Raindex__quote3InputQuoteConfigStruct, + ): Raindex__quote3Result { let result = super.call( - "quote2", - "quote2(((address,(address,address,bytes),(address,bytes32)[],(address,bytes32)[],bytes32),uint256,uint256,(address,bytes32[],bytes)[])):(bool,bytes32,bytes32)", + "quote3", + "quote3(((address,(address,address,bytes),(address,bytes32)[],(address,bytes32)[],bytes32),uint256,uint256,(address,bytes32,bytes32[],bytes)[])):(bool,bytes32,bytes32)", [ethereum.Value.fromTuple(quoteConfig)], ); - return new Raindex__quote2Result( + return new Raindex__quote3Result( result[0].toBoolean(), result[1].toBytes(), result[2].toBytes(), ); } - try_quote2( - quoteConfig: Raindex__quote2InputQuoteConfigStruct, - ): ethereum.CallResult { + try_quote3( + quoteConfig: Raindex__quote3InputQuoteConfigStruct, + ): ethereum.CallResult { let result = super.tryCall( - "quote2", - "quote2(((address,(address,address,bytes),(address,bytes32)[],(address,bytes32)[],bytes32),uint256,uint256,(address,bytes32[],bytes)[])):(bool,bytes32,bytes32)", + "quote3", + "quote3(((address,(address,address,bytes),(address,bytes32)[],(address,bytes32)[],bytes32),uint256,uint256,(address,bytes32,bytes32[],bytes)[])):(bool,bytes32,bytes32)", [ethereum.Value.fromTuple(quoteConfig)], ); if (result.reverted) { @@ -1371,7 +1391,7 @@ export class Raindex extends ethereum.SmartContract { } let value = result.value; return ethereum.CallResult.fromValue( - new Raindex__quote2Result( + new Raindex__quote3Result( value[0].toBoolean(), value[1].toBytes(), value[2].toBytes(), @@ -1379,26 +1399,26 @@ export class Raindex extends ethereum.SmartContract { ); } - removeOrder3( - order: Raindex__removeOrder3InputOrderStruct, - post: Array, + removeOrder4( + order: Raindex__removeOrder4InputOrderStruct, + post: Array, ): boolean { let result = super.call( - "removeOrder3", - "removeOrder3((address,(address,address,bytes),(address,bytes32)[],(address,bytes32)[],bytes32),((address,address,bytes),(address,bytes32[],bytes)[])[]):(bool)", + "removeOrder4", + "removeOrder4((address,(address,address,bytes),(address,bytes32)[],(address,bytes32)[],bytes32),((address,address,bytes),(address,bytes32,bytes32[],bytes)[])[]):(bool)", [ethereum.Value.fromTuple(order), ethereum.Value.fromTupleArray(post)], ); return result[0].toBoolean(); } - try_removeOrder3( - order: Raindex__removeOrder3InputOrderStruct, - post: Array, + try_removeOrder4( + order: Raindex__removeOrder4InputOrderStruct, + post: Array, ): ethereum.CallResult { let result = super.tryCall( - "removeOrder3", - "removeOrder3((address,(address,address,bytes),(address,bytes32)[],(address,bytes32)[],bytes32),((address,address,bytes),(address,bytes32[],bytes)[])[]):(bool)", + "removeOrder4", + "removeOrder4((address,(address,address,bytes),(address,bytes32)[],(address,bytes32)[],bytes32),((address,address,bytes),(address,bytes32,bytes32[],bytes)[])[]):(bool)", [ethereum.Value.fromTuple(order), ethereum.Value.fromTupleArray(post)], ); if (result.reverted) { @@ -1431,27 +1451,27 @@ export class Raindex extends ethereum.SmartContract { return ethereum.CallResult.fromValue(value[0].toBoolean()); } - takeOrders4( - config: Raindex__takeOrders4InputConfigStruct, - ): Raindex__takeOrders4Result { + takeOrders5( + config: Raindex__takeOrders5InputConfigStruct, + ): Raindex__takeOrders5Result { let result = super.call( - "takeOrders4", - "takeOrders4((bytes32,bytes32,bytes32,bool,((address,(address,address,bytes),(address,bytes32)[],(address,bytes32)[],bytes32),uint256,uint256,(address,bytes32[],bytes)[])[],bytes)):(bytes32,bytes32)", + "takeOrders5", + "takeOrders5((bytes32,bytes32,bytes32,bool,((address,(address,address,bytes),(address,bytes32)[],(address,bytes32)[],bytes32),uint256,uint256,(address,bytes32,bytes32[],bytes)[])[],bytes)):(bytes32,bytes32)", [ethereum.Value.fromTuple(config)], ); - return new Raindex__takeOrders4Result( + return new Raindex__takeOrders5Result( result[0].toBytes(), result[1].toBytes(), ); } - try_takeOrders4( - config: Raindex__takeOrders4InputConfigStruct, - ): ethereum.CallResult { + try_takeOrders5( + config: Raindex__takeOrders5InputConfigStruct, + ): ethereum.CallResult { let result = super.tryCall( - "takeOrders4", - "takeOrders4((bytes32,bytes32,bytes32,bool,((address,(address,address,bytes),(address,bytes32)[],(address,bytes32)[],bytes32),uint256,uint256,(address,bytes32[],bytes)[])[],bytes)):(bytes32,bytes32)", + "takeOrders5", + "takeOrders5((bytes32,bytes32,bytes32,bool,((address,(address,address,bytes),(address,bytes32)[],(address,bytes32)[],bytes32),uint256,uint256,(address,bytes32,bytes32[],bytes)[])[],bytes)):(bytes32,bytes32)", [ethereum.Value.fromTuple(config)], ); if (result.reverted) { @@ -1459,7 +1479,7 @@ export class Raindex extends ethereum.SmartContract { } let value = result.value; return ethereum.CallResult.fromValue( - new Raindex__takeOrders4Result(value[0].toBytes(), value[1].toBytes()), + new Raindex__takeOrders5Result(value[0].toBytes(), value[1].toBytes()), ); } @@ -1499,38 +1519,38 @@ export class Raindex extends ethereum.SmartContract { } } -export class AddOrder4Call extends ethereum.Call { - get inputs(): AddOrder4Call__Inputs { - return new AddOrder4Call__Inputs(this); +export class AddOrder5Call extends ethereum.Call { + get inputs(): AddOrder5Call__Inputs { + return new AddOrder5Call__Inputs(this); } - get outputs(): AddOrder4Call__Outputs { - return new AddOrder4Call__Outputs(this); + get outputs(): AddOrder5Call__Outputs { + return new AddOrder5Call__Outputs(this); } } -export class AddOrder4Call__Inputs { - _call: AddOrder4Call; +export class AddOrder5Call__Inputs { + _call: AddOrder5Call; - constructor(call: AddOrder4Call) { + constructor(call: AddOrder5Call) { this._call = call; } - get orderConfig(): AddOrder4CallOrderConfigStruct { - return changetype( + get orderConfig(): AddOrder5CallOrderConfigStruct { + return changetype( this._call.inputValues[0].value.toTuple(), ); } - get post(): Array { - return this._call.inputValues[1].value.toTupleArray(); + get post(): Array { + return this._call.inputValues[1].value.toTupleArray(); } } -export class AddOrder4Call__Outputs { - _call: AddOrder4Call; +export class AddOrder5Call__Outputs { + _call: AddOrder5Call; - constructor(call: AddOrder4Call) { + constructor(call: AddOrder5Call) { this._call = call; } @@ -1539,19 +1559,19 @@ export class AddOrder4Call__Outputs { } } -export class AddOrder4CallOrderConfigStruct extends ethereum.Tuple { - get evaluable(): AddOrder4CallOrderConfigEvaluableStruct { - return changetype( +export class AddOrder5CallOrderConfigStruct extends ethereum.Tuple { + get evaluable(): AddOrder5CallOrderConfigEvaluableStruct { + return changetype( this[0].toTuple(), ); } - get validInputs(): Array { - return this[1].toTupleArray(); + get validInputs(): Array { + return this[1].toTupleArray(); } - get validOutputs(): Array { - return this[2].toTupleArray(); + get validOutputs(): Array { + return this[2].toTupleArray(); } get nonce(): Bytes { @@ -1567,7 +1587,7 @@ export class AddOrder4CallOrderConfigStruct extends ethereum.Tuple { } } -export class AddOrder4CallOrderConfigEvaluableStruct extends ethereum.Tuple { +export class AddOrder5CallOrderConfigEvaluableStruct extends ethereum.Tuple { get interpreter(): Address { return this[0].toAddress(); } @@ -1581,7 +1601,7 @@ export class AddOrder4CallOrderConfigEvaluableStruct extends ethereum.Tuple { } } -export class AddOrder4CallOrderConfigValidInputsStruct extends ethereum.Tuple { +export class AddOrder5CallOrderConfigValidInputsStruct extends ethereum.Tuple { get token(): Address { return this[0].toAddress(); } @@ -1591,7 +1611,7 @@ export class AddOrder4CallOrderConfigValidInputsStruct extends ethereum.Tuple { } } -export class AddOrder4CallOrderConfigValidOutputsStruct extends ethereum.Tuple { +export class AddOrder5CallOrderConfigValidOutputsStruct extends ethereum.Tuple { get token(): Address { return this[0].toAddress(); } @@ -1601,17 +1621,17 @@ export class AddOrder4CallOrderConfigValidOutputsStruct extends ethereum.Tuple { } } -export class AddOrder4CallPostStruct extends ethereum.Tuple { - get evaluable(): AddOrder4CallPostEvaluableStruct { - return changetype(this[0].toTuple()); +export class AddOrder5CallPostStruct extends ethereum.Tuple { + get evaluable(): AddOrder5CallPostEvaluableStruct { + return changetype(this[0].toTuple()); } - get signedContext(): Array { - return this[1].toTupleArray(); + get signedContext(): Array { + return this[1].toTupleArray(); } } -export class AddOrder4CallPostEvaluableStruct extends ethereum.Tuple { +export class AddOrder5CallPostEvaluableStruct extends ethereum.Tuple { get interpreter(): Address { return this[0].toAddress(); } @@ -1625,17 +1645,21 @@ export class AddOrder4CallPostEvaluableStruct extends ethereum.Tuple { } } -export class AddOrder4CallPostSignedContextStruct extends ethereum.Tuple { +export class AddOrder5CallPostSignedContextStruct extends ethereum.Tuple { get signer(): Address { return this[0].toAddress(); } + get domainSeparator(): Bytes { + return this[1].toBytes(); + } + get context(): Array { - return this[1].toBytesArray(); + return this[2].toBytesArray(); } get signature(): Bytes { - return this[2].toBytes(); + return this[3].toBytes(); } } @@ -1834,12 +1858,16 @@ export class Clear4CallAliceSignedContextStruct extends ethereum.Tuple { return this[0].toAddress(); } + get domainSeparator(): Bytes { + return this[1].toBytes(); + } + get context(): Array { - return this[1].toBytesArray(); + return this[2].toBytesArray(); } get signature(): Bytes { - return this[2].toBytes(); + return this[3].toBytes(); } } @@ -1848,29 +1876,33 @@ export class Clear4CallBobSignedContextStruct extends ethereum.Tuple { return this[0].toAddress(); } + get domainSeparator(): Bytes { + return this[1].toBytes(); + } + get context(): Array { - return this[1].toBytesArray(); + return this[2].toBytesArray(); } get signature(): Bytes { - return this[2].toBytes(); + return this[3].toBytes(); } } -export class Deposit4Call extends ethereum.Call { - get inputs(): Deposit4Call__Inputs { - return new Deposit4Call__Inputs(this); +export class Deposit5Call extends ethereum.Call { + get inputs(): Deposit5Call__Inputs { + return new Deposit5Call__Inputs(this); } - get outputs(): Deposit4Call__Outputs { - return new Deposit4Call__Outputs(this); + get outputs(): Deposit5Call__Outputs { + return new Deposit5Call__Outputs(this); } } -export class Deposit4Call__Inputs { - _call: Deposit4Call; +export class Deposit5Call__Inputs { + _call: Deposit5Call; - constructor(call: Deposit4Call) { + constructor(call: Deposit5Call) { this._call = call; } @@ -1886,30 +1918,30 @@ export class Deposit4Call__Inputs { return this._call.inputValues[2].value.toBytes(); } - get post(): Array { - return this._call.inputValues[3].value.toTupleArray(); + get post(): Array { + return this._call.inputValues[3].value.toTupleArray(); } } -export class Deposit4Call__Outputs { - _call: Deposit4Call; +export class Deposit5Call__Outputs { + _call: Deposit5Call; - constructor(call: Deposit4Call) { + constructor(call: Deposit5Call) { this._call = call; } } -export class Deposit4CallPostStruct extends ethereum.Tuple { - get evaluable(): Deposit4CallPostEvaluableStruct { - return changetype(this[0].toTuple()); +export class Deposit5CallPostStruct extends ethereum.Tuple { + get evaluable(): Deposit5CallPostEvaluableStruct { + return changetype(this[0].toTuple()); } - get signedContext(): Array { - return this[1].toTupleArray(); + get signedContext(): Array { + return this[1].toTupleArray(); } } -export class Deposit4CallPostEvaluableStruct extends ethereum.Tuple { +export class Deposit5CallPostEvaluableStruct extends ethereum.Tuple { get interpreter(): Address { return this[0].toAddress(); } @@ -1923,61 +1955,65 @@ export class Deposit4CallPostEvaluableStruct extends ethereum.Tuple { } } -export class Deposit4CallPostSignedContextStruct extends ethereum.Tuple { +export class Deposit5CallPostSignedContextStruct extends ethereum.Tuple { get signer(): Address { return this[0].toAddress(); } + get domainSeparator(): Bytes { + return this[1].toBytes(); + } + get context(): Array { - return this[1].toBytesArray(); + return this[2].toBytesArray(); } get signature(): Bytes { - return this[2].toBytes(); + return this[3].toBytes(); } } -export class Entask2Call extends ethereum.Call { - get inputs(): Entask2Call__Inputs { - return new Entask2Call__Inputs(this); +export class Entask3Call extends ethereum.Call { + get inputs(): Entask3Call__Inputs { + return new Entask3Call__Inputs(this); } - get outputs(): Entask2Call__Outputs { - return new Entask2Call__Outputs(this); + get outputs(): Entask3Call__Outputs { + return new Entask3Call__Outputs(this); } } -export class Entask2Call__Inputs { - _call: Entask2Call; +export class Entask3Call__Inputs { + _call: Entask3Call; - constructor(call: Entask2Call) { + constructor(call: Entask3Call) { this._call = call; } - get post(): Array { - return this._call.inputValues[0].value.toTupleArray(); + get post(): Array { + return this._call.inputValues[0].value.toTupleArray(); } } -export class Entask2Call__Outputs { - _call: Entask2Call; +export class Entask3Call__Outputs { + _call: Entask3Call; - constructor(call: Entask2Call) { + constructor(call: Entask3Call) { this._call = call; } } -export class Entask2CallPostStruct extends ethereum.Tuple { - get evaluable(): Entask2CallPostEvaluableStruct { - return changetype(this[0].toTuple()); +export class Entask3CallPostStruct extends ethereum.Tuple { + get evaluable(): Entask3CallPostEvaluableStruct { + return changetype(this[0].toTuple()); } - get signedContext(): Array { - return this[1].toTupleArray(); + get signedContext(): Array { + return this[1].toTupleArray(); } } -export class Entask2CallPostEvaluableStruct extends ethereum.Tuple { +export class Entask3CallPostEvaluableStruct extends ethereum.Tuple { get interpreter(): Address { return this[0].toAddress(); } @@ -1991,17 +2027,21 @@ export class Entask2CallPostEvaluableStruct extends ethereum.Tuple { } } -export class Entask2CallPostSignedContextStruct extends ethereum.Tuple { +export class Entask3CallPostSignedContextStruct extends ethereum.Tuple { get signer(): Address { return this[0].toAddress(); } + get domainSeparator(): Bytes { + return this[1].toBytes(); + } + get context(): Array { - return this[1].toBytesArray(); + return this[2].toBytesArray(); } get signature(): Bytes { - return this[2].toBytes(); + return this[3].toBytes(); } } @@ -2085,38 +2125,38 @@ export class MulticallCall__Outputs { } } -export class RemoveOrder3Call extends ethereum.Call { - get inputs(): RemoveOrder3Call__Inputs { - return new RemoveOrder3Call__Inputs(this); +export class RemoveOrder4Call extends ethereum.Call { + get inputs(): RemoveOrder4Call__Inputs { + return new RemoveOrder4Call__Inputs(this); } - get outputs(): RemoveOrder3Call__Outputs { - return new RemoveOrder3Call__Outputs(this); + get outputs(): RemoveOrder4Call__Outputs { + return new RemoveOrder4Call__Outputs(this); } } -export class RemoveOrder3Call__Inputs { - _call: RemoveOrder3Call; +export class RemoveOrder4Call__Inputs { + _call: RemoveOrder4Call; - constructor(call: RemoveOrder3Call) { + constructor(call: RemoveOrder4Call) { this._call = call; } - get order(): RemoveOrder3CallOrderStruct { - return changetype( + get order(): RemoveOrder4CallOrderStruct { + return changetype( this._call.inputValues[0].value.toTuple(), ); } - get post(): Array { - return this._call.inputValues[1].value.toTupleArray(); + get post(): Array { + return this._call.inputValues[1].value.toTupleArray(); } } -export class RemoveOrder3Call__Outputs { - _call: RemoveOrder3Call; +export class RemoveOrder4Call__Outputs { + _call: RemoveOrder4Call; - constructor(call: RemoveOrder3Call) { + constructor(call: RemoveOrder4Call) { this._call = call; } @@ -2125,21 +2165,21 @@ export class RemoveOrder3Call__Outputs { } } -export class RemoveOrder3CallOrderStruct extends ethereum.Tuple { +export class RemoveOrder4CallOrderStruct extends ethereum.Tuple { get owner(): Address { return this[0].toAddress(); } - get evaluable(): RemoveOrder3CallOrderEvaluableStruct { - return changetype(this[1].toTuple()); + get evaluable(): RemoveOrder4CallOrderEvaluableStruct { + return changetype(this[1].toTuple()); } - get validInputs(): Array { - return this[2].toTupleArray(); + get validInputs(): Array { + return this[2].toTupleArray(); } - get validOutputs(): Array { - return this[3].toTupleArray(); + get validOutputs(): Array { + return this[3].toTupleArray(); } get nonce(): Bytes { @@ -2147,7 +2187,7 @@ export class RemoveOrder3CallOrderStruct extends ethereum.Tuple { } } -export class RemoveOrder3CallOrderEvaluableStruct extends ethereum.Tuple { +export class RemoveOrder4CallOrderEvaluableStruct extends ethereum.Tuple { get interpreter(): Address { return this[0].toAddress(); } @@ -2161,7 +2201,7 @@ export class RemoveOrder3CallOrderEvaluableStruct extends ethereum.Tuple { } } -export class RemoveOrder3CallOrderValidInputsStruct extends ethereum.Tuple { +export class RemoveOrder4CallOrderValidInputsStruct extends ethereum.Tuple { get token(): Address { return this[0].toAddress(); } @@ -2171,7 +2211,7 @@ export class RemoveOrder3CallOrderValidInputsStruct extends ethereum.Tuple { } } -export class RemoveOrder3CallOrderValidOutputsStruct extends ethereum.Tuple { +export class RemoveOrder4CallOrderValidOutputsStruct extends ethereum.Tuple { get token(): Address { return this[0].toAddress(); } @@ -2181,17 +2221,17 @@ export class RemoveOrder3CallOrderValidOutputsStruct extends ethereum.Tuple { } } -export class RemoveOrder3CallPostStruct extends ethereum.Tuple { - get evaluable(): RemoveOrder3CallPostEvaluableStruct { - return changetype(this[0].toTuple()); +export class RemoveOrder4CallPostStruct extends ethereum.Tuple { + get evaluable(): RemoveOrder4CallPostEvaluableStruct { + return changetype(this[0].toTuple()); } - get signedContext(): Array { - return this[1].toTupleArray(); + get signedContext(): Array { + return this[1].toTupleArray(); } } -export class RemoveOrder3CallPostEvaluableStruct extends ethereum.Tuple { +export class RemoveOrder4CallPostEvaluableStruct extends ethereum.Tuple { get interpreter(): Address { return this[0].toAddress(); } @@ -2205,48 +2245,52 @@ export class RemoveOrder3CallPostEvaluableStruct extends ethereum.Tuple { } } -export class RemoveOrder3CallPostSignedContextStruct extends ethereum.Tuple { +export class RemoveOrder4CallPostSignedContextStruct extends ethereum.Tuple { get signer(): Address { return this[0].toAddress(); } + get domainSeparator(): Bytes { + return this[1].toBytes(); + } + get context(): Array { - return this[1].toBytesArray(); + return this[2].toBytesArray(); } get signature(): Bytes { - return this[2].toBytes(); + return this[3].toBytes(); } } -export class TakeOrders4Call extends ethereum.Call { - get inputs(): TakeOrders4Call__Inputs { - return new TakeOrders4Call__Inputs(this); +export class TakeOrders5Call extends ethereum.Call { + get inputs(): TakeOrders5Call__Inputs { + return new TakeOrders5Call__Inputs(this); } - get outputs(): TakeOrders4Call__Outputs { - return new TakeOrders4Call__Outputs(this); + get outputs(): TakeOrders5Call__Outputs { + return new TakeOrders5Call__Outputs(this); } } -export class TakeOrders4Call__Inputs { - _call: TakeOrders4Call; +export class TakeOrders5Call__Inputs { + _call: TakeOrders5Call; - constructor(call: TakeOrders4Call) { + constructor(call: TakeOrders5Call) { this._call = call; } - get config(): TakeOrders4CallConfigStruct { - return changetype( + get config(): TakeOrders5CallConfigStruct { + return changetype( this._call.inputValues[0].value.toTuple(), ); } } -export class TakeOrders4Call__Outputs { - _call: TakeOrders4Call; +export class TakeOrders5Call__Outputs { + _call: TakeOrders5Call; - constructor(call: TakeOrders4Call) { + constructor(call: TakeOrders5Call) { this._call = call; } @@ -2259,7 +2303,7 @@ export class TakeOrders4Call__Outputs { } } -export class TakeOrders4CallConfigStruct extends ethereum.Tuple { +export class TakeOrders5CallConfigStruct extends ethereum.Tuple { get minimumIO(): Bytes { return this[0].toBytes(); } @@ -2276,8 +2320,8 @@ export class TakeOrders4CallConfigStruct extends ethereum.Tuple { return this[3].toBoolean(); } - get orders(): Array { - return this[4].toTupleArray(); + get orders(): Array { + return this[4].toTupleArray(); } get data(): Bytes { @@ -2285,9 +2329,9 @@ export class TakeOrders4CallConfigStruct extends ethereum.Tuple { } } -export class TakeOrders4CallConfigOrdersStruct extends ethereum.Tuple { - get order(): TakeOrders4CallConfigOrdersOrderStruct { - return changetype( +export class TakeOrders5CallConfigOrdersStruct extends ethereum.Tuple { + get order(): TakeOrders5CallConfigOrdersOrderStruct { + return changetype( this[0].toTuple(), ); } @@ -2300,28 +2344,28 @@ export class TakeOrders4CallConfigOrdersStruct extends ethereum.Tuple { return this[2].toBigInt(); } - get signedContext(): Array { - return this[3].toTupleArray(); + get signedContext(): Array { + return this[3].toTupleArray(); } } -export class TakeOrders4CallConfigOrdersOrderStruct extends ethereum.Tuple { +export class TakeOrders5CallConfigOrdersOrderStruct extends ethereum.Tuple { get owner(): Address { return this[0].toAddress(); } - get evaluable(): TakeOrders4CallConfigOrdersOrderEvaluableStruct { - return changetype( + get evaluable(): TakeOrders5CallConfigOrdersOrderEvaluableStruct { + return changetype( this[1].toTuple(), ); } - get validInputs(): Array { - return this[2].toTupleArray(); + get validInputs(): Array { + return this[2].toTupleArray(); } - get validOutputs(): Array { - return this[3].toTupleArray(); + get validOutputs(): Array { + return this[3].toTupleArray(); } get nonce(): Bytes { @@ -2329,7 +2373,7 @@ export class TakeOrders4CallConfigOrdersOrderStruct extends ethereum.Tuple { } } -export class TakeOrders4CallConfigOrdersOrderEvaluableStruct extends ethereum.Tuple { +export class TakeOrders5CallConfigOrdersOrderEvaluableStruct extends ethereum.Tuple { get interpreter(): Address { return this[0].toAddress(); } @@ -2343,7 +2387,7 @@ export class TakeOrders4CallConfigOrdersOrderEvaluableStruct extends ethereum.Tu } } -export class TakeOrders4CallConfigOrdersOrderValidInputsStruct extends ethereum.Tuple { +export class TakeOrders5CallConfigOrdersOrderValidInputsStruct extends ethereum.Tuple { get token(): Address { return this[0].toAddress(); } @@ -2353,7 +2397,7 @@ export class TakeOrders4CallConfigOrdersOrderValidInputsStruct extends ethereum. } } -export class TakeOrders4CallConfigOrdersOrderValidOutputsStruct extends ethereum.Tuple { +export class TakeOrders5CallConfigOrdersOrderValidOutputsStruct extends ethereum.Tuple { get token(): Address { return this[0].toAddress(); } @@ -2363,34 +2407,38 @@ export class TakeOrders4CallConfigOrdersOrderValidOutputsStruct extends ethereum } } -export class TakeOrders4CallConfigOrdersSignedContextStruct extends ethereum.Tuple { +export class TakeOrders5CallConfigOrdersSignedContextStruct extends ethereum.Tuple { get signer(): Address { return this[0].toAddress(); } + get domainSeparator(): Bytes { + return this[1].toBytes(); + } + get context(): Array { - return this[1].toBytesArray(); + return this[2].toBytesArray(); } get signature(): Bytes { - return this[2].toBytes(); + return this[3].toBytes(); } } -export class Withdraw4Call extends ethereum.Call { - get inputs(): Withdraw4Call__Inputs { - return new Withdraw4Call__Inputs(this); +export class Withdraw5Call extends ethereum.Call { + get inputs(): Withdraw5Call__Inputs { + return new Withdraw5Call__Inputs(this); } - get outputs(): Withdraw4Call__Outputs { - return new Withdraw4Call__Outputs(this); + get outputs(): Withdraw5Call__Outputs { + return new Withdraw5Call__Outputs(this); } } -export class Withdraw4Call__Inputs { - _call: Withdraw4Call; +export class Withdraw5Call__Inputs { + _call: Withdraw5Call; - constructor(call: Withdraw4Call) { + constructor(call: Withdraw5Call) { this._call = call; } @@ -2406,30 +2454,30 @@ export class Withdraw4Call__Inputs { return this._call.inputValues[2].value.toBytes(); } - get post(): Array { - return this._call.inputValues[3].value.toTupleArray(); + get post(): Array { + return this._call.inputValues[3].value.toTupleArray(); } } -export class Withdraw4Call__Outputs { - _call: Withdraw4Call; +export class Withdraw5Call__Outputs { + _call: Withdraw5Call; - constructor(call: Withdraw4Call) { + constructor(call: Withdraw5Call) { this._call = call; } } -export class Withdraw4CallPostStruct extends ethereum.Tuple { - get evaluable(): Withdraw4CallPostEvaluableStruct { - return changetype(this[0].toTuple()); +export class Withdraw5CallPostStruct extends ethereum.Tuple { + get evaluable(): Withdraw5CallPostEvaluableStruct { + return changetype(this[0].toTuple()); } - get signedContext(): Array { - return this[1].toTupleArray(); + get signedContext(): Array { + return this[1].toTupleArray(); } } -export class Withdraw4CallPostEvaluableStruct extends ethereum.Tuple { +export class Withdraw5CallPostEvaluableStruct extends ethereum.Tuple { get interpreter(): Address { return this[0].toAddress(); } @@ -2443,16 +2491,20 @@ export class Withdraw4CallPostEvaluableStruct extends ethereum.Tuple { } } -export class Withdraw4CallPostSignedContextStruct extends ethereum.Tuple { +export class Withdraw5CallPostSignedContextStruct extends ethereum.Tuple { get signer(): Address { return this[0].toAddress(); } + get domainSeparator(): Bytes { + return this[1].toBytes(); + } + get context(): Array { - return this[1].toBytesArray(); + return this[2].toBytesArray(); } get signature(): Bytes { - return this[2].toBytes(); + return this[3].toBytes(); } } diff --git a/subgraph/src/handlers.ts b/subgraph/src/handlers.ts index da27346bf1..ff3a39caf5 100644 --- a/subgraph/src/handlers.ts +++ b/subgraph/src/handlers.ts @@ -5,7 +5,7 @@ import { DepositV2, MetaV1_2, RemoveOrderV3, - TakeOrderV3 + TakeOrderV4 } from "../generated/Raindex/Raindex"; import { WithdrawV2 } from "../generated/Raindex/Raindex"; import { handleDeposit as _handleDeposit } from "./deposit"; @@ -47,7 +47,7 @@ export function handleRemoveOrder(event: RemoveOrderV3): void { _handleRemoveOrder(event); } -export function handleTakeOrder(event: TakeOrderV3): void { +export function handleTakeOrder(event: TakeOrderV4): void { createTransactionEntity(event); createRaindexEntity(event); _handleTakeOrder(event); diff --git a/subgraph/src/takeorder.ts b/subgraph/src/takeorder.ts index c1a8da5b87..2c1506613e 100644 --- a/subgraph/src/takeorder.ts +++ b/subgraph/src/takeorder.ts @@ -1,5 +1,5 @@ import { Bytes, ethereum } from "@graphprotocol/graph-ts"; -import { TakeOrderV3 } from "../generated/Raindex/Raindex"; +import { TakeOrderV4 } from "../generated/Raindex/Raindex"; import { TakeOrder } from "../generated/schema"; import { eventId } from "./interfaces/event"; import { handleVaultBalanceChange, vaultEntityId } from "./vault"; @@ -8,14 +8,14 @@ import { createTradeEntity } from "./trade"; import { crypto } from "@graphprotocol/graph-ts"; import { getCalculator } from "./float"; -export function orderHashFromTakeOrderEvent(event: TakeOrderV3): Bytes { +export function orderHashFromTakeOrderEvent(event: TakeOrderV4): Bytes { let orderHash = crypto.keccak256( ethereum.encode(event.parameters[1].value.toTuple()[0])! ); return Bytes.fromByteArray(orderHash); } -export function handleTakeOrder(event: TakeOrderV3): void { +export function handleTakeOrder(event: TakeOrderV4): void { let order = event.params.config.order; let orderHash = orderHashFromTakeOrderEvent(event); @@ -82,7 +82,7 @@ export function handleTakeOrder(event: TakeOrderV3): void { createTakeOrderEntity(event); } -export function createTakeOrderEntity(event: TakeOrderV3): void { +export function createTakeOrderEntity(event: TakeOrderV4): void { let takeOrder = new TakeOrder(eventId(event)); takeOrder.raindex = event.address; takeOrder.inputAmount = event.params.input; diff --git a/subgraph/subgraph.yaml b/subgraph/subgraph.yaml index bf693a6366..cc415368fe 100644 --- a/subgraph/subgraph.yaml +++ b/subgraph/subgraph.yaml @@ -33,7 +33,7 @@ dataSources: handler: handleAddOrder - event: RemoveOrderV3(address,bytes32,(address,(address,address,bytes),(address,bytes32)[],(address,bytes32)[],bytes32)) handler: handleRemoveOrder - - event: TakeOrderV3(address,((address,(address,address,bytes),(address,bytes32)[],(address,bytes32)[],bytes32),uint256,uint256,(address,bytes32[],bytes)[]),bytes32,bytes32) + - event: TakeOrderV4(address,((address,(address,address,bytes),(address,bytes32)[],(address,bytes32)[],bytes32),uint256,uint256,(address,bytes32,bytes32[],bytes)[]),bytes32,bytes32) handler: handleTakeOrder - event: MetaV1_2(address,bytes32,bytes) handler: handleMeta diff --git a/subgraph/tests/event-mocks.test.ts b/subgraph/tests/event-mocks.test.ts index d50955757e..67460eeaa3 100644 --- a/subgraph/tests/event-mocks.test.ts +++ b/subgraph/tests/event-mocks.test.ts @@ -13,7 +13,7 @@ import { DepositV2, MetaV1_2, RemoveOrderV3, - TakeOrderV3, + TakeOrderV4, } from "../generated/Raindex/Raindex"; import { WithdrawV2 } from "../generated/Raindex/Raindex"; import { createTransactionEntity } from "../src/transaction"; @@ -246,7 +246,7 @@ export function createRemoveOrderEvent( return removeOrderEvent; } -// event TakeOrderV3(address sender, TakeOrderConfigV4 config, Float input, Float output); +// event TakeOrderV4(address sender, TakeOrderConfigV5 config, Float input, Float output); export function createTakeOrderEvent( sender: Address, owner: Address, @@ -256,9 +256,9 @@ export function createTakeOrderEvent( evaluable: Evaluable, input: Float, output: Float -): TakeOrderV3 { +): TakeOrderV4 { let mockEvent = newMockEvent(); - let takeOrderEvent = new TakeOrderV3( + let takeOrderEvent = new TakeOrderV4( mockEvent.address, mockEvent.logIndex, mockEvent.transactionLogIndex, @@ -278,6 +278,13 @@ export function createTakeOrderEvent( let signedContext = new ethereum.Tuple(); signedContext.push(ethereum.Value.fromAddress(sender)); + signedContext.push( + ethereum.Value.fromFixedBytes( + Bytes.fromHexString( + "0x0000000000000000000000000000000000000000000000000000000000000000" + ) + ) + ); signedContext.push(ethereum.Value.fromUnsignedBigIntArray([])); signedContext.push(ethereum.Value.fromBytes(Bytes.fromHexString("0x"))); From 8dbb863d3f7b36104c0949702eda6b7e72c54856 Mon Sep 17 00:00:00 2001 From: David Meister Date: Mon, 26 Oct 2026 15:12:14 +0000 Subject: [PATCH 07/15] Rust/JS: migrate to IRaindexV7 SignedContextV2 names; oracle responses carry the EIP-712 domainSeparator Co-Authored-By: Claude Opus 5.5 --- crates/bindings/ARCHITECTURE.md | 30 ++++---- crates/bindings/src/js_api.rs | 46 ++++++------ crates/bindings/src/lib.rs | 4 +- crates/common/ARCHITECTURE.md | 8 +- crates/common/src/add_order.rs | 18 ++--- crates/common/src/deposit.rs | 8 +- .../common/src/local_db/address_collectors.rs | 17 +++-- crates/common/src/local_db/decode.rs | 35 +++++---- crates/common/src/local_db/insert.rs | 21 +++--- .../common/src/raindex_client/order_quotes.rs | 8 +- crates/common/src/raindex_client/orders.rs | 12 +-- .../src/raindex_client/remove_orders.rs | 4 +- .../raindex_client/take_orders/e2e_tests.rs | 46 ++++++------ .../src/raindex_client/take_orders/mod.rs | 15 ++-- .../src/raindex_client/take_orders/result.rs | 10 +-- .../src/raindex_client/take_orders/single.rs | 12 +-- .../take_orders/single_tests.rs | 16 ++-- crates/common/src/raindex_client/vaults.rs | 14 ++-- .../common/src/raindex_client/vaults_list.rs | 4 +- .../raindex_order_builder/order_operations.rs | 4 +- crates/common/src/remove_order.rs | 12 +-- crates/common/src/replays.rs | 8 +- crates/common/src/take_orders/candidates.rs | 12 +-- crates/common/src/take_orders/config.rs | 10 +-- crates/common/src/take_orders/preflight.rs | 36 ++++----- crates/common/src/test_helpers.rs | 2 +- crates/common/src/withdraw.rs | 10 +-- crates/integration_tests/src/lib.rs | 60 +++++++-------- crates/js_api/ARCHITECTURE.md | 4 +- crates/js_api/src/bindings/mod.rs | 10 +-- crates/quote/ARCHITECTURE.md | 30 ++++---- crates/quote/src/cli/input.rs | 8 +- crates/quote/src/cli/mod.rs | 8 +- crates/quote/src/injector.rs | 8 +- crates/quote/src/oracle.rs | 68 +++++++++++++---- crates/quote/src/order_quotes.rs | 44 ++++++----- crates/quote/src/quote.rs | 52 ++++++------- crates/quote/src/quote_debug.rs | 12 +-- crates/quote/src/rpc.rs | 74 +++++++++---------- crates/test_fixtures/src/lib.rs | 2 +- packages/raindex/README.md | 4 +- .../raindex/test/js_api/raindexClient.test.ts | 4 +- 42 files changed, 436 insertions(+), 374 deletions(-) diff --git a/crates/bindings/ARCHITECTURE.md b/crates/bindings/ARCHITECTURE.md index adc3772730..439f0dfc8b 100644 --- a/crates/bindings/ARCHITECTURE.md +++ b/crates/bindings/ARCHITECTURE.md @@ -57,9 +57,9 @@ Generated Solidity Bindings (Alloy `sol!`) - Practical result of the `sol!(… rpc)` attribute: - For `IRaindexV5` and `IERC20`, you can construct an instance bound to a provider and call methods with strong typing, for example: - `let ob = IRaindexV5Instance::new(address, provider.clone()); ob.quote2(config).await?`. + `let ob = IRaindexV5Instance::new(address, provider.clone()); ob.quote3(config).await?`. - For all bindings, you can still directly use generated call structs, e.g., - `IRaindexV5::removeOrder3Call { ... }.abi_encode()` or + `IRaindexV5::removeOrder4Call { ... }.abi_encode()` or `Raindex::multicallCall { ... }`. - Derives and defaults: @@ -118,17 +118,17 @@ WASM and JS Interop - Exposed interfaces (hand‑written TS definitions): - `IOV2`: `{ token: string; vaultId: string; }` - - `QuoteV2`: - `{ order: OrderV4; inputIOIndex: string; outputIOIndex: string; signedContext: SignedContextV1[]; }` + - `QuoteV3`: + `{ order: OrderV4; inputIOIndex: string; outputIOIndex: string; signedContext: SignedContextV2[]; }` - `OrderV4`: `{ owner: string; evaluable: EvaluableV4; validInputs: IOV2[]; validOutputs: IOV2[]; nonce: string; }` - `EvaluableV4`: `{ interpreter: string; store: string; bytecode: string; }` - - `SignedContextV1`: - `{ signer: string; context: string[]; signature: string; }` - - `TakeOrderConfigV4`: - `{ order: OrderV4; inputIOIndex: string; outputIOIndex: string; signedContext: SignedContextV1[]; }` - - `TakeOrdersConfigV5`: - `{ minimumIO: string; maximumIO: string; maximumIORatio: string; IOIsInput: string; orders: TakeOrderConfigV4[]; data: string; }` + - `SignedContextV2`: + `{ signer: string; domainSeparator: string; context: string[]; signature: string; }` + - `TakeOrderConfigV5`: + `{ order: OrderV4; inputIOIndex: string; outputIOIndex: string; signedContext: SignedContextV2[]; }` + - `TakeOrdersConfigV6`: + `{ minimumIO: string; maximumIO: string; maximumIORatio: string; IOIsInput: string; orders: TakeOrderConfigV5[]; data: string; }` - Why many fields are `string` in TS - Large numeric values (e.g., `U256`) are represented as strings to avoid @@ -157,11 +157,11 @@ How This Crate Is Used Elsewhere - Quote engine (`crates/quote`): - Imports `IRaindexV5::IRaindexV5Instance` and `mk_read_provider`. - - Binds the instance to a provider and calls `quote2` for many orders via + - Binds the instance to a provider and calls `quote3` for many orders via Alloy’s multicall helper. - Common utilities (`crates/common`): - Uses ABI‑generated call structs (e.g., `deposit3Call`, `withdraw3Call`, - `removeOrder3Call`, `IERC20::approveCall`) to build calldata for + `removeOrder4Call`, `IERC20::approveCall`) to build calldata for transactions. - JS API (`crates/js_api`): - Builds order builder calldata for approvals/deposits/add‑order and uses call @@ -209,12 +209,12 @@ Examples `let provider = mk_read_provider(&rpcs)?;` - Bind to a raindex: `let ob = IRaindexV5Instance::new(raindex_addr, provider.clone());` - - Call a view: `let quote = ob.quote2(config).await?;` + - Call a view: `let quote = ob.quote3(config).await?;` - Building calldata without an instance: - - `use raindex_bindings::IRaindexV5::removeOrder3Call;` + - `use raindex_bindings::IRaindexV5::removeOrder4Call;` - Construct the struct and encode: - `let bytes = removeOrder3Call { order, tasks }.abi_encode();` + `let bytes = removeOrder4Call { order, tasks }.abi_encode();` Limitations and Notes diff --git a/crates/bindings/src/js_api.rs b/crates/bindings/src/js_api.rs index 9971d06835..88a9ae8897 100644 --- a/crates/bindings/src/js_api.rs +++ b/crates/bindings/src/js_api.rs @@ -1,15 +1,15 @@ use crate::IRaindexV7::{ - EvaluableV4, OrderV4, QuoteV2, SignedContextV1, TakeOrderConfigV4, TakeOrdersConfigV5, IOV2, + EvaluableV4, OrderV4, QuoteV3, SignedContextV2, TakeOrderConfigV5, TakeOrdersConfigV6, IOV2, }; use wasm_bindgen_utils::{impl_custom_tsify, impl_wasm_traits, prelude::*}; impl_wasm_traits!(IOV2); -impl_wasm_traits!(QuoteV2); +impl_wasm_traits!(QuoteV3); impl_wasm_traits!(OrderV4); impl_wasm_traits!(EvaluableV4); -impl_wasm_traits!(SignedContextV1); -impl_wasm_traits!(TakeOrderConfigV4); -impl_wasm_traits!(TakeOrdersConfigV5); +impl_wasm_traits!(SignedContextV2); +impl_wasm_traits!(TakeOrderConfigV5); +impl_wasm_traits!(TakeOrdersConfigV6); impl_custom_tsify!( IOV2, @@ -19,12 +19,12 @@ impl_custom_tsify!( }" ); impl_custom_tsify!( - QuoteV2, - "export interface QuoteV2 { + QuoteV3, + "export interface QuoteV3 { order: OrderV4; inputIOIndex: string; outputIOIndex: string; - signedContext: SignedContextV1[]; + signedContext: SignedContextV2[]; }" ); impl_custom_tsify!( @@ -46,30 +46,31 @@ impl_custom_tsify!( }" ); impl_custom_tsify!( - SignedContextV1, - "export interface SignedContextV1 { + SignedContextV2, + "export interface SignedContextV2 { signer: string; + domainSeparator: string; context: string[]; signature: string; }" ); impl_custom_tsify!( - TakeOrderConfigV4, - "export interface TakeOrderConfigV4 { + TakeOrderConfigV5, + "export interface TakeOrderConfigV5 { order: OrderV4; inputIOIndex: string; outputIOIndex: string; - signedContext: SignedContextV1[]; + signedContext: SignedContextV2[]; }" ); impl_custom_tsify!( - TakeOrdersConfigV5, - "export interface TakeOrdersConfigV5 { + TakeOrdersConfigV6, + "export interface TakeOrdersConfigV6 { minimumIO: string; maximumIO: string; maximumIORatio: string; IOIsInput: string; - orders: TakeOrderConfigV4[]; + orders: TakeOrderConfigV5[]; data: string; }" ); @@ -91,7 +92,7 @@ mod tests { #[wasm_bindgen_test] fn test_quote_tsify() { - let js_quote = to_js_value(&QuoteV2::default()).unwrap(); + let js_quote = to_js_value(&QuoteV3::default()).unwrap(); // validate serialized props match the tsify definition assert!(JsString::from_str("order").unwrap().js_in(&js_quote)); assert!(JsString::from_str("inputIOIndex").unwrap().js_in(&js_quote)); @@ -126,12 +127,15 @@ mod tests { } #[wasm_bindgen_test] - fn test_signed_contextv1_tsify() { - let js_signed_context = to_js_value(&SignedContextV1::default()).unwrap(); + fn test_signed_contextv2_tsify() { + let js_signed_context = to_js_value(&SignedContextV2::default()).unwrap(); // validate serialized props match the tsify definition assert!(JsString::from_str("signer") .unwrap() .js_in(&js_signed_context)); + assert!(JsString::from_str("domainSeparator") + .unwrap() + .js_in(&js_signed_context)); assert!(JsString::from_str("context") .unwrap() .js_in(&js_signed_context)); @@ -142,7 +146,7 @@ mod tests { #[wasm_bindgen_test] fn test_take_order_config_v4_tsify() { - let js_take_order_config = to_js_value(&TakeOrderConfigV4::default()).unwrap(); + let js_take_order_config = to_js_value(&TakeOrderConfigV5::default()).unwrap(); // validate serialized props match the tsify definition assert!(JsString::from_str("order") .unwrap() @@ -160,7 +164,7 @@ mod tests { #[wasm_bindgen_test] fn test_take_orders_config_v4_tsify() { - let js_take_orders_config = to_js_value(&TakeOrdersConfigV5::default()).unwrap(); + let js_take_orders_config = to_js_value(&TakeOrdersConfigV6::default()).unwrap(); // validate serialized props match the tsify definition assert!(JsString::from_str("minimumIO") .unwrap() diff --git a/crates/bindings/src/lib.rs b/crates/bindings/src/lib.rs index 4f6bab267e..744f953f99 100644 --- a/crates/bindings/src/lib.rs +++ b/crates/bindings/src/lib.rs @@ -58,7 +58,7 @@ pub mod topics { use crate::{ IInterpreterStoreV3::Set, IRaindexV7::{ - AddOrderV3, AfterClearV2, ClearV3, DepositV2, RemoveOrderV3, TakeOrderV3, WithdrawV2, + AddOrderV3, AfterClearV2, ClearV3, DepositV2, RemoveOrderV3, TakeOrderV4, WithdrawV2, }, Raindex::MetaV1_2, }; @@ -66,7 +66,7 @@ pub mod topics { pub const RAINDEX_EVENT_TOPICS: [B256; 8] = [ AddOrderV3::SIGNATURE_HASH, - TakeOrderV3::SIGNATURE_HASH, + TakeOrderV4::SIGNATURE_HASH, WithdrawV2::SIGNATURE_HASH, DepositV2::SIGNATURE_HASH, RemoveOrderV3::SIGNATURE_HASH, diff --git a/crates/common/ARCHITECTURE.md b/crates/common/ARCHITECTURE.md index c217f2152e..8dd2babef3 100644 --- a/crates/common/ARCHITECTURE.md +++ b/crates/common/ARCHITECTURE.md @@ -23,7 +23,7 @@ require its `COMMIT_SHA` env var. - `add_order` — Compose Rainlang from DOTRAIN, parse to bytecode via on‑chain Parser, generate `addOrder3` call parameters, execute or simulate on a fork. -- `remove_order` — Convert subgraph `SgOrder` to `removeOrder3` call, execute or +- `remove_order` — Convert subgraph `SgOrder` to `removeOrder4` call, execute or return calldata. - `deposit` — ERC20 allowance check/approve and `deposit3` call builder/executor. @@ -94,7 +94,7 @@ Target gating is used extensively: ### 2) Remove Order -- `RemoveOrderArgs` converts `SgOrder` to `removeOrder3Call` via subgraph +- `RemoveOrderArgs` converts `SgOrder` to `removeOrder4Call` via subgraph traits. - Native execution mirrors `add_order` (Ledger provider + `WriteTransaction`), or return calldata only. @@ -356,7 +356,7 @@ are provided so frontends can submit via their own providers. ## Notable Dependencies (workspace crates) - `raindex_bindings` — Strongly‑typed ABI for Raindex and ERC20 contracts - (`addOrder3`, `removeOrder3`, `deposit3`, `withdraw3`, multicall). + (`addOrder3`, `removeOrder4`, `deposit3`, `withdraw3`, multicall). - `raindex_subgraph_client` — GraphQL types and clients for raindex data; provides `Sg*` models and helpers. - `raindex_app_settings` — DOTRAIN/raindex YAML structures, validation, and spec @@ -384,7 +384,7 @@ are provided so frontends can submit via their own providers. submit via external provider (WASM). - Remove an order: - 1. Fetch `SgOrder` from subgraph; convert to `removeOrder3Call` and execute or + 1. Fetch `SgOrder` from subgraph; convert to `removeOrder4Call` and execute or export calldata. - Deposit/Withdraw: diff --git a/crates/common/src/add_order.rs b/crates/common/src/add_order.rs index 6fbd390863..ac2c7c2847 100644 --- a/crates/common/src/add_order.rs +++ b/crates/common/src/add_order.rs @@ -31,7 +31,7 @@ use rain_metadata::{ use rain_metadata_bindings::MetaBoard::emitMetaCall; use raindex_app_settings::deployment::DeploymentCfg; use raindex_bindings::provider::{mk_read_provider, ReadProviderError}; -use raindex_bindings::IRaindexV7::{addOrder4Call, EvaluableV4, OrderConfigV4, TaskV2, IOV2}; +use raindex_bindings::IRaindexV7::{addOrder5Call, EvaluableV4, OrderConfigV4, TaskV3, IOV2}; use serde::{Deserialize, Serialize}; use serde_bytes::ByteBuf; use std::collections::HashMap; @@ -251,7 +251,7 @@ impl AddOrderArgs { pub async fn try_into_call( &self, rpcs: Vec, - ) -> Result { + ) -> Result { let rainlang = self.compose_to_rainlang()?; let bytecode = self .try_parse_rainlang(rpcs.clone(), rainlang.clone()) @@ -273,12 +273,12 @@ impl AddOrderArgs { bytecode: post_bytecode.into(), }; - let post_task = TaskV2 { + let post_task = TaskV3 { evaluable: post_evaluable, signedContext: vec![], }; - Ok(addOrder4Call { + Ok(addOrder5Call { config: OrderConfigV4 { validInputs: self.inputs.clone(), validOutputs: self.outputs.clone(), @@ -1656,7 +1656,7 @@ _ _: 0 0; additional_meta: None, }; - let add_order_call = addOrder4Call { + let add_order_call = addOrder5Call { config: OrderConfigV4 { evaluable: EvaluableV4 { interpreter: *local_evm.interpreter.address(), @@ -1679,7 +1679,7 @@ _ _: 0 0; meta: Bytes::from_str("0xff0a89c674ee7874a30058382f2a20302e2063616c63756c6174652d696f202a2f200a5f205f3a203020303b0a0a2f2a20312e2068616e646c652d696f202a2f200a3a3b011bff13109e41336ff20278186170706c69636174696f6e2f6f637465742d73747265616d").unwrap(), }, tasks: vec![ - TaskV2 { + TaskV3 { evaluable: EvaluableV4 { interpreter: *local_evm.interpreter.address(), store: *local_evm.store.address(), @@ -1702,7 +1702,7 @@ _ _: 0 0; .unwrap(); let input = res.input.input.expect("tx request has no input"); - let decoded = addOrder4Call::abi_decode(&input).unwrap(); + let decoded = addOrder5Call::abi_decode(&input).unwrap(); assert_eq!(decoded.config.evaluable, add_order_call.config.evaluable); assert_eq!( @@ -1749,7 +1749,7 @@ _ _: 0 0; .unwrap() .into(); - let expected_bytes: Bytes = addOrder4Call { + let expected_bytes: Bytes = addOrder5Call { config: OrderConfigV4 { evaluable: EvaluableV4 { interpreter: *local_evm.interpreter.address(), @@ -1774,7 +1774,7 @@ _ _: 0 0; secret: U256::from(0).into(), meta: Bytes::from_str("0xff0a89c674ee7874a30058382f2a20302e2063616c63756c6174652d696f202a2f200a5f205f3a203020303b0a0a2f2a20312e2068616e646c652d696f202a2f200a3a3b011bff13109e41336ff20278186170706c69636174696f6e2f6f637465742d73747265616d").unwrap(), }, - tasks: vec![TaskV2 { + tasks: vec![TaskV3 { evaluable: EvaluableV4 { interpreter: *local_evm.interpreter.address(), store: *local_evm.store.address(), diff --git a/crates/common/src/deposit.rs b/crates/common/src/deposit.rs index f7a92162f8..862a47e446 100644 --- a/crates/common/src/deposit.rs +++ b/crates/common/src/deposit.rs @@ -2,7 +2,7 @@ use crate::allowance::read_allowance; use crate::transaction::{TransactionArgs, TransactionArgsError, WritableTransactionExecuteError}; use alloy::primitives::{Address, B256, U256}; use rain_math_float::{Float, FloatError}; -use raindex_bindings::IRaindexV7::deposit4Call; +use raindex_bindings::IRaindexV7::deposit5Call; #[cfg(not(target_family = "wasm"))] use raindex_bindings::IERC20::approveCall; use serde::{Deserialize, Serialize}; @@ -35,11 +35,11 @@ pub struct DepositArgs { pub decimals: u8, } -impl TryFrom for deposit4Call { +impl TryFrom for deposit5Call { type Error = FloatError; fn try_from(val: DepositArgs) -> Result { - Ok(deposit4Call { + Ok(deposit5Call { token: val.token, vaultId: val.vault_id, depositAmount: val.amount.get_inner(), @@ -99,7 +99,7 @@ impl DepositArgs { ) -> Result<(), DepositError> { let (ledger_client, _) = transaction_args.clone().try_into_ledger_client().await?; - let deposit_call: deposit4Call = self.clone().try_into()?; + let deposit_call: deposit5Call = self.clone().try_into()?; let tx_request = transaction_args .try_into_transaction_request(deposit_call, transaction_args.raindex_address)?; diff --git a/crates/common/src/local_db/address_collectors.rs b/crates/common/src/local_db/address_collectors.rs index 33763f7608..919f2a4b68 100644 --- a/crates/common/src/local_db/address_collectors.rs +++ b/crates/common/src/local_db/address_collectors.rs @@ -13,7 +13,7 @@ pub fn collect_token_addresses( DecodedEvent::WithdrawV2(withdraw) => Some(vec![withdraw.token]), DecodedEvent::AddOrderV3(add) => Some(order_tokens_vec(&add.order)), DecodedEvent::RemoveOrderV3(remove) => Some(order_tokens_vec(&remove.order)), - DecodedEvent::TakeOrderV3(take) => Some(order_tokens_vec(&take.config.order)), + DecodedEvent::TakeOrderV4(take) => Some(order_tokens_vec(&take.config.order)), DecodedEvent::ClearV3(clear) => { let mut tokens = order_tokens_vec(&clear.alice); tokens.extend(order_tokens_vec(&clear.bob)); @@ -38,7 +38,7 @@ pub fn collect_store_addresses( DecodedEvent::RemoveOrderV3(remove) => { out.insert(remove.order.evaluable.store); } - DecodedEvent::TakeOrderV3(take) => { + DecodedEvent::TakeOrderV4(take) => { out.insert(take.config.order.evaluable.store); } DecodedEvent::InterpreterStoreSet(set) => { @@ -69,8 +69,8 @@ mod tests { use alloy::primitives::{b256, Address, Bytes, FixedBytes, U256}; use raindex_bindings::IInterpreterStoreV3::Set; use raindex_bindings::IRaindexV7::{ - AddOrderV3, DepositV2, OrderV4, RemoveOrderV3, SignedContextV1, TakeOrderConfigV4, - TakeOrderV3, WithdrawV2, IOV2, + AddOrderV3, DepositV2, OrderV4, RemoveOrderV3, SignedContextV2, TakeOrderConfigV5, + TakeOrderV4, WithdrawV2, IOV2, }; fn build_event(event: DecodedEvent) -> DecodedEventData { @@ -215,14 +215,15 @@ mod tests { let mut take_order = sample_order(); take_order.evaluable.store = Address::from([0x33; 20]); - let take_event = TakeOrderV3 { + let take_event = TakeOrderV4 { sender: Address::from([0x23; 20]), - config: TakeOrderConfigV4 { + config: TakeOrderConfigV5 { order: take_order, inputIOIndex: U256::from(0), outputIOIndex: U256::from(0), - signedContext: vec![SignedContextV1 { + signedContext: vec![SignedContextV2 { signer: Address::from([0x24; 20]), + domainSeparator: alloy::primitives::B256::repeat_byte(0xd5), context: vec![U256::from(1).into()], signature: Bytes::from(vec![0xde, 0xad]), }], @@ -243,7 +244,7 @@ mod tests { let events = vec![ build_event(DecodedEvent::AddOrderV3(Box::new(add_event))), build_event(DecodedEvent::RemoveOrderV3(Box::new(remove_event))), - build_event(DecodedEvent::TakeOrderV3(Box::new(take_event))), + build_event(DecodedEvent::TakeOrderV4(Box::new(take_event))), build_event(DecodedEvent::InterpreterStoreSet(Box::new(store_event))), ]; diff --git a/crates/common/src/local_db/decode.rs b/crates/common/src/local_db/decode.rs index a12b1212af..28feb213ea 100644 --- a/crates/common/src/local_db/decode.rs +++ b/crates/common/src/local_db/decode.rs @@ -8,7 +8,7 @@ use core::convert::TryFrom; use raindex_bindings::{ IInterpreterStoreV3::Set, IRaindexV7::{ - AddOrderV3, AfterClearV2, ClearV3, DepositV2, RemoveOrderV3, TakeOrderV3, WithdrawV2, + AddOrderV3, AfterClearV2, ClearV3, DepositV2, RemoveOrderV3, TakeOrderV4, WithdrawV2, }, Raindex::MetaV1_2, }; @@ -27,7 +27,7 @@ pub enum DecodeError { #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)] pub enum EventType { AddOrderV3, - TakeOrderV3, + TakeOrderV4, WithdrawV2, DepositV2, RemoveOrderV3, @@ -43,8 +43,8 @@ impl EventType { if topic == AddOrderV3::SIGNATURE_HASH.as_slice() { return Self::AddOrderV3; } - if topic == TakeOrderV3::SIGNATURE_HASH.as_slice() { - return Self::TakeOrderV3; + if topic == TakeOrderV4::SIGNATURE_HASH.as_slice() { + return Self::TakeOrderV4; } if topic == WithdrawV2::SIGNATURE_HASH.as_slice() { return Self::WithdrawV2; @@ -87,7 +87,7 @@ pub struct DecodedEventData { #[serde(untagged)] pub enum DecodedEvent { AddOrderV3(Box), - TakeOrderV3(Box), + TakeOrderV4(Box), WithdrawV2(Box), DepositV2(Box), RemoveOrderV3(Box), @@ -136,8 +136,8 @@ pub fn decode_events( EventType::AddOrderV3 => { DecodedEvent::AddOrderV3(Box::new(decode_event::(event)?)) } - EventType::TakeOrderV3 => { - DecodedEvent::TakeOrderV3(Box::new(decode_event::(event)?)) + EventType::TakeOrderV4 => { + DecodedEvent::TakeOrderV4(Box::new(decode_event::(event)?)) } EventType::WithdrawV2 => { DecodedEvent::WithdrawV2(Box::new(decode_event::(event)?)) @@ -212,7 +212,7 @@ mod test_helpers { use raindex_bindings::{ IRaindexV7::{ AddOrderV3, AfterClearV2, ClearConfigV2, ClearStateChangeV2, ClearV3, DepositV2, - RemoveOrderV3, SignedContextV1, TakeOrderConfigV4, TakeOrderV3, WithdrawV2, + RemoveOrderV3, SignedContextV2, TakeOrderConfigV5, TakeOrderV4, WithdrawV2, }, IRaindexV7::{EvaluableV4, OrderV4, IOV2}, Raindex::MetaV1_2, @@ -336,12 +336,13 @@ mod test_helpers { fn create_take_order_v3_event_data() -> LogEntryResponse { let sender = Address::from([9u8; 20]); - let config = TakeOrderConfigV4 { + let config = TakeOrderConfigV5 { order: create_sample_order_v4(), inputIOIndex: U256::from(0), outputIOIndex: U256::from(0), - signedContext: vec![SignedContextV1 { + signedContext: vec![SignedContextV2 { signer: Address::from([10u8; 20]), + domainSeparator: alloy::primitives::B256::repeat_byte(0xd5), context: vec![U256::from(42).into(), U256::from(43).into()], signature: Bytes::from(vec![0x11, 0x22, 0x33]), }], @@ -349,7 +350,7 @@ mod test_helpers { let input = U256::from(1000); let output = U256::from(2000); - let event_data = TakeOrderV3 { + let event_data = TakeOrderV4 { sender, config, input: input.into(), @@ -358,7 +359,7 @@ mod test_helpers { let encoded_data = event_data.encode_data(); new_log_entry( - Bytes::from(TakeOrderV3::SIGNATURE_HASH.as_slice().to_vec()), + Bytes::from(TakeOrderV4::SIGNATURE_HASH.as_slice().to_vec()), Bytes::from(encoded_data), "0x123457", Some("0x64b8c124"), @@ -587,10 +588,10 @@ mod test_helpers { assert_eq!(decoded_events.len(), 1); let decoded_event = &decoded_events[0]; - assert_eq!(decoded_event.event_type, EventType::TakeOrderV3); + assert_eq!(decoded_event.event_type, EventType::TakeOrderV4); - let DecodedEvent::TakeOrderV3(take_order) = &decoded_event.decoded_data else { - panic!("expected TakeOrderV3 decoded data"); + let DecodedEvent::TakeOrderV4(take_order) = &decoded_event.decoded_data else { + panic!("expected TakeOrderV4 decoded data"); }; let take_order = take_order.as_ref(); @@ -607,6 +608,10 @@ mod test_helpers { assert_eq!(signed_context.len(), 1); let ctx = &signed_context[0]; assert_eq!(ctx.signer, Address::from([10u8; 20])); + assert_eq!( + ctx.domainSeparator, + alloy::primitives::B256::repeat_byte(0xd5) + ); assert_eq!(ctx.context, vec![fixed_u256(42), fixed_u256(43)]); assert_eq!(ctx.signature, Bytes::from(vec![0x11, 0x22, 0x33])); } diff --git a/crates/common/src/local_db/insert.rs b/crates/common/src/local_db/insert.rs index e6556ee19f..008c88a0a2 100644 --- a/crates/common/src/local_db/insert.rs +++ b/crates/common/src/local_db/insert.rs @@ -10,7 +10,7 @@ use alloy::{ }; use rain_math_float::Float; use raindex_bindings::IRaindexV7::{ - AddOrderV3, AfterClearV2, ClearV3, DepositV2, OrderV4, RemoveOrderV3, TakeOrderV3, WithdrawV2, + AddOrderV3, AfterClearV2, ClearV3, DepositV2, OrderV4, RemoveOrderV3, TakeOrderV4, WithdrawV2, IOV2, }; use raindex_bindings::Raindex::MetaV1_2; @@ -114,7 +114,7 @@ pub fn decoded_events_to_statements( batch.add(generate_remove_order_statement(&context, remove_event)); batch.extend(generate_order_ios_statements(&context, &remove_event.order)); } - DecodedEvent::TakeOrderV3(decoded) => { + DecodedEvent::TakeOrderV4(decoded) => { let take_event = decoded.as_ref(); batch.add(generate_take_order_statement(&context, take_event)?); } @@ -410,7 +410,7 @@ fn generate_remove_order_statement( fn generate_take_order_statement( context: &EventContext, - decoded: &TakeOrderV3, + decoded: &TakeOrderV4, ) -> Result { let input_io_index_u64 = u256_to_u64(&decoded.config.inputIOIndex, "inputIOIndex")?; let output_io_index_u64 = u256_to_u64(&decoded.config.outputIOIndex, "outputIOIndex")?; @@ -777,7 +777,7 @@ mod tests { use itertools::Itertools; use raindex_bindings::IInterpreterStoreV3::Set; use raindex_bindings::IRaindexV7::{ - ClearConfigV2, ClearStateChangeV2, EvaluableV4, SignedContextV1, TakeOrderConfigV4, + ClearConfigV2, ClearStateChangeV2, EvaluableV4, SignedContextV2, TakeOrderConfigV5, }; use std::collections::HashMap; @@ -917,14 +917,15 @@ mod tests { } fn sample_take_event() -> DecodedEventData { - let take = TakeOrderV3 { + let take = TakeOrderV4 { sender: Address::from([0x09; 20]), - config: TakeOrderConfigV4 { + config: TakeOrderConfigV5 { order: sample_order(), inputIOIndex: U256::from(0), outputIOIndex: U256::from(0), - signedContext: vec![SignedContextV1 { + signedContext: vec![SignedContextV2 { signer: Address::from([0x0a; 20]), + domainSeparator: alloy::primitives::B256::repeat_byte(0xd5), context: vec![U256::from(0x2a).into()], signature: Bytes::from(vec![0x11, 0x22, 0x33]), }], @@ -934,12 +935,12 @@ mod tests { }; build_event( - EventType::TakeOrderV3, + EventType::TakeOrderV4, "0x101", "0x201", b256!("0x000000000000000000000000000000000000000000000000000000000000def0"), "0x2", - DecodedEvent::TakeOrderV3(Box::new(take)), + DecodedEvent::TakeOrderV4(Box::new(take)), ) } @@ -1184,7 +1185,7 @@ mod tests { fn take_order_sql_generation() { let event = sample_take_event(); let context = event_context(&RaindexIdentifier::new(1, Address::ZERO), &event).unwrap(); - let DecodedEvent::TakeOrderV3(decoded) = &event.decoded_data else { + let DecodedEvent::TakeOrderV4(decoded) = &event.decoded_data else { unreachable!() }; let statement = generate_take_order_statement(&context, decoded).unwrap(); diff --git a/crates/common/src/raindex_client/order_quotes.rs b/crates/common/src/raindex_client/order_quotes.rs index 2044051a94..d0c02380d6 100644 --- a/crates/common/src/raindex_client/order_quotes.rs +++ b/crates/common/src/raindex_client/order_quotes.rs @@ -5,7 +5,7 @@ use crate::raindex_client::vaults::RaindexVault; use crate::utils::timing::Timing; use alloy::primitives::{Address, B256}; use rain_math_float::Float; -use raindex_bindings::IRaindexV7::{OrderV4, SignedContextV1, IOV2}; +use raindex_bindings::IRaindexV7::{OrderV4, SignedContextV2, IOV2}; use raindex_quote::{ get_order_quotes, get_order_quotes_for_pairs, BatchOrderQuotesResponse, NoopInjector, OrderQuoteValue, Pair, SignedContextInjector, @@ -30,7 +30,7 @@ pub struct RaindexOrderQuote { /// the candidate builder can reuse the same context the quote saw. #[serde(default, skip_serializing_if = "Vec::is_empty")] #[tsify(optional)] - pub signed_context: Vec, + pub signed_context: Vec, } impl_wasm_traits!(RaindexOrderQuote); impl RaindexOrderQuote { @@ -400,7 +400,7 @@ pub(crate) async fn get_order_quotes_batch_for_pairs( /// `counterparty` address and a caller-supplied [`SignedContextInjector`] /// through to the quote RPC. Oracle-fetched contexts come first, followed by /// entries produced by the injector; the composed list is attached to each -/// `QuoteV2.signedContext` before the multicall and is therefore visible to +/// `QuoteV3.signedContext` before the multicall and is therefore visible to /// any `calculate-io` execution run during quoting (e.g. gated orders that /// assert on `signer<0>()`). pub async fn get_order_quotes_batch_with_injector( @@ -626,7 +626,7 @@ mod tests { ); // OZ Multicall returns `bytes[]`; helper to wrap per-target - // `quote2Return`s into the outer multicall return payload. + // `quote3Return`s into the outer multicall return payload. fn encode_multicall_bytes(inner: Vec) -> String { let elements: Vec = inner.into_iter().map(|r| r.abi_encode().into()).collect(); encode_prefixed( as SolValue>::abi_encode(&elements)) diff --git a/crates/common/src/raindex_client/orders.rs b/crates/common/src/raindex_client/orders.rs index 7d25f9d659..9468ef877c 100644 --- a/crates/common/src/raindex_client/orders.rs +++ b/crates/common/src/raindex_client/orders.rs @@ -753,7 +753,7 @@ impl RaindexOrder { Ok(sg_order) } - /// Generates calldata for `IRaindexV7.takeOrders4` targeting this specific order. + /// Generates calldata for `IRaindexV7.takeOrders5` targeting this specific order. /// /// Unlike `getTakeOrdersCalldata` on `RaindexClient` which discovers orders from the subgraph, /// this method generates calldata for taking this single known order that the user has already @@ -770,7 +770,7 @@ impl RaindexOrder { /// - `priceCap`: human-readable decimal string for max sell per 1 buy /// /// Returns calldata plus pricing info: - /// - `calldata`: ABI-encoded bytes for `takeOrders4`. + /// - `calldata`: ABI-encoded bytes for `takeOrders5`. /// - `effectivePrice`: expected blended sell per 1 buy from the simulation. /// - `prices`: per-leg ratios (single entry for this order). /// - `expectedSell`: simulated sell at current quotes. @@ -794,7 +794,7 @@ impl RaindexOrder { /// ``` #[wasm_export( js_name = "getTakeCalldata", - return_description = "Encoded takeOrders4 calldata and price information for this order", + return_description = "Encoded takeOrders5 calldata and price information for this order", unchecked_return_type = "TakeOrdersCalldataResult", preserve_js_class )] @@ -901,10 +901,10 @@ impl RaindexOrder { /// caller-supplied [`SignedContextInjector`] through the quote pipeline. /// /// Mirrors the shape of [`RaindexClient::get_take_orders_calldata_with_injector`]: - /// any injector-contributed `SignedContextV1` entries are appended after - /// any oracle-fetched context on each `QuoteV2` before the quote multicall + /// any injector-contributed `SignedContextV2` entries are appended after + /// any oracle-fetched context on each `QuoteV3` before the quote multicall /// (composition order: `[oracle..., injected...]`). The candidate inherits - /// that exact composed list, so `takeOrders4` executes with the same + /// that exact composed list, so `takeOrders5` executes with the same /// signed context the quote saw — required for gated orders whose /// `calculate-io` asserts on `signer<0>()` or similar. /// diff --git a/crates/common/src/raindex_client/remove_orders.rs b/crates/common/src/raindex_client/remove_orders.rs index 0a9dc1b5df..a40176bfd5 100644 --- a/crates/common/src/raindex_client/remove_orders.rs +++ b/crates/common/src/raindex_client/remove_orders.rs @@ -8,7 +8,7 @@ use crate::retry::{retry_with_constant_interval, RetryError}; use crate::utils::timing::Timing; use alloy::primitives::{hex::decode, Bytes, B256}; use alloy::sol_types::{SolCall, SolValue}; -use raindex_bindings::IRaindexV7::{removeOrder3Call, OrderV4}; +use raindex_bindings::IRaindexV7::{removeOrder4Call, OrderV4}; use raindex_subgraph_client::types::order_detail_traits::OrderDetailError; use tracing::{error, info, info_span}; @@ -221,7 +221,7 @@ impl RaindexOrder { return Err(RaindexError::from(err)); } }; - let remove_order_call = removeOrder3Call { + let remove_order_call = removeOrder4Call { order, tasks: vec![], }; diff --git a/crates/common/src/raindex_client/take_orders/e2e_tests.rs b/crates/common/src/raindex_client/take_orders/e2e_tests.rs index ebc5947ea3..a28a09cae0 100644 --- a/crates/common/src/raindex_client/take_orders/e2e_tests.rs +++ b/crates/common/src/raindex_client/take_orders/e2e_tests.rs @@ -24,7 +24,7 @@ use alloy::serde::WithOtherFields; use alloy::sol_types::SolCall; use httpmock::MockServer; use rain_math_float::Float; -use raindex_bindings::IRaindexV7::{takeOrders4Call, TakeOrdersConfigV5}; +use raindex_bindings::IRaindexV7::{takeOrders5Call, TakeOrdersConfigV6}; use serde_json::json; use std::ops::{Mul, Sub}; @@ -217,7 +217,7 @@ async fn test_get_take_orders_calldata_happy_path_returns_valid_config() { "Raindex address should match" ); - let decoded = takeOrders4Call::abi_decode(result.calldata()).expect("Should decode calldata"); + let decoded = takeOrders5Call::abi_decode(result.calldata()).expect("Should decode calldata"); let config = decoded.config; assert!( @@ -338,12 +338,12 @@ async fn test_get_take_orders_calldata_min_receive_mode_exact_vs_partial() { ); let result_exact = result_exact.take_orders_info().unwrap(); - let decoded_partial = takeOrders4Call::abi_decode(result_partial.calldata()) + let decoded_partial = takeOrders5Call::abi_decode(result_partial.calldata()) .expect("Should decode partial calldata"); let config_partial = decoded_partial.config; let decoded_exact = - takeOrders4Call::abi_decode(result_exact.calldata()).expect("Should decode exact calldata"); + takeOrders5Call::abi_decode(result_exact.calldata()).expect("Should decode exact calldata"); let config_exact = decoded_exact.config; let expected_buy_target = Float::parse(buy_target).unwrap().get_inner(); @@ -504,7 +504,7 @@ async fn test_min_receive_mode_exact_returns_error_when_insufficient_liquidity() assert!(result_partial.is_ready(), "Expected Ready variant"); let result_partial = result_partial.take_orders_info().unwrap(); - let decoded_partial = takeOrders4Call::abi_decode(result_partial.calldata()) + let decoded_partial = takeOrders5Call::abi_decode(result_partial.calldata()) .expect("Should decode partial calldata"); let config_partial = decoded_partial.config; @@ -625,7 +625,7 @@ async fn test_maximum_io_ratio_enforcement_skips_overpriced_leg() { assert!(result.is_ready(), "Expected Ready variant"); let result = result.take_orders_info().unwrap(); - let decoded = takeOrders4Call::abi_decode(result.calldata()).expect("Should decode calldata"); + let decoded = takeOrders5Call::abi_decode(result.calldata()).expect("Should decode calldata"); let original_config = decoded.config; assert_eq!( @@ -657,7 +657,7 @@ async fn test_maximum_io_ratio_enforcement_skips_overpriced_leg() { ); let lowered_max_io_ratio = Float::parse("1.5".to_string()).unwrap(); - let modified_config = TakeOrdersConfigV5 { + let modified_config = TakeOrdersConfigV6 { minimumIO: original_config.minimumIO, maximumIO: original_config.maximumIO, maximumIORatio: lowered_max_io_ratio.get_inner(), @@ -666,7 +666,7 @@ async fn test_maximum_io_ratio_enforcement_skips_overpriced_leg() { data: original_config.data.clone(), }; - let modified_calldata_bytes = takeOrders4Call { + let modified_calldata_bytes = takeOrders5Call { config: modified_config, } .abi_encode(); @@ -719,7 +719,7 @@ async fn test_maximum_io_ratio_enforcement_skips_overpriced_leg() { "Should have received some tokens from cheap order" ); - let exact_config = TakeOrdersConfigV5 { + let exact_config = TakeOrdersConfigV6 { minimumIO: original_config.maximumIO, maximumIO: original_config.maximumIO, maximumIORatio: lowered_max_io_ratio.get_inner(), @@ -728,7 +728,7 @@ async fn test_maximum_io_ratio_enforcement_skips_overpriced_leg() { data: original_config.data.clone(), }; - let exact_calldata_bytes = takeOrders4Call { + let exact_calldata_bytes = takeOrders5Call { config: exact_config, } .abi_encode(); @@ -844,7 +844,7 @@ async fn test_maximum_io_ratio_enforcement_with_worsened_on_chain_price() { assert!(result.is_ready(), "Expected Ready variant"); let result = result.take_orders_info().unwrap(); - let decoded = takeOrders4Call::abi_decode(result.calldata()).expect("Should decode calldata"); + let decoded = takeOrders5Call::abi_decode(result.calldata()).expect("Should decode calldata"); let original_config = decoded.config; let expected_price_cap_2 = Float::parse(price_cap_2.clone()).unwrap(); @@ -859,7 +859,7 @@ async fn test_maximum_io_ratio_enforcement_with_worsened_on_chain_price() { let withdraw_tx = setup .local_evm .raindex - .withdraw4(setup.token2, vault_id_2, withdraw_amount, vec![]) + .withdraw5(setup.token2, vault_id_2, withdraw_amount, vec![]) .from(setup.owner) .into_transaction_request(); setup @@ -918,7 +918,7 @@ async fn test_maximum_io_ratio_enforcement_with_worsened_on_chain_price() { "Should have received tokens from cheap order" ); - let exact_config = TakeOrdersConfigV5 { + let exact_config = TakeOrdersConfigV6 { minimumIO: original_config.maximumIO, maximumIO: original_config.maximumIO, maximumIORatio: original_config.maximumIORatio, @@ -927,7 +927,7 @@ async fn test_maximum_io_ratio_enforcement_with_worsened_on_chain_price() { data: original_config.data.clone(), }; - let exact_calldata_bytes = takeOrders4Call { + let exact_calldata_bytes = takeOrders5Call { config: exact_config, } .abi_encode(); @@ -1057,7 +1057,7 @@ async fn test_cross_raindex_selection_picks_best_book() { assert!(result.is_ready(), "Expected Ready variant"); let result = result.take_orders_info().unwrap(); - let decoded = takeOrders4Call::abi_decode(result.calldata()).expect("Should decode calldata"); + let decoded = takeOrders5Call::abi_decode(result.calldata()).expect("Should decode calldata"); let config = decoded.config; assert_eq!( @@ -1213,7 +1213,7 @@ async fn test_cross_raindex_selection_flips_when_economics_flip() { "Should select raindex A (max_output=10 > max_output=3)" ); - let decoded = takeOrders4Call::abi_decode(result.calldata()).expect("Should decode calldata"); + let decoded = takeOrders5Call::abi_decode(result.calldata()).expect("Should decode calldata"); let config = decoded.config; assert!( @@ -1352,7 +1352,7 @@ async fn test_cross_raindex_economic_selection_prefers_best_yield() { "Should select raindex A (can fill 5 buy at ratio 1.0) over B (can fill 5 buy but at worse price 1.5)" ); - let decoded = takeOrders4Call::abi_decode(result.calldata()).expect("Should decode calldata"); + let decoded = takeOrders5Call::abi_decode(result.calldata()).expect("Should decode calldata"); let config = decoded.config; assert!( @@ -1552,7 +1552,7 @@ async fn test_prices_sorted_best_to_worst_matching_config_orders() { assert!(result.is_ready(), "Expected Ready variant"); let result = result.take_orders_info().unwrap(); - let decoded = takeOrders4Call::abi_decode(result.calldata()).expect("Should decode calldata"); + let decoded = takeOrders5Call::abi_decode(result.calldata()).expect("Should decode calldata"); let config = decoded.config; assert_eq!( @@ -1669,7 +1669,7 @@ async fn test_spend_up_to_mode_happy_path() { "Raindex address should match" ); - let decoded = takeOrders4Call::abi_decode(result.calldata()).expect("Should decode calldata"); + let decoded = takeOrders5Call::abi_decode(result.calldata()).expect("Should decode calldata"); let config = decoded.config; assert!( @@ -1797,11 +1797,11 @@ async fn test_spend_exact_vs_spend_up_to_modes() { let result_exact = result_exact.take_orders_info().unwrap(); let decoded_up_to = - takeOrders4Call::abi_decode(result_up_to.calldata()).expect("Should decode up_to calldata"); + takeOrders5Call::abi_decode(result_up_to.calldata()).expect("Should decode up_to calldata"); let config_up_to = decoded_up_to.config; let decoded_exact = - takeOrders4Call::abi_decode(result_exact.calldata()).expect("Should decode exact calldata"); + takeOrders5Call::abi_decode(result_exact.calldata()).expect("Should decode exact calldata"); let config_exact = decoded_exact.config; let expected_spend_budget = Float::parse(spend_budget).unwrap().get_inner(); @@ -1911,7 +1911,7 @@ async fn test_spend_exact_mode_insufficient_liquidity() { let result_up_to = result_up_to.take_orders_info().unwrap(); let decoded_up_to = - takeOrders4Call::abi_decode(result_up_to.calldata()).expect("Should decode up_to calldata"); + takeOrders5Call::abi_decode(result_up_to.calldata()).expect("Should decode up_to calldata"); let config_up_to = decoded_up_to.config; assert_eq!( @@ -2153,7 +2153,7 @@ async fn test_spend_mode_cross_raindex_selection() { assert!(result.is_ready(), "Expected Ready variant"); let result = result.take_orders_info().unwrap(); - let decoded = takeOrders4Call::abi_decode(result.calldata()).expect("Should decode calldata"); + let decoded = takeOrders5Call::abi_decode(result.calldata()).expect("Should decode calldata"); let config = decoded.config; assert!( diff --git a/crates/common/src/raindex_client/take_orders/mod.rs b/crates/common/src/raindex_client/take_orders/mod.rs index 916bcf159b..4de327f27c 100644 --- a/crates/common/src/raindex_client/take_orders/mod.rs +++ b/crates/common/src/raindex_client/take_orders/mod.rs @@ -189,7 +189,7 @@ fn log_selected_legs( #[wasm_export] impl RaindexClient { - /// Generates calldata for `IRaindexV7.takeOrders4` using a mode + price-cap policy. + /// Generates calldata for `IRaindexV7.takeOrders5` using a mode + price-cap policy. /// /// This method includes preflight simulation to validate the transaction will succeed /// and automatically removes failing orders from the config. @@ -204,7 +204,7 @@ impl RaindexClient { /// - `priceCap`: human-readable decimal string for max sell per 1 buy /// /// Returns calldata plus pricing info: - /// - `calldata`: ABI-encoded bytes for `takeOrders4`. + /// - `calldata`: ABI-encoded bytes for `takeOrders5`. /// - `effectivePrice`: expected blended sell per 1 buy from the simulation. /// - `prices`: per-leg ratios, best→worst. /// - `expectedSell`: simulated sell at current quotes. @@ -229,7 +229,7 @@ impl RaindexClient { /// ``` #[wasm_export( js_name = "getTakeOrdersCalldata", - return_description = "Encoded takeOrders4 calldata and price information", + return_description = "Encoded takeOrders5 calldata and price information", unchecked_return_type = "TakeOrdersCalldataResult", preserve_js_class )] @@ -249,7 +249,7 @@ impl RaindexClient { impl RaindexClient { /// Non-wasm variant of [`Self::get_take_orders_calldata`] that accepts a /// caller-supplied [`SignedContextInjector`]. The injector contributes - /// additional `SignedContextV1` entries appended after any oracle-fetched + /// additional `SignedContextV2` entries appended after any oracle-fetched /// contexts for each candidate (composition order: `[oracle..., injected...]`). pub async fn get_take_orders_calldata_with_injector( &self, @@ -608,7 +608,7 @@ mod tests { use crate::test_helpers::candidates::make_candidate; use alloy::primitives::{Address, Bytes, FixedBytes, U256}; use rain_math_float::Float; - use raindex_bindings::IRaindexV7::SignedContextV1; + use raindex_bindings::IRaindexV7::SignedContextV2; fn float(value: &str) -> Float { Float::parse(value.to_string()).unwrap() @@ -628,9 +628,10 @@ mod tests { } } - fn signed_context(value: u8) -> SignedContextV1 { - SignedContextV1 { + fn signed_context(value: u8) -> SignedContextV2 { + SignedContextV2 { signer: Address::from([value; 20]), + domainSeparator: alloy::primitives::B256::repeat_byte(0xd5), context: vec![FixedBytes::<32>::from( U256::from(value).to_be_bytes::<32>(), )], diff --git a/crates/common/src/raindex_client/take_orders/result.rs b/crates/common/src/raindex_client/take_orders/result.rs index c1ec8080f2..3186baeb4b 100644 --- a/crates/common/src/raindex_client/take_orders/result.rs +++ b/crates/common/src/raindex_client/take_orders/result.rs @@ -3,7 +3,7 @@ use crate::take_orders::{build_approval_calldata, BuiltTakeOrdersConfig, ParsedT use alloy::primitives::{Address, Bytes}; use alloy::sol_types::SolCall; use rain_math_float::Float; -use raindex_bindings::IRaindexV7::takeOrders4Call; +use raindex_bindings::IRaindexV7::takeOrders5Call; use serde::{Deserialize, Serialize}; use std::ops::{Div, Mul}; use wasm_bindgen_utils::prelude::*; @@ -379,7 +379,7 @@ pub(crate) fn build_calldata_result( mode: ParsedTakeOrdersMode, price_cap: Float, ) -> Result { - let calldata_bytes = takeOrders4Call { + let calldata_bytes = takeOrders5Call { config: built_config.config, } .abi_encode(); @@ -426,7 +426,7 @@ mod tests { use crate::take_orders::build_take_orders_config_from_simulation; use crate::test_helpers::candidates::make_candidate; use alloy::primitives::U256; - use raindex_bindings::IRaindexV7::takeOrders4Call; + use raindex_bindings::IRaindexV7::takeOrders5Call; use raindex_bindings::IERC20::approveCall; fn high_price_cap() -> Float { @@ -473,7 +473,7 @@ mod tests { assert!(!take_orders_info.calldata().is_empty()); assert!(!take_orders_info.prices().is_empty()); - let decoded = takeOrders4Call::abi_decode(take_orders_info.calldata()) + let decoded = takeOrders5Call::abi_decode(take_orders_info.calldata()) .expect("Should decode calldata"); assert!(!decoded.config.orders.is_empty()); assert!( @@ -508,7 +508,7 @@ mod tests { assert!(!take_orders_info.calldata().is_empty()); assert!(!take_orders_info.prices().is_empty()); - let decoded = takeOrders4Call::abi_decode(take_orders_info.calldata()) + let decoded = takeOrders5Call::abi_decode(take_orders_info.calldata()) .expect("Should decode calldata"); assert!(!decoded.config.orders.is_empty()); assert!( diff --git a/crates/common/src/raindex_client/take_orders/single.rs b/crates/common/src/raindex_client/take_orders/single.rs index fbdf708f59..4ea26b76d3 100644 --- a/crates/common/src/raindex_client/take_orders/single.rs +++ b/crates/common/src/raindex_client/take_orders/single.rs @@ -74,7 +74,7 @@ pub fn build_candidate_from_quote( // attached (oracle entries first, then any injector-contributed // entries). Dropping it here was a regression: gated orders whose // `calculate-io` asserted on signed context during quoting would - // then be executed without the same context at `takeOrders4` time. + // then be executed without the same context at `takeOrders5` time. signed_context: quote.signed_context.clone(), })) } @@ -646,7 +646,7 @@ mod tests { /// Regression: a quote whose `signed_context` is populated (as produced /// by the injector-aware quote pipeline) must propagate that context into /// the candidate verbatim. Dropping it here previously caused gated - /// single-takes to execute `takeOrders4` without the context that + /// single-takes to execute `takeOrders5` without the context that /// `calculate-io` saw at quote time. #[test] fn test_build_candidate_inherits_signed_context_from_quote() { @@ -654,7 +654,7 @@ mod tests { use crate::raindex_client::tests::{get_test_yaml, CHAIN_ID_1_RAINDEX_ADDRESS}; use alloy::primitives::{b256, Address, Bytes, FixedBytes, U256}; use httpmock::MockServer; - use raindex_bindings::IRaindexV7::SignedContextV1; + use raindex_bindings::IRaindexV7::SignedContextV2; use raindex_subgraph_client::utils::float::F1; use serde_json::json; use std::str::FromStr; @@ -662,13 +662,15 @@ mod tests { let max_output = Float::parse("100".to_string()).unwrap(); let ratio = Float::parse("1".to_string()).unwrap(); - let oracle_entry = SignedContextV1 { + let oracle_entry = SignedContextV2 { signer: Address::from([0xAAu8; 20]), + domainSeparator: alloy::primitives::B256::repeat_byte(0xd5), context: vec![FixedBytes::<32>::from(U256::from(1u64).to_be_bytes::<32>())], signature: Bytes::from(vec![0x01]), }; - let injected_entry = SignedContextV1 { + let injected_entry = SignedContextV2 { signer: Address::from([0xBBu8; 20]), + domainSeparator: alloy::primitives::B256::repeat_byte(0xd5), context: vec![FixedBytes::<32>::from(U256::from(2u64).to_be_bytes::<32>())], signature: Bytes::from(vec![0x02]), }; diff --git a/crates/common/src/raindex_client/take_orders/single_tests.rs b/crates/common/src/raindex_client/take_orders/single_tests.rs index 35ef2801d6..9f84f015bd 100644 --- a/crates/common/src/raindex_client/take_orders/single_tests.rs +++ b/crates/common/src/raindex_client/take_orders/single_tests.rs @@ -22,7 +22,7 @@ use alloy::serde::WithOtherFields; use alloy::sol_types::SolCall; use httpmock::MockServer; use rain_math_float::Float; -use raindex_bindings::IRaindexV7::takeOrders4Call; +use raindex_bindings::IRaindexV7::takeOrders5Call; use raindex_quote::Pair; use serde_json::json; use std::ops::{Div, Mul}; @@ -152,7 +152,7 @@ async fn test_single_order_take_happy_path_buy_up_to() { "Should have exactly 1 price entry" ); - let decoded = takeOrders4Call::abi_decode(result.calldata()).expect("Should decode calldata"); + let decoded = takeOrders5Call::abi_decode(result.calldata()).expect("Should decode calldata"); let config = decoded.config; assert_eq!(config.orders.len(), 1, "Should have exactly 1 order"); @@ -251,7 +251,7 @@ async fn test_single_order_take_happy_path_buy_exact() { assert!(result.is_ready()); let result = result.take_orders_info().unwrap(); - let decoded = takeOrders4Call::abi_decode(result.calldata()).expect("Should decode calldata"); + let decoded = takeOrders5Call::abi_decode(result.calldata()).expect("Should decode calldata"); let config = decoded.config; let expected_buy = Float::parse(buy_target.to_string()).unwrap().get_inner(); @@ -351,7 +351,7 @@ async fn test_single_order_take_happy_path_spend_up_to() { assert!(result.is_ready()); let result = result.take_orders_info().unwrap(); - let decoded = takeOrders4Call::abi_decode(result.calldata()).expect("Should decode calldata"); + let decoded = takeOrders5Call::abi_decode(result.calldata()).expect("Should decode calldata"); let config = decoded.config; assert!( @@ -1058,7 +1058,7 @@ async fn test_single_order_take_approval_then_ready_flow() { ); // Verify the calldata is valid by decoding it - let decoded = takeOrders4Call::abi_decode(take_info.calldata()) + let decoded = takeOrders5Call::abi_decode(take_info.calldata()) .expect("Should decode take orders calldata"); assert_eq!( decoded.config.orders.len(), @@ -1154,7 +1154,7 @@ async fn test_single_order_take_calldata_encoding_buy_mode() { assert!(result.is_ready()); let result = result.take_orders_info().unwrap(); - let decoded = takeOrders4Call::abi_decode(result.calldata()).expect("Should decode calldata"); + let decoded = takeOrders5Call::abi_decode(result.calldata()).expect("Should decode calldata"); let config = decoded.config; assert!(config.IOIsInput, "IOIsInput should be true for buy mode"); @@ -1368,7 +1368,7 @@ async fn test_single_order_take_spend_exact_mode() { assert!(result.is_ready()); let result = result.take_orders_info().unwrap(); - let decoded = takeOrders4Call::abi_decode(result.calldata()).expect("Should decode calldata"); + let decoded = takeOrders5Call::abi_decode(result.calldata()).expect("Should decode calldata"); let config = decoded.config; assert!( @@ -1686,7 +1686,7 @@ async fn test_single_order_take_calldata_encoding_spend_mode() { assert!(result.is_ready()); let result = result.take_orders_info().unwrap(); - let decoded = takeOrders4Call::abi_decode(result.calldata()).expect("Should decode calldata"); + let decoded = takeOrders5Call::abi_decode(result.calldata()).expect("Should decode calldata"); let config = decoded.config; assert!( diff --git a/crates/common/src/raindex_client/vaults.rs b/crates/common/src/raindex_client/vaults.rs index 1183d1a81f..31e524431f 100644 --- a/crates/common/src/raindex_client/vaults.rs +++ b/crates/common/src/raindex_client/vaults.rs @@ -25,7 +25,7 @@ use alloy::{ }; use async_trait::async_trait; use rain_math_float::Float; -use raindex_bindings::{IRaindexV7::deposit4Call, IERC20::approveCall}; +use raindex_bindings::{IRaindexV7::deposit5Call, IERC20::approveCall}; use raindex_subgraph_client::{ performance::vol::{VaultVolume, VolumeDetails}, types::{ @@ -711,7 +711,7 @@ impl RaindexVault { let approval = self.build_approval_calldata(amount).await?; let deposit_args = self.get_deposit_args(amount); - let deposit = Bytes::copy_from_slice(&deposit4Call::try_from(deposit_args)?.abi_encode()); + let deposit = Bytes::copy_from_slice(&deposit5Call::try_from(deposit_args)?.abi_encode()); let withdraw = self.build_withdraw_calldata(amount).await?; @@ -2647,7 +2647,7 @@ mod tests { use alloy::sol_types::SolCall; use httpmock::MockServer; use raindex_bindings::{ - IRaindexV7::{deposit4Call, withdraw4Call}, + IRaindexV7::{deposit5Call, withdraw5Call}, IERC20::{allowanceCall, approveCall}, }; use raindex_subgraph_client::utils::float::*; @@ -3916,7 +3916,7 @@ mod tests { assert_eq!( result.deposit, Bytes::copy_from_slice( - &deposit4Call { + &deposit5Call { token, vaultId: vault_id, depositAmount: amount.get_inner(), @@ -3928,7 +3928,7 @@ mod tests { assert_eq!( result.withdraw, Bytes::copy_from_slice( - &withdraw4Call { + &withdraw5Call { token, vaultId: vault_id, targetAmount: amount.get_inner(), @@ -3946,7 +3946,7 @@ mod tests { assert_eq!( result.deposit, Bytes::copy_from_slice( - &deposit4Call { + &deposit5Call { token, vaultId: vault_id, depositAmount: amount.get_inner(), @@ -3958,7 +3958,7 @@ mod tests { assert_eq!( result.withdraw, Bytes::copy_from_slice( - &withdraw4Call { + &withdraw5Call { token, vaultId: vault_id, targetAmount: amount.get_inner(), diff --git a/crates/common/src/raindex_client/vaults_list.rs b/crates/common/src/raindex_client/vaults_list.rs index 923afd1b2e..1d57cdc5ad 100644 --- a/crates/common/src/raindex_client/vaults_list.rs +++ b/crates/common/src/raindex_client/vaults_list.rs @@ -268,7 +268,7 @@ mod tests { use crate::raindex_client::{tests::get_test_yaml, RaindexClient}; use alloy::{primitives::U256, sol_types::SolCall}; use httpmock::MockServer; - use raindex_bindings::IRaindexV7::withdraw4Call; + use raindex_bindings::IRaindexV7::withdraw5Call; use serde_json::{json, Value}; fn get_vault1_json() -> Value { @@ -415,7 +415,7 @@ mod tests { RaindexVaultsList::new(get_vaults_for(get_vault1_json(), vault).await); let calldata = vaults_list.get_withdraw_calldata().await.unwrap(); - let decoded = withdraw4Call::abi_decode(&calldata).unwrap(); + let decoded = withdraw5Call::abi_decode(&calldata).unwrap(); assert_eq!( decoded.targetAmount, diff --git a/crates/common/src/raindex_order_builder/order_operations.rs b/crates/common/src/raindex_order_builder/order_operations.rs index 4e9743fbf6..aa0ffcb7a2 100644 --- a/crates/common/src/raindex_order_builder/order_operations.rs +++ b/crates/common/src/raindex_order_builder/order_operations.rs @@ -17,7 +17,7 @@ use raindex_app_settings::{ order::{OrderIOCfg, VaultType}, raindex::RaindexCfg, }; -use raindex_bindings::{IRaindexV7::deposit4Call, Raindex::multicallCall, IERC20::approveCall}; +use raindex_bindings::{IRaindexV7::deposit5Call, Raindex::multicallCall, IERC20::approveCall}; use std::{collections::HashMap, str::FromStr, sync::Arc}; use url::Url; @@ -375,7 +375,7 @@ impl RaindexOrderBuilder { vault_id: vault_id.into(), decimals, }; - let calldata = deposit4Call::try_from(deposit_args) + let calldata = deposit5Call::try_from(deposit_args) .map_err(crate::deposit::DepositError::from)? .abi_encode(); calldatas.push(Bytes::copy_from_slice(&calldata)); diff --git a/crates/common/src/remove_order.rs b/crates/common/src/remove_order.rs index 3322bd5d24..ae714d9d66 100644 --- a/crates/common/src/remove_order.rs +++ b/crates/common/src/remove_order.rs @@ -5,7 +5,7 @@ use crate::transaction::TransactionArgsError; use crate::write_tx::{execute_write_tx, WriteTransactionError, WriteTransactionStatus}; use alloy::primitives::hex::FromHexError; use alloy::sol_types::SolCall; -use raindex_bindings::IRaindexV7::removeOrder3Call; +use raindex_bindings::IRaindexV7::removeOrder4Call; use raindex_subgraph_client::types::{common::SgOrder, order_detail_traits::OrderDetailError}; use serde::{Deserialize, Serialize}; use thiserror::Error; @@ -34,11 +34,11 @@ impl From for RemoveOrderArgs { } } -impl TryInto for RemoveOrderArgs { +impl TryInto for RemoveOrderArgs { type Error = OrderDetailError; - fn try_into(self) -> Result { - Ok(removeOrder3Call { + fn try_into(self) -> Result { + Ok(removeOrder4Call { order: self.order.try_into()?, tasks: vec![], }) @@ -54,7 +54,7 @@ impl RemoveOrderArgs { ) -> Result<(), RemoveOrderArgsError> { let (ledger_client, _) = transaction_args.clone().try_into_ledger_client().await?; - let remove_order_call: removeOrder3Call = self.try_into()?; + let remove_order_call: removeOrder4Call = self.try_into()?; let tx_request = transaction_args .try_into_transaction_request(remove_order_call, transaction_args.raindex_address)?; @@ -64,7 +64,7 @@ impl RemoveOrderArgs { } pub async fn get_rm_order_calldata(self) -> Result, RemoveOrderArgsError> { - let remove_order_call: removeOrder3Call = self.try_into()?; + let remove_order_call: removeOrder4Call = self.try_into()?; Ok(remove_order_call.abi_encode()) } } diff --git a/crates/common/src/replays.rs b/crates/common/src/replays.rs index 42eb45a281..c5e1698c0a 100644 --- a/crates/common/src/replays.rs +++ b/crates/common/src/replays.rs @@ -188,7 +188,7 @@ amount price: 2 1; let amount = Float::parse("10".to_string()).unwrap().get_inner(); let tx_req = raindex - .deposit4( + .deposit5( *token1.address(), B256::from(U256::from(0x01)), amount, @@ -214,8 +214,8 @@ amount price: 2 1; .unwrap() .get_inner(); let one_float = Float::parse("1".to_string()).unwrap().get_inner(); - let config = Raindex::TakeOrdersConfigV5 { - orders: vec![Raindex::TakeOrderConfigV4 { + let config = Raindex::TakeOrdersConfigV6 { + orders: vec![Raindex::TakeOrderConfigV5 { order, inputIOIndex: U256::from(0), outputIOIndex: U256::from(0), @@ -229,7 +229,7 @@ amount price: 2 1; }; let tx_req = raindex - .takeOrders4(config) + .takeOrders5(config) .from(token2_holder) .into_transaction_request(); diff --git a/crates/common/src/take_orders/candidates.rs b/crates/common/src/take_orders/candidates.rs index 159947750d..9253074148 100644 --- a/crates/common/src/take_orders/candidates.rs +++ b/crates/common/src/take_orders/candidates.rs @@ -7,7 +7,7 @@ use crate::utils::timing::Timing; use alloy::primitives::{keccak256, Address, B256}; use alloy::sol_types::SolValue; use rain_math_float::Float; -use raindex_bindings::IRaindexV7::{OrderV4, SignedContextV1}; +use raindex_bindings::IRaindexV7::{OrderV4, SignedContextV2}; use raindex_quote::SignedContextInjector; #[cfg(target_family = "wasm")] use std::str::FromStr; @@ -77,7 +77,7 @@ pub struct TakeOrderCandidate { /// from the order's oracle endpoint come first, followed by entries /// contributed by a caller-supplied [`SignedContextInjector`]. Strategies /// that verify signed context by index must be aware of this ordering. - pub signed_context: Vec, + pub signed_context: Vec, } #[derive(Default)] @@ -208,7 +208,7 @@ pub async fn build_take_order_candidates_for_pair( let started_at = Timing::now(); // Oracle fetch and injector invocation both happen inside the quote // pipeline now: `get_order_quotes_batch_with_injector` composes them into - // `QuoteV2.signedContext` before issuing the quote RPC, so gated orders + // `QuoteV3.signedContext` before issuing the quote RPC, so gated orders // whose `calculate-io` asserts on signed context do not revert during // quoting. Each returned quote carries the exact composed context that // the quote call saw, which we propagate straight into the candidate. @@ -633,13 +633,15 @@ mod tests { // A candidate built from a quote that already carries signed context // (as produced by the quote pipeline) should inherit that exact list. - let oracle_entry = SignedContextV1 { + let oracle_entry = SignedContextV2 { signer: Address::from([0xAAu8; 20]), + domainSeparator: alloy::primitives::B256::repeat_byte(0xd5), context: vec![FixedBytes::<32>::from(U256::from(1u64).to_be_bytes::<32>())], signature: alloy::primitives::Bytes::from(vec![0x01]), }; - let injected_entry = SignedContextV1 { + let injected_entry = SignedContextV2 { signer: Address::from([0xBBu8; 20]), + domainSeparator: alloy::primitives::B256::repeat_byte(0xd5), context: vec![FixedBytes::<32>::from(U256::from(2u64).to_be_bytes::<32>())], signature: alloy::primitives::Bytes::from(vec![0x02]), }; diff --git a/crates/common/src/take_orders/config.rs b/crates/common/src/take_orders/config.rs index be29243104..df7bde1856 100644 --- a/crates/common/src/take_orders/config.rs +++ b/crates/common/src/take_orders/config.rs @@ -2,7 +2,7 @@ use super::simulation::SimulationResult; use crate::raindex_client::RaindexError; use alloy::primitives::{Bytes, U256}; use rain_math_float::Float; -use raindex_bindings::IRaindexV7::{TakeOrderConfigV4, TakeOrdersConfigV5}; +use raindex_bindings::IRaindexV7::{TakeOrderConfigV5, TakeOrdersConfigV6}; use serde::{Deserialize, Serialize}; use wasm_bindgen_utils::{impl_wasm_traits, prelude::*}; @@ -53,7 +53,7 @@ impl ParsedTakeOrdersMode { #[derive(Clone, Debug)] pub struct BuiltTakeOrdersConfig { - pub config: TakeOrdersConfigV5, + pub config: TakeOrdersConfigV6, pub sim: SimulationResult, } @@ -84,10 +84,10 @@ pub fn build_take_orders_config_from_simulation( let zero = Float::zero()?; - let orders: Vec = sim + let orders: Vec = sim .legs .iter() - .map(|leg| TakeOrderConfigV4 { + .map(|leg| TakeOrderConfigV5 { order: leg.candidate.order.clone(), inputIOIndex: U256::from(leg.candidate.input_io_index), outputIOIndex: U256::from(leg.candidate.output_io_index), @@ -101,7 +101,7 @@ pub fn build_take_orders_config_from_simulation( let minimum_io = if mode.is_exact_mode() { target } else { zero }; let maximum_io_ratio = price_cap; - let config = TakeOrdersConfigV5 { + let config = TakeOrdersConfigV6 { minimumIO: minimum_io.get_inner(), maximumIO: maximum_io.get_inner(), maximumIORatio: maximum_io_ratio.get_inner(), diff --git a/crates/common/src/take_orders/preflight.rs b/crates/common/src/take_orders/preflight.rs index 6986324e08..5f0e86daf8 100644 --- a/crates/common/src/take_orders/preflight.rs +++ b/crates/common/src/take_orders/preflight.rs @@ -6,7 +6,7 @@ use alloy::rpc::types::TransactionRequest; use alloy::serde::WithOtherFields; use alloy::sol_types::SolCall; use raindex_bindings::provider::ReadProvider; -use raindex_bindings::IRaindexV7::{takeOrders4Call, TakeOrdersConfigV5}; +use raindex_bindings::IRaindexV7::{takeOrders5Call, TakeOrdersConfigV6}; use raindex_bindings::IERC20::approveCall; use thiserror::Error; use tracing::{debug, info, warn}; @@ -150,7 +150,7 @@ pub async fn simulate_take_orders( provider: &ReadProvider, raindex: Address, taker: Address, - config: &TakeOrdersConfigV5, + config: &TakeOrdersConfigV6, block_number: Option, ) -> Result<(), String> { let started_at = Timing::now(); @@ -162,7 +162,7 @@ pub async fn simulate_take_orders( order_count, "starting take-orders preflight simulation" ); - let calldata = takeOrders4Call { + let calldata = takeOrders5Call { config: config.clone(), } .abi_encode(); @@ -217,7 +217,7 @@ pub async fn find_failing_order_index( provider: &ReadProvider, raindex: Address, taker: Address, - config: &TakeOrdersConfigV5, + config: &TakeOrdersConfigV6, block_number: Option, ) -> Option { match diagnose_take_orders_failure(provider, raindex, taker, config, block_number).await { @@ -237,7 +237,7 @@ pub(crate) async fn diagnose_take_orders_failure( provider: &ReadProvider, raindex: Address, taker: Address, - config: &TakeOrdersConfigV5, + config: &TakeOrdersConfigV6, block_number: Option, ) -> TakeOrdersFailureDiagnosis { let started_at = Timing::now(); @@ -323,8 +323,8 @@ pub(crate) async fn diagnose_take_orders_failure( TakeOrdersFailureDiagnosis::Unidentified } -fn single_order_probe_config(config: &TakeOrdersConfigV5, idx: usize) -> TakeOrdersConfigV5 { - TakeOrdersConfigV5 { +fn single_order_probe_config(config: &TakeOrdersConfigV6, idx: usize) -> TakeOrdersConfigV6 { + TakeOrdersConfigV6 { // `minimumIO` is an aggregate constraint. Keeping the batch minimum // when probing one leg would make healthy partial legs fail in exact // modes and incorrectly identify them as the cause of the revert. @@ -340,7 +340,7 @@ fn single_order_probe_config(config: &TakeOrdersConfigV5, idx: usize) -> TakeOrd #[cfg(test)] mod tests { use super::*; - use raindex_bindings::IRaindexV7::TakeOrderConfigV4; + use raindex_bindings::IRaindexV7::TakeOrderConfigV5; #[test] fn test_preflight_error_display() { @@ -405,13 +405,13 @@ mod tests { #[test] fn single_order_probe_drops_aggregate_minimum_io() { - let order = TakeOrderConfigV4::default(); - let config = TakeOrdersConfigV5 { + let order = TakeOrderConfigV5::default(); + let config = TakeOrdersConfigV6 { minimumIO: U256::from(10).into(), maximumIO: U256::from(20).into(), maximumIORatio: U256::from(2).into(), IOIsInput: true, - orders: vec![order.clone(), TakeOrderConfigV4::default()], + orders: vec![order.clone(), TakeOrderConfigV5::default()], data: Bytes::from(vec![1]), }; @@ -432,7 +432,7 @@ mod local_evm_tests { use crate::erc20::ERC20; use alloy::primitives::B256; use raindex_bindings::provider::mk_read_provider; - use raindex_bindings::IRaindexV7::TakeOrderConfigV4; + use raindex_bindings::IRaindexV7::TakeOrderConfigV5; use raindex_test_fixtures::LocalEvm; use url::Url; @@ -586,7 +586,7 @@ mod local_evm_tests { let rpc_url = Url::parse(&local_evm.url().to_string()).unwrap(); let provider = mk_read_provider(&[rpc_url]).unwrap(); - let config = TakeOrdersConfigV5 { + let config = TakeOrdersConfigV6 { minimumIO: B256::ZERO, maximumIO: U256::MAX.into(), maximumIORatio: U256::MAX.into(), @@ -609,7 +609,7 @@ mod local_evm_tests { let rpc_url = Url::parse(&local_evm.url().to_string()).unwrap(); let provider = mk_read_provider(&[rpc_url]).unwrap(); - let fake_order = TakeOrderConfigV4 { + let fake_order = TakeOrderConfigV5 { order: raindex_bindings::IRaindexV7::OrderV4 { owner: Address::ZERO, evaluable: raindex_bindings::IRaindexV7::EvaluableV4 { @@ -626,7 +626,7 @@ mod local_evm_tests { signedContext: vec![], }; - let config = TakeOrdersConfigV5 { + let config = TakeOrdersConfigV6 { minimumIO: B256::ZERO, maximumIO: U256::MAX.into(), maximumIORatio: U256::MAX.into(), @@ -646,7 +646,7 @@ mod local_evm_tests { let rpc_url = Url::parse(&local_evm.url().to_string()).unwrap(); let provider = mk_read_provider(&[rpc_url]).unwrap(); - let config = TakeOrdersConfigV5 { + let config = TakeOrdersConfigV6 { minimumIO: B256::ZERO, maximumIO: U256::MAX.into(), maximumIORatio: U256::MAX.into(), @@ -666,7 +666,7 @@ mod local_evm_tests { let rpc_url = Url::parse(&local_evm.url().to_string()).unwrap(); let provider = mk_read_provider(&[rpc_url]).unwrap(); - let fake_order = TakeOrderConfigV4 { + let fake_order = TakeOrderConfigV5 { order: raindex_bindings::IRaindexV7::OrderV4 { owner: Address::ZERO, evaluable: raindex_bindings::IRaindexV7::EvaluableV4 { @@ -683,7 +683,7 @@ mod local_evm_tests { signedContext: vec![], }; - let config = TakeOrdersConfigV5 { + let config = TakeOrdersConfigV6 { minimumIO: B256::ZERO, maximumIO: U256::MAX.into(), maximumIORatio: U256::MAX.into(), diff --git a/crates/common/src/test_helpers.rs b/crates/common/src/test_helpers.rs index 5df5903a05..ebfd9c211e 100644 --- a/crates/common/src/test_helpers.rs +++ b/crates/common/src/test_helpers.rs @@ -416,7 +416,7 @@ pub mod local_evm { let raw_amount = Float::from_fixed_decimal(amount, 18).unwrap().get_inner(); raindex_instance - .deposit4(token, vault_id, raw_amount, vec![]) + .deposit5(token, vault_id, raw_amount, vec![]) .from(setup.owner) .send() .await diff --git a/crates/common/src/withdraw.rs b/crates/common/src/withdraw.rs index e882252303..2e44ba9cbc 100644 --- a/crates/common/src/withdraw.rs +++ b/crates/common/src/withdraw.rs @@ -8,7 +8,7 @@ use alloy::sol_types::SolCall; use serde::{Deserialize, Serialize}; use rain_math_float::Float; -use raindex_bindings::IRaindexV7::withdraw4Call; +use raindex_bindings::IRaindexV7::withdraw5Call; #[derive(Clone, Deserialize, Serialize, Debug)] pub struct WithdrawArgs { @@ -17,9 +17,9 @@ pub struct WithdrawArgs { pub target_amount: Float, } -impl From for withdraw4Call { +impl From for withdraw5Call { fn from(val: WithdrawArgs) -> Self { - withdraw4Call { + withdraw5Call { token: val.token, vaultId: val.vault_id, targetAmount: val.target_amount.get_inner(), @@ -37,7 +37,7 @@ impl WithdrawArgs { ) -> Result<(), WritableTransactionExecuteError> { let (ledger_client, _) = transaction_args.clone().try_into_ledger_client().await?; - let withdraw_call: withdraw4Call = self.clone().into(); + let withdraw_call: withdraw5Call = self.clone().into(); let tx_request = transaction_args .try_into_transaction_request(withdraw_call, transaction_args.raindex_address)?; @@ -47,7 +47,7 @@ impl WithdrawArgs { } pub async fn get_withdraw_calldata(&self) -> Result, WritableTransactionExecuteError> { - let withdraw_call: withdraw4Call = self.clone().into(); + let withdraw_call: withdraw5Call = self.clone().into(); Ok(withdraw_call.abi_encode()) } } diff --git a/crates/integration_tests/src/lib.rs b/crates/integration_tests/src/lib.rs index 1df12631b7..d5ef6c1bb2 100644 --- a/crates/integration_tests/src/lib.rs +++ b/crates/integration_tests/src/lib.rs @@ -13,7 +13,7 @@ mod tests { use raindex_common::{add_order::AddOrderArgs, dotrain_order::DotrainOrder}; use raindex_test_fixtures::{ LocalEvm, - Raindex::{self, ClearConfigV2, OrderV4, QuoteV2, TakeOrderConfigV4, TakeOrdersConfigV5}, + Raindex::{self, ClearConfigV2, OrderV4, QuoteV3, TakeOrderConfigV5, TakeOrdersConfigV6}, }; #[tokio::test] @@ -118,7 +118,7 @@ amount price: get("amount") 52; .order; let quote = local_evm - .call_contract(raindex.quote2(QuoteV2 { + .call_contract(raindex.quote3(QuoteV3 { order, inputIOIndex: U256::from(0), outputIOIndex: U256::from(0), @@ -335,7 +335,7 @@ amount price: 2 1; (event.order, event.orderHash) } - /// Counts the `OrderNotFound`, `TakeOrderV3`, `ClearV3` and `AfterClearV2` + /// Counts the `OrderNotFound`, `TakeOrderV4`, `ClearV3` and `AfterClearV2` /// logs emitted by a single transaction receipt. These are the events that /// discriminate the best-effort no-op behaviour: a dead order is announced /// with `OrderNotFound` and contributes no settlement event. @@ -349,7 +349,7 @@ amount price: 2 1; .count(); let take_order = logs .iter() - .filter(|l| l.log_decode::().is_ok()) + .filter(|l| l.log_decode::().is_ok()) .count(); let clear = logs .iter() @@ -378,9 +378,9 @@ amount price: 2 1; found.remove(0) } - /// `takeOrders4` against a single dead order is a best-effort no-op: the + /// `takeOrders5` against a single dead order is a best-effort no-op: the /// transaction succeeds, the contract emits `OrderNotFound` (caller, owner, - /// orderHash) instead of reverting, no `TakeOrderV3` is emitted, and the + /// orderHash) instead of reverting, no `TakeOrderV4` is emitted, and the /// returned `(totalTakerInput, totalTakerOutput)` are both zero. #[tokio::test] async fn test_take_orders_dead_order_is_noop() { @@ -405,12 +405,12 @@ amount price: 2 1; local_evm .send_transaction( raindex - .removeOrder3(order.clone(), vec![]) + .removeOrder4(order.clone(), vec![]) .from(owner) .into_transaction_request(), ) .await - .expect("removeOrder3 should succeed"); + .expect("removeOrder4 should succeed"); assert!( !raindex @@ -418,16 +418,16 @@ amount price: 2 1; .call() .await .expect("orderExists call should succeed"), - "order must be dead before takeOrders4" + "order must be dead before takeOrders5" ); let max_io = Float::parse("1000".to_string()).unwrap().get_inner(); - let config = TakeOrdersConfigV5 { + let config = TakeOrdersConfigV6 { minimumIO: Float::parse("0".to_string()).unwrap().get_inner(), maximumIO: max_io, maximumIORatio: max_io, IOIsInput: true, - orders: vec![TakeOrderConfigV4 { + orders: vec![TakeOrderConfigV5 { order: order.clone(), inputIOIndex: U256::from(0), outputIOIndex: U256::from(0), @@ -438,10 +438,10 @@ amount price: 2 1; // Static call to read the returned totals: both must be zero. let returns = local_evm - .call_contract(raindex.takeOrders4(config.clone()).from(taker)) + .call_contract(raindex.takeOrders5(config.clone()).from(taker)) .await .expect("rpc should succeed") - .expect("takeOrders4 should not revert against a dead order"); + .expect("takeOrders5 should not revert against a dead order"); let total_input = Float::from_raw(returns.totalTakerInput); let total_output = Float::from_raw(returns.totalTakerOutput); assert!( @@ -461,18 +461,18 @@ amount price: 2 1; let receipt = local_evm .send_transaction( raindex - .takeOrders4(config) + .takeOrders5(config) .from(taker) .into_transaction_request(), ) .await - .expect("takeOrders4 against a dead order must succeed, not revert"); + .expect("takeOrders5 against a dead order must succeed, not revert"); let (order_not_found, take_order, _clear, _after_clear) = count_outcome_events(&receipt); assert_eq!(order_not_found, 1, "exactly one OrderNotFound expected"); assert_eq!( take_order, 0, - "no TakeOrderV3 must be emitted for a dead order" + "no TakeOrderV4 must be emitted for a dead order" ); let event = expect_single_order_not_found(&receipt); @@ -490,10 +490,10 @@ amount price: 2 1; ); } - /// In a `takeOrders4` batch of [dead, live] orders the dead order is skipped + /// In a `takeOrders5` batch of [dead, live] orders the dead order is skipped /// (best-effort) while the live order is still taken: the receipt carries /// exactly one `OrderNotFound` (for the dead order) AND exactly one - /// `TakeOrderV3` (for the live order), and the returned totals reflect the + /// `TakeOrderV4` (for the live order), and the returned totals reflect the /// live fill only (taker buys the live order's full `outputMax = 2`). #[tokio::test] async fn test_take_orders_dead_order_skipped_live_order_taken() { @@ -527,12 +527,12 @@ amount price: 2 1; local_evm .send_transaction( raindex - .removeOrder3(dead_order.clone(), vec![]) + .removeOrder4(dead_order.clone(), vec![]) .from(owner) .into_transaction_request(), ) .await - .expect("removeOrder3 should succeed"); + .expect("removeOrder4 should succeed"); // The taker pays `eth` (token2); approve raindex to pull it. local_evm @@ -546,19 +546,19 @@ amount price: 2 1; .expect("approve should succeed"); let max_io = Float::parse("1000".to_string()).unwrap().get_inner(); - let config = TakeOrdersConfigV5 { + let config = TakeOrdersConfigV6 { minimumIO: Float::parse("0".to_string()).unwrap().get_inner(), maximumIO: max_io, maximumIORatio: max_io, IOIsInput: true, orders: vec![ - TakeOrderConfigV4 { + TakeOrderConfigV5 { order: dead_order, inputIOIndex: U256::from(0), outputIOIndex: U256::from(0), signedContext: vec![], }, - TakeOrderConfigV4 { + TakeOrderConfigV5 { order: live_order, inputIOIndex: U256::from(0), outputIOIndex: U256::from(0), @@ -571,12 +571,12 @@ amount price: 2 1; let receipt = local_evm .send_transaction( raindex - .takeOrders4(config) + .takeOrders5(config) .from(taker) .into_transaction_request(), ) .await - .expect("mixed dead/live takeOrders4 must succeed"); + .expect("mixed dead/live takeOrders5 must succeed"); let (order_not_found, take_order, _clear, _after_clear) = count_outcome_events(&receipt); assert_eq!( @@ -585,7 +585,7 @@ amount price: 2 1; ); assert_eq!( take_order, 1, - "the live order must still be taken (one TakeOrderV3)" + "the live order must still be taken (one TakeOrderV4)" ); // The dead order is the one announced, not the live one. @@ -601,8 +601,8 @@ amount price: 2 1; .inner .logs() .iter() - .find_map(|l| l.log_decode::().ok()) - .expect("a TakeOrderV3 must be present") + .find_map(|l| l.log_decode::().ok()) + .expect("a TakeOrderV4 must be present") .inner .data; let taker_input = Float::from_raw(taken.input); @@ -661,12 +661,12 @@ amount price: 2 1; local_evm .send_transaction( raindex - .removeOrder3(alice_order.clone(), vec![]) + .removeOrder4(alice_order.clone(), vec![]) .from(alice) .into_transaction_request(), ) .await - .expect("removeOrder3 should succeed"); + .expect("removeOrder4 should succeed"); assert!( !raindex diff --git a/crates/js_api/ARCHITECTURE.md b/crates/js_api/ARCHITECTURE.md index 719fc81554..164e9aa79d 100644 --- a/crates/js_api/ARCHITECTURE.md +++ b/crates/js_api/ARCHITECTURE.md @@ -58,8 +58,8 @@ - `TakeOrdersCalldata(Bytes)` as an opaque JS type for encoded calldata. - `getOrderHash(order: OrderV4) -> string`: ABI-encodes `OrderV4` and returns `keccak256` with `0x` prefix. - - `getTakeOrders4Calldata(config: TakeOrdersConfigV5) -> TakeOrdersCalldata`: - ABI-encodes a `takeOrders4` call for the on-chain Raindex. + - `getTakeOrders4Calldata(config: TakeOrdersConfigV6) -> TakeOrdersCalldata`: + ABI-encodes a `takeOrders5` call for the on-chain Raindex. - `keccak256(bytes: Uint8Array) -> string` and `keccak256HexString(hex: string) -> string`. - Errors: `Error::FromHexError` mapped to JS with human-readable message. diff --git a/crates/js_api/src/bindings/mod.rs b/crates/js_api/src/bindings/mod.rs index 2ea17b835a..8d7a22a061 100644 --- a/crates/js_api/src/bindings/mod.rs +++ b/crates/js_api/src/bindings/mod.rs @@ -8,7 +8,7 @@ use alloy::{ }, sol_types::SolCall, }; -use raindex_bindings::IRaindexV7::{takeOrders4Call, OrderV4, TakeOrdersConfigV5}; +use raindex_bindings::IRaindexV7::{takeOrders5Call, OrderV4, TakeOrdersConfigV6}; use serde::{Deserialize, Serialize}; use wasm_bindgen_utils::{impl_wasm_traits, prelude::*}; @@ -64,9 +64,9 @@ pub fn get_take_orders4_calldata( #[wasm_export( param_description = "Complete configuration for order execution including minimumIO, maximumIO, maximumIORatio, orders array, IOIsInput, and additional data" )] - take_orders_config: TakeOrdersConfigV5, + take_orders_config: TakeOrdersConfigV6, ) -> Result { - let calldata = takeOrders4Call { + let calldata = takeOrders5Call { config: take_orders_config, } .abi_encode(); @@ -169,9 +169,9 @@ mod tests { #[wasm_bindgen_test] fn test_take_orders_calldata() { - let take_orders_config = TakeOrdersConfigV5::default(); + let take_orders_config = TakeOrdersConfigV6::default(); let result = get_take_orders4_calldata(take_orders_config.clone()).unwrap(); - let expected = takeOrders4Call { + let expected = takeOrders5Call { config: take_orders_config, } .abi_encode(); diff --git a/crates/quote/ARCHITECTURE.md b/crates/quote/ARCHITECTURE.md index bb4426953e..a240f40224 100644 --- a/crates/quote/ARCHITECTURE.md +++ b/crates/quote/ARCHITECTURE.md @@ -8,7 +8,7 @@ debugging. It stitches together three external systems: - The Raindex subgraph for fetching order details by id - Rain error decoding to turn revert data into human readable errors -It also includes a debugger that can fork an EVM and trace a `quote2` call for +It also includes a debugger that can fork an EVM and trace a `quote3` call for step‑by‑step analysis of interpreter execution. ## Targets and Build Modes @@ -32,7 +32,7 @@ Key gating: lookups). - Perform efficient batched on‑chain calls using the raindex's own OpenZeppelin `Multicall` (`multicall(bytes[])`). This is critical — Multicall3 forwards via - `CALL`, which would change `msg.sender` inside `quote2` to the Multicall3 + `CALL`, which would change `msg.sender` inside `quote3` to the Multicall3 contract and break any strategy that reads `order-counterparty()` in `calculate-io`. OZ Multicall uses `delegatecall`, preserving `msg.sender` as the caller-supplied `counterparty` so gated strategies simulate with the @@ -43,17 +43,17 @@ Key gating: (`FailedQuote`). - Provide a CLI to drive the above with ergonomic input formats and JSON output. - Provide a quote debugger that forks an EVM and returns interpreter traces for - `quote2` calls. + `quote3` calls. ## Core Data Model - `OrderQuoteValue` - Fields: `max_output: Float`, `ratio: Float` - - Converts from the ABI type `quote2Return { exists, outputMax, ioRatio }`. + - Converts from the ABI type `quote3Return { exists, outputMax, ioRatio }`. - Used by both native and wasm; serializes to camelCase. - `QuoteTarget` - - A fully specified quote request with the exact `QuoteV2` (includes the + - A fully specified quote request with the exact `QuoteV3` (includes the `OrderV4` bytes, input/output indices, and optional signed context) and the `raindex` address. - Helpers: @@ -100,7 +100,7 @@ Key gating: - `FailedQuote` represents a per‑call failure returned as an element within `Vec`: - - `NonExistent` — the target `quote2` call returned `exists=false`. + - `NonExistent` — the target `quote3` call returned `exists=false`. - `RevertError(AbiDecodedErrorType)` — decoder recognized the revert (often a Rain error like `TokenSelfTrade`). - `RevertErrorDecodeFailed(AbiDecodeFailedErrors)` — revert present but not @@ -118,7 +118,7 @@ Key gating: ## RPC Layer: `rpc::batch_quote` -Purpose: execute `quote2` for many `QuoteTarget`s efficiently while preserving +Purpose: execute `quote3` for many `QuoteTarget`s efficiently while preserving the caller's `msg.sender`. Flow: @@ -131,11 +131,11 @@ Flow: chunk with: - `to = raindex` - `from = counterparty` (preserved through `delegatecall` into each inner - `quote2`) - - `data = abi_encode(multicall(bytes[] { abi_encode(quote2Call), ... }))` + `quote3`) + - `data = abi_encode(multicall(bytes[] { abi_encode(quote3Call), ... }))` - optional `block_number` via `BlockId::Number(block)` 4. On success, decode the `bytes[]` response and per-element decode - `quote2Return { exists, outputMax, ioRatio }`: + `quote3Return { exists, outputMax, ioRatio }`: - `exists == true` → `Ok(OrderQuoteValue::from(ret))`. - `exists == false` → `Err(FailedQuote::NonExistent)`. - ABI decode failure → `Err(FailedQuote::CorruptReturnData)`. @@ -153,7 +153,7 @@ Flow: Notes: - `block_number` lets callers obtain deterministic historical quotes. -- `counterparty` is the `from` address on every inner `quote2`, so strategies +- `counterparty` is the `from` address on every inner `quote3`, so strategies that read `order-counterparty()` in `calculate-io` observe the real taker rather than a batching contract. @@ -164,7 +164,7 @@ Notes: - `QuoteSpec` and `BatchQuoteSpec` use the helper `make_order_id(raindex, order_hash)` to query the subgraph. - ABI decoding of `orderBytes` constructs `OrderV4`, which is then embedded into - `QuoteV2`. + `QuoteV3`. ## Order Pair Sweep: `order_quotes::get_order_quotes` @@ -183,7 +183,7 @@ Flow: `input.token != output.token`: - Build `pair_name` using token symbols from the subgraph record. - Build a `QuoteTarget` with - `QuoteV2 { order, inputIOIndex, outputIOIndex, signedContext: [] }`. + `QuoteV3 { order, inputIOIndex, outputIOIndex, signedContext: [] }`. - Batch quote all constructed targets at `req_block_number`. - For each pair, push a `BatchOrderQuotesResponse` with either `data: Some(OrderQuoteValue)` and `success: true`, or @@ -237,7 +237,7 @@ Behavior: ## Quote Debugger: `quote_debug` (native only) -Purpose: Help users debug a `quote2` call by forking a chain, executing the +Purpose: Help users debug a `quote3` call by forking a chain, executing the call, collecting interpreter traces, and decoding any revert reason. - Types: @@ -248,7 +248,7 @@ call, collecting interpreter traces, and decoding any revert reason. `rain_interpreter_eval::Forker::new_with_fork`. - `QuoteDebugger::debug(quote_target)`: - Validates IO indices with `QuoteTarget::validate()`. - - Encodes `quote2` call and executes it against the forked EVM. + - Encodes `quote3` call and executes it against the forked EVM. - If reverted, optionally decode revert data using the Rain selector registry. - Returns `(RainEvalResult, Option>)` diff --git a/crates/quote/src/cli/input.rs b/crates/quote/src/cli/input.rs index 7102031c71..3492601757 100644 --- a/crates/quote/src/cli/input.rs +++ b/crates/quote/src/cli/input.rs @@ -5,7 +5,7 @@ use alloy::primitives::{ }; use alloy::sol_types::SolType; use clap::Args; -use raindex_bindings::IRaindexV7::{OrderV4, QuoteV2}; +use raindex_bindings::IRaindexV7::{OrderV4, QuoteV3}; use std::str::FromStr; /// Group of valid input formats @@ -146,7 +146,7 @@ impl TryFrom<&Vec> for BatchQuoteTarget { batch_quote_target.0.push(QuoteTarget { raindex: Address::from_hex(raindex_str)?, - quote_config: QuoteV2 { + quote_config: QuoteV3 { signedContext: vec![], inputIOIndex: U256::from_str(input_io_index_str)?, outputIOIndex: U256::from_str(output_io_index_str)?, @@ -295,7 +295,7 @@ mod tests { let expected = BatchQuoteTarget(vec![ QuoteTarget { raindex: raindex1, - quote_config: QuoteV2 { + quote_config: QuoteV3 { inputIOIndex: U256::from(input_index), outputIOIndex: U256::from(output_index), signedContext: vec![], @@ -304,7 +304,7 @@ mod tests { }, QuoteTarget { raindex: raindex2, - quote_config: QuoteV2 { + quote_config: QuoteV3 { inputIOIndex: U256::from(input_index), outputIOIndex: U256::from(output_index), signedContext: vec![], diff --git a/crates/quote/src/cli/mod.rs b/crates/quote/src/cli/mod.rs index 03f7ba2f52..840e9191c0 100644 --- a/crates/quote/src/cli/mod.rs +++ b/crates/quote/src/cli/mod.rs @@ -154,7 +154,7 @@ mod tests { use clap::CommandFactory; use httpmock::{Method::POST, MockServer}; use rain_math_float::Float; - use raindex_bindings::IRaindexV7::{quote2Call, quote2Return, OrderV4, IOV2}; + use raindex_bindings::IRaindexV7::{quote3Call, quote3Return, OrderV4, IOV2}; use serde_json::json; use std::{fs::read_to_string, str::FromStr}; use tempfile::NamedTempFile; @@ -296,7 +296,7 @@ mod tests { // spec is missing from the subgraph → yields `NonExistent` before // any RPC call), so the raindex-native multicall response carries // a single element. - let exists_true: alloy::primitives::Bytes = quote2Call::abi_encode_returns("e2Return { + let exists_true: alloy::primitives::Bytes = quote3Call::abi_encode_returns("e3Return { exists: true, outputMax: Float::default().get_inner(), ioRatio: Float::default().get_inner(), @@ -500,8 +500,8 @@ mod tests { // The CLI `--target` flag here is parsed into a single QuoteTarget // (four arg tokens per target), so the raindex's multicall carries - // a single inner `quote2` return. - let exists_true: alloy::primitives::Bytes = quote2Call::abi_encode_returns("e2Return { + // a single inner `quote3` return. + let exists_true: alloy::primitives::Bytes = quote3Call::abi_encode_returns("e3Return { exists: true, outputMax: Float::default().get_inner(), ioRatio: Float::default().get_inner(), diff --git a/crates/quote/src/injector.rs b/crates/quote/src/injector.rs index 52c2708ea4..8c6b1a8082 100644 --- a/crates/quote/src/injector.rs +++ b/crates/quote/src/injector.rs @@ -1,8 +1,8 @@ use alloy::primitives::Address; use async_trait::async_trait; -use raindex_bindings::IRaindexV7::{OrderV4, SignedContextV1}; +use raindex_bindings::IRaindexV7::{OrderV4, SignedContextV2}; -/// Caller-supplied source of additional `SignedContextV1` entries for each +/// Caller-supplied source of additional `SignedContextV2` entries for each /// order candidate. Invoked during candidate building, after any oracle-URL /// contexts have been fetched. Returned contexts are appended (not replacing /// oracle contexts). Strategies that verify signed context by index must @@ -20,7 +20,7 @@ pub trait SignedContextInjector: Send + Sync { input_io_index: u32, output_io_index: u32, counterparty: Address, - ) -> Vec; + ) -> Vec; } /// No-op injector used as the default when no caller-supplied injector is given. @@ -34,7 +34,7 @@ impl SignedContextInjector for NoopInjector { _input_io_index: u32, _output_io_index: u32, _counterparty: Address, - ) -> Vec { + ) -> Vec { vec![] } } diff --git a/crates/quote/src/oracle.rs b/crates/quote/src/oracle.rs index 932ad72780..7e960659b7 100644 --- a/crates/quote/src/oracle.rs +++ b/crates/quote/src/oracle.rs @@ -2,7 +2,7 @@ use alloy::primitives::{Address, Bytes, FixedBytes, U256}; use alloy::sol_types::SolValue; use futures::{stream::FuturesUnordered, StreamExt}; use once_cell::sync::{Lazy, OnceCell}; -use raindex_bindings::IRaindexV7::{OrderV4, SignedContextV1}; +use raindex_bindings::IRaindexV7::{OrderV4, SignedContextV2}; use raindex_subgraph_client::types::common::SgOrder; use reqwest::Client; use serde::de::DeserializeOwned; @@ -81,14 +81,18 @@ fn sanitized_endpoint(url: &Url) -> String { } /// JSON response format from an oracle endpoint. -/// Maps directly to `SignedContextV1` in the raindex contract. +/// Maps directly to `SignedContextV2` in the raindex contract. #[derive(Debug, Clone, Serialize, Deserialize)] pub struct OracleResponse { - /// The signer address (EIP-191 signer of the context data) + /// The signer address (EIP-712 signer of the context data) pub signer: Address, + /// The EIP-712 domain separator the signer chose + #[serde(rename = "domainSeparator")] + pub domain_separator: FixedBytes<32>, /// The signed context data as bytes32[] values pub context: Vec>, - /// The EIP-191 signature over keccak256(abi.encodePacked(context)) + /// The EIP-712 signature over `SignedContextV2(address signer,bytes32[] context)` + /// under `domain_separator` pub signature: Bytes, } @@ -103,7 +107,7 @@ pub struct OracleBatchItemError { } /// Result for one item in an `allowFailure=true` oracle batch. -pub type OracleBatchItemResult = Result; +pub type OracleBatchItemResult = Result; #[derive(Debug, Deserialize)] #[serde(tag = "status", content = "body", rename_all = "lowercase")] @@ -119,10 +123,11 @@ enum OracleBatchResponse { Legacy(Vec), } -impl From for SignedContextV1 { +impl From for SignedContextV2 { fn from(resp: OracleResponse) -> Self { - SignedContextV1 { + SignedContextV2 { signer: resp.signer, + domainSeparator: resp.domain_separator, context: resp.context, signature: resp.signature, } @@ -242,7 +247,7 @@ impl OracleClient { &self, url: &str, body: Vec, - ) -> Result { + ) -> Result { let url = validate_oracle_url(url)?; self.fetch_signed_context_at(&url, body).await } @@ -251,7 +256,7 @@ impl OracleClient { &self, url: &Url, body: Vec, - ) -> Result { + ) -> Result { let response: Vec = self.fetch_json(url, body).await?; let [response]: [OracleResponse; 1] = @@ -298,7 +303,7 @@ impl OracleClient { url: &str, body: Vec, expected_count: usize, - ) -> Result, OracleError> { + ) -> Result, OracleError> { let url = validate_oracle_url(url)?; let response: Vec = self.fetch_json(&url, body).await?; @@ -428,7 +433,7 @@ pub fn encode_oracle_body_batch(requests: Vec<(&OrderV4, u32, u32, Address)>) -> pub async fn fetch_signed_context( url: &str, body: Vec, -) -> Result { +) -> Result { OracleClient::new()?.fetch_signed_context(url, body).await } @@ -443,7 +448,7 @@ pub async fn fetch_signed_context_batch( url: &str, body: Vec, expected_count: usize, -) -> Result, OracleError> { +) -> Result, OracleError> { OracleClient::new()? .fetch_signed_context_batch(url, body, expected_count) .await @@ -496,20 +501,52 @@ mod tests { let ctx_val = FixedBytes::<32>::from([0x2a; 32]); let response = OracleResponse { signer: address!("0x1234567890123456789012345678901234567890"), + domain_separator: FixedBytes::<32>::repeat_byte(0xd5), context: vec![ctx_val], signature: Bytes::from(vec![0xaa, 0xbb, 0xcc]), }; - let signed: SignedContextV1 = response.into(); + let signed: SignedContextV2 = response.into(); assert_eq!( signed.signer, address!("0x1234567890123456789012345678901234567890") ); + assert_eq!( + signed.domainSeparator, + FixedBytes::<32>::repeat_byte(0xd5) + ); assert_eq!(signed.context.len(), 1); assert_eq!(signed.context[0], ctx_val); assert_eq!(signed.signature, Bytes::from(vec![0xaa, 0xbb, 0xcc])); } + #[test] + fn test_oracle_response_json_requires_domain_separator() { + let domain = format!("0x{}", "d5".repeat(32)); + let with_domain: OracleResponse = serde_json::from_value(json!({ + "signer": "0x1234567890123456789012345678901234567890", + "domainSeparator": domain, + "context": [format!("0x{}", "2a".repeat(32))], + "signature": "0xaabbcc", + })) + .unwrap(); + assert_eq!( + with_domain.domain_separator, + FixedBytes::<32>::repeat_byte(0xd5) + ); + assert_eq!( + serde_json::to_value(&with_domain).unwrap()["domainSeparator"], + json!(domain) + ); + + let without_domain = serde_json::from_value::(json!({ + "signer": "0x1234567890123456789012345678901234567890", + "context": [format!("0x{}", "2a".repeat(32))], + "signature": "0xaabbcc", + })); + assert!(without_domain.is_err()); + } + #[test] fn test_encode_oracle_body_single() { let order = create_test_order(); @@ -598,11 +635,13 @@ mod tests { let server = MockServer::start_async().await; let first_response = OracleResponse { signer: address!("0x1111111111111111111111111111111111111111"), + domain_separator: FixedBytes::<32>::repeat_byte(0xd5), context: vec![FixedBytes::with_last_byte(1)], signature: vec![0xaa].into(), }; let third_response = OracleResponse { signer: address!("0x3333333333333333333333333333333333333333"), + domain_separator: FixedBytes::<32>::repeat_byte(0xd5), context: vec![FixedBytes::with_last_byte(3)], signature: vec![0xcc].into(), }; @@ -676,11 +715,13 @@ mod tests { let server = MockServer::start_async().await; let first = OracleResponse { signer: address!("0x1111111111111111111111111111111111111111"), + domain_separator: FixedBytes::<32>::repeat_byte(0xd5), context: vec![FixedBytes::with_last_byte(1)], signature: vec![0xaa].into(), }; let second = OracleResponse { signer: address!("0x2222222222222222222222222222222222222222"), + domain_separator: FixedBytes::<32>::repeat_byte(0xd5), context: vec![FixedBytes::with_last_byte(2)], signature: vec![0xbb].into(), }; @@ -718,6 +759,7 @@ mod tests { let server = MockServer::start_async().await; let response = OracleResponse { signer: address!("0x1111111111111111111111111111111111111111"), + domain_separator: FixedBytes::<32>::repeat_byte(0xd5), context: vec![FixedBytes::with_last_byte(1)], signature: vec![0xaa].into(), }; diff --git a/crates/quote/src/order_quotes.rs b/crates/quote/src/order_quotes.rs index aea2c93d33..e6ecc95e82 100644 --- a/crates/quote/src/order_quotes.rs +++ b/crates/quote/src/order_quotes.rs @@ -12,7 +12,7 @@ use crate::{ use alloy::primitives::{Address, U256}; use alloy::providers::Provider; use raindex_bindings::provider::mk_read_provider; -use raindex_bindings::IRaindexV7::{OrderV4, QuoteV2, SignedContextV1}; +use raindex_bindings::IRaindexV7::{OrderV4, QuoteV3, SignedContextV2}; use raindex_subgraph_client::types::common::SgOrder; use serde::{Deserialize, Serialize}; use std::{collections::HashMap, str::FromStr}; @@ -110,7 +110,7 @@ pub struct BatchOrderQuotesResponse { /// quote call saw, rather than re-fetching or re-composing. #[serde(default, skip_serializing_if = "Vec::is_empty")] #[cfg_attr(target_family = "wasm", tsify(optional))] - pub signed_context: Vec, + pub signed_context: Vec, } #[cfg(target_family = "wasm")] impl_wasm_traits!(BatchOrderQuotesResponse); @@ -134,7 +134,7 @@ impl_wasm_traits!(Pair); /// is fetched in one batch POST. Different URL batches execute concurrently. /// Any additional entries produced by `injector` are appended after the oracle /// entries (composition order: `[oracle..., injected...]`), and the composed -/// list is attached to the `QuoteV2.signedContext` before the multicall is +/// list is attached to the `QuoteV3.signedContext` before the multicall is /// issued. This matters for gated orders whose `calculate-io` asserts on /// signed context during quoting. pub async fn get_order_quotes( @@ -300,7 +300,7 @@ async fn get_order_quotes_inner( }, quote_target: QuoteTarget { raindex, - quote_config: QuoteV2 { + quote_config: QuoteV3 { order: order_struct.clone(), inputIOIndex: U256::from(input_index), outputIOIndex: U256::from(output_index), @@ -365,7 +365,7 @@ async fn get_order_quotes_inner( oracle_batch_request_count, "starting bounded batched quote oracle context fetches" ); - let oracle_batch_results: Vec>, String>> = + let oracle_batch_results: Vec>, String>> = if oracle_batch_requests.is_empty() { vec![] } else { @@ -393,7 +393,7 @@ async fn get_order_quotes_inner( } } }; - let mut oracle_results: Vec>> = + let mut oracle_results: Vec>> = std::iter::repeat_with(|| None) .take(pair_preparations.len()) .collect(); @@ -467,7 +467,7 @@ async fn get_order_quotes_inner( ) .await; injected_context_count += injected.len(); - let composed: Vec = + let composed: Vec = oracle_context.into_iter().chain(injected).collect(); let mut quote_target = preparation.quote_target; quote_target.quote_config.signedContext = composed; @@ -735,7 +735,7 @@ mod tests { #[cfg(not(target_family = "wasm"))] struct TestInjector { - context: SignedContextV1, + context: SignedContextV2, call_count: Arc, } @@ -748,7 +748,7 @@ mod tests { _input_io_index: u32, _output_io_index: u32, _counterparty: Address, - ) -> Vec { + ) -> Vec { self.call_count.fetch_add(1, Ordering::SeqCst); vec![self.context.clone()] } @@ -1183,13 +1183,15 @@ amount price: 2 3; let inputs = vec![vault2.clone(), vault1.clone()]; let outputs = vec![vault2, vault1]; let oracle_contexts = [ - SignedContextV1 { + SignedContextV2 { signer: address!("0x1111111111111111111111111111111111111111"), + domainSeparator: alloy::primitives::B256::repeat_byte(0xd5), context: vec![B256::with_last_byte(1)], signature: vec![0xaa].into(), }, - SignedContextV1 { + SignedContextV2 { signer: address!("0x3333333333333333333333333333333333333333"), + domainSeparator: alloy::primitives::B256::repeat_byte(0xd5), context: vec![B256::with_last_byte(3)], signature: vec![0xcc].into(), }, @@ -1202,6 +1204,7 @@ amount price: 2 3; if index == 0 { Ok(crate::oracle::OracleResponse { signer: context.signer, + domain_separator: context.domainSeparator, context: context.context, signature: context.signature, }) @@ -1223,8 +1226,9 @@ amount price: 2 3; let (oracle_url, oracle_server) = start_batch_oracle_server(oracle_responses).await; let oracle_order = with_oracle_url(base_oracle_order, &oracle_url); let plain_order = create_sg_order(&setup, order_bytes, inputs, outputs); - let injected_context = SignedContextV1 { + let injected_context = SignedContextV2 { signer: address!("0x2222222222222222222222222222222222222222"), + domainSeparator: alloy::primitives::B256::repeat_byte(0xd5), context: vec![B256::with_last_byte(2)], signature: vec![0xbb].into(), }; @@ -1243,8 +1247,8 @@ amount price: 2 3; .iter() .map(|(output_max, ratio)| { Bytes::from( - raindex_bindings::IRaindexV7::quote2Call::abi_encode_returns( - &raindex_bindings::IRaindexV7::quote2Return { + raindex_bindings::IRaindexV7::quote3Call::abi_encode_returns( + &raindex_bindings::IRaindexV7::quote3Return { exists: true, outputMax: output_max.get_inner(), ioRatio: ratio.get_inner(), @@ -1254,8 +1258,8 @@ amount price: 2 3; }) .collect::>(); let expected_oracle_quote_call = Bytes::from( - raindex_bindings::IRaindexV7::quote2Call { - quoteConfig: QuoteV2 { + raindex_bindings::IRaindexV7::quote3Call { + quoteConfig: QuoteV3 { order: order_struct.clone(), inputIOIndex: U256::ZERO, outputIOIndex: U256::from(1), @@ -1265,8 +1269,8 @@ amount price: 2 3; .abi_encode(), ); let expected_plain_quote_call = Bytes::from( - raindex_bindings::IRaindexV7::quote2Call { - quoteConfig: QuoteV2 { + raindex_bindings::IRaindexV7::quote3Call { + quoteConfig: QuoteV3 { order: order_struct.clone(), inputIOIndex: U256::ZERO, outputIOIndex: U256::from(1), @@ -1276,8 +1280,8 @@ amount price: 2 3; .abi_encode(), ); let expected_second_plain_quote_call = Bytes::from( - raindex_bindings::IRaindexV7::quote2Call { - quoteConfig: QuoteV2 { + raindex_bindings::IRaindexV7::quote3Call { + quoteConfig: QuoteV3 { order: order_struct, inputIOIndex: U256::from(1), outputIOIndex: U256::ZERO, diff --git a/crates/quote/src/quote.rs b/crates/quote/src/quote.rs index 257d86b2ac..1f9a05fd47 100644 --- a/crates/quote/src/quote.rs +++ b/crates/quote/src/quote.rs @@ -13,7 +13,7 @@ use url::Url; use wasm_bindgen_utils::{add_ts_content, impl_wasm_traits, prelude::*}; use rain_math_float::Float; -use raindex_bindings::IRaindexV7::{quote2Return, OrderV4, QuoteV2, SignedContextV1}; +use raindex_bindings::IRaindexV7::{quote3Return, OrderV4, QuoteV3, SignedContextV2}; use raindex_subgraph_client::{ types::{common::SgBytes, Id}, utils::make_order_id, @@ -36,8 +36,8 @@ pub struct OrderQuoteValue { #[cfg(target_family = "wasm")] impl_wasm_traits!(OrderQuoteValue); -impl From for OrderQuoteValue { - fn from(v: quote2Return) -> Self { +impl From for OrderQuoteValue { + fn from(v: quote3Return) -> Self { Self { max_output: Float::from_raw(v.outputMax), ratio: Float::from_raw(v.ioRatio), @@ -50,7 +50,7 @@ impl From for OrderQuoteValue { #[serde(rename_all = "camelCase")] #[cfg_attr(target_family = "wasm", derive(Tsify))] pub struct QuoteTarget { - pub quote_config: QuoteV2, + pub quote_config: QuoteV3, #[cfg_attr(target_family = "wasm", tsify(type = "string"))] pub raindex: Address, } @@ -137,7 +137,7 @@ pub struct QuoteSpec { pub input_io_index: u8, #[serde(rename = "outputIOIndex")] pub output_io_index: u8, - pub signed_context: Vec, + pub signed_context: Vec, #[cfg_attr(target_family = "wasm", tsify(type = "string"))] pub raindex: Address, } @@ -165,7 +165,7 @@ impl QuoteSpec { Ok(QuoteTarget { raindex: self.raindex, - quote_config: QuoteV2 { + quote_config: QuoteV3 { inputIOIndex: U256::from(self.input_io_index), outputIOIndex: U256::from(self.output_io_index), signedContext: self.signed_context.clone(), @@ -238,7 +238,7 @@ impl BatchQuoteSpec { .and_then(|order_detail| { Some(QuoteTarget { raindex: target.raindex, - quote_config: QuoteV2 { + quote_config: QuoteV3 { inputIOIndex: U256::from(target.input_io_index), outputIOIndex: U256::from(target.output_io_index), signedContext: target.signed_context.clone(), @@ -316,7 +316,7 @@ mod tests { use alloy::sol_types::{SolCall, SolValue}; use httpmock::{Method::POST, MockServer}; use rain_error_decoding::AbiDecodedErrorType; - use raindex_bindings::IRaindexV7::{quote2Call, QuoteV2, IOV2}; + use raindex_bindings::IRaindexV7::{quote3Call, QuoteV3, IOV2}; use raindex_subgraph_client::RaindexSubgraphClientError; use serde_json::{json, Value}; @@ -475,7 +475,7 @@ mod tests { fn test_quote_target_get_order_hash() { let (raindex, order, _, _) = get_test_data(false); let quote_target = QuoteTarget { - quote_config: QuoteV2 { + quote_config: QuoteV3 { order, ..Default::default() }, @@ -518,7 +518,7 @@ mod tests { fn test_validate_ok() { let (raindex, order, _, _) = get_test_data(false); let quote_target = QuoteTarget { - quote_config: QuoteV2 { + quote_config: QuoteV3 { order, ..Default::default() }, @@ -530,7 +530,7 @@ mod tests { #[test] fn test_validate_err() { let quote_target = QuoteTarget { - quote_config: QuoteV2 { + quote_config: QuoteV3 { order: OrderV4::default(), outputIOIndex: U256::from(1_u16), ..Default::default() @@ -540,7 +540,7 @@ mod tests { assert!(quote_target.validate().is_err()); let quote_target = QuoteTarget { - quote_config: QuoteV2 { + quote_config: QuoteV3 { order: OrderV4::default(), inputIOIndex: U256::from(1_u16), ..Default::default() @@ -576,7 +576,7 @@ mod tests { let expected = QuoteTarget { raindex, - quote_config: QuoteV2 { + quote_config: QuoteV3 { order, inputIOIndex: U256::from(quote_target_specifier.input_io_index), outputIOIndex: U256::from(quote_target_specifier.output_io_index), @@ -653,7 +653,7 @@ mod tests { let expected = vec![Some(QuoteTarget { raindex, - quote_config: QuoteV2 { + quote_config: QuoteV3 { order, inputIOIndex: U256::from(batch_quote_targets_specifiers.0[0].input_io_index), outputIOIndex: U256::from(batch_quote_targets_specifiers.0[0].output_io_index), @@ -724,7 +724,7 @@ mod tests { let two = Float::parse("2".to_string()).unwrap(); // build response data - let inner_return: Bytes = quote2Call::abi_encode_returns("e2Return { + let inner_return: Bytes = quote3Call::abi_encode_returns("e3Return { exists: true, outputMax: one.get_inner(), ioRatio: two.get_inner(), @@ -785,7 +785,7 @@ mod tests { let one = Float::parse("1".to_string()).unwrap(); let two = Float::parse("2".to_string()).unwrap(); - let inner_return: Bytes = quote2Call::abi_encode_returns("e2Return { + let inner_return: Bytes = quote3Call::abi_encode_returns("e3Return { exists: true, outputMax: one.get_inner(), ioRatio: two.get_inner(), @@ -875,7 +875,7 @@ mod tests { let one = Float::parse("1".to_string()).unwrap(); let two = Float::parse("2".to_string()).unwrap(); - let inner_return: Bytes = quote2Call::abi_encode_returns("e2Return { + let inner_return: Bytes = quote3Call::abi_encode_returns("e3Return { exists: true, outputMax: one.get_inner(), ioRatio: two.get_inner(), @@ -964,7 +964,7 @@ mod tests { let (raindex, order, _, _) = get_test_data(false); let quote_target = QuoteTarget { - quote_config: QuoteV2 { + quote_config: QuoteV3 { order, ..Default::default() }, @@ -972,11 +972,11 @@ mod tests { }; // OZ Multicall returns `bytes[]`; each element is the ABI-encoded - // return of one inner `quote2` call. + // return of one inner `quote3` call. let one = Float::parse("1".to_string()).unwrap(); let two = Float::parse("2".to_string()).unwrap(); - let inner_return: Bytes = quote2Call::abi_encode_returns("e2Return { + let inner_return: Bytes = quote3Call::abi_encode_returns("e3Return { exists: true, outputMax: one.get_inner(), ioRatio: two.get_inner(), @@ -1015,7 +1015,7 @@ mod tests { let (raindex, order, _, _) = get_test_data(false); let quote_target = QuoteTarget { - quote_config: QuoteV2 { + quote_config: QuoteV3 { order, ..Default::default() }, @@ -1023,7 +1023,7 @@ mod tests { }; // Outer multicall decodes fine (one `bytes` element) but that inner - // bytes is not a valid `quote2Return`, so the per-target decode fails + // bytes is not a valid `quote3Return`, so the per-target decode fails // and we get `FailedQuote::CorruptReturnData` — not a top-level Error. let corrupt_inner: Bytes = Bytes::from_static(b"corrupt data"); let response_data = as SolValue>::abi_encode(&vec![corrupt_inner]); @@ -1059,18 +1059,18 @@ mod tests { let (raindex, order, _, _) = get_test_data(true); let quote_targets = BatchQuoteTarget(vec![QuoteTarget { - quote_config: QuoteV2 { + quote_config: QuoteV3 { order, ..Default::default() }, raindex, }]); - // OZ Multicall returns `bytes[]`; one element per inner `quote2`. + // OZ Multicall returns `bytes[]`; one element per inner `quote3`. let one = Float::parse("1".to_string()).unwrap(); let two = Float::parse("2".to_string()).unwrap(); - let inner_return: Bytes = quote2Call::abi_encode_returns("e2Return { + let inner_return: Bytes = quote3Call::abi_encode_returns("e3Return { exists: true, outputMax: one.get_inner(), ioRatio: two.get_inner(), @@ -1114,7 +1114,7 @@ mod tests { let (raindex, order, _, _) = get_test_data(true); let quote_targets = BatchQuoteTarget(vec![QuoteTarget { - quote_config: QuoteV2 { + quote_config: QuoteV3 { order, ..Default::default() }, diff --git a/crates/quote/src/quote_debug.rs b/crates/quote/src/quote_debug.rs index 92d9568862..0ef2b8e3aa 100644 --- a/crates/quote/src/quote_debug.rs +++ b/crates/quote/src/quote_debug.rs @@ -7,7 +7,7 @@ use rain_interpreter_eval::{ fork::{Forker, NewForkedEvm}, trace::{RainEvalResult, RainEvalResultFromRawCallResultError}, }; -use raindex_bindings::IRaindexV7::quote2Call; +use raindex_bindings::IRaindexV7::quote3Call; use url::Url; pub struct NewQuoteDebugger { @@ -61,7 +61,7 @@ impl QuoteDebugger { > { quote_target.validate()?; - let quote_call = quote2Call { + let quote_call = quote3Call { quoteConfig: quote_target.quote_config.clone(), }; @@ -89,7 +89,7 @@ mod tests { use alloy::sol_types::{SolCall, SolValue}; use httpmock::MockServer; use raindex_app_settings::spec_version::SpecVersion; - use raindex_bindings::IRaindexV7::{OrderV4, QuoteV2}; + use raindex_bindings::IRaindexV7::{OrderV4, QuoteV3}; use raindex_common::add_order::AddOrderArgs; use raindex_common::dotrain_order::DotrainOrder; use raindex_test_fixtures::LocalEvm; @@ -206,7 +206,7 @@ amount price: 16 52; let quote_target = QuoteTarget { raindex: *raindex.address(), - quote_config: QuoteV2 { + quote_config: QuoteV3 { order, inputIOIndex: U256::from(0), outputIOIndex: U256::from(0), @@ -336,7 +336,7 @@ _: 1; let quote_target = QuoteTarget { raindex: *raindex.address(), - quote_config: QuoteV2 { + quote_config: QuoteV3 { order, inputIOIndex: U256::from(0), outputIOIndex: U256::from(0), @@ -473,7 +473,7 @@ _: 1; let quote_target = QuoteTarget { raindex: *raindex.address(), - quote_config: QuoteV2 { + quote_config: QuoteV3 { order, inputIOIndex: U256::from(1), outputIOIndex: U256::from(2), diff --git a/crates/quote/src/rpc.rs b/crates/quote/src/rpc.rs index 7ec1f7c94e..813997bb0a 100644 --- a/crates/quote/src/rpc.rs +++ b/crates/quote/src/rpc.rs @@ -15,7 +15,7 @@ use alloy::{ use futures::future::join_all; use rain_error_decoding::{AbiDecodedErrorType, ErrorRegistry}; use raindex_bindings::provider::{mk_read_provider, ReadProvider}; -use raindex_bindings::IRaindexV7::quote2Call; +use raindex_bindings::IRaindexV7::quote3Call; use raindex_bindings::Raindex::multicallCall; #[cfg(not(target_family = "wasm"))] use std::future::Future; @@ -47,8 +47,8 @@ fn single_quote_failure(err: &Error) -> QuoteResult { ))) } -/// Issue a single `raindex.multicall([quote2, quote2, ...])` RPC call with -/// `from = counterparty` so each inner `quote2` sees `msg.sender = counterparty`. +/// Issue a single `raindex.multicall([quote3, quote3, ...])` RPC call with +/// `from = counterparty` so each inner `quote3` sees `msg.sender = counterparty`. /// /// RaindexV6 inherits OpenZeppelin's `Multicall` which `delegatecall`s each /// element back into the raindex itself. `delegatecall` preserves the outer @@ -81,7 +81,7 @@ async fn quote_chunk_once( .iter() .map(|t| { Bytes::from( - quote2Call { + quote3Call { quoteConfig: t.quote_config.clone(), } .abi_encode(), @@ -139,7 +139,7 @@ async fn quote_chunk_once( let mut results: Vec = Vec::with_capacity(decoded.len()); for element in decoded { - match quote2Call::abi_decode_returns(&element) { + match quote3Call::abi_decode_returns(&element) { Ok(ret) => { if ret.exists { results.push(Ok(ret.into())); @@ -148,7 +148,7 @@ async fn quote_chunk_once( } } Err(e) => results.push(Err(FailedQuote::CorruptReturnData(format!( - "Failed to decode quote2 return: {e}" + "Failed to decode quote3 return: {e}" )))), } } @@ -296,7 +296,7 @@ fn chunk_err_to_quote_result(err: &Error) -> QuoteResult { /// Targets are partitioned by their `raindex` address so that each raindex /// gets its own `multicall(bytes[])` RPC call. Using the raindex's own OZ /// `Multicall` (rather than Multicall3) ensures `msg.sender` inside each -/// inner `quote2` is preserved as `counterparty` — critical for gated +/// inner `quote3` is preserved as `counterparty` — critical for gated /// strategies that read `order-counterparty()` inside `calculate-io`. /// /// Within each raindex group, targets are chunked by `chunk_size` and each @@ -526,7 +526,7 @@ mod tests { use httpmock::{Method::POST, MockServer}; use rain_error_decoding::ErrorRegistry; use rain_math_float::Float; - use raindex_bindings::IRaindexV7::{quote2Call, quote2Return}; + use raindex_bindings::IRaindexV7::{quote3Call, quote3Return}; use serde_json::json; #[test] @@ -539,10 +539,10 @@ mod tests { assert_eq!(normalize_chunk_size(Some(0)), 1); } - // Encode a single `quote2Return` into its ABI-encoded form (this is what + // Encode a single `quote3Return` into its ABI-encoded form (this is what // ends up as one element of the outer `bytes[]` returned by OZ Multicall). - fn encode_quote2_return_bytes(exists: bool, output_max: Float, io_ratio: Float) -> Bytes { - Bytes::from(quote2Call::abi_encode_returns("e2Return { + fn encode_quote3_return_bytes(exists: bool, output_max: Float, io_ratio: Float) -> Bytes { + Bytes::from(quote3Call::abi_encode_returns("e3Return { exists, outputMax: output_max.get_inner(), ioRatio: io_ratio.get_inner(), @@ -651,7 +651,7 @@ mod tests { async fn test_batch_quote_applies_timeout_per_chunk_request() { let rpc_server = MockServer::start_async().await; let one = Float::parse("1".to_string()).unwrap(); - let response = encode_multicall_return(vec![encode_quote2_return_bytes(true, one, one)]); + let response = encode_multicall_return(vec![encode_quote3_return_bytes(true, one, one)]); let quote = rpc_server.mock(|when, then| { when.method(POST).path("/rpc"); then.delay(std::time::Duration::from_millis(1_600)) @@ -690,7 +690,7 @@ mod tests { then.json_body(json!({ "jsonrpc": "2.0", "id": 1, - "result": encode_multicall_return(vec![encode_quote2_return_bytes( + "result": encode_multicall_return(vec![encode_quote3_return_bytes( true, Float::parse("2".into()).unwrap(), Float::parse("3".into()).unwrap(), @@ -739,7 +739,7 @@ mod tests { then.json_body(json!({ "jsonrpc": "2.0", "id": 1, - "result": encode_multicall_return(vec![encode_quote2_return_bytes( + "result": encode_multicall_return(vec![encode_quote3_return_bytes( true, Float::parse("2".into()).unwrap(), Float::parse("3".into()).unwrap(), @@ -780,7 +780,7 @@ mod tests { then.json_body(json!({ "jsonrpc": "2.0", "id": 1, - "result": encode_multicall_return(vec![encode_quote2_return_bytes( + "result": encode_multicall_return(vec![encode_quote3_return_bytes( true, Float::parse("2".into()).unwrap(), Float::parse("3".into()).unwrap(), @@ -812,7 +812,7 @@ mod tests { then.json_body(json!({ "jsonrpc": "2.0", "id": 1, - "result": encode_multicall_return(vec![encode_quote2_return_bytes( + "result": encode_multicall_return(vec![encode_quote3_return_bytes( true, Float::parse("2".into()).unwrap(), Float::parse("3".into()).unwrap(), @@ -842,7 +842,7 @@ mod tests { let two = Float::parse("2".to_string()).unwrap(); // One target → one multicall call with a single inner return. - let inner = vec![encode_quote2_return_bytes(true, one, two)]; + let inner = vec![encode_quote3_return_bytes(true, one, two)]; mock_eth_call_static(&rpc_server, "/rpc", &encode_multicall_return(inner)); let quote_targets = vec![QuoteTarget::default()]; @@ -872,8 +872,8 @@ mod tests { let four = Float::parse("4".to_string()).unwrap(); let inner = vec![ - encode_quote2_return_bytes(true, one, two), - encode_quote2_return_bytes(true, three, four), + encode_quote3_return_bytes(true, one, two), + encode_quote3_return_bytes(true, three, four), ]; mock_eth_call_static(&rpc_server, "/rpc", &encode_multicall_return(inner)); @@ -903,7 +903,7 @@ mod tests { let rpc_server = MockServer::start_async().await; let zero = Float::parse("0".to_string()).unwrap(); - let inner = vec![encode_quote2_return_bytes(false, zero, zero)]; + let inner = vec![encode_quote3_return_bytes(false, zero, zero)]; mock_eth_call_static(&rpc_server, "/rpc", &encode_multicall_return(inner)); let quote_targets = vec![QuoteTarget::default()]; @@ -1034,7 +1034,7 @@ mod tests { let one = Float::parse("1".to_string()).unwrap(); let two = Float::parse("2".to_string()).unwrap(); - let inner = vec![encode_quote2_return_bytes(true, one, two)]; + let inner = vec![encode_quote3_return_bytes(true, one, two)]; let ret_hex = encode_multicall_return(inner); // alloy serialises `from` lowercased in JSON-RPC params; asserting the @@ -1119,17 +1119,17 @@ mod tests { // --------------------------------------------------------------------- use alloy::primitives::U256; - use raindex_bindings::IRaindexV7::QuoteV2; + use raindex_bindings::IRaindexV7::QuoteV3; // Build a `QuoteTarget` with a specific raindex address and a distinctive - // `inputIOIndex`. The index is ABI-encoded into the inner `quote2` calldata, + // `inputIOIndex`. The index is ABI-encoded into the inner `quote3` calldata, // so a large/unusual value (e.g. 0xAAAA) gives a hex substring that uniquely // identifies this target inside the outer multicall request body. This lets // a mock respond differently per-target / per-chunk without per-target paths. fn target_with(raindex: Address, input_index: u64) -> QuoteTarget { QuoteTarget { raindex, - quote_config: QuoteV2 { + quote_config: QuoteV3 { inputIOIndex: U256::from(input_index), ..Default::default() }, @@ -1137,7 +1137,7 @@ mod tests { } // Mock an eth_call that only matches when the request body contains - // `needle` (a hex substring identifying a specific inner quote2 call or the + // `needle` (a hex substring identifying a specific inner quote3 call or the // raindex `to` address), returning the given multicall hex. fn mock_eth_call_when_body_contains( server: &MockServer, @@ -1178,8 +1178,8 @@ mod tests { let four = Float::parse("4".to_string()).unwrap(); // Group A (raindex_a) -> quote (1, 2); Group B (raindex_b) -> quote (3, 4). - let ret_a = encode_multicall_return(vec![encode_quote2_return_bytes(true, one, two)]); - let ret_b = encode_multicall_return(vec![encode_quote2_return_bytes(true, three, four)]); + let ret_a = encode_multicall_return(vec![encode_quote3_return_bytes(true, one, two)]); + let ret_b = encode_multicall_return(vec![encode_quote3_return_bytes(true, three, four)]); mock_eth_call_when_body_contains(&rpc_server, "/rpc", "aaaaaaaaaaaaaaaaaa", &ret_a); mock_eth_call_when_body_contains(&rpc_server, "/rpc", "bbbbbbbbbbbbbbbbbb", &ret_b); @@ -1236,13 +1236,13 @@ mod tests { // Chunk one (targets 0 and 1) returns TWO inner results; matched by the // presence of target 1's index (only present in the first chunk). let ret_chunk1 = encode_multicall_return(vec![ - encode_quote2_return_bytes(true, one, two), - encode_quote2_return_bytes(true, three, four), + encode_quote3_return_bytes(true, one, two), + encode_quote3_return_bytes(true, three, four), ]); mock_eth_call_when_body_contains(&rpc_server, "/rpc", &needle1, &ret_chunk1); // Chunk two (target 2 only) returns ONE inner result; matched by target // 2's index, which never appears in the first chunk. - let ret_chunk2 = encode_multicall_return(vec![encode_quote2_return_bytes(true, five, six)]); + let ret_chunk2 = encode_multicall_return(vec![encode_quote3_return_bytes(true, five, six)]); mock_eth_call_when_body_contains(&rpc_server, "/rpc", &needle2, &ret_chunk2); // Target 0's index is bound for parity with the other chunk needles; // chunk one is matched by target 1's index, so it is unused here. @@ -1290,9 +1290,9 @@ mod tests { let one = Float::parse("1".to_string()).unwrap(); let two = Float::parse("2".to_string()).unwrap(); let first_return = - encode_multicall_return(vec![encode_quote2_return_bytes(true, one, one)]); + encode_multicall_return(vec![encode_quote3_return_bytes(true, one, one)]); let second_return = - encode_multicall_return(vec![encode_quote2_return_bytes(true, two, two)]); + encode_multicall_return(vec![encode_quote3_return_bytes(true, two, two)]); let first_success = first_rpc.mock(|when, then| { when.method(POST) @@ -1350,8 +1350,8 @@ mod tests { let two = Float::parse("2".to_string()).unwrap(); // ONE target but TWO returned inner elements. let ret = encode_multicall_return(vec![ - encode_quote2_return_bytes(true, one, two), - encode_quote2_return_bytes(true, one, two), + encode_quote3_return_bytes(true, one, two), + encode_quote3_return_bytes(true, one, two), ]); mock_eth_call_static(&rpc_server, "/rpc", &ret); @@ -1433,7 +1433,7 @@ mod tests { }); // OK singleton: body contains the OK index but not the revert index, so // only this mock matches it. - let ok_ret = encode_multicall_return(vec![encode_quote2_return_bytes(true, one, two)]); + let ok_ret = encode_multicall_return(vec![encode_quote3_return_bytes(true, one, two)]); rpc_server.mock(|when, then| { when.method(POST) .path("/rpc") @@ -1549,8 +1549,8 @@ mod tests { // Success mock for the [2,4) half: matches only when BOTH s2 and s3 are // present (the 2-element sub-chunk). Returns a 2-element multicall. let ok_pair = encode_multicall_return(vec![ - encode_quote2_return_bytes(true, three, four), - encode_quote2_return_bytes(true, five, six), + encode_quote3_return_bytes(true, three, four), + encode_quote3_return_bytes(true, five, six), ]); rpc_server.mock(|when, then| { when.method(POST) diff --git a/crates/test_fixtures/src/lib.rs b/crates/test_fixtures/src/lib.rs index c43543b19f..8b14c8bc21 100644 --- a/crates/test_fixtures/src/lib.rs +++ b/crates/test_fixtures/src/lib.rs @@ -372,7 +372,7 @@ impl LocalEvm { let tx = self .raindex - .deposit4(token, vault_id, raw_deposit_amount, vec![]) + .deposit5(token, vault_id, raw_deposit_amount, vec![]) .from(from) .into_transaction_request(); diff --git a/packages/raindex/README.md b/packages/raindex/README.md index 2a0627a23b..20581d00fa 100644 --- a/packages/raindex/README.md +++ b/packages/raindex/README.md @@ -465,7 +465,7 @@ leg before building calldata. ### 5. Take orders -The SDK provides two approaches for executing `takeOrders4` transactions: +The SDK provides two approaches for executing `takeOrders5` transactions: auto-discovery by token pair or targeting a specific known order. #### Take orders by token pair (auto-discovery) @@ -491,7 +491,7 @@ if (takeResult.error) throw new Error(takeResult.error.readableMsg); const { raindex, // Contract address to call - calldata, // ABI-encoded takeOrders4 calldata + calldata, // ABI-encoded takeOrders5 calldata effectivePrice, // Blended price from simulation prices, // Per-leg ratios (best to worst) expectedSell, // Simulated sell amount at current quotes diff --git a/packages/raindex/test/js_api/raindexClient.test.ts b/packages/raindex/test/js_api/raindexClient.test.ts index bfcaa22505..592ee2e834 100644 --- a/packages/raindex/test/js_api/raindexClient.test.ts +++ b/packages/raindex/test/js_api/raindexClient.test.ts @@ -964,7 +964,7 @@ describe("Rain Raindex JS API Package Bindgen Tests - Raindex Client", async fun .thenReply(200, JSON.stringify({ data: { orders: [order1] } })); await mockServer.forPost("/rpc1").once().thenSendJsonRpcResult("0x01"); // OZ Multicall returns `bytes[]` — 1 element whose contents are the - // ABI-encoded `quote2Return` tuple `(bool exists, Float outputMax, Float ioRatio)` (96 bytes). + // ABI-encoded `quote3Return` tuple `(bool exists, Float outputMax, Float ioRatio)` (96 bytes). await mockServer .forPost("/rpc1") .thenSendJsonRpcResult( @@ -1074,7 +1074,7 @@ describe("Rain Raindex JS API Package Bindgen Tests - Raindex Client", async fun .forPost("/sg1") .thenReply(200, JSON.stringify({ data: { orders: [order1] } })); await mockServer.forPost("/rpc1").once().thenSendJsonRpcResult("0x01"); - // OZ Multicall `bytes[]` with 2 elements, each a 96-byte `quote2Return`. + // OZ Multicall `bytes[]` with 2 elements, each a 96-byte `quote3Return`. // elem[0] maxOutput=1/ioRatio=2, elem[1] maxOutput=2/ioRatio=1 await mockServer .forPost("/rpc1") From 54a07a5f33c881f90469dc1ba503bcec8e7bb66b Mon Sep 17 00:00:00 2001 From: David Meister Date: Mon, 26 Oct 2026 15:18:49 +0000 Subject: [PATCH 08/15] Pin removeOrder4 selector in remove calldata fixtures Co-Authored-By: Claude Opus 5.5 --- crates/common/src/raindex_client/remove_orders.rs | 2 +- packages/raindex/test/js_api/raindexClient.test.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/crates/common/src/raindex_client/remove_orders.rs b/crates/common/src/raindex_client/remove_orders.rs index a40176bfd5..e99615a3ba 100644 --- a/crates/common/src/raindex_client/remove_orders.rs +++ b/crates/common/src/raindex_client/remove_orders.rs @@ -655,7 +655,7 @@ mod tests { let calldata = order.get_remove_calldata().unwrap(); assert_eq!( calldata, - Bytes::from_str("0x1f69cb75000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000002c00000000000000000000000006171c21b2e553c59a64d1337211b77c367cefe5d00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000002200000000000000000000000000000000000000000000000000000000000000001000000000000000000000000379b966dc6b117dd47b5fc5308534256a4ab1bcc0000000000000000000000006e4b01603edbda617002a077420e98c86595748e000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000950000000000000000000000000000000000000000000000000000000000000002ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000b1a2bc2ec5000000000000000000000000000000000000000000000000000000000000000000015020000000c020200020110000001100001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000050c5725949a6f0c72e6c4a641f24049a917db0cb00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000001000000000000000000000000833589fcd6edb6e08f4c7c32d4f71b54bda0291300000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000").unwrap() + Bytes::from_str("0xdf6db3c2000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000002c00000000000000000000000006171c21b2e553c59a64d1337211b77c367cefe5d00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000002200000000000000000000000000000000000000000000000000000000000000001000000000000000000000000379b966dc6b117dd47b5fc5308534256a4ab1bcc0000000000000000000000006e4b01603edbda617002a077420e98c86595748e000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000950000000000000000000000000000000000000000000000000000000000000002ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000b1a2bc2ec5000000000000000000000000000000000000000000000000000000000000000000015020000000c020200020110000001100001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000050c5725949a6f0c72e6c4a641f24049a917db0cb00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000001000000000000000000000000833589fcd6edb6e08f4c7c32d4f71b54bda0291300000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000").unwrap() ); assert!(logs_contain("built remove order calldata")); } diff --git a/packages/raindex/test/js_api/raindexClient.test.ts b/packages/raindex/test/js_api/raindexClient.test.ts index 592ee2e834..a5983489ba 100644 --- a/packages/raindex/test/js_api/raindexClient.test.ts +++ b/packages/raindex/test/js_api/raindexClient.test.ts @@ -954,7 +954,7 @@ describe("Rain Raindex JS API Package Bindgen Tests - Raindex Client", async fun const calldata = extractWasmEncodedData(order.getRemoveCalldata()); assert.equal( calldata, - "0x1f69cb75000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000002a000000000000000000000000005f6c104ca9812ef91fe2e26a2e7187b92d3b0e800000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000020009cd210f509c66e18fab61fd30f76fb17c6c6cd09f0972ce0815b5b7630a1b050000000000000000000000005fb33d710f8b58de4c9fdec703b5c2487a5219d600000000000000000000000084c6e7f5a1e5dd89594cc25bef4722a1b8871ae600000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000075000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000015020000000c02020002011000000110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000001d80c49bbbcd1c0911346656b529df9e5c2f783d0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000100000000000000000000000012e605bc104e93b45e1ad99f9e555f659051c2bb00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000000", + "0xdf6db3c2000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000002a000000000000000000000000005f6c104ca9812ef91fe2e26a2e7187b92d3b0e800000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000020009cd210f509c66e18fab61fd30f76fb17c6c6cd09f0972ce0815b5b7630a1b050000000000000000000000005fb33d710f8b58de4c9fdec703b5c2487a5219d600000000000000000000000084c6e7f5a1e5dd89594cc25bef4722a1b8871ae600000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000075000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000015020000000c02020002011000000110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000001d80c49bbbcd1c0911346656b529df9e5c2f783d0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000100000000000000000000000012e605bc104e93b45e1ad99f9e555f659051c2bb00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000000", ); }); From cb3382d704013415af4dece7d9326dfd4835d412 Mon Sep 17 00:00:00 2001 From: David Meister Date: Mon, 26 Oct 2026 15:23:42 +0000 Subject: [PATCH 09/15] Oracle JSON test: qualify json! so it compiles for wasm Co-Authored-By: Claude Opus 5.5 --- crates/quote/src/oracle.rs | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/crates/quote/src/oracle.rs b/crates/quote/src/oracle.rs index 7e960659b7..2db2f35967 100644 --- a/crates/quote/src/oracle.rs +++ b/crates/quote/src/oracle.rs @@ -511,10 +511,7 @@ mod tests { signed.signer, address!("0x1234567890123456789012345678901234567890") ); - assert_eq!( - signed.domainSeparator, - FixedBytes::<32>::repeat_byte(0xd5) - ); + assert_eq!(signed.domainSeparator, FixedBytes::<32>::repeat_byte(0xd5)); assert_eq!(signed.context.len(), 1); assert_eq!(signed.context[0], ctx_val); assert_eq!(signed.signature, Bytes::from(vec![0xaa, 0xbb, 0xcc])); @@ -523,7 +520,7 @@ mod tests { #[test] fn test_oracle_response_json_requires_domain_separator() { let domain = format!("0x{}", "d5".repeat(32)); - let with_domain: OracleResponse = serde_json::from_value(json!({ + let with_domain: OracleResponse = serde_json::from_value(serde_json::json!({ "signer": "0x1234567890123456789012345678901234567890", "domainSeparator": domain, "context": [format!("0x{}", "2a".repeat(32))], @@ -536,10 +533,10 @@ mod tests { ); assert_eq!( serde_json::to_value(&with_domain).unwrap()["domainSeparator"], - json!(domain) + serde_json::json!(domain) ); - let without_domain = serde_json::from_value::(json!({ + let without_domain = serde_json::from_value::(serde_json::json!({ "signer": "0x1234567890123456789012345678901234567890", "context": [format!("0x{}", "2a".repeat(32))], "signature": "0xaabbcc", From cf236e90532b9d16a8de08580fed3edd06cf41f5 Mon Sep 17 00:00:00 2001 From: David Meister Date: Mon, 26 Oct 2026 15:29:27 +0000 Subject: [PATCH 10/15] Pin deposit5 selector in builder deposit calldata test Co-Authored-By: Claude Opus 5.5 --- packages/raindex/test/js_api/builder.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/raindex/test/js_api/builder.test.ts b/packages/raindex/test/js_api/builder.test.ts index 40588ea1c5..76be8ce876 100644 --- a/packages/raindex/test/js_api/builder.test.ts +++ b/packages/raindex/test/js_api/builder.test.ts @@ -1558,7 +1558,7 @@ ${dotrain}`; assert.equal( // @ts-expect-error - result is valid result.Calldatas[0], - "0x2fbc4ba00000000000000000000000008f3cf7ad23cd3cadbd9735aff958023239c6a0630000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000138800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000", + "0xca9109ba0000000000000000000000008f3cf7ad23cd3cadbd9735aff958023239c6a0630000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000138800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000", ); // Test no deposits case From 5195e565c3af3f30495b85cb4c4ff6b39e032839 Mon Sep 17 00:00:00 2001 From: David Meister Date: Mon, 26 Oct 2026 18:36:46 +0000 Subject: [PATCH 11/15] Pin raindex-interface 0.1.10 from the Soldeer registry Co-Authored-By: Claude Opus 5.5 --- foundry.toml | 2 +- soldeer.lock | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/foundry.toml b/foundry.toml index c00bdc38d0..aa8b0fe1c3 100644 --- a/foundry.toml +++ b/foundry.toml @@ -84,7 +84,7 @@ rainlang-interface = "0.2.14" rainlang-interface-rainlang = { version = "0.2.13", url = "https://soldeer-revisions.s3.amazonaws.com/rainlang-interface/0_2_13_11-10-2026_17:54:59_rainlang.zip" } # rainlanguage/rain.raindex.interface was renamed to # rainlanguage/raindex.interface; Soldeer registry name follows. -raindex-interface = { version = "0.1.10", git = "https://github.com/rainlanguage/raindex.interface.git", rev = "7107727113b499347a7beb89bc7b750c298c41f0" } +raindex-interface = "0.1.10" rain-metadata = "0.1.43" # The MetaBoard split out of `rain.metadata` into its own deploy repo. The # deploy pin lives there now; `rain-metadata` keeps the interfaces and libs. diff --git a/soldeer.lock b/soldeer.lock index 2cdb515d62..0894f380ab 100644 --- a/soldeer.lock +++ b/soldeer.lock @@ -134,8 +134,9 @@ integrity = "a2832c32c4a13a592c4c66072be5dca8b956e535467d8ce3cb6c51e9b4d5fc89" [[dependencies]] name = "raindex-interface" version = "0.1.10" -git = "https://github.com/rainlanguage/raindex.interface.git" -rev = "7107727113b499347a7beb89bc7b750c298c41f0" +url = "https://soldeer-revisions.s3.amazonaws.com/raindex-interface/0_1_10_26-10-2026_18:32:26_raindex.zip" +checksum = "f027522920deb18627febd992cdc006e801561e6a96e9dbb7fec626e2afac0e1" +integrity = "835cd538cad10a60b0fb6a36711bc5dbf789e6ae4647f5a16bb8c335d1fb9fca" [[dependencies]] name = "rainlang" From 3fe6778a50d8396ad5fa444866ea150e2a91566c Mon Sep 17 00:00:00 2001 From: David Meister Date: Mon, 26 Oct 2026 18:55:07 +0000 Subject: [PATCH 12/15] Keep clear4 signed-context routing as in clear3 clear4 evaluates alice with bobSignedContext and bob with aliceSignedContext, as clear3 did. The routing tests are replaced by a routing-agnostic SignedContextV2 test. Co-Authored-By: Claude Opus 5.5 --- src/concrete/raindex/RaindexV6.sol | 4 +- ... => RaindexV6.clear.signedContextV2.t.sol} | 57 +++++-------------- 2 files changed, 15 insertions(+), 46 deletions(-) rename test/concrete/raindex/{RaindexV6.clear.signedContextRouting.t.sol => RaindexV6.clear.signedContextV2.t.sol} (72%) diff --git a/src/concrete/raindex/RaindexV6.sol b/src/concrete/raindex/RaindexV6.sol index bb2db0113b..963140987a 100644 --- a/src/concrete/raindex/RaindexV6.sol +++ b/src/concrete/raindex/RaindexV6.sol @@ -621,7 +621,7 @@ contract RaindexV6 is IRaindexV7, IMetaV1_2, ReentrancyGuard, Multicall, Raindex clearConfig.aliceInputIOIndex, clearConfig.aliceOutputIOIndex, bobOrder.owner, - aliceSignedContext, + bobSignedContext, new bytes32[](0), false ); @@ -630,7 +630,7 @@ contract RaindexV6 is IRaindexV7, IMetaV1_2, ReentrancyGuard, Multicall, Raindex clearConfig.bobInputIOIndex, clearConfig.bobOutputIOIndex, aliceOrder.owner, - bobSignedContext, + aliceSignedContext, new bytes32[](0), false ); diff --git a/test/concrete/raindex/RaindexV6.clear.signedContextRouting.t.sol b/test/concrete/raindex/RaindexV6.clear.signedContextV2.t.sol similarity index 72% rename from test/concrete/raindex/RaindexV6.clear.signedContextRouting.t.sol rename to test/concrete/raindex/RaindexV6.clear.signedContextV2.t.sol index d1901cfd3d..2b4aab2764 100644 --- a/test/concrete/raindex/RaindexV6.clear.signedContextRouting.t.sol +++ b/test/concrete/raindex/RaindexV6.clear.signedContextV2.t.sol @@ -18,13 +18,11 @@ import {Strings} from "@openzeppelin-contracts-5.7.0/utils/Strings.sol"; import {LibDecimalFloat, Float} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; import {LibTestSignedContext} from "test/util/lib/LibTestSignedContext.sol"; -/// @title RaindexV6ClearSignedContextRoutingTest -/// @notice `clear4` evaluates alice's order with `aliceSignedContext` and bob's -/// with `bobSignedContext`, matching `quote3`/`takeOrders5`. Each order's -/// expression asserts the signer, domain and signed content it sees, so routing -/// is pinned by signer, domain and content rather than slot. Runs against -/// fresh-compiled RaindexV6 so source mutations are observable. -contract RaindexV6ClearSignedContextRoutingTest is RaindexV6ExternalRealTest { +/// @title RaindexV6ClearSignedContextV2Test +/// @notice `clear4` evaluates orders with `SignedContextV2`: each order's +/// expression asserts the signer, domain and signed content it sees. Runs +/// against fresh-compiled RaindexV6 so source mutations are observable. +contract RaindexV6ClearSignedContextV2Test is RaindexV6ExternalRealTest { using Strings for address; using Strings for uint256; using LibDecimalFloat for Float; @@ -134,50 +132,21 @@ contract RaindexV6ClearSignedContextRoutingTest is RaindexV6ExternalRealTest { return ClearConfigV2(0, 0, 0, 0, bytes32(uint256(0xc1)), bytes32(uint256(0xc2))); } + /// Both orders receive the same signed context, so this holds under either + /// routing of `aliceSignedContext`/`bobSignedContext`. /// forge-config: default.fuzz.runs = 32 - function testClearRoutesEachSignedContextToItsOwnOrder(Expected memory alice, Expected memory bob) external { - alice.pk = boundPk(alice.pk); - bob.pk = boundPk(bob.pk); - vm.assume(vm.addr(alice.pk) != vm.addr(bob.pk)); - (OrderV4 memory aliceOrder, OrderV4 memory bobOrder) = orders(alice, bob); + function testClearEvalSeesSignedContextV2(Expected memory expected) external { + expected.pk = boundPk(expected.pk); + vm.assume(expected.domain != bytes32(0)); + (OrderV4 memory aliceOrder, OrderV4 memory bobOrder) = orders(expected, expected); + SignedContextV2[] memory signedContexts = signedContext(expected); - iRaindex.clear4(aliceOrder, bobOrder, clearConfig(), signedContext(alice), signedContext(bob)); + iRaindex.clear4(aliceOrder, bobOrder, clearConfig(), signedContexts, signedContexts); assertTrue(iRaindex.vaultBalance2(aliceOrder.owner, address(iToken0), ALICE_IN).gt(LibDecimalFloat.FLOAT_ZERO)); assertTrue(iRaindex.vaultBalance2(bobOrder.owner, address(iToken1), BOB_IN).gt(LibDecimalFloat.FLOAT_ZERO)); } - /// forge-config: default.fuzz.runs = 32 - function testClearRevertsWhenSignedContextsAreSwapped(Expected memory alice, Expected memory bob) external { - alice.pk = boundPk(alice.pk); - bob.pk = boundPk(bob.pk); - vm.assume(vm.addr(alice.pk) != vm.addr(bob.pk)); - (OrderV4 memory aliceOrder, OrderV4 memory bobOrder) = orders(alice, bob); - SignedContextV2[] memory aliceSignedContext = signedContext(alice); - SignedContextV2[] memory bobSignedContext = signedContext(bob); - - vm.expectRevert("alice signer"); - iRaindex.clear4(aliceOrder, bobOrder, clearConfig(), bobSignedContext, aliceSignedContext); - } - - /// Same signer and content for both orders, so only the domain tells the - /// two signed contexts apart. - /// forge-config: default.fuzz.runs = 32 - function testClearRevertsWhenDomainsAreSwapped(uint256 pk, bytes32 aliceDomain, bytes32 bobDomain, bytes32 content) - external - { - vm.assume(aliceDomain != bobDomain); - pk = boundPk(pk); - Expected memory alice = Expected(pk, aliceDomain, content); - Expected memory bob = Expected(pk, bobDomain, content); - (OrderV4 memory aliceOrder, OrderV4 memory bobOrder) = orders(alice, bob); - SignedContextV2[] memory aliceSignedContext = signedContext(alice); - SignedContextV2[] memory bobSignedContext = signedContext(bob); - - vm.expectRevert("alice domain"); - iRaindex.clear4(aliceOrder, bobOrder, clearConfig(), bobSignedContext, aliceSignedContext); - } - function testClear3SelectorIsRemoved() external { (bool success, bytes memory returnData) = address(iRaindex) .call( From 579d27bce3f4479033094c3ba52d45b16aa87be5 Mon Sep 17 00:00:00 2001 From: David Meister Date: Mon, 26 Oct 2026 19:01:52 +0000 Subject: [PATCH 13/15] Regenerate pins for clear3 routing Co-Authored-By: Claude Opus 5.5 --- crates/test_fixtures/abis/RaindexV6.json | 2 +- .../candidate/GenericPoolRaindexV6ArbOrderTaker.sol | 10 +++++----- .../candidate/GenericPoolRaindexV6FlashBorrower.sol | 10 +++++----- src/generated/candidate/RaindexV6.sol | 8 ++++---- .../candidate/RouteProcessorRaindexV6ArbOrderTaker.sol | 10 +++++----- 5 files changed, 20 insertions(+), 20 deletions(-) diff --git a/crates/test_fixtures/abis/RaindexV6.json b/crates/test_fixtures/abis/RaindexV6.json index 5c49f7cd4e..dbf45f003c 100644 --- a/crates/test_fixtures/abis/RaindexV6.json +++ b/crates/test_fixtures/abis/RaindexV6.json @@ -2437,7 +2437,7 @@ } ], "bytecode": { - "object": "0x6080806040523460395760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005561588f908161003e8239f35b5f80fdfe6080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a71461180e575080632cb77e9f146117e257806341d1514f146117ab5780635343c1b7146117105780635cffe9de146115b45780635d003c4414611430578063613255ab146113ad578063687cf02a14611096578063ac9650d814610f48578063b0460f07146105f3578063b845b83e1461059b578063ca9109ba1461044c578063d9d98ce41461039b578063ddebc96f146103475763df6db3c2146100c1575f80fd5b34610321576003196040368201126103215767ffffffffffffffff9060043582811161032157806004019160a0823603918201126103215760243584811161032157610111903690600401611cd0565b909361011b612bf1565b5f946001600160a01b039485610130846125d8565b163303610325576101496101443685611b02565b612c33565b805f525f60205260405f20966001885414610190575b60208960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556040519015158152f35b9091929394959697505f600198556040519633885282602089015260606040890152816101bc8761188d565b166060890152602484013590606219018112156103215783019060a06080890152806101ea6004840161188d565b166101008901526101fd6024830161188d565b16610120880152604481013560221982360301811215610321570190602460048301359201988211610321578136038913610321577f09d18501db0080ca2d6cd7c17fa7255daff4b2d503ea93b76ff68b6752ea8e6387806103069560846102c561030e9a60209f610284906103149f9a60606101406102ef9d0152610160880191612389565b6102b66102ab61029760448801856129dc565b605f198a8603810160a08c01529491612a11565b9260648701906129dc565b918784030160c0880152612a11565b91013560e08301520390a13390919060405192600284526020840152604083015260608201604052565b906040519160018352602083015260408201604052565b9236916123a9565b90613c66565b5f8080808080808061015f565b5f80fd5b602486610331856125d8565b6040516335252be360e01b815291166004820152fd5b3461032157600319602036820112610321576004359067ffffffffffffffff82116103215760809082360301126103215761038660609160040161262c565b90604051921515835260208301526040820152f35b34610321576040366003190112610321576001600160a01b036103bc611861565b166040516370a0823160e01b8152306004820152602081602481855afa908115610441575f9161040f575b50156103f75760206040515f8152f35b60249060405190633c5bf76960e21b82526004820152fd5b90506020813d602011610439575b8161042a60209383611971565b810103126103215751826103e7565b3d915061041d565b6040513d5f823e3d90fd5b346103215761045a36611d01565b92809492610466612bf1565b610471828533613b62565b61047a816134d7565b15610567578061048e6104dd9286336140a8565b9790957f7f9dfa19cf1cc2f806f2f860fbc9c056b601fb1afc0e9b843dfe5c63616268e660806040513381526001600160a01b038416998a60208301528560408301526060820152a1336137be565b9390918561050c575b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b61055b9661030e956103069460ff93604051956005875260208701526040860152606085015260808401521660a082015260c08101604052906040519160018352602083015260408201604052565b808080808080806104e6565b506040516306dde9c360e41b81523360048201526001600160a01b03841660248201526044810191909152606490fd5b0390fd5b346103215760203660031901126103215760043567ffffffffffffffff81116103215761030e6105d26104e6923690600401611cd0565b91906105dc612bf1565b604051926105e984611955565b5f845236916123a9565b34610321576003196020368201126103215767ffffffffffffffff600435116103215760c090600435360301126103215761062c612bf1565b5f808061064160048035608481019101612511565b905015610f36576024600435013592610659846134d7565b15610f245760608060405161066d81611909565b610675612566565b81525f60208201525f6040820152015261068d612566565b506106ed6106e86106c76106bd6106b76106b1608460043501600435600401612511565b90612598565b806125b3565b60408101906124a3565b60206106e06106b1608460043501600435600401612511565b0135916125c8565b6125d8565b936001600160a01b0361073c6106e86107236107196106b76106b1608460043501600435600401612511565b60608101906124a3565b60406106e06106b1608460043501600435600401612511565b816040519761074a896118d1565b168752166020860152604085015261076c608460043501600435600401612511565b9490506001604051955f87520160051b85016040525f905f5b610799608460043501600435600401612511565b9050811080610f11575b15610d5e576107bc608460043501600435600401612511565b821015610d4a578160051b810135607e198236030181121561032157608081830136031261032157604051916107f183611909565b8181013567ffffffffffffffff81116103215761081390369084840101611b02565b835280820160208181013590850152604080820135908501526060013567ffffffffffffffff81116103215761084c9236920101611cb5565b606082015280516001600160a01b0361086e6040830151602085015190611dbe565b5151166001600160a01b0385511614801590610d16575b610d045761089d602083015160408401519083613fa5565b6108a681612c33565b91825f525f60205260405f2054155f1461090a575051604080513381526001600160a01b039092166020830152810191909152600191907fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f390606090a15b01610785565b919061093b60208497959701516040850151906060860151906040519261093084611955565b5f8452339186613235565b5f94916109a457505051604080513381526001600160a01b03909216602083015281019190915260019291907f1e6fa9678edf81f9f25bbf308bde03ad3e110db1f429394b0915ba021532941490606090a15b811561099c575b5092610904565b905088610995565b6109b9606082015160446004350135906134fa565b15610a1357505051604080513381526001600160a01b03909216602083015281019190915260019291907fe3151dc8cb7a54ffc4baabd28c1f241c94d510b5e5b502491ac3cad6c16316d59080606081015b0390a161098e565b610a2060408201516134d7565b158015610cf1575b15610a7e57505051604080513381526001600160a01b03909216602083015281019190915260019291907f500b713857325f9e6dcb52ae832eca9109d107ed1aae9cb4928b4c1e13f051aa908060608101610a0b565b9250925050600196959691610a976064600435016125ec565b15610c5e5796610b0797610b1760408401516040880151610ab88183613544565b15610c565750925b610b11848592610afa610af460608a01516001600160e01b03601b918660e01d92828816810b928260e01d9216900b6145f5565b9061456a565b9d8e9260408d015161356b565b60408c015261407e565b9961407e565b98610b228484613595565b610b2c84826135f3565b60405192338452608060208501526060610b528451608080880152610100870190611e19565b93602081015160a0870152604081015160c0870152015192607f198582030160e0860152835180825260208201906020808260051b8501019601925f5b828110610bee57505050505092806001979695937fbae4dbf76931c547f765e9def16d693d86daaa596f491de979008831789185ae93610be996604084015260608301520390a180858c5101808d5260051b8c01526138aa565b61098e565b9091929396602080610c49600193601f198782030189528b51906001600160a01b03825116815283820151848201526060610c3860408401516080604085015260808401906125f9565b920151906060818403910152611d4d565b9901950193929101610b8f565b905092610ac0565b610b0790610b176060840151610b11610c9c610af460408801516001600160e01b0394601b90868360e01d9316820b91878260e01d9216900b6145f5565b60408a0151610cab8183613544565b15610ce95750915b829c8d916060890151908116155f14610cda575060408801515b96879460408d015161356b565b610ce49085613fda565b610ccd565b905091610cb3565b50610cff6060820151613521565b610a28565b60405163936bb5ad60e01b8152600490fd5b506001600160a01b03610d326060830151604085015190611dbe565b5151166001600160a01b036020860151161415610885565b634e487b7160e01b5f52603260045260245ffd5b50919390610d706064600435016125ec565b15610f0b57835b6004356004013590610d898282613544565b610eed5750508490610da9856001600160a01b0360208701511633613bf4565b505060a46004350190610dc182600435600401612470565b905015159081610ee5575b50610e44575b506001600160a01b03610de892935116336140a8565b50505b8351811015610e105780610e0a610e0460019387611dbe565b5161371e565b01610deb565b5060409160017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005582519182526020820152f35b90506001600160a01b03602084015116610e6e6001600160a01b0385511692600435600401612470565b929091333b1561032157610eb65f93604051958694859463691f9ed760e01b8652600486015260248501528960448501528a606485015260a0608485015260a4840191612389565b038183335af190811561044157859115610dd2579050610ed69150611925565b5f836001600160a01b03610dd2565b905088610dcc565b604492506040519163573b6f4160e01b835260048301526024820152fd5b84610d77565b50610f1f60408301516134d7565b6107a3565b60405163315f9e2360e21b8152600490fd5b604051639c95219f60e01b8152600490fd5b34610321576020806003193601126103215760043567ffffffffffffffff811161032157610f7a903690600401611cd0565b919060405192610f8984611955565b5f8452828401610f9882611a55565b94610fa66040519687611971565b828652610fb283611a55565b93610fc486880195601f1901866124f5565b5f5b84811061102857604080518881528951818a018190525f92600582901b83018101918a918c9085015b828710610ffc5785850386f35b909192938280611018600193603f198a82030186528851611d4d565b9601920196019592919092610fef565b806110778861107161104460019560059d9c9d1b870187612470565b929089846040519586938585013782018381015f81528b519283915e015f83820152038084520182611971565b30613f14565b611081828a611dbe565b5261108c8189611dbe565b5001969596610fc6565b34610321576003196040368201126103215760043567ffffffffffffffff8082116103215760c08260040193833603011261032157602435908111610321576110e3903690600401611cd0565b906110ec612bf1565b61111d61111861111361110c611102888061245b565b6040810190612470565b3691611993565b613e96565b613eff565b801561139b5760011015611389576024830161113981866124a3565b90501561137757604484019461114f86826124a3565b905015611365576111b561117d966111a961117461116d858061245b565b95856124a3565b999092856124a3565b91909261119a60405197611190896118a1565b33895236906119f7565b9a60209b8c8901523691611a6d565b60408601523691611a6d565b6060830152606485013560808301526111cd82612c33565b91825f525f875260405f20958654159687611211575b888860017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055604051908152f35b6001905560a46001600160a01b03917f87491344dfbcf91f6cbbc610cbbeedc85313d37a02df0c93527f7ea5f8db717f83855116604051908152878c82015260606040820152806112656060820188611e19565b0390a101916112748385612470565b90506112b9575b505050506112ad92916103066102ef61030e933390919060405192600284526020840152604083015260608201604052565b828080808080806111e3565b6112c661110c8486612470565b6112cf816145d1565b156113425750937fd46c2c56b35c8210e9e712ec3f02242d5fc90187c0ac8ed80cc33626846ec369896112ad989795611335611318610306976102ef9761030e9b511693612470565b866040519586958652850152606060408501526060840191612389565b0390a1938395965061127b565b89610597604051928392630c89984b60e31b845260048401526024830190611d4d565b60405163540e5f0b60e01b8152600490fd5b604051636c44ef8f60e01b8152600490fd5b604051633c8270bd60e21b8152600490fd5b604051632cff108b60e21b8152600490fd5b3461032157602080600319360112610321576024816001600160a01b036113d2611861565b16604051928380926370a0823160e01b82523060048301525afa908115610441575f91611403575b50604051908152f35b90508181813d8311611429575b61141a8183611971565b810103126103215751826113fa565b503d611410565b346103215761143e36611d01565b929161144b949194612bf1565b611456838333613b62565b61145f816134d7565b15611583578160ff916114778561153a969533612a61565b6114818183613544565b1561157d575080935b61149685828533613b96565b917f8045c25080b0868951141ed0a91720bcad09a8364a2b3109ee1fd49c1f0bc8b860c06114c5898833613bf4565b97906001600160a01b0360405192338452169a8b6020840152856040840152886060840152608083015260a0820152a16040519660068852602088015260408701526060860152608085015260a08401521660c082015260e08101604052906040519160018352602083015260408201604052565b90806115665760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b6115759261030e9136916123a9565b8080806104e6565b9361148a565b50604051623a3a4d60e21b81523360048201526001600160a01b039190911660248201526044810191909152606490fd5b34610321576080366003190112610321576004356001600160a01b0390818116809103610321576115e3611877565b6044359167ffffffffffffffff91606435838111610321573660238201121561032157806004013593841161032157366024858301011161032157611670956020921693611632868587613a83565b60405196879283926323e30c8b60e01b84523360048501528760248501528860448501525f606485015260a06084850152602460a485019201612389565b03815f855af1938415610441575f946116dc575b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd984036116c3576116b893503091613afc565b602060405160018152f35b604051630b6c58a960e31b815260048101859052602490fd5b9093506020813d602011611708575b816116f860209383611971565b8101031261032157519284611684565b3d91506116eb565b34610321576101403660031901126103215767ffffffffffffffff60043581811161032157611743903690600401611b02565b6024358281116103215761175b903690600401611b02565b60c0366043190112610321576101043583811161032157611780903690600401611cb5565b90610124359384116103215761179d6104e6943690600401611cb5565b926117a6612bf1565b611eca565b346103215760603660031901126103215760206117da6117c9611861565b6117d1611877565b60443591612a61565b604051908152f35b34610321576020366003190112610321576004355f525f6020526020600160405f205414604051908152f35b34610321576020366003190112610321576004359063ffffffff60e01b82168092036103215760209163e414309160e01b8114908115611850575b5015158152f35b6301ffc9a760e01b14905083611849565b600435906001600160a01b038216820361032157565b602435906001600160a01b038216820361032157565b35906001600160a01b038216820361032157565b60a0810190811067ffffffffffffffff8211176118bd57604052565b634e487b7160e01b5f52604160045260245ffd5b6060810190811067ffffffffffffffff8211176118bd57604052565b6040810190811067ffffffffffffffff8211176118bd57604052565b6080810190811067ffffffffffffffff8211176118bd57604052565b67ffffffffffffffff81116118bd57604052565b60e0810190811067ffffffffffffffff8211176118bd57604052565b6020810190811067ffffffffffffffff8211176118bd57604052565b90601f8019910116810190811067ffffffffffffffff8211176118bd57604052565b92919267ffffffffffffffff82116118bd57604051916119bd601f8201601f191660200184611971565b829481845281830111610321578281602093845f960137010152565b9080601f83011215610321578160206119f493359101611993565b90565b91906060838203126103215760405190611a10826118d1565b8193611a1b8161188d565b8352611a296020820161188d565b602084015260408101359167ffffffffffffffff831161032157604092611a5092016119d9565b910152565b67ffffffffffffffff81116118bd5760051b60200190565b929192611a7982611a55565b604092611a896040519283611971565b819581835260208093019160061b84019381851161032157915b848310611ab257505050505050565b8583830312610321578386918251611ac9816118ed565b611ad28661188d565b81528286013583820152815201920191611aa3565b9080601f83011215610321578160206119f493359101611a6d565b91909160a0818403126103215760405190611b1c826118a1565b8193611b278261188d565b835267ffffffffffffffff9160208101358381116103215782611b4b9183016119f7565b602085015260408101358381116103215782611b68918301611ae7565b6040850152606081013592831161032157611b896080939284938301611ae7565b60608501520135910152565b90929192611ba281611a55565b91604094611bb36040519485611971565b839583855260208095019160059460051b8401948186116103215784935b868510611be2575050505050505050565b67ffffffffffffffff90853582811161032157870190608082860312610321578551611c0d81611909565b611c168361188d565b81528a8301358b8201528683013584811161032157830186601f8201121561032157803590611c4482611a55565b91611c518a519384611971565b8083528d80840191891b83010191898311610321578e809101915b838310611ca557505050508782015260608084013594851161032157611c96878d968796016119d9565b90820152815201940193611bd1565b82358152918101918f9101611c6c565b9080601f83011215610321578160206119f493359101611b95565b9181601f840112156103215782359167ffffffffffffffff8311610321576020808501948460051b01011161032157565b906080600319830112610321576004356001600160a01b0381168103610321579160243591604435916064359067ffffffffffffffff821161032157611d4991600401611cd0565b9091565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b805115610d4a5760200190565b805160011015610d4a5760400190565b805160021015610d4a5760600190565b805160031015610d4a5760800190565b805160041015610d4a5760a00190565b8051821015610d4a5760209160051b010190565b9081518082526020808093019301915f5b828110611df1575050505090565b835180516001600160a01b031686528201518583015260409094019392810192600101611de3565b90608080611e8f611e7d611e6b60406001600160a01b0380895116885260208901519060a060208a01528082511660a08a015260208201511660c08901520151606060e0880152610100870190611d4d565b60408701518682036040880152611dd2565b60608601518582036060870152611dd2565b93015191015290565b90611ea282611a55565b611eaf6040519182611971565b8281528092611ec0601f1991611a55565b0190602036910137565b92916001600160a01b038451166001600160a01b0383511614612377576001600160a01b03611f00606086015160643590611dbe565b515116906040830151916001600160a01b03611f1f6084358095611dbe565b51511614801590612337575b610d04576040850151906001600160a01b03611f4a6044358094611dbe565b5151166001600160a01b03611f6560643560608a0151611dbe565b5151161461232557611f7686612c33565b805f525f60205260405f2054156122d25750611f9184612c33565b805f525f60205260405f20541561227e5750612076929161204e917f6fa7f4c28634b0a9d6831401c45ae468195fb63aed07308935c35374ff5d9e3960405180611ff9611feb61012033845280602085015283018d611e19565b82810360408401528a611e19565b85606083015260643560808301528760a083015260a43560c083015260c43560e083015260e4356101008301520390a16001600160a01b038651166040519261204184611955565b5f8452606435908a612e9d565b9490506001600160a01b038651166040519261206984611955565b5f845260a4359086612e9d565b92905061208660408201516134d7565b15801561226a575b8015612257575b8015612244575b61223257604051916120ad83611909565b5f83525f60208401525f60408401525f60608401526120cc84836144e2565b845260408401526120f26120e083866144e2565b6020860152806060860152845161356b565b94612106602085015160408601519061356b565b9361211087613521565b8015612223575b612211576121d861220a957fd9fa84dd790c969daa5c33d8050dc06b4a9b59d5b42e2be5f5e8ae20447f618d946121ba61220f9a60a0966121598a8851613595565b6121678c6020890151613595565b6121758a60408901516135f3565b6121838c60608901516135f3565b61218c8a61371e565b6121958c61371e565b6001600160a01b036121b160c435926060606435910151611dbe565b515116336137be565b50506001600160a01b036121b160e43592606060a435910151611dbe565b5050606060405191338352805160208401526020810151604084015260408101518284015201516080820152a16138aa565b6138aa565b565b604051630d86822160e01b8152600490fd5b5061222d85613521565b612117565b6040516321badf1f60e01b8152600490fd5b506122526060840151613521565b61209c565b506122656060820151613521565b612095565b5061227860408401516134d7565b1561208e565b9351604080513381526001600160a01b039092166020830152810194909452507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f3945091925082915050606081015b0390a1565b9551604080513381526001600160a01b039092166020830152810196909652507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f3949350839250506060820190506122cd565b604051631cd2f1c760e21b8152600490fd5b506001600160a01b03612351606085015160a43590611dbe565b5151166001600160a01b0361236d604088015160443590611dbe565b5151161415611f2b565b604051630a98f1f360e21b8152600490fd5b908060209392818452848401375f828201840152601f01601f1916010190565b909291926123b681611a55565b916040916123c76040519485611971565b839581855260208095019160051b8301938185116103215783925b8584106123f25750505050505050565b67ffffffffffffffff90843582811161032157860190838286031261032157835161241c816118ed565b823584811161032157866124319185016119f7565b8152898301359384116103215761244c868b95869501611cb5565b838201528152019301926123e2565b903590605e1981360301821215610321570190565b903590601e1981360301821215610321570180359067ffffffffffffffff82116103215760200191813603831361032157565b903590601e1981360301821215610321570180359067ffffffffffffffff821161032157602001918160061b3603831361032157565b5f5b608081106124e7575050565b6060828201526020016124db565b5f5b82811061250357505050565b6060828201526020016124f7565b903590601e1981360301821215610321570180359067ffffffffffffffff821161032157602001918160051b3603831361032157565b60405190612554826118d1565b60606040835f81525f60208201520152565b60405190612573826118a1565b5f608083828152612582612547565b6020820152606060408201526060808201520152565b9015610d4a57803590607e1981360301821215610321570190565b903590609e1981360301821215610321570190565b9190811015610d4a5760061b0190565b356001600160a01b03811681036103215790565b3580151581036103215790565b9081518082526020808093019301915f5b828110612618575050505090565b83518552938101939281019260010161260a565b9061264461014461263d84806125b3565b3690611b02565b5f5260205f81526040926001845f2054036129d157916128c6916126cb85855f61284b6126748361268b9a6125b3565b612690878501359182878701359c8d923690611b02565b613fa5565b6126a861269d85806125b3565b946060810190612511565b96906126c38751966126b988611955565b8688523690611b02565b973691611b95565b906126d4612c64565b506127fb8651916126e4836118a1565b600483526126f38a84016124d9565b886126fd81612c33565b988b6001600160a01b039a8b84511690835192600384528301528282015233606082015260808101825261273086611d71565b5261273a85611d71565b508051612746816118d1565b6002815281368e83013761275986611d7e565b5261276385611d7e565b50810160ff8c6127c66127af8d80612788816127808b8a51611dbe565b515116614173565b97511690612797898851611dbe565b515116846127a68a8951611dbe565b51015191612a61565b958d6127bc828751611dbe565b5151169451611dbe565b51015192169093929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b61280482611d8e565b5261280e81611d8e565b506128328b886060810160ff8c6127c66127af8d80612788816127808b8a51611dbe565b61283b82611d9e565b5261284581611d9e565b50614251565b918385511693868601918b83519289818551169401511693878652308a5281808720915101519082519261287e84611955565b878452519561288c87611939565b86528a8601528d85015284606085015285608085015260a084015260c08301528a5180809a819463d04dfe2360e01b835260048301612de5565b03915afa95865f915f986129ab575b506128e45788513d5f823e3d90fd5b95938651600281106129945750888798998260c0979899015199015161291261290c85611dae565b51611d9e565b5161291d8183613544565b1561298a5750998a925b6129498b85919060405192600284526020840152604083015260608201604052565b61295286611d8e565b5261295c85611d8e565b5082519661296988611939565b8752860152840152866060840152608083015260a082015201526001929190565b9050998a92612927565b6024908a5190630fbb8e5560e21b82526004820152fd5b9097506129ca91503d805f833e6129c28183611971565b810190612ca1565b965f6128d5565b505f92508291829150565b9035601e198236030181121561032157016020813591019167ffffffffffffffff8211610321578160061b3603831361032157565b9190808252602080920192915f905b828210612a2e575050505090565b909192936001906001600160a01b03612a468761188d565b16815285830135838201526040908101950193920190612a20565b8215612a96576001600160a01b038091165f52600160205260405f2091165f5260205260405f20905f5260205260405f205490565b909150612aa282614173565b6001600160a01b03809316906040918251946370a0823160e01b86528416938460048701526020928387602481865afa968715612bb8575f97612bc2575b5083612af9612af283612b299a614f37565b50906149f9565b508651636eb1769f60e11b81526001600160a01b0390941660048501523060248501529297889081906044820190565b0381865afa968715612bb8575f97612b87575b50612af2612b4d916119f498614f37565b50612b588183613544565b15612b7f5750935b5f5260018252825f20905f528152815f20905f8052525f20549061407e565b905093612b60565b96508387813d8311612bb1575b612b9e8183611971565b8101031261032157955195612af2612b3c565b503d612b94565b85513d5f823e3d90fd5b96508387813d8311612bea575b612bd98183611971565b810103126103215795519583612ae0565b503d612bcf565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f006002815414612c215760029055565b604051633ee5aeb560e01b8152600490fd5b604051612c5e81612c506020820194602086526040830190611e19565b03601f198101835282611971565b51902090565b60405190612c7182611939565b606060c083612c7e612566565b81525f60208201525f60408201525f838201528260808201525f60a08201520152565b919060408382031261032157825167ffffffffffffffff908181116103215784019082601f83011215610321578151602092612cdc82611a55565b91612cea6040519384611971565b808352848084019160051b830101918683116103215785809101915b838310612d795750505050948281015191821161032157019180601f84011215610321578251612d3581611a55565b93612d436040519586611971565b818552838086019260051b820101928311610321578301905b828210612d6a575050505090565b81518152908301908301612d5c565b8251815291810191869101612d06565b90808251908181526020809101926020808460051b8301019501935f915b848310612db75750505050505090565b9091929394958480612dd5600193601f198682030187528a516125f9565b9801930193019194939290612da7565b91906020928381526001600160a01b0382511684820152838201516040820152612e1f604083015160e06060840152610100830190611d4d565b9060608301516080820152612e46608084015192601f1993848483030160a0850152612d89565b9260a081015193838382030160c08401528680865192838152019501905f5b818110612e89575050506119f494955060c060e091015192828503019101526125f9565b825187529588019591880191600101612e65565b94959395929192612eac612c64565b50604096875190612ebc826118a1565b60048252602093612ece8584016124d9565b612ed789612c33565b6001600160a01b038097818c51168d519360038552898501528d840152166060820152608081018b52612f0984611d71565b52612f1383611d71565b508951612f1f816118d1565b600281528a3687830137612f3284611d7e565b52612f3c83611d7e565b50898901908681835190612f4f91611dbe565b515116612f5b90614173565b86888c51168984865190612f6e91611dbe565b5151168285875190612f7f91611dbe565b51015190612f8c92612a61565b928981865190612f9b91611dbe565b515116945190612faa91611dbe565b5101519060ff16612fe2929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b612feb83611d8e565b52612ff582611d8e565b5060608801858782519061300891611dbe565b51511661301490614173565b868a5116878984519061302691611dbe565b515116878a85519061303791611dbe565b5101519061304492612a61565b908689898186519061305591611dbe565b51511694519061306491611dbe565b5101519060ff1661309c929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b6130a583611d9e565b526130af82611d9e565b506130b991614251565b9183875116938188019283519183818451169301511693865f523084528a805f20915101518b51916130ea83611955565b5f83528c51966130f988611939565b8752858701528b8601525f60608601526080850186905260a085015260c0840152885163d04dfe2360e01b815292839081906131389060048301612de5565b03815a935f94fa91825f915f94613217575b506131595788513d5f823e3d90fd5b979495969791948251966002881097886132005750818385015194015161318261290c87611dae565b5161318d8183613544565b156131f85750925b6131b78585919060405192600284526020840152604083015260608201604052565b6131c087611d8e565b526131ca86611d8e565b5082519a6131d78c611939565b8b528a01528801526060870152608086015260a085015260c0840152159190565b905092613195565b602490835190630fbb8e5560e21b82526004820152fd5b90935061322e91503d805f833e6129c28183611971565b925f61314a565b95949193908693613244612c64565b505f92604061335f815192613258846118a1565b6004845260209361326a8582016124d9565b6133286132768b612c33565b8b6001600160a01b03998a9283835116895191600383528b830152898201528360609b168b8201526080810189526132ad86611d71565b526132b785611d71565b5087516132c3816118d1565b6002815288368b8301376132d686611d7e565b526132e085611d7e565b5060ff896127c68a85019361331c876132fe81612780858a51611dbe565b9751168861330d848951611dbe565b515116856127a6858a51611dbe565b966127bc828751611dbe565b61333182611d8e565b5261333b81611d8e565b50612832878b8d60ff896127c68c85019361331c876132fe81612780858a51611dbe565b946133df5f868a511698869786889c0191825191888184511693015116928c8552308952878086209151015188519161339783611955565b8683528951956133a687611939565b86528a86015288850152848a8501528b608085015260a084015260c08301528551808095819463d04dfe2360e01b835260048301612de5565b03915afa90815f915f936134b9575b506134ac575050505f975b6002855110988915996134995782848701519601519061341b61290c89611dae565b51906134278284613544565b1590506134915750925b6134538685919060405192600284526020840152604083015260608201604052565b61345c88611d8e565b5261346687611d8e565b5082519b6134738d611939565b8c528b0152890152870152608086015260a085015260c08401529190565b905092613431565b50505050505050505091506119f4612c64565b91999850945093966133f9565b9092506134d091503d805f833e6129c28183611971565b915f6133ee565b6134f6905f60e01d906001600160e01b038160e01d9116601b0b614fee565b1290565b906134f6916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b61506f565b613540905f60e01d906001600160e01b038160e01d9116601b0b614fee565b1390565b90613540916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b61506f565b6119f491610af4916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614545565b6135ef9160808101826135b16135ab8351611dae565b51611dae565b526135e86135e26001600160a01b038094515116936135d96135d38551611dae565b51611d71565b51169251611dae565b51611d8e565b5191613b96565b5050565b906080810191806136076135ab8551611d9e565b526001600160a01b038092515116916136236135d38551611d9e565b51166136326135e28551611d9e565b5190816136e65761364283613521565b6136cd579183917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a95936122cd955f5260209060018252613698604094855f20835f528452855f20855f528452855f205461407e565b945f5260018252835f20905f528152825f20915f52525f20555b51604051918291338352604060208401526040830190612d89565b60405163793a8f5560e01b815260048101849052602490fd5b91613717917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a95936122cd956137be565b50506136b2565b6080810161372f6135e28251611d9e565b5191821561373c57505050565b6137566135d36001600160a01b0380935151169351611d9e565b5116815f5260209160018352604092835f20835f528152835f20855f528152835f2054936001600160e01b038516613791575b505050505050565b6137b5955f9284845260018152828420868552815282842091845252812055613bf4565b5f808080613789565b939291936137cb83613521565b6136cd57846137e7576137df939450613bf4565b50505f905f90565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f528152613824835f2054948561407e565b9561382e87613521565b613851575f97885260018252838820908852815282872091875252909320829055565b835163c5e12af560e01b815260048101889052602490fd5b90604082019082526020606081936040838201528551809452019301915f5b828110613896575050505090565b835185529381019392810192600101613888565b60c0810151908151915f92613a1e575b5061395f6020918281510151926001600160a01b039081818187511696015116928660a082019485518252308452604097888320898686510151015160808601518b519161390783611955565b8683528c519361391685611955565b8785528d519661392588611939565b8752898701528c86015260016060860152608085015260a084015260c08301528851808099819463d04dfe2360e01b835260048301612de5565b03915afa948515613a145787956139f6575b508451613982575b50505050505050565b81905101510151169051813b156139f2579184918493836139b7965180978195829463012c676d60e21b845260048401613869565b03925af19081156139e957506139d2575b8080808080613979565b6139dc8291611925565b6139e657806139c8565b80fd5b513d84823e3d90fd5b8480fd5b613a0b9195503d8089833e6129c28183611971565b9050935f613971565b86513d89823e3d90fd5b6001600160a01b03602080845101510151169060a083015190823b1561032157613a61925f928360405180968195829463012c676d60e21b845260048401613869565b03925af1801561044157156138ba57613a7b919250611925565b5f905f6138ba565b6040519263a9059cbb60e01b5f526001600160a01b0380931660045260245260205f60448180855af160015f5114811615613add575b8360405215613ac757505050565b635274afe760e01b835216600482015260249150fd5b6001811516613af357813b15153d151616613ab9565b833d5f823e3d90fd5b9092604051936323b872dd60e01b5f526001600160a01b0393848092166004521660245260445260205f60648180855af160015f5114811615613b4c575b836040525f60605215613ac757505050565b6001811516613af357813b15153d151616613b3a565b909115613b6d575050565b6040516305dbdfd960e41b81526001600160a01b03918216600482015291166024820152604490fd5b93929193613ba383613521565b6136cd5784613bb7576137df9394506140a8565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f528152613824835f2054948561356b565b90929192613c0181614574565b93613c0b81613521565b613c545784816001600160e01b03613c2a9360e01d9116601b0b615199565b50809281613c3a575b5050509190565b6001600160a01b03613c4c9316613a83565b5f8181613c33565b604051632d1671a360e11b8152600490fd5b916040805191613c75836118a1565b60048084526020613c878186016124d9565b5f5b8751811015613cbc5780613c9f6001928a611dbe565b51613caa8289611dbe565b52613cb58188611dbe565b5001613c89565b5092955092939093335f52308352855f2091865190613cda826118ed565b613ce2612547565b8252606085819301528751613cf681611955565b5f8152885191613d0583611955565b5f83525f3681375f5b8151811015613e6b57613d218183611dbe565b5190888c8b84519189818401518d8d8251613d49575b50505050505050506001915001613d0e565b5f613db897948197948c9794613d768c956001600160a01b039d8e81818d51169c0151169b015190614251565b94865199613d838b611939565b8a528901528488015286015260808501528a60a08501528b60c08501525180958194829363d04dfe2360e01b84528301612de5565b03915afa938415613e61578b915f95613e43575b508451613de1575b50908b8e89838d8d613d37565b51015116803b1561032157613e10925f918c8f84905180978195829463012c676d60e21b845233908401613869565b03925af1918215613e3957600192613e2a575b8981613dd4565b613e3390611925565b5f613e23565b8c513d5f823e3d90fd5b613e589195503d805f833e6129c28183611971565b9050935f613dcc565b8e513d5f823e3d90fd5b5050505050505050509050565b8115613e82570490565b634e487b7160e01b5f52601260045260245ffd5b6040815110613ef2576020810151908051603f198101908111613ede5760051c8211613eca5760016020920160051b010190565b5050604051613ed881611955565b5f815290565b634e487b7160e01b5f52601160045260245ffd5b50604051613ed881611955565b805115613f0f57602001515f1a90565b505f90565b905f8091602081519101845af48080613f92575b15613f485750506040513d81523d5f602083013e60203d82010160405290565b15613f6f57604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b3d15613f80576040513d5f823e3d90fd5b60405163d6bda27560e01b8152600490fd5b503d151580613f285750813b1515613f28565b91613fd0906060613fc5936001600160a01b039485916040880151611dbe565b515116940151611dbe565b5151161461232557565b6140016001600160e01b0392838316601b0b9260e01d938160e01d9116601b0b84846147b0565b90637ffffff58213614051575b90614018916149f9565b9290921580614049575b61402b57505090565b6044925060405191638eba4d0760e01b835260048301526024820152fd5b508215614022565b61405b82826156c2565b1561400e57604483856040519163d556b11160e01b835260048301526024820152fd5b6119f491610af4916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614d9e565b9291926140b482614574565b936140be81613521565b61411f5784816001600160e01b036140dd9360e01d9116601b0b615199565b929080931561410a575b508290816140f6575050509190565b613c4c926001600160a01b03309216613afc565b9092505f198114613ede57600101915f6140e7565b604051632eaefac360e21b8152600490fd5b6004111561413b57565b634e487b7160e01b5f52602160045260245ffd5b602090939291936001600160a01b03604082019516815261416f83614131565b0152565b61417b6156db565b60408051630782d7e160e01b81526001600160a01b03831660048201529091828260248173200e12d10bb0c5e4a17e7018f0f1161919bb93895afa928315614248575f925f94614213575b506141d083614131565b600183141580614201575b6141e55750505090565b5163ee07877f60e01b815291829161059791906004840161414f565b5061420b83614131565b8215156141db565b908094506142379293503d8511614241575b61422f8183611971565b810190614f0d565b919091925f6141c6565b503d614225565b513d5f823e3d90fd5b61425b8251611e98565b6142658351611e98565b9282519281518015155f146144da57600201935b6001940184019061428982611a55565b956142a460409361429c8551998a611971565b808952611a55565b6142b6602091601f1901828a016124f5565b5f9584519389896002926002885233868901523089890152606097606081018a526142e084611d71565b526142ea83611d71565b505f825b61449a575b50505050865161430a575b50505050505050505090565b9091929360028861432d8c866143268e809c9d9e018093611dbe565b528d611dbe565b50018561433a828d611dbe565b52614345818c611dbe565b505f965b614354575b506142fe565b8851871015614495576001600160a01b03614400898b856143f78c60428c8861437d8488611dbe565b51511696858261438d868a611dbe565b5101519261439b868a611dbe565b51838d82511691015182815160051b910120908451927f6ec4dff745ec96dbde88c5d41f8aa5ac13aa1664afb47b8406b44fa945a650c88452830152838201522090519161190160f01b83528d83015260228201522093611dbe565b51015191614f65565b1561447d578761446c8b8e8c8f9e9d9c9b9a999897968f614459918d61444f898f8f61443b83889f614432828f611dbe565b51511692611dbe565b52614446828b611dbe565b51015192611dbe565b52019c8d94611dbe565b5101516144668383611dbe565b52611dbe565b500196979895909192939495614349565b8851630a57f30960e31b815260048101899052602490fd5b61434e565b9091929a82518210156144d257906144c684809301809d6144bb8487611dbe565b516144668383611dbe565b50019082918d936142ee565b9a92916142f3565b505f93614279565b916040830192604061451c610af4606087519401938451906001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6145f5565b9451930161452b8151866134fa565b614533575050565b9093506119f491925051925183613fda565b919291600160ff1b840161455d57611d4993506150c4565b90611d49935f0391614d9e565b61401882826149f9565b61457c6156db565b6040805163b7bad1b160e01b81526001600160a01b0383166004820152909182826024815f73200e12d10bb0c5e4a17e7018f0f1161919bb93895af1928315614248575f925f9461421357506141d083614131565b6008815110613f0f576008015167ffffffffffffffff1667ff0a89c674ee78741490565b9091939284158215175f1461460f5750505090505f905f90565b82810192600160fd1b8082019083011760fe1c614746575b505061463281615387565b9361463c81615387565b9461464786826153a7565b90918215614737575f9083986f0785ee10d5da46d900f436a000000000808611614729575b50670de0b6b3a7640000808b1161471a575b50633b9aca00808b1161470b575b50612710808b116146fd575b5098805b6146ec57508190611d49989982600a0a9109960195817fcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccd0a93838211900382610100031b9203901c1702916153ba565b60019290920191600a90048061469c565b60049a04998a930192614698565b600991939a049901915f61468c565b601291939a049901915f61467e565b85049950602592505f61466c565b50929050611d499495506153ba565b5f82121561479a5780841361478c575b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb284131561462757909250611d499394916152c5565b909250611d4993949161532c565b8084121561475657909250611d499394916152c5565b929091806147d6576044848460405191637a97930f60e01b835260048301526024820152fd5b90919280155f146147eb57505050505f905f90565b614804936147f891615474565b92919490938492615474565b909391928461481288615387565b9161481c86615387565b947f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000094604c918688106149c3575b030191600160ff1b98838a018112155f14614990575050035b5f955f821280614987575b614969575b5f811280614957575b6149395786820103966001600160ff1b038814908161492f575b5080614926575b8061491d575b6148ff5750906148b39291615620565b915f81136148c6575b50611d49936153ba565b9091604c82136148f4576148dd91600a0a90613e78565b9081156148ea575f6148bc565b505050505f905f90565b50505050505f905f90565b876044916040519163d556b11160e01b835260048301526024820152fd5b505f85126148a3565b5082841461489d565b905088145f614896565b604489836040519163d556b11160e01b835260048301526024820152fd5b50806001600160ff1b0301821361487c565b95508087018613156149815786818703015b95614873565b5f61497b565b505f811361486e565b89985090920390506001600160ff1b03819003870182136149b45701860194614863565b5050505050505050505f905f90565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009650604b925061484a565b8115613e82570590565b8082601b82810b8314614bee577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000008405614b9a575b8380820b03614b8957507b199999999999999999999999999999999999999999999999999999987b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc84011115614b3a575b838060030b03614abe575b808413614aa25750506001600160e01b036001925b60e01b91161791565b8303600a0a8015613e82576001600160e01b0391071592614a99565b92915f841315614b0e575090614ad483836156c2565b614af057637ffffffe1901600a0a810290637fffffff92614a84565b506044916040519163d556b11160e01b835260048301526024820152fd5b637fffffff1992830390604382136148f457614b2d91600a0a906149ef565b9182156148ea5792614a84565b5f198401808060030b14614b4e5750614a79565b90506001600160e01b039293507b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff915060e01b9260ff1d181617905f90565b600190940193600a90930592614a2c565b937f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000840515614bdb576305f5e100600894058094819201955b915050614a2c565b620186a060059405809481920195614bd3565b5082614a7957505050505f90600190565b919291600160ff1b9190801580614d8c575090614c1b91615474565b9490929091905f868585858282138015614d83575b614d66575b505050508682841860ff1c94860391039081604c038111614d4b5701600a0a808205919084614d31575b505081019182821860ff1c1115614d2957826001600160ff1b0314614d0b57905f600192135f14614cdc57600a9004915b01925b81158117614ca057509190565b80614cb9575b508015614cb1579190565b505f91508190565b9192614ccf9203600160ff1b01600a0a906149ef565b600160ff1b91905f614ca6565b600a60037fe6666666666666666666666666666666666666666666666666666666666666679201040191614c90565b604490836040519163d556b11160e01b835260048301526024820152fd5b509092614c93565b8107614d3e575b80614c5f565b60ff1d600117015f614d38565b505050919350614d59579190565b60018160ff1d1790039190565b5f9a50909750909550600160ff1b94509250905086808080614c35565b50835f12614c30565b15614d975750509190565b9350919050565b9392919384158115818117614eef57505090614db991615474565b9194908295614dca82958294615474565b8096929491969387868482138015614ee6575b614ecd575b5050505050508682841860ff1c94860391039081604c038111614d4b5701600a0a808205919084614eb3575b505081019182821860ff1c1115614eab57826001600160ff1b0314614d0b57905f600192135f14614e7c57600a9004915b01925b81158117614e4f57509190565b80614e5f57508015614cb1579190565b600160ff1b93614e769291038401600a0a906149ef565b5f614ca6565b600a60037fe6666666666666666666666666666666666666666666666666666666666666679201040191614e3f565b509092614e42565b8107614ec0575b80614e0e565b60ff1d600117015f614eba565b929b5098509196509450925090505f8080808080614de2565b50858412614ddd565b9395939092919015614f05575050614cb1579190565b945092915050565b919082604091031261032157815160048110156103215760209092015160ff811681036103215790565b9060ff165f03916001600160ff1b0382115f14614f5d57600a6001818404940192061590565b909190600190565b9091813b614fa057614f779192615744565b50614f8181614131565b159182614f8d57505090565b6001600160a01b03918216911614919050565b6020918160645f935160405192630b135d3f60e11b9788855260048501526040602485015286820190604485015e8281018201859052601f01601f191601915afa905f5114601f3d11161690565b92915f9060018184145f87128715171717615068575f9280821361505a575b03604c81135f82121761504e57600a0a908461502c83820293846149ef565b146150415750501561503d575f9190565b5f90565b90935090156119f4579190565b50501561503d575f9190565b5f956001945092509061500d565b5050505f90565b93929190918083145f83125f871218831587151717176150be575f928082136150b15703604c81135f82121761504e57600a0a908461502c83820293846149ef565b919460019350919061500d565b50919050565b909291600160ff1b91828101615156575080841461514c57808413918215615144578185035b604c8111156151335750505f915b1561512457507f8000000000000000000000000000000000000000000000000000000000000001019190565b92506001600160ff1b03039190565b600a0a908115613e825704916150f8565b8482036150ea565b505090505f905f90565b9361516392945f03614bff565b80939180928114615177575b50505f039190565b915092506001600160ff1b038314614d0b57600a600191059201915f8061516f565b91925f8312156151c1576044838360405191634a7d166b60e01b835260048301526024820152fd5b9192836151d357505090505f90600190565b60ff811682019180831261529b575f83121561520b575050604c198112614cb1575f03600a0a916152048382613e78565b9283021490565b909293915f81135f1461529157604d811361526657600a0a928315613e8257835f1904831161523d5750500290600190565b60405163c849483b60e01b815260048101849052602481019290925260ff166044820152606490fd5b5060405163c849483b60e01b81526004810192909252602482015260ff919091166044820152606490fd5b5050905090600190565b60405163c849483b60e01b815260048101869052602481019190915260ff82166044820152606490fd5b909392915f6152d59181846145f5565b9490945f8483019182019412159081615322575b8115615318575b506152fa57505090565b604492506040519163d556b11160e01b835260048301526024820152fd5b905083125f6152f0565b82811291506152e9565b61534193600160fe1b908101939201906145f5565b9081815f821215615378575050604b1982126137df57615366915f03600a0a906149ef565b9081615370575f90565b600160ff1b90565b93600160ff1b90910192509050565b5f8112156119f457600160ff1b908082036153a0575090565b90505f0390565b905f198183099102908180821091030391565b92939291905f818418121561544f576001600160ff1b03928383111561543957600160ff1b938385036153ef57505050509190565b90919293508514615409575050600a600191045f03920190565b604051630ed8062160e21b8152600481019190915260248101919091526044810182905260648101849052608490fd5b5090915050600160ff1b8114613ede575f039190565b90916001600160ff1b0380841115613c33578514615409575050600a60019104920190565b919091801561561657827f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000080830515615524575b507f19999999999999999999999999999999999999999999999999999999999999997f0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc830110615515575b83136154ff5791905f90565b919060018060ff1b926001600160ff1b03030190565b9290600a02905f1901926154f3565b6f4b3b4ca85a86c47a098a22400000000080840515615604575b507728c87cb5c89a2571ebfdcb54864ada834a000000000000008305156155ed575b7b097edd871cfda3a5697758bf0e3cbb5ac5741c6400000000000000008305156155d9575b7e3899162693736ac531a5a58f1fbb4b746504382ca7e40000000000000000008305156155c9578205156155ba575b5f6154a8565b9290600a02905f1901926155b4565b9391606402916001190193615585565b93916402540be40002916009190193615585565b9391678ac7230489e8000002916012190193615560565b6025198301955092909202915f61553e565b505f915081908190565b90915f19838309928083029283808610950394808603958487101561569e5714615696579082910960018219018216809204600280826003021880830282030280830282030280830282030280830282030280830282030280920290030293600183805f03040190848311900302920304170290565b505091500490565b60648386866040519263362ced0960e11b8452600484015260248301526044820152fd5b6119f491905f8112156156d6575f0361577e565b61577e565b73200e12d10bb0c5e4a17e7018f0f1161919bb9389803b158015615719575b6157015750565b602490604051906373e6d7b360e01b82526004820152fd5b507f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d41813f14156156fa565b81519190604183036157745761576d9250602082015190606060408401519301515f1a9061580d565b9192909190565b50505f9160029190565b90637ffffff581131561580757637ffffffe1981019060438213615800575f8212156157d457637fffffff91505f0301600a0a7b8000000000000000000000000000000000000000000000000000000202111590565b50600a0a8015613e82577b80000000000000000000000000000000000000000000000000000001041090565b5050151590565b50505f90565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411615884579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa15610441575f516001600160a01b0381161561587a57905f905f90565b505f906001905f90565b5050505f916003919056", + "object": "0x6080806040523460395760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005561588e908161003e8239f35b5f80fdfe6080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a71461180e575080632cb77e9f146117e257806341d1514f146117ab5780635343c1b7146117105780635cffe9de146115b45780635d003c4414611430578063613255ab146113ad578063687cf02a14611096578063ac9650d814610f48578063b0460f07146105f3578063b845b83e1461059b578063ca9109ba1461044c578063d9d98ce41461039b578063ddebc96f146103475763df6db3c2146100c1575f80fd5b34610321576003196040368201126103215767ffffffffffffffff9060043582811161032157806004019160a0823603918201126103215760243584811161032157610111903690600401611cd0565b909361011b612bf0565b5f946001600160a01b039485610130846125d7565b163303610325576101496101443685611b02565b612c32565b805f525f60205260405f20966001885414610190575b60208960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556040519015158152f35b9091929394959697505f600198556040519633885282602089015260606040890152816101bc8761188d565b166060890152602484013590606219018112156103215783019060a06080890152806101ea6004840161188d565b166101008901526101fd6024830161188d565b16610120880152604481013560221982360301811215610321570190602460048301359201988211610321578136038913610321577f09d18501db0080ca2d6cd7c17fa7255daff4b2d503ea93b76ff68b6752ea8e6387806103069560846102c561030e9a60209f610284906103149f9a60606101406102ef9d0152610160880191612388565b6102b66102ab61029760448801856129db565b605f198a8603810160a08c01529491612a10565b9260648701906129db565b918784030160c0880152612a10565b91013560e08301520390a13390919060405192600284526020840152604083015260608201604052565b906040519160018352602083015260408201604052565b9236916123a8565b90613c65565b5f8080808080808061015f565b5f80fd5b602486610331856125d7565b6040516335252be360e01b815291166004820152fd5b3461032157600319602036820112610321576004359067ffffffffffffffff82116103215760809082360301126103215761038660609160040161262b565b90604051921515835260208301526040820152f35b34610321576040366003190112610321576001600160a01b036103bc611861565b166040516370a0823160e01b8152306004820152602081602481855afa908115610441575f9161040f575b50156103f75760206040515f8152f35b60249060405190633c5bf76960e21b82526004820152fd5b90506020813d602011610439575b8161042a60209383611971565b810103126103215751826103e7565b3d915061041d565b6040513d5f823e3d90fd5b346103215761045a36611d01565b92809492610466612bf0565b610471828533613b61565b61047a816134d6565b15610567578061048e6104dd9286336140a7565b9790957f7f9dfa19cf1cc2f806f2f860fbc9c056b601fb1afc0e9b843dfe5c63616268e660806040513381526001600160a01b038416998a60208301528560408301526060820152a1336137bd565b9390918561050c575b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b61055b9661030e956103069460ff93604051956005875260208701526040860152606085015260808401521660a082015260c08101604052906040519160018352602083015260408201604052565b808080808080806104e6565b506040516306dde9c360e41b81523360048201526001600160a01b03841660248201526044810191909152606490fd5b0390fd5b346103215760203660031901126103215760043567ffffffffffffffff81116103215761030e6105d26104e6923690600401611cd0565b91906105dc612bf0565b604051926105e984611955565b5f845236916123a8565b34610321576003196020368201126103215767ffffffffffffffff600435116103215760c090600435360301126103215761062c612bf0565b5f808061064160048035608481019101612510565b905015610f36576024600435013592610659846134d6565b15610f245760608060405161066d81611909565b610675612565565b81525f60208201525f6040820152015261068d612565565b506106ed6106e86106c76106bd6106b76106b1608460043501600435600401612510565b90612597565b806125b2565b60408101906124a2565b60206106e06106b1608460043501600435600401612510565b0135916125c7565b6125d7565b936001600160a01b0361073c6106e86107236107196106b76106b1608460043501600435600401612510565b60608101906124a2565b60406106e06106b1608460043501600435600401612510565b816040519761074a896118d1565b168752166020860152604085015261076c608460043501600435600401612510565b9490506001604051955f87520160051b85016040525f905f5b610799608460043501600435600401612510565b9050811080610f11575b15610d5e576107bc608460043501600435600401612510565b821015610d4a578160051b810135607e198236030181121561032157608081830136031261032157604051916107f183611909565b8181013567ffffffffffffffff81116103215761081390369084840101611b02565b835280820160208181013590850152604080820135908501526060013567ffffffffffffffff81116103215761084c9236920101611cb5565b606082015280516001600160a01b0361086e6040830151602085015190611dbe565b5151166001600160a01b0385511614801590610d16575b610d045761089d602083015160408401519083613fa4565b6108a681612c32565b91825f525f60205260405f2054155f1461090a575051604080513381526001600160a01b039092166020830152810191909152600191907fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f390606090a15b01610785565b919061093b60208497959701516040850151906060860151906040519261093084611955565b5f8452339186613234565b5f94916109a457505051604080513381526001600160a01b03909216602083015281019190915260019291907f1e6fa9678edf81f9f25bbf308bde03ad3e110db1f429394b0915ba021532941490606090a15b811561099c575b5092610904565b905088610995565b6109b9606082015160446004350135906134f9565b15610a1357505051604080513381526001600160a01b03909216602083015281019190915260019291907fe3151dc8cb7a54ffc4baabd28c1f241c94d510b5e5b502491ac3cad6c16316d59080606081015b0390a161098e565b610a2060408201516134d6565b158015610cf1575b15610a7e57505051604080513381526001600160a01b03909216602083015281019190915260019291907f500b713857325f9e6dcb52ae832eca9109d107ed1aae9cb4928b4c1e13f051aa908060608101610a0b565b9250925050600196959691610a976064600435016125eb565b15610c5e5796610b0797610b1760408401516040880151610ab88183613543565b15610c565750925b610b11848592610afa610af460608a01516001600160e01b03601b918660e01d92828816810b928260e01d9216900b6145f4565b90614569565b9d8e9260408d015161356a565b60408c015261407d565b9961407d565b98610b228484613594565b610b2c84826135f2565b60405192338452608060208501526060610b528451608080880152610100870190611e19565b93602081015160a0870152604081015160c0870152015192607f198582030160e0860152835180825260208201906020808260051b8501019601925f5b828110610bee57505050505092806001979695937fbae4dbf76931c547f765e9def16d693d86daaa596f491de979008831789185ae93610be996604084015260608301520390a180858c5101808d5260051b8c01526138a9565b61098e565b9091929396602080610c49600193601f198782030189528b51906001600160a01b03825116815283820151848201526060610c3860408401516080604085015260808401906125f8565b920151906060818403910152611d4d565b9901950193929101610b8f565b905092610ac0565b610b0790610b176060840151610b11610c9c610af460408801516001600160e01b0394601b90868360e01d9316820b91878260e01d9216900b6145f4565b60408a0151610cab8183613543565b15610ce95750915b829c8d916060890151908116155f14610cda575060408801515b96879460408d015161356a565b610ce49085613fd9565b610ccd565b905091610cb3565b50610cff6060820151613520565b610a28565b60405163936bb5ad60e01b8152600490fd5b506001600160a01b03610d326060830151604085015190611dbe565b5151166001600160a01b036020860151161415610885565b634e487b7160e01b5f52603260045260245ffd5b50919390610d706064600435016125eb565b15610f0b57835b6004356004013590610d898282613543565b610eed5750508490610da9856001600160a01b0360208701511633613bf3565b505060a46004350190610dc18260043560040161246f565b905015159081610ee5575b50610e44575b506001600160a01b03610de892935116336140a7565b50505b8351811015610e105780610e0a610e0460019387611dbe565b5161371d565b01610deb565b5060409160017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005582519182526020820152f35b90506001600160a01b03602084015116610e6e6001600160a01b038551169260043560040161246f565b929091333b1561032157610eb65f93604051958694859463691f9ed760e01b8652600486015260248501528960448501528a606485015260a0608485015260a4840191612388565b038183335af190811561044157859115610dd2579050610ed69150611925565b5f836001600160a01b03610dd2565b905088610dcc565b604492506040519163573b6f4160e01b835260048301526024820152fd5b84610d77565b50610f1f60408301516134d6565b6107a3565b60405163315f9e2360e21b8152600490fd5b604051639c95219f60e01b8152600490fd5b34610321576020806003193601126103215760043567ffffffffffffffff811161032157610f7a903690600401611cd0565b919060405192610f8984611955565b5f8452828401610f9882611a55565b94610fa66040519687611971565b828652610fb283611a55565b93610fc486880195601f1901866124f4565b5f5b84811061102857604080518881528951818a018190525f92600582901b83018101918a918c9085015b828710610ffc5785850386f35b909192938280611018600193603f198a82030186528851611d4d565b9601920196019592919092610fef565b806110778861107161104460019560059d9c9d1b87018761246f565b929089846040519586938585013782018381015f81528b519283915e015f83820152038084520182611971565b30613f13565b611081828a611dbe565b5261108c8189611dbe565b5001969596610fc6565b34610321576003196040368201126103215760043567ffffffffffffffff8082116103215760c08260040193833603011261032157602435908111610321576110e3903690600401611cd0565b906110ec612bf0565b61111d61111861111361110c611102888061245a565b604081019061246f565b3691611993565b613e95565b613efe565b801561139b5760011015611389576024830161113981866124a2565b90501561137757604484019461114f86826124a2565b905015611365576111b561117d966111a961117461116d858061245a565b95856124a2565b999092856124a2565b91909261119a60405197611190896118a1565b33895236906119f7565b9a60209b8c8901523691611a6d565b60408601523691611a6d565b6060830152606485013560808301526111cd82612c32565b91825f525f875260405f20958654159687611211575b888860017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055604051908152f35b6001905560a46001600160a01b03917f87491344dfbcf91f6cbbc610cbbeedc85313d37a02df0c93527f7ea5f8db717f83855116604051908152878c82015260606040820152806112656060820188611e19565b0390a10191611274838561246f565b90506112b9575b505050506112ad92916103066102ef61030e933390919060405192600284526020840152604083015260608201604052565b828080808080806111e3565b6112c661110c848661246f565b6112cf816145d0565b156113425750937fd46c2c56b35c8210e9e712ec3f02242d5fc90187c0ac8ed80cc33626846ec369896112ad989795611335611318610306976102ef9761030e9b51169361246f565b866040519586958652850152606060408501526060840191612388565b0390a1938395965061127b565b89610597604051928392630c89984b60e31b845260048401526024830190611d4d565b60405163540e5f0b60e01b8152600490fd5b604051636c44ef8f60e01b8152600490fd5b604051633c8270bd60e21b8152600490fd5b604051632cff108b60e21b8152600490fd5b3461032157602080600319360112610321576024816001600160a01b036113d2611861565b16604051928380926370a0823160e01b82523060048301525afa908115610441575f91611403575b50604051908152f35b90508181813d8311611429575b61141a8183611971565b810103126103215751826113fa565b503d611410565b346103215761143e36611d01565b929161144b949194612bf0565b611456838333613b61565b61145f816134d6565b15611583578160ff916114778561153a969533612a60565b6114818183613543565b1561157d575080935b61149685828533613b95565b917f8045c25080b0868951141ed0a91720bcad09a8364a2b3109ee1fd49c1f0bc8b860c06114c5898833613bf3565b97906001600160a01b0360405192338452169a8b6020840152856040840152886060840152608083015260a0820152a16040519660068852602088015260408701526060860152608085015260a08401521660c082015260e08101604052906040519160018352602083015260408201604052565b90806115665760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b6115759261030e9136916123a8565b8080806104e6565b9361148a565b50604051623a3a4d60e21b81523360048201526001600160a01b039190911660248201526044810191909152606490fd5b34610321576080366003190112610321576004356001600160a01b0390818116809103610321576115e3611877565b6044359167ffffffffffffffff91606435838111610321573660238201121561032157806004013593841161032157366024858301011161032157611670956020921693611632868587613a82565b60405196879283926323e30c8b60e01b84523360048501528760248501528860448501525f606485015260a06084850152602460a485019201612388565b03815f855af1938415610441575f946116dc575b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd984036116c3576116b893503091613afb565b602060405160018152f35b604051630b6c58a960e31b815260048101859052602490fd5b9093506020813d602011611708575b816116f860209383611971565b8101031261032157519284611684565b3d91506116eb565b34610321576101403660031901126103215767ffffffffffffffff60043581811161032157611743903690600401611b02565b6024358281116103215761175b903690600401611b02565b60c0366043190112610321576101043583811161032157611780903690600401611cb5565b90610124359384116103215761179d6104e6943690600401611cb5565b926117a6612bf0565b611eca565b346103215760603660031901126103215760206117da6117c9611861565b6117d1611877565b60443591612a60565b604051908152f35b34610321576020366003190112610321576004355f525f6020526020600160405f205414604051908152f35b34610321576020366003190112610321576004359063ffffffff60e01b82168092036103215760209163e414309160e01b8114908115611850575b5015158152f35b6301ffc9a760e01b14905083611849565b600435906001600160a01b038216820361032157565b602435906001600160a01b038216820361032157565b35906001600160a01b038216820361032157565b60a0810190811067ffffffffffffffff8211176118bd57604052565b634e487b7160e01b5f52604160045260245ffd5b6060810190811067ffffffffffffffff8211176118bd57604052565b6040810190811067ffffffffffffffff8211176118bd57604052565b6080810190811067ffffffffffffffff8211176118bd57604052565b67ffffffffffffffff81116118bd57604052565b60e0810190811067ffffffffffffffff8211176118bd57604052565b6020810190811067ffffffffffffffff8211176118bd57604052565b90601f8019910116810190811067ffffffffffffffff8211176118bd57604052565b92919267ffffffffffffffff82116118bd57604051916119bd601f8201601f191660200184611971565b829481845281830111610321578281602093845f960137010152565b9080601f83011215610321578160206119f493359101611993565b90565b91906060838203126103215760405190611a10826118d1565b8193611a1b8161188d565b8352611a296020820161188d565b602084015260408101359167ffffffffffffffff831161032157604092611a5092016119d9565b910152565b67ffffffffffffffff81116118bd5760051b60200190565b929192611a7982611a55565b604092611a896040519283611971565b819581835260208093019160061b84019381851161032157915b848310611ab257505050505050565b8583830312610321578386918251611ac9816118ed565b611ad28661188d565b81528286013583820152815201920191611aa3565b9080601f83011215610321578160206119f493359101611a6d565b91909160a0818403126103215760405190611b1c826118a1565b8193611b278261188d565b835267ffffffffffffffff9160208101358381116103215782611b4b9183016119f7565b602085015260408101358381116103215782611b68918301611ae7565b6040850152606081013592831161032157611b896080939284938301611ae7565b60608501520135910152565b90929192611ba281611a55565b91604094611bb36040519485611971565b839583855260208095019160059460051b8401948186116103215784935b868510611be2575050505050505050565b67ffffffffffffffff90853582811161032157870190608082860312610321578551611c0d81611909565b611c168361188d565b81528a8301358b8201528683013584811161032157830186601f8201121561032157803590611c4482611a55565b91611c518a519384611971565b8083528d80840191891b83010191898311610321578e809101915b838310611ca557505050508782015260608084013594851161032157611c96878d968796016119d9565b90820152815201940193611bd1565b82358152918101918f9101611c6c565b9080601f83011215610321578160206119f493359101611b95565b9181601f840112156103215782359167ffffffffffffffff8311610321576020808501948460051b01011161032157565b906080600319830112610321576004356001600160a01b0381168103610321579160243591604435916064359067ffffffffffffffff821161032157611d4991600401611cd0565b9091565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b805115610d4a5760200190565b805160011015610d4a5760400190565b805160021015610d4a5760600190565b805160031015610d4a5760800190565b805160041015610d4a5760a00190565b8051821015610d4a5760209160051b010190565b9081518082526020808093019301915f5b828110611df1575050505090565b835180516001600160a01b031686528201518583015260409094019392810192600101611de3565b90608080611e8f611e7d611e6b60406001600160a01b0380895116885260208901519060a060208a01528082511660a08a015260208201511660c08901520151606060e0880152610100870190611d4d565b60408701518682036040880152611dd2565b60608601518582036060870152611dd2565b93015191015290565b90611ea282611a55565b611eaf6040519182611971565b8281528092611ec0601f1991611a55565b0190602036910137565b926001600160a01b038451166001600160a01b0383511614612376576001600160a01b03611eff606086015160643590611dbe565b515116906040830151916001600160a01b03611f1e6084358095611dbe565b51511614801590612336575b610d04576040850151906001600160a01b03611f496044358094611dbe565b5151166001600160a01b03611f6460643560608a0151611dbe565b5151161461232457611f7586612c32565b805f525f60205260405f2054156122d15750611f9084612c32565b805f525f60205260405f20541561227d5750612075929161204d917f6fa7f4c28634b0a9d6831401c45ae468195fb63aed07308935c35374ff5d9e3960405180611ff8611fea61012033845280602085015283018d611e19565b82810360408401528a611e19565b85606083015260643560808301528760a083015260a43560c083015260c43560e083015260e4356101008301520390a16001600160a01b038651166040519261204084611955565b5f8452606435908a612e9c565b9490506001600160a01b038651166040519261206884611955565b5f845260a4359086612e9c565b92905061208560408201516134d6565b158015612269575b8015612256575b8015612243575b61223157604051916120ac83611909565b5f83525f60208401525f60408401525f60608401526120cb84836144e1565b845260408401526120f16120df83866144e1565b6020860152806060860152845161356a565b94612105602085015160408601519061356a565b9361210f87613520565b8015612222575b612210576121d7612209957fd9fa84dd790c969daa5c33d8050dc06b4a9b59d5b42e2be5f5e8ae20447f618d946121b961220e9a60a0966121588a8851613594565b6121668c6020890151613594565b6121748a60408901516135f2565b6121828c60608901516135f2565b61218b8a61371d565b6121948c61371d565b6001600160a01b036121b060c435926060606435910151611dbe565b515116336137bd565b50506001600160a01b036121b060e43592606060a435910151611dbe565b5050606060405191338352805160208401526020810151604084015260408101518284015201516080820152a16138a9565b6138a9565b565b604051630d86822160e01b8152600490fd5b5061222c85613520565b612116565b6040516321badf1f60e01b8152600490fd5b506122516060840151613520565b61209b565b506122646060820151613520565b612094565b5061227760408401516134d6565b1561208d565b9351604080513381526001600160a01b039092166020830152810194909452507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f3945091925082915050606081015b0390a1565b9551604080513381526001600160a01b039092166020830152810196909652507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f3949350839250506060820190506122cc565b604051631cd2f1c760e21b8152600490fd5b506001600160a01b03612350606085015160a43590611dbe565b5151166001600160a01b0361236c604088015160443590611dbe565b5151161415611f2a565b604051630a98f1f360e21b8152600490fd5b908060209392818452848401375f828201840152601f01601f1916010190565b909291926123b581611a55565b916040916123c66040519485611971565b839581855260208095019160051b8301938185116103215783925b8584106123f15750505050505050565b67ffffffffffffffff90843582811161032157860190838286031261032157835161241b816118ed565b823584811161032157866124309185016119f7565b8152898301359384116103215761244b868b95869501611cb5565b838201528152019301926123e1565b903590605e1981360301821215610321570190565b903590601e1981360301821215610321570180359067ffffffffffffffff82116103215760200191813603831361032157565b903590601e1981360301821215610321570180359067ffffffffffffffff821161032157602001918160061b3603831361032157565b5f5b608081106124e6575050565b6060828201526020016124da565b5f5b82811061250257505050565b6060828201526020016124f6565b903590601e1981360301821215610321570180359067ffffffffffffffff821161032157602001918160051b3603831361032157565b60405190612553826118d1565b60606040835f81525f60208201520152565b60405190612572826118a1565b5f608083828152612581612546565b6020820152606060408201526060808201520152565b9015610d4a57803590607e1981360301821215610321570190565b903590609e1981360301821215610321570190565b9190811015610d4a5760061b0190565b356001600160a01b03811681036103215790565b3580151581036103215790565b9081518082526020808093019301915f5b828110612617575050505090565b835185529381019392810192600101612609565b9061264361014461263c84806125b2565b3690611b02565b5f5260205f81526040926001845f2054036129d057916128c5916126ca85855f61284a6126738361268a9a6125b2565b61268f878501359182878701359c8d923690611b02565b613fa4565b6126a761269c85806125b2565b946060810190612510565b96906126c28751966126b888611955565b8688523690611b02565b973691611b95565b906126d3612c63565b506127fa8651916126e3836118a1565b600483526126f28a84016124d8565b886126fc81612c32565b988b6001600160a01b039a8b84511690835192600384528301528282015233606082015260808101825261272f86611d71565b5261273985611d71565b508051612745816118d1565b6002815281368e83013761275886611d7e565b5261276285611d7e565b50810160ff8c6127c56127ae8d806127878161277f8b8a51611dbe565b515116614172565b97511690612796898851611dbe565b515116846127a58a8951611dbe565b51015191612a60565b958d6127bb828751611dbe565b5151169451611dbe565b51015192169093929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b61280382611d8e565b5261280d81611d8e565b506128318b886060810160ff8c6127c56127ae8d806127878161277f8b8a51611dbe565b61283a82611d9e565b5261284481611d9e565b50614250565b918385511693868601918b83519289818551169401511693878652308a5281808720915101519082519261287d84611955565b878452519561288b87611939565b86528a8601528d85015284606085015285608085015260a084015260c08301528a5180809a819463d04dfe2360e01b835260048301612de4565b03915afa95865f915f986129aa575b506128e35788513d5f823e3d90fd5b95938651600281106129935750888798998260c0979899015199015161291161290b85611dae565b51611d9e565b5161291c8183613543565b156129895750998a925b6129488b85919060405192600284526020840152604083015260608201604052565b61295186611d8e565b5261295b85611d8e565b5082519661296888611939565b8752860152840152866060840152608083015260a082015201526001929190565b9050998a92612926565b6024908a5190630fbb8e5560e21b82526004820152fd5b9097506129c991503d805f833e6129c18183611971565b810190612ca0565b965f6128d4565b505f92508291829150565b9035601e198236030181121561032157016020813591019167ffffffffffffffff8211610321578160061b3603831361032157565b9190808252602080920192915f905b828210612a2d575050505090565b909192936001906001600160a01b03612a458761188d565b16815285830135838201526040908101950193920190612a1f565b8215612a95576001600160a01b038091165f52600160205260405f2091165f5260205260405f20905f5260205260405f205490565b909150612aa182614172565b6001600160a01b03809316906040918251946370a0823160e01b86528416938460048701526020928387602481865afa968715612bb7575f97612bc1575b5083612af8612af183612b289a614f36565b50906149f8565b508651636eb1769f60e11b81526001600160a01b0390941660048501523060248501529297889081906044820190565b0381865afa968715612bb7575f97612b86575b50612af1612b4c916119f498614f36565b50612b578183613543565b15612b7e5750935b5f5260018252825f20905f528152815f20905f8052525f20549061407d565b905093612b5f565b96508387813d8311612bb0575b612b9d8183611971565b8101031261032157955195612af1612b3b565b503d612b93565b85513d5f823e3d90fd5b96508387813d8311612be9575b612bd88183611971565b810103126103215795519583612adf565b503d612bce565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f006002815414612c205760029055565b604051633ee5aeb560e01b8152600490fd5b604051612c5d81612c4f6020820194602086526040830190611e19565b03601f198101835282611971565b51902090565b60405190612c7082611939565b606060c083612c7d612565565b81525f60208201525f60408201525f838201528260808201525f60a08201520152565b919060408382031261032157825167ffffffffffffffff908181116103215784019082601f83011215610321578151602092612cdb82611a55565b91612ce96040519384611971565b808352848084019160051b830101918683116103215785809101915b838310612d785750505050948281015191821161032157019180601f84011215610321578251612d3481611a55565b93612d426040519586611971565b818552838086019260051b820101928311610321578301905b828210612d69575050505090565b81518152908301908301612d5b565b8251815291810191869101612d05565b90808251908181526020809101926020808460051b8301019501935f915b848310612db65750505050505090565b9091929394958480612dd4600193601f198682030187528a516125f8565b9801930193019194939290612da6565b91906020928381526001600160a01b0382511684820152838201516040820152612e1e604083015160e06060840152610100830190611d4d565b9060608301516080820152612e45608084015192601f1993848483030160a0850152612d88565b9260a081015193838382030160c08401528680865192838152019501905f5b818110612e88575050506119f494955060c060e091015192828503019101526125f8565b825187529588019591880191600101612e64565b94959395929192612eab612c63565b50604096875190612ebb826118a1565b60048252602093612ecd8584016124d8565b612ed689612c32565b6001600160a01b038097818c51168d519360038552898501528d840152166060820152608081018b52612f0884611d71565b52612f1283611d71565b508951612f1e816118d1565b600281528a3687830137612f3184611d7e565b52612f3b83611d7e565b50898901908681835190612f4e91611dbe565b515116612f5a90614172565b86888c51168984865190612f6d91611dbe565b5151168285875190612f7e91611dbe565b51015190612f8b92612a60565b928981865190612f9a91611dbe565b515116945190612fa991611dbe565b5101519060ff16612fe1929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b612fea83611d8e565b52612ff482611d8e565b5060608801858782519061300791611dbe565b51511661301390614172565b868a5116878984519061302591611dbe565b515116878a85519061303691611dbe565b5101519061304392612a60565b908689898186519061305491611dbe565b51511694519061306391611dbe565b5101519060ff1661309b929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b6130a483611d9e565b526130ae82611d9e565b506130b891614250565b9183875116938188019283519183818451169301511693865f523084528a805f20915101518b51916130e983611955565b5f83528c51966130f888611939565b8752858701528b8601525f60608601526080850186905260a085015260c0840152885163d04dfe2360e01b815292839081906131379060048301612de4565b03815a935f94fa91825f915f94613216575b506131585788513d5f823e3d90fd5b979495969791948251966002881097886131ff5750818385015194015161318161290b87611dae565b5161318c8183613543565b156131f75750925b6131b68585919060405192600284526020840152604083015260608201604052565b6131bf87611d8e565b526131c986611d8e565b5082519a6131d68c611939565b8b528a01528801526060870152608086015260a085015260c0840152159190565b905092613194565b602490835190630fbb8e5560e21b82526004820152fd5b90935061322d91503d805f833e6129c18183611971565b925f613149565b95949193908693613243612c63565b505f92604061335e815192613257846118a1565b600484526020936132698582016124d8565b6133276132758b612c32565b8b6001600160a01b03998a9283835116895191600383528b830152898201528360609b168b8201526080810189526132ac86611d71565b526132b685611d71565b5087516132c2816118d1565b6002815288368b8301376132d586611d7e565b526132df85611d7e565b5060ff896127c58a85019361331b876132fd8161277f858a51611dbe565b9751168861330c848951611dbe565b515116856127a5858a51611dbe565b966127bb828751611dbe565b61333082611d8e565b5261333a81611d8e565b50612831878b8d60ff896127c58c85019361331b876132fd8161277f858a51611dbe565b946133de5f868a511698869786889c0191825191888184511693015116928c8552308952878086209151015188519161339683611955565b8683528951956133a587611939565b86528a86015288850152848a8501528b608085015260a084015260c08301528551808095819463d04dfe2360e01b835260048301612de4565b03915afa90815f915f936134b8575b506134ab575050505f975b6002855110988915996134985782848701519601519061341a61290b89611dae565b51906134268284613543565b1590506134905750925b6134528685919060405192600284526020840152604083015260608201604052565b61345b88611d8e565b5261346587611d8e565b5082519b6134728d611939565b8c528b0152890152870152608086015260a085015260c08401529190565b905092613430565b50505050505050505091506119f4612c63565b91999850945093966133f8565b9092506134cf91503d805f833e6129c18183611971565b915f6133ed565b6134f5905f60e01d906001600160e01b038160e01d9116601b0b614fed565b1290565b906134f5916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b61506e565b61353f905f60e01d906001600160e01b038160e01d9116601b0b614fed565b1390565b9061353f916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b61506e565b6119f491610af4916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614544565b6135ee9160808101826135b06135aa8351611dae565b51611dae565b526135e76135e16001600160a01b038094515116936135d86135d28551611dae565b51611d71565b51169251611dae565b51611d8e565b5191613b95565b5050565b906080810191806136066135aa8551611d9e565b526001600160a01b038092515116916136226135d28551611d9e565b51166136316135e18551611d9e565b5190816136e55761364183613520565b6136cc579183917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a95936122cc955f5260209060018252613697604094855f20835f528452855f20855f528452855f205461407d565b945f5260018252835f20905f528152825f20915f52525f20555b51604051918291338352604060208401526040830190612d88565b60405163793a8f5560e01b815260048101849052602490fd5b91613716917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a95936122cc956137bd565b50506136b1565b6080810161372e6135e18251611d9e565b5191821561373b57505050565b6137556135d26001600160a01b0380935151169351611d9e565b5116815f5260209160018352604092835f20835f528152835f20855f528152835f2054936001600160e01b038516613790575b505050505050565b6137b4955f9284845260018152828420868552815282842091845252812055613bf3565b5f808080613788565b939291936137ca83613520565b6136cc57846137e6576137de939450613bf3565b50505f905f90565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f528152613823835f2054948561407d565b9561382d87613520565b613850575f97885260018252838820908852815282872091875252909320829055565b835163c5e12af560e01b815260048101889052602490fd5b90604082019082526020606081936040838201528551809452019301915f5b828110613895575050505090565b835185529381019392810192600101613887565b60c0810151908151915f92613a1d575b5061395e6020918281510151926001600160a01b039081818187511696015116928660a082019485518252308452604097888320898686510151015160808601518b519161390683611955565b8683528c519361391585611955565b8785528d519661392488611939565b8752898701528c86015260016060860152608085015260a084015260c08301528851808099819463d04dfe2360e01b835260048301612de4565b03915afa948515613a135787956139f5575b508451613981575b50505050505050565b81905101510151169051813b156139f1579184918493836139b6965180978195829463012c676d60e21b845260048401613868565b03925af19081156139e857506139d1575b8080808080613978565b6139db8291611925565b6139e557806139c7565b80fd5b513d84823e3d90fd5b8480fd5b613a0a9195503d8089833e6129c18183611971565b9050935f613970565b86513d89823e3d90fd5b6001600160a01b03602080845101510151169060a083015190823b1561032157613a60925f928360405180968195829463012c676d60e21b845260048401613868565b03925af1801561044157156138b957613a7a919250611925565b5f905f6138b9565b6040519263a9059cbb60e01b5f526001600160a01b0380931660045260245260205f60448180855af160015f5114811615613adc575b8360405215613ac657505050565b635274afe760e01b835216600482015260249150fd5b6001811516613af257813b15153d151616613ab8565b833d5f823e3d90fd5b9092604051936323b872dd60e01b5f526001600160a01b0393848092166004521660245260445260205f60648180855af160015f5114811615613b4b575b836040525f60605215613ac657505050565b6001811516613af257813b15153d151616613b39565b909115613b6c575050565b6040516305dbdfd960e41b81526001600160a01b03918216600482015291166024820152604490fd5b93929193613ba283613520565b6136cc5784613bb6576137de9394506140a7565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f528152613823835f2054948561356a565b90929192613c0081614573565b93613c0a81613520565b613c535784816001600160e01b03613c299360e01d9116601b0b615198565b50809281613c39575b5050509190565b6001600160a01b03613c4b9316613a82565b5f8181613c32565b604051632d1671a360e11b8152600490fd5b916040805191613c74836118a1565b60048084526020613c868186016124d8565b5f5b8751811015613cbb5780613c9e6001928a611dbe565b51613ca98289611dbe565b52613cb48188611dbe565b5001613c88565b5092955092939093335f52308352855f2091865190613cd9826118ed565b613ce1612546565b8252606085819301528751613cf581611955565b5f8152885191613d0483611955565b5f83525f3681375f5b8151811015613e6a57613d208183611dbe565b5190888c8b84519189818401518d8d8251613d48575b50505050505050506001915001613d0d565b5f613db797948197948c9794613d758c956001600160a01b039d8e81818d51169c0151169b015190614250565b94865199613d828b611939565b8a528901528488015286015260808501528a60a08501528b60c08501525180958194829363d04dfe2360e01b84528301612de4565b03915afa938415613e60578b915f95613e42575b508451613de0575b50908b8e89838d8d613d36565b51015116803b1561032157613e0f925f918c8f84905180978195829463012c676d60e21b845233908401613868565b03925af1918215613e3857600192613e29575b8981613dd3565b613e3290611925565b5f613e22565b8c513d5f823e3d90fd5b613e579195503d805f833e6129c18183611971565b9050935f613dcb565b8e513d5f823e3d90fd5b5050505050505050509050565b8115613e81570490565b634e487b7160e01b5f52601260045260245ffd5b6040815110613ef1576020810151908051603f198101908111613edd5760051c8211613ec95760016020920160051b010190565b5050604051613ed781611955565b5f815290565b634e487b7160e01b5f52601160045260245ffd5b50604051613ed781611955565b805115613f0e57602001515f1a90565b505f90565b905f8091602081519101845af48080613f91575b15613f475750506040513d81523d5f602083013e60203d82010160405290565b15613f6e57604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b3d15613f7f576040513d5f823e3d90fd5b60405163d6bda27560e01b8152600490fd5b503d151580613f275750813b1515613f27565b91613fcf906060613fc4936001600160a01b039485916040880151611dbe565b515116940151611dbe565b5151161461232457565b6140006001600160e01b0392838316601b0b9260e01d938160e01d9116601b0b84846147af565b90637ffffff58213614050575b90614017916149f8565b9290921580614048575b61402a57505090565b6044925060405191638eba4d0760e01b835260048301526024820152fd5b508215614021565b61405a82826156c1565b1561400d57604483856040519163d556b11160e01b835260048301526024820152fd5b6119f491610af4916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614d9d565b9291926140b382614573565b936140bd81613520565b61411e5784816001600160e01b036140dc9360e01d9116601b0b615198565b9290809315614109575b508290816140f5575050509190565b613c4b926001600160a01b03309216613afb565b9092505f198114613edd57600101915f6140e6565b604051632eaefac360e21b8152600490fd5b6004111561413a57565b634e487b7160e01b5f52602160045260245ffd5b602090939291936001600160a01b03604082019516815261416e83614130565b0152565b61417a6156da565b60408051630782d7e160e01b81526001600160a01b03831660048201529091828260248173200e12d10bb0c5e4a17e7018f0f1161919bb93895afa928315614247575f925f94614212575b506141cf83614130565b600183141580614200575b6141e45750505090565b5163ee07877f60e01b815291829161059791906004840161414e565b5061420a83614130565b8215156141da565b908094506142369293503d8511614240575b61422e8183611971565b810190614f0c565b919091925f6141c5565b503d614224565b513d5f823e3d90fd5b61425a8251611e98565b6142648351611e98565b9282519281518015155f146144d957600201935b6001940184019061428882611a55565b956142a360409361429b8551998a611971565b808952611a55565b6142b5602091601f1901828a016124f4565b5f9584519389896002926002885233868901523089890152606097606081018a526142df84611d71565b526142e983611d71565b505f825b614499575b505050508651614309575b50505050505050505090565b9091929360028861432c8c866143258e809c9d9e018093611dbe565b528d611dbe565b500185614339828d611dbe565b52614344818c611dbe565b505f965b614353575b506142fd565b8851871015614494576001600160a01b036143ff898b856143f68c60428c8861437c8488611dbe565b51511696858261438c868a611dbe565b5101519261439a868a611dbe565b51838d82511691015182815160051b910120908451927f6ec4dff745ec96dbde88c5d41f8aa5ac13aa1664afb47b8406b44fa945a650c88452830152838201522090519161190160f01b83528d83015260228201522093611dbe565b51015191614f64565b1561447c578761446b8b8e8c8f9e9d9c9b9a999897968f614458918d61444e898f8f61443a83889f614431828f611dbe565b51511692611dbe565b52614445828b611dbe565b51015192611dbe565b52019c8d94611dbe565b5101516144658383611dbe565b52611dbe565b500196979895909192939495614348565b8851630a57f30960e31b815260048101899052602490fd5b61434d565b9091929a82518210156144d157906144c584809301809d6144ba8487611dbe565b516144658383611dbe565b50019082918d936142ed565b9a92916142f2565b505f93614278565b916040830192604061451b610af4606087519401938451906001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6145f4565b9451930161452a8151866134f9565b614532575050565b9093506119f491925051925183613fd9565b919291600160ff1b840161455c57611d4993506150c3565b90611d49935f0391614d9d565b61401782826149f8565b61457b6156da565b6040805163b7bad1b160e01b81526001600160a01b0383166004820152909182826024815f73200e12d10bb0c5e4a17e7018f0f1161919bb93895af1928315614247575f925f9461421257506141cf83614130565b6008815110613f0e576008015167ffffffffffffffff1667ff0a89c674ee78741490565b9091939284158215175f1461460e5750505090505f905f90565b82810192600160fd1b8082019083011760fe1c614745575b505061463181615386565b9361463b81615386565b9461464686826153a6565b90918215614736575f9083986f0785ee10d5da46d900f436a000000000808611614728575b50670de0b6b3a7640000808b11614719575b50633b9aca00808b1161470a575b50612710808b116146fc575b5098805b6146eb57508190611d49989982600a0a9109960195817fcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccd0a93838211900382610100031b9203901c1702916153b9565b60019290920191600a90048061469b565b60049a04998a930192614697565b600991939a049901915f61468b565b601291939a049901915f61467d565b85049950602592505f61466b565b50929050611d499495506153b9565b5f8212156147995780841361478b575b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb284131561462657909250611d499394916152c4565b909250611d4993949161532b565b8084121561475557909250611d499394916152c4565b929091806147d5576044848460405191637a97930f60e01b835260048301526024820152fd5b90919280155f146147ea57505050505f905f90565b614803936147f791615473565b92919490938492615473565b909391928461481188615386565b9161481b86615386565b947f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000094604c918688106149c2575b030191600160ff1b98838a018112155f1461498f575050035b5f955f821280614986575b614968575b5f811280614956575b6149385786820103966001600160ff1b038814908161492e575b5080614925575b8061491c575b6148fe5750906148b2929161561f565b915f81136148c5575b50611d49936153b9565b9091604c82136148f3576148dc91600a0a90613e77565b9081156148e9575f6148bb565b505050505f905f90565b50505050505f905f90565b876044916040519163d556b11160e01b835260048301526024820152fd5b505f85126148a2565b5082841461489c565b905088145f614895565b604489836040519163d556b11160e01b835260048301526024820152fd5b50806001600160ff1b0301821361487b565b95508087018613156149805786818703015b95614872565b5f61497a565b505f811361486d565b89985090920390506001600160ff1b03819003870182136149b35701860194614862565b5050505050505050505f905f90565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009650604b9250614849565b8115613e81570590565b8082601b82810b8314614bed577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000008405614b99575b8380820b03614b8857507b199999999999999999999999999999999999999999999999999999987b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc84011115614b39575b838060030b03614abd575b808413614aa15750506001600160e01b036001925b60e01b91161791565b8303600a0a8015613e81576001600160e01b0391071592614a98565b92915f841315614b0d575090614ad383836156c1565b614aef57637ffffffe1901600a0a810290637fffffff92614a83565b506044916040519163d556b11160e01b835260048301526024820152fd5b637fffffff1992830390604382136148f357614b2c91600a0a906149ee565b9182156148e95792614a83565b5f198401808060030b14614b4d5750614a78565b90506001600160e01b039293507b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff915060e01b9260ff1d181617905f90565b600190940193600a90930592614a2b565b937f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000840515614bda576305f5e100600894058094819201955b915050614a2b565b620186a060059405809481920195614bd2565b5082614a7857505050505f90600190565b919291600160ff1b9190801580614d8b575090614c1a91615473565b9490929091905f868585858282138015614d82575b614d65575b505050508682841860ff1c94860391039081604c038111614d4a5701600a0a808205919084614d30575b505081019182821860ff1c1115614d2857826001600160ff1b0314614d0a57905f600192135f14614cdb57600a9004915b01925b81158117614c9f57509190565b80614cb8575b508015614cb0579190565b505f91508190565b9192614cce9203600160ff1b01600a0a906149ee565b600160ff1b91905f614ca5565b600a60037fe6666666666666666666666666666666666666666666666666666666666666679201040191614c8f565b604490836040519163d556b11160e01b835260048301526024820152fd5b509092614c92565b8107614d3d575b80614c5e565b60ff1d600117015f614d37565b505050919350614d58579190565b60018160ff1d1790039190565b5f9a50909750909550600160ff1b94509250905086808080614c34565b50835f12614c2f565b15614d965750509190565b9350919050565b9392919384158115818117614eee57505090614db891615473565b9194908295614dc982958294615473565b8096929491969387868482138015614ee5575b614ecc575b5050505050508682841860ff1c94860391039081604c038111614d4a5701600a0a808205919084614eb2575b505081019182821860ff1c1115614eaa57826001600160ff1b0314614d0a57905f600192135f14614e7b57600a9004915b01925b81158117614e4e57509190565b80614e5e57508015614cb0579190565b600160ff1b93614e759291038401600a0a906149ee565b5f614ca5565b600a60037fe6666666666666666666666666666666666666666666666666666666666666679201040191614e3e565b509092614e41565b8107614ebf575b80614e0d565b60ff1d600117015f614eb9565b929b5098509196509450925090505f8080808080614de1565b50858412614ddc565b9395939092919015614f04575050614cb0579190565b945092915050565b919082604091031261032157815160048110156103215760209092015160ff811681036103215790565b9060ff165f03916001600160ff1b0382115f14614f5c57600a6001818404940192061590565b909190600190565b9091813b614f9f57614f769192615743565b50614f8081614130565b159182614f8c57505090565b6001600160a01b03918216911614919050565b6020918160645f935160405192630b135d3f60e11b9788855260048501526040602485015286820190604485015e8281018201859052601f01601f191601915afa905f5114601f3d11161690565b92915f9060018184145f87128715171717615067575f92808213615059575b03604c81135f82121761504d57600a0a908461502b83820293846149ee565b146150405750501561503c575f9190565b5f90565b90935090156119f4579190565b50501561503c575f9190565b5f956001945092509061500c565b5050505f90565b93929190918083145f83125f871218831587151717176150bd575f928082136150b05703604c81135f82121761504d57600a0a908461502b83820293846149ee565b919460019350919061500c565b50919050565b909291600160ff1b91828101615155575080841461514b57808413918215615143578185035b604c8111156151325750505f915b1561512357507f8000000000000000000000000000000000000000000000000000000000000001019190565b92506001600160ff1b03039190565b600a0a908115613e815704916150f7565b8482036150e9565b505090505f905f90565b9361516292945f03614bfe565b80939180928114615176575b50505f039190565b915092506001600160ff1b038314614d0a57600a600191059201915f8061516e565b91925f8312156151c0576044838360405191634a7d166b60e01b835260048301526024820152fd5b9192836151d257505090505f90600190565b60ff811682019180831261529a575f83121561520a575050604c198112614cb0575f03600a0a916152038382613e77565b9283021490565b909293915f81135f1461529057604d811361526557600a0a928315613e8157835f1904831161523c5750500290600190565b60405163c849483b60e01b815260048101849052602481019290925260ff166044820152606490fd5b5060405163c849483b60e01b81526004810192909252602482015260ff919091166044820152606490fd5b5050905090600190565b60405163c849483b60e01b815260048101869052602481019190915260ff82166044820152606490fd5b909392915f6152d49181846145f4565b9490945f8483019182019412159081615321575b8115615317575b506152f957505090565b604492506040519163d556b11160e01b835260048301526024820152fd5b905083125f6152ef565b82811291506152e8565b61534093600160fe1b908101939201906145f4565b9081815f821215615377575050604b1982126137de57615365915f03600a0a906149ee565b908161536f575f90565b600160ff1b90565b93600160ff1b90910192509050565b5f8112156119f457600160ff1b9080820361539f575090565b90505f0390565b905f198183099102908180821091030391565b92939291905f818418121561544e576001600160ff1b03928383111561543857600160ff1b938385036153ee57505050509190565b90919293508514615408575050600a600191045f03920190565b604051630ed8062160e21b8152600481019190915260248101919091526044810182905260648101849052608490fd5b5090915050600160ff1b8114613edd575f039190565b90916001600160ff1b0380841115613c32578514615408575050600a60019104920190565b919091801561561557827f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000080830515615523575b507f19999999999999999999999999999999999999999999999999999999999999997f0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc830110615514575b83136154fe5791905f90565b919060018060ff1b926001600160ff1b03030190565b9290600a02905f1901926154f2565b6f4b3b4ca85a86c47a098a22400000000080840515615603575b507728c87cb5c89a2571ebfdcb54864ada834a000000000000008305156155ec575b7b097edd871cfda3a5697758bf0e3cbb5ac5741c6400000000000000008305156155d8575b7e3899162693736ac531a5a58f1fbb4b746504382ca7e40000000000000000008305156155c8578205156155b9575b5f6154a7565b9290600a02905f1901926155b3565b9391606402916001190193615584565b93916402540be40002916009190193615584565b9391678ac7230489e800000291601219019361555f565b6025198301955092909202915f61553d565b505f915081908190565b90915f19838309928083029283808610950394808603958487101561569d5714615695579082910960018219018216809204600280826003021880830282030280830282030280830282030280830282030280830282030280920290030293600183805f03040190848311900302920304170290565b505091500490565b60648386866040519263362ced0960e11b8452600484015260248301526044820152fd5b6119f491905f8112156156d5575f0361577d565b61577d565b73200e12d10bb0c5e4a17e7018f0f1161919bb9389803b158015615718575b6157005750565b602490604051906373e6d7b360e01b82526004820152fd5b507f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d41813f14156156f9565b81519190604183036157735761576c9250602082015190606060408401519301515f1a9061580c565b9192909190565b50505f9160029190565b90637ffffff581131561580657637ffffffe19810190604382136157ff575f8212156157d357637fffffff91505f0301600a0a7b8000000000000000000000000000000000000000000000000000000202111590565b50600a0a8015613e81577b80000000000000000000000000000000000000000000000000000001041090565b5050151590565b50505f90565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411615883579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa15610441575f516001600160a01b0381161561587957905f905f90565b505f906001905f90565b5050505f916003919056", "linkReferences": {} } } diff --git a/src/generated/candidate/GenericPoolRaindexV6ArbOrderTaker.sol b/src/generated/candidate/GenericPoolRaindexV6ArbOrderTaker.sol index 87e41b0907..a5cdc900f3 100644 --- a/src/generated/candidate/GenericPoolRaindexV6ArbOrderTaker.sol +++ b/src/generated/candidate/GenericPoolRaindexV6ArbOrderTaker.sol @@ -5,23 +5,23 @@ pragma solidity ^0.8.25; // THIS FILE IS AUTOGENERATED BY THE BUILD SCRIPT. DO NOT EDIT BY HAND. /// @dev Hash of the known bytecode. -bytes32 constant BYTECODE_HASH = bytes32(0x6399e925e329e4c0003e507429686e605cf8788acd9c2d70eb96f58988a4193b); +bytes32 constant BYTECODE_HASH = bytes32(0xde8bc9d05f9cd1da3bb12ae489a5ea7e5b533cd15ba9396334df575e9a23e326); /// @dev The deterministic deploy address of the contract when deployed via /// the Zoltu factory. -address constant DEPLOYED_ADDRESS = address(0x8cFe7B8606452Be73abaf8d95Ee77c818e0B71Cf); +address constant DEPLOYED_ADDRESS = address(0x02Ce492d12b2AdCea959377568Dd82BB8b6Ca0EE); /// @dev The creation bytecode of the contract. bytes constant CREATION_CODE = - hex"6080604052348015600e575f80fd5b5060017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055612543806100405f395ff3fe608060405260043610610034575f3560e01c806301ffc9a71461003d578063691f9ed714610070578063ea37cc511461008f57005b3661003b57005b005b348015610048575f80fd5b5061005c61005736600461179e565b6100a2565b604051901515815260200160405180910390f35b34801561007b575f80fd5b5061003b61008a3660046117d9565b6100f3565b61003b61009d36600461187b565b610148565b5f6001600160e01b0319821663691f9ed760e01b14806100d257506001600160e01b0319821663ea37cc5160e01b145b806100ed57506301ffc9a760e01b6001600160e01b03198316145b92915050565b61010186868686868661040a565b6101408683838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061046f92505050565b505050505050565b610150610520565b61015f61015c82611b8c565b50565b61016c6080830183611c48565b90505f0361018d57604051639c95219f60e01b815260040160405180910390fd5b6001600160a01b03831673f78c2c56f95e28f73f4b8b695b07ee574da5c783146101da5760405163516e822d60e01b81526001600160a01b03841660048201526024015b60405180910390fd5b5f6101e86080840184611c48565b5f8181106101f8576101f8611c8e565b905060200281019061020a9190611ca2565b6102149080611cc0565b610222906040810190611cd4565b61022f6080860186611c48565b5f81811061023f5761023f611c8e565b90506020028101906102519190611ca2565b6020013581811061026457610264611c8e565b61027a9260206040909202019081019150611d1a565b90505f61028a6080850185611c48565b5f81811061029a5761029a611c8e565b90506020028101906102ac9190611ca2565b6102b69080611cc0565b6102c4906060810190611cd4565b6102d16080870187611c48565b5f8181106102e1576102e1611c8e565b90506020028101906102f39190611ca2565b6040013581811061030657610306611c8e565b61031c9260206040909202019081019150611d1a565b90506103336001600160a01b038316865f1961054e565b60405163b0460f0760e01b81526001600160a01b0386169063b0460f079061035f908790600401611fe2565b60408051808303815f875af115801561037a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061039e91906121a4565b506103b590506001600160a01b038316865f61054e565b6103da6103c184611b8c565b836103cb856105c8565b846103d5866105c8565b61064c565b505061040560017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054600214801561044f57503373f78c2c56f95e28f73f4b8b695b07ee574da5c78314155b156101405760405163f6688adf60e01b81523360048201526024016101d1565b5f805f8380602001905181019061048691906121c6565b919450925090506001600160a01b0383166104b4576040516398521dc560e01b815260040160405180910390fd5b6001600160a01b0382166104db5760405163456ac4c360e11b815260040160405180910390fd5b6104f06001600160a01b038616845f1961054e565b6105046001600160a01b03831682476108eb565b506105196001600160a01b038616845f61054e565b5050505050565b6105286109b8565b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b61055a8383835f6109fc565b6104055761056b83835f60016109fc565b61059357604051635274afe760e01b81526001600160a01b03841660048201526024016101d1565b6105a083838360016109fc565b61040557604051635274afe760e01b81526001600160a01b03841660048201526024016101d1565b5f6105d1610a5e565b6040516354636d2b60e01b81526001600160a01b038316600482015273200e12d10bb0c5e4a17e7018f0f1161919bb9389906354636d2b906024016020604051808303815f875af1158015610628573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100ed9190612261565b6040805160018082528183019092525f91816020015b6060815260200190600190039081610662575050604080516003808252608082019092529192505f919060208201606080368337019050506040516370a0823160e01b81523060048201529091505f906001600160a01b038816906370a0823190602401602060405180830381865afa1580156106e1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107059190612281565b90508015610721576107216001600160a01b0388163383610ae9565b5f61072c8288610af6565b50905080835f8151811061074257610742611c8e565b602090810291909101015250506040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015610793573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107b79190612281565b905080156107d3576107d36001600160a01b0386163383610ae9565b5f6107de8286610af6565b50905080836001815181106107f5576107f5611c8e565b6020908102919091010152504790508015610814576108143382610b37565b5f610820826012610af6565b509050808360028151811061083757610837611c8e565b602002602001018181525050505080825f8151811061085857610858611c8e565b60209081029190910101526040805160018082528183019092525f91816020015b6040805160a0810182525f918101828152606080830193909352608082018390528152602081019190915281526020019060019003908161087957905050905087815f815181106108cc576108cc611c8e565b60200260200101819052506108e18382610b95565b5050505050505050565b6060814710156109175760405163cf47918160e01b8152476004820152602481018390526044016101d1565b5f610923858486610ddd565b905080801561094457505f3d118061094457505f856001600160a01b03163b115b1561095957610951610df2565b9150506109b1565b801561098357604051639996b31560e01b81526001600160a01b03861660048201526024016101d1565b3d1561099657610991610e0b565b6109af565b60405163d6bda27560e01b815260040160405180910390fd5b505b9392505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00546002036109fa57604051633ee5aeb560e01b815260040160405180910390fd5b565b60405163095ea7b360e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610a52578383151615610a46573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b73200e12d10bb0c5e4a17e7018f0f1161919bb93893b1580610ab5575073200e12d10bb0c5e4a17e7018f0f1161919bb93893f7f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d4114155b156109fa576040516373e6d7b360e01b815273200e12d10bb0c5e4a17e7018f0f1161919bb938960048201526024016101d1565b6105a08383836001610e16565b5f805f805f610b058787610e60565b9250925092505f80610b178585610ebc565b9150915081838015610b265750815b9650965050505050505b9250929050565b80471015610b615760405163cf47918160e01b8152476004820152602481018290526044016101d1565b610b7a828260405180602001604052805f815250610ddd565b15610b83575050565b3d1561099657610b91610e0b565b5050565b60408051600480825260a082019092525f91816020015b6060815260200190600190039081610bac5790505090505f5b8351811015610c0d57838181518110610be057610be0611c8e565b6020026020010151828281518110610bfa57610bfa611c8e565b6020908102919091010152600101610bc5565b50335f8181523060209081526040808320815160a0810183528083018581526060808301879052608083018190529082528185015282518581529384018581528484019093529093909291905b8751811015610dd257878181518110610c7557610c75611c8e565b602002602001015193505f845f015160400151511115610dca575f845f01515f01516001600160a01b031663d04dfe236040518060e00160405280885f0151602001516001600160a01b03168152602001898152602001885f01516040015181526020015f8152602001610ced8c8a6020015161112f565b8152602001878152602001868152506040518263ffffffff1660e01b8152600401610d18919061234d565b5f60405180830381865afa158015610d32573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610d599190810190612445565b9150505f81511115610dc85784516020015160405163012c676d60e21b81526001600160a01b03909116906304b19db490610d9a908a9085906004016124fb565b5f604051808303815f87803b158015610db1575f80fd5b505af1158015610dc3573d5f803e3d5ffd5b505050505b505b600101610c5a565b505050505050505050565b5f805f83516020850186885af1949350505050565b6040513d81523d5f602083013e3d602001810160405290565b6040513d5f823e3d81fd5b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610a52578383151615610a46573d5f823e3d81fd5b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff861115610eab57600a860460018201600a88065f1493509350935050610eb5565b8593509150600190505b9250925092565b5f808383601b82900b821480611007577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e1000000000000000000870515610f3d577f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000870515610f2e576305f5e10087059650600886019550610f3d565b620186a0870596506005860195505b8687601b0b14610f5857600a87059650856001019550610f3d565b7b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc7b1999999999999999999999999999999999999999999999999999999888820111611001575f600188039050808160030b03610fff5760e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff7b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff60ff8b901d18161795505f9450610b309350505050565b505b5061101e565b865f0361101e57505f935060019250610b30915050565b858660030b146110d5575f82131561107d5761103a8383611502565b156110625760405163d556b11160e01b815260048101849052602481018390526044016101d1565b637ffffffe19909501600a0a82029550637fffffff946110d5565b637fffffff19869003604381131561109f57505f9450849350610b3092505050565b80600a0a88816110b1576110b161251b565b059750875f036110cb57505f9450849350610b3092505050565b50637fffffff1995505b8186136110e557600193506110fe565b818603600a0a83816110f9576110f961251b565b071593505b5050507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff841660e084901b1791509250929050565b60605f825167ffffffffffffffff81111561114c5761114c6118f9565b604051908082528060200260200182016040528015611175578160200160208202803683370190505b5090505f835167ffffffffffffffff811115611193576111936118f9565b6040519080825280602002602001820160405280156111bc578160200160208202803683370190505b5090505f808551116111ce575f6111d4565b84516002015b86516001010190505f8167ffffffffffffffff8111156111f6576111f66118f9565b60405190808252806020026020018201604052801561122957816020015b60608152602001906001900390816112145790505b5090505f61124d604080516002815233602082015230818301526060810190915290565b82828151811061125f5761125f611c8e565b60200260200101819052505f5b88518110156112bc57818060010192505088818151811061128f5761128f611c8e565b60200260200101518383815181106112a9576112a9611c8e565b602090810291909101015260010161126c565b508651156114f7578080600101915050848282815181106112df576112df611c8e565b602002602001018190525080806001019150508382828151811061130557611305611c8e565b60200260200101819052505f5b87518110156114f55761140888828151811061133057611330611c8e565b60200260200101515f01516113e58a848151811061135057611350611c8e565b6020026020010151602001516113c68c868151811061137157611371611c8e565b60200260200101518051604091820151805160209081029181019190912083517f6ec4dff745ec96dbde88c5d41f8aa5ac13aa1664afb47b8406b44fa945a650c8815291820192909252918201526060902090565b60405161190160f01b8152600281019290925260228201526042902090565b8a84815181106113f7576113f7611c8e565b60200260200101516060015161151d565b61142857604051630a57f30960e31b8152600481018290526024016101d1565b87818151811061143a5761143a611c8e565b60200260200101515f01516001600160a01b03165f1b86828151811061146257611462611c8e565b60200260200101818152505087818151811061148057611480611c8e565b60200260200101516020015185828151811061149e5761149e611c8e565b60200260200101818152505081806001019250508781815181106114c4576114c4611c8e565b6020026020010151604001518383815181106114e2576114e2611c8e565b6020908102919091010152600101611312565b505b509695505050505050565b5f6109b15f84126115135783611517565b835f035b8361158d565b5f836001600160a01b03163b5f0361157b575f8061153b858561162b565b5090925090505f8160038111156115545761155461252f565b1480156115725750856001600160a01b0316826001600160a01b0316145b925050506109b1565b611586848484611671565b90506109b1565b5f637ffffff582136115a057505f6100ed565b637ffffffe19820160438113156115bb5750508115156100ed565b5f81126115fb5780600a0a7b80000000000000000000000000000000000000000000000000000001816115f0576115f061251b565b0484119150506100ed565b805f03600a0a7b800000000000000000000000000000000000000000000000000000020284101591505092915050565b5f805f8351604103611662576020840151604085015160608601515f1a611654888285856116d6565b955095509550505050610eb5565b505081515f9150600290610eb5565b805160408051630b135d3f60e11b8082526004820186905260248201929092525f92906020820185604483015e5f82606483010152601f820160051c60051b915060205f60648401838a5afa9050825f5114601f3d1116811693505050509392505050565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084111561170f57505f91506003905082611794565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015611760573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b03811661178b57505f925060019150829050611794565b92505f91508190505b9450945094915050565b5f602082840312156117ae575f80fd5b81356001600160e01b0319811681146109b1575f80fd5b6001600160a01b038116811461015c575f80fd5b5f805f805f8060a087890312156117ee575f80fd5b86356117f9816117c5565b95506020870135611809816117c5565b94506040870135935060608701359250608087013567ffffffffffffffff80821115611833575f80fd5b818901915089601f830112611846575f80fd5b813581811115611854575f80fd5b8a6020828501011115611865575f80fd5b6020830194508093505050509295509295509295565b5f805f6060848603121561188d575f80fd5b8335611898816117c5565b9250602084013567ffffffffffffffff808211156118b4575f80fd5b9085019060c082880312156118c7575f80fd5b909250604085013590808211156118dc575f80fd5b508401604081870312156118ee575f80fd5b809150509250925092565b634e487b7160e01b5f52604160045260245ffd5b6040516080810167ffffffffffffffff81118282101715611930576119306118f9565b60405290565b6040805190810167ffffffffffffffff81118282101715611930576119306118f9565b6040516060810167ffffffffffffffff81118282101715611930576119306118f9565b604051601f8201601f1916810167ffffffffffffffff811182821017156119a5576119a56118f9565b604052919050565b5f67ffffffffffffffff8211156119c6576119c66118f9565b50601f01601f191660200190565b5f82601f8301126119e3575f80fd5b81356119f66119f1826119ad565b61197c565b818152846020838601011115611a0a575f80fd5b816020850160208301375f918101602001919091529392505050565b5f67ffffffffffffffff821115611a3f57611a3f6118f9565b5060051b60200190565b5f82601f830112611a58575f80fd5b81356020611a686119f183611a26565b82815260059290921b84018101918181019086841115611a86575f80fd5b8286015b848110156114f757803567ffffffffffffffff80821115611aa9575f80fd5b908801906080828b03601f19011215611ac0575f80fd5b611ac861190d565b86830135611ad5816117c5565b815260408381013588830152606084013583811115611af2575f80fd5b8401603f81018d13611b02575f80fd5b88810135611b126119f182611a26565b81815260059190911b82018301908a8101908f831115611b30575f80fd5b928401925b82841015611b4e5783358252928b0192908b0190611b35565b80858701525050505050608083013582811115611b69575f80fd5b611b778c89838701016119d4565b60608301525085525050918301918301611a8a565b5f60408236031215611b9c575f80fd5b611ba4611936565b823567ffffffffffffffff80821115611bbb575f80fd5b818501915060608236031215611bcf575f80fd5b611bd7611959565b8235611be2816117c5565b81526020830135611bf2816117c5565b6020820152604083013582811115611c08575f80fd5b611c14368286016119d4565b60408301525083526020850135915080821115611c2f575f80fd5b50611c3c36828601611a49565b60208301525092915050565b5f808335601e19843603018112611c5d575f80fd5b83018035915067ffffffffffffffff821115611c77575f80fd5b6020019150600581901b3603821315610b30575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235607e19833603018112611cb6575f80fd5b9190910192915050565b5f8235609e19833603018112611cb6575f80fd5b5f808335601e19843603018112611ce9575f80fd5b83018035915067ffffffffffffffff821115611d03575f80fd5b6020019150600681901b3603821315610b30575f80fd5b5f60208284031215611d2a575f80fd5b81356109b1816117c5565b5f808335601e19843603018112611d4a575f80fd5b830160208101925035905067ffffffffffffffff811115611d69575f80fd5b8060051b3603821315610b30575f80fd5b5f808335601e19843603018112611d8f575f80fd5b830160208101925035905067ffffffffffffffff811115611dae575f80fd5b803603821315610b30575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f8135611df0816117c5565b6001600160a01b039081168452602083013590611e0c826117c5565b166020840152611e1f6040830183611d7a565b60606040860152611e34606086018284611dbc565b95945050505050565b5f808335601e19843603018112611e52575f80fd5b830160208101925035905067ffffffffffffffff811115611e71575f80fd5b8060061b3603821315610b30575f80fd5b8183525f60208085019450825f5b85811015611ec8578135611ea3816117c5565b6001600160a01b03168752818301358388015260409687019690910190600101611e90565b509495945050505050565b5f8235607e19833603018112611ee7575f80fd5b90910192915050565b8183526020808401935f91600585811b8301820185855b88811015611fd457858303601f19018a52611f228289611ed3565b60808135611f2f816117c5565b6001600160a01b0316855281870135878601526040611f5081840184611d35565b8383890152808489015260a093507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811115611f8a575f80fd5b881b91508181888501375085016060611fa584820185611d7a565b9450838884030182890152611fbd8484018683611dbc565b9e8a019e9750505093870193505050600101611f07565b509098975050505050505050565b5f602080835260e08301843582850152818501356040850152606060408601356060860152606086013580151580821461201a575f80fd5b60809150806080880152506120326080880188611d35565b60c060a08901529384905261010093848801600582901b89018601835f5b8481101561216b578b830360ff1901845261206b8287611ed3565b8035609e1982360301811261207e575f80fd5b8885528101803561208e816117c5565b6001600160a01b0316858a0152808c013536829003605e190181126120b1575f80fd5b60a0808701526120c76101208701838301611de4565b90506120d66040830183611e3d565b607f19808985030160c08a01526120ee848385611e82565b93506120fc8e860186611e3d565b93509150808985030160e08a015250612116838383611e82565b92505050898201358c8701528c8301358d870152604083013560408701526121408b840184611d35565b935091508581038b870152612156818484611ef0565b968d019695505050918a019150600101612050565b505061217a60a08c018c611d7a565b8b8303601f190160c08d015298509650612195818989611dbc565b9b9a5050505050505050505050565b5f80604083850312156121b5575f80fd5b505080516020909101519092909150565b5f805f606084860312156121d8575f80fd5b83516121e3816117c5565b60208501519093506121f4816117c5565b604085015190925067ffffffffffffffff811115612210575f80fd5b8401601f81018613612220575f80fd5b805161222e6119f1826119ad565b818152876020838501011115612242575f80fd5b8160208401602083015e5f602083830101528093505050509250925092565b5f60208284031215612271575f80fd5b815160ff811681146109b1575f80fd5b5f60208284031215612291575f80fd5b5051919050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f815180845260208085019450602084015f5b83811015611ec8578151875295820195908201906001016122d9565b5f8282518085526020808601955060208260051b840101602086015f5b8481101561234057601f1986840301895261232e8383516122c6565b98840198925090830190600101612312565b5090979650505050505050565b602081526001600160a01b038251166020820152602082015160408201525f604083015160e06060840152612386610100840182612298565b9050606084015160808401526080840151601f19808584030160a08601526123ae83836122f5565b925060a08601519150808584030160c08601526123cb83836122c6565b925060c08601519150808584030160e086015250611e3482826122c6565b5f82601f8301126123f8575f80fd5b815160206124086119f183611a26565b8083825260208201915060208460051b870101935086841115612429575f80fd5b602086015b848110156114f7578051835291830191830161242e565b5f8060408385031215612456575f80fd5b825167ffffffffffffffff8082111561246d575f80fd5b818501915085601f830112612480575f80fd5b815160206124906119f183611a26565b82815260059290921b840181019181810190898411156124ae575f80fd5b948201945b838610156124cc578551825294820194908201906124b3565b918801519196509093505050808211156124e4575f80fd5b506124f1858286016123e9565b9150509250929050565b828152604060208201525f61251360408301846122c6565b949350505050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52602160045260245ffd"; + hex"6080604052348015600e575f80fd5b5060017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055612543806100405f395ff3fe608060405260043610610034575f3560e01c806301ffc9a71461003d578063691f9ed714610070578063ea37cc511461008f57005b3661003b57005b005b348015610048575f80fd5b5061005c61005736600461179e565b6100a2565b604051901515815260200160405180910390f35b34801561007b575f80fd5b5061003b61008a3660046117d9565b6100f3565b61003b61009d36600461187b565b610148565b5f6001600160e01b0319821663691f9ed760e01b14806100d257506001600160e01b0319821663ea37cc5160e01b145b806100ed57506301ffc9a760e01b6001600160e01b03198316145b92915050565b61010186868686868661040a565b6101408683838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061046f92505050565b505050505050565b610150610520565b61015f61015c82611b8c565b50565b61016c6080830183611c48565b90505f0361018d57604051639c95219f60e01b815260040160405180910390fd5b6001600160a01b03831673531167691b4f37f0266e226d03412c77fb2977ce146101da5760405163516e822d60e01b81526001600160a01b03841660048201526024015b60405180910390fd5b5f6101e86080840184611c48565b5f8181106101f8576101f8611c8e565b905060200281019061020a9190611ca2565b6102149080611cc0565b610222906040810190611cd4565b61022f6080860186611c48565b5f81811061023f5761023f611c8e565b90506020028101906102519190611ca2565b6020013581811061026457610264611c8e565b61027a9260206040909202019081019150611d1a565b90505f61028a6080850185611c48565b5f81811061029a5761029a611c8e565b90506020028101906102ac9190611ca2565b6102b69080611cc0565b6102c4906060810190611cd4565b6102d16080870187611c48565b5f8181106102e1576102e1611c8e565b90506020028101906102f39190611ca2565b6040013581811061030657610306611c8e565b61031c9260206040909202019081019150611d1a565b90506103336001600160a01b038316865f1961054e565b60405163b0460f0760e01b81526001600160a01b0386169063b0460f079061035f908790600401611fe2565b60408051808303815f875af115801561037a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061039e91906121a4565b506103b590506001600160a01b038316865f61054e565b6103da6103c184611b8c565b836103cb856105c8565b846103d5866105c8565b61064c565b505061040560017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054600214801561044f57503373531167691b4f37f0266e226d03412c77fb2977ce14155b156101405760405163f6688adf60e01b81523360048201526024016101d1565b5f805f8380602001905181019061048691906121c6565b919450925090506001600160a01b0383166104b4576040516398521dc560e01b815260040160405180910390fd5b6001600160a01b0382166104db5760405163456ac4c360e11b815260040160405180910390fd5b6104f06001600160a01b038616845f1961054e565b6105046001600160a01b03831682476108eb565b506105196001600160a01b038616845f61054e565b5050505050565b6105286109b8565b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b61055a8383835f6109fc565b6104055761056b83835f60016109fc565b61059357604051635274afe760e01b81526001600160a01b03841660048201526024016101d1565b6105a083838360016109fc565b61040557604051635274afe760e01b81526001600160a01b03841660048201526024016101d1565b5f6105d1610a5e565b6040516354636d2b60e01b81526001600160a01b038316600482015273200e12d10bb0c5e4a17e7018f0f1161919bb9389906354636d2b906024016020604051808303815f875af1158015610628573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100ed9190612261565b6040805160018082528183019092525f91816020015b6060815260200190600190039081610662575050604080516003808252608082019092529192505f919060208201606080368337019050506040516370a0823160e01b81523060048201529091505f906001600160a01b038816906370a0823190602401602060405180830381865afa1580156106e1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107059190612281565b90508015610721576107216001600160a01b0388163383610ae9565b5f61072c8288610af6565b50905080835f8151811061074257610742611c8e565b602090810291909101015250506040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015610793573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107b79190612281565b905080156107d3576107d36001600160a01b0386163383610ae9565b5f6107de8286610af6565b50905080836001815181106107f5576107f5611c8e565b6020908102919091010152504790508015610814576108143382610b37565b5f610820826012610af6565b509050808360028151811061083757610837611c8e565b602002602001018181525050505080825f8151811061085857610858611c8e565b60209081029190910101526040805160018082528183019092525f91816020015b6040805160a0810182525f918101828152606080830193909352608082018390528152602081019190915281526020019060019003908161087957905050905087815f815181106108cc576108cc611c8e565b60200260200101819052506108e18382610b95565b5050505050505050565b6060814710156109175760405163cf47918160e01b8152476004820152602481018390526044016101d1565b5f610923858486610ddd565b905080801561094457505f3d118061094457505f856001600160a01b03163b115b1561095957610951610df2565b9150506109b1565b801561098357604051639996b31560e01b81526001600160a01b03861660048201526024016101d1565b3d1561099657610991610e0b565b6109af565b60405163d6bda27560e01b815260040160405180910390fd5b505b9392505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00546002036109fa57604051633ee5aeb560e01b815260040160405180910390fd5b565b60405163095ea7b360e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610a52578383151615610a46573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b73200e12d10bb0c5e4a17e7018f0f1161919bb93893b1580610ab5575073200e12d10bb0c5e4a17e7018f0f1161919bb93893f7f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d4114155b156109fa576040516373e6d7b360e01b815273200e12d10bb0c5e4a17e7018f0f1161919bb938960048201526024016101d1565b6105a08383836001610e16565b5f805f805f610b058787610e60565b9250925092505f80610b178585610ebc565b9150915081838015610b265750815b9650965050505050505b9250929050565b80471015610b615760405163cf47918160e01b8152476004820152602481018290526044016101d1565b610b7a828260405180602001604052805f815250610ddd565b15610b83575050565b3d1561099657610b91610e0b565b5050565b60408051600480825260a082019092525f91816020015b6060815260200190600190039081610bac5790505090505f5b8351811015610c0d57838181518110610be057610be0611c8e565b6020026020010151828281518110610bfa57610bfa611c8e565b6020908102919091010152600101610bc5565b50335f8181523060209081526040808320815160a0810183528083018581526060808301879052608083018190529082528185015282518581529384018581528484019093529093909291905b8751811015610dd257878181518110610c7557610c75611c8e565b602002602001015193505f845f015160400151511115610dca575f845f01515f01516001600160a01b031663d04dfe236040518060e00160405280885f0151602001516001600160a01b03168152602001898152602001885f01516040015181526020015f8152602001610ced8c8a6020015161112f565b8152602001878152602001868152506040518263ffffffff1660e01b8152600401610d18919061234d565b5f60405180830381865afa158015610d32573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610d599190810190612445565b9150505f81511115610dc85784516020015160405163012c676d60e21b81526001600160a01b03909116906304b19db490610d9a908a9085906004016124fb565b5f604051808303815f87803b158015610db1575f80fd5b505af1158015610dc3573d5f803e3d5ffd5b505050505b505b600101610c5a565b505050505050505050565b5f805f83516020850186885af1949350505050565b6040513d81523d5f602083013e3d602001810160405290565b6040513d5f823e3d81fd5b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610a52578383151615610a46573d5f823e3d81fd5b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff861115610eab57600a860460018201600a88065f1493509350935050610eb5565b8593509150600190505b9250925092565b5f808383601b82900b821480611007577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e1000000000000000000870515610f3d577f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000870515610f2e576305f5e10087059650600886019550610f3d565b620186a0870596506005860195505b8687601b0b14610f5857600a87059650856001019550610f3d565b7b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc7b1999999999999999999999999999999999999999999999999999999888820111611001575f600188039050808160030b03610fff5760e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff7b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff60ff8b901d18161795505f9450610b309350505050565b505b5061101e565b865f0361101e57505f935060019250610b30915050565b858660030b146110d5575f82131561107d5761103a8383611502565b156110625760405163d556b11160e01b815260048101849052602481018390526044016101d1565b637ffffffe19909501600a0a82029550637fffffff946110d5565b637fffffff19869003604381131561109f57505f9450849350610b3092505050565b80600a0a88816110b1576110b161251b565b059750875f036110cb57505f9450849350610b3092505050565b50637fffffff1995505b8186136110e557600193506110fe565b818603600a0a83816110f9576110f961251b565b071593505b5050507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff841660e084901b1791509250929050565b60605f825167ffffffffffffffff81111561114c5761114c6118f9565b604051908082528060200260200182016040528015611175578160200160208202803683370190505b5090505f835167ffffffffffffffff811115611193576111936118f9565b6040519080825280602002602001820160405280156111bc578160200160208202803683370190505b5090505f808551116111ce575f6111d4565b84516002015b86516001010190505f8167ffffffffffffffff8111156111f6576111f66118f9565b60405190808252806020026020018201604052801561122957816020015b60608152602001906001900390816112145790505b5090505f61124d604080516002815233602082015230818301526060810190915290565b82828151811061125f5761125f611c8e565b60200260200101819052505f5b88518110156112bc57818060010192505088818151811061128f5761128f611c8e565b60200260200101518383815181106112a9576112a9611c8e565b602090810291909101015260010161126c565b508651156114f7578080600101915050848282815181106112df576112df611c8e565b602002602001018190525080806001019150508382828151811061130557611305611c8e565b60200260200101819052505f5b87518110156114f55761140888828151811061133057611330611c8e565b60200260200101515f01516113e58a848151811061135057611350611c8e565b6020026020010151602001516113c68c868151811061137157611371611c8e565b60200260200101518051604091820151805160209081029181019190912083517f6ec4dff745ec96dbde88c5d41f8aa5ac13aa1664afb47b8406b44fa945a650c8815291820192909252918201526060902090565b60405161190160f01b8152600281019290925260228201526042902090565b8a84815181106113f7576113f7611c8e565b60200260200101516060015161151d565b61142857604051630a57f30960e31b8152600481018290526024016101d1565b87818151811061143a5761143a611c8e565b60200260200101515f01516001600160a01b03165f1b86828151811061146257611462611c8e565b60200260200101818152505087818151811061148057611480611c8e565b60200260200101516020015185828151811061149e5761149e611c8e565b60200260200101818152505081806001019250508781815181106114c4576114c4611c8e565b6020026020010151604001518383815181106114e2576114e2611c8e565b6020908102919091010152600101611312565b505b509695505050505050565b5f6109b15f84126115135783611517565b835f035b8361158d565b5f836001600160a01b03163b5f0361157b575f8061153b858561162b565b5090925090505f8160038111156115545761155461252f565b1480156115725750856001600160a01b0316826001600160a01b0316145b925050506109b1565b611586848484611671565b90506109b1565b5f637ffffff582136115a057505f6100ed565b637ffffffe19820160438113156115bb5750508115156100ed565b5f81126115fb5780600a0a7b80000000000000000000000000000000000000000000000000000001816115f0576115f061251b565b0484119150506100ed565b805f03600a0a7b800000000000000000000000000000000000000000000000000000020284101591505092915050565b5f805f8351604103611662576020840151604085015160608601515f1a611654888285856116d6565b955095509550505050610eb5565b505081515f9150600290610eb5565b805160408051630b135d3f60e11b8082526004820186905260248201929092525f92906020820185604483015e5f82606483010152601f820160051c60051b915060205f60648401838a5afa9050825f5114601f3d1116811693505050509392505050565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084111561170f57505f91506003905082611794565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015611760573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b03811661178b57505f925060019150829050611794565b92505f91508190505b9450945094915050565b5f602082840312156117ae575f80fd5b81356001600160e01b0319811681146109b1575f80fd5b6001600160a01b038116811461015c575f80fd5b5f805f805f8060a087890312156117ee575f80fd5b86356117f9816117c5565b95506020870135611809816117c5565b94506040870135935060608701359250608087013567ffffffffffffffff80821115611833575f80fd5b818901915089601f830112611846575f80fd5b813581811115611854575f80fd5b8a6020828501011115611865575f80fd5b6020830194508093505050509295509295509295565b5f805f6060848603121561188d575f80fd5b8335611898816117c5565b9250602084013567ffffffffffffffff808211156118b4575f80fd5b9085019060c082880312156118c7575f80fd5b909250604085013590808211156118dc575f80fd5b508401604081870312156118ee575f80fd5b809150509250925092565b634e487b7160e01b5f52604160045260245ffd5b6040516080810167ffffffffffffffff81118282101715611930576119306118f9565b60405290565b6040805190810167ffffffffffffffff81118282101715611930576119306118f9565b6040516060810167ffffffffffffffff81118282101715611930576119306118f9565b604051601f8201601f1916810167ffffffffffffffff811182821017156119a5576119a56118f9565b604052919050565b5f67ffffffffffffffff8211156119c6576119c66118f9565b50601f01601f191660200190565b5f82601f8301126119e3575f80fd5b81356119f66119f1826119ad565b61197c565b818152846020838601011115611a0a575f80fd5b816020850160208301375f918101602001919091529392505050565b5f67ffffffffffffffff821115611a3f57611a3f6118f9565b5060051b60200190565b5f82601f830112611a58575f80fd5b81356020611a686119f183611a26565b82815260059290921b84018101918181019086841115611a86575f80fd5b8286015b848110156114f757803567ffffffffffffffff80821115611aa9575f80fd5b908801906080828b03601f19011215611ac0575f80fd5b611ac861190d565b86830135611ad5816117c5565b815260408381013588830152606084013583811115611af2575f80fd5b8401603f81018d13611b02575f80fd5b88810135611b126119f182611a26565b81815260059190911b82018301908a8101908f831115611b30575f80fd5b928401925b82841015611b4e5783358252928b0192908b0190611b35565b80858701525050505050608083013582811115611b69575f80fd5b611b778c89838701016119d4565b60608301525085525050918301918301611a8a565b5f60408236031215611b9c575f80fd5b611ba4611936565b823567ffffffffffffffff80821115611bbb575f80fd5b818501915060608236031215611bcf575f80fd5b611bd7611959565b8235611be2816117c5565b81526020830135611bf2816117c5565b6020820152604083013582811115611c08575f80fd5b611c14368286016119d4565b60408301525083526020850135915080821115611c2f575f80fd5b50611c3c36828601611a49565b60208301525092915050565b5f808335601e19843603018112611c5d575f80fd5b83018035915067ffffffffffffffff821115611c77575f80fd5b6020019150600581901b3603821315610b30575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235607e19833603018112611cb6575f80fd5b9190910192915050565b5f8235609e19833603018112611cb6575f80fd5b5f808335601e19843603018112611ce9575f80fd5b83018035915067ffffffffffffffff821115611d03575f80fd5b6020019150600681901b3603821315610b30575f80fd5b5f60208284031215611d2a575f80fd5b81356109b1816117c5565b5f808335601e19843603018112611d4a575f80fd5b830160208101925035905067ffffffffffffffff811115611d69575f80fd5b8060051b3603821315610b30575f80fd5b5f808335601e19843603018112611d8f575f80fd5b830160208101925035905067ffffffffffffffff811115611dae575f80fd5b803603821315610b30575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f8135611df0816117c5565b6001600160a01b039081168452602083013590611e0c826117c5565b166020840152611e1f6040830183611d7a565b60606040860152611e34606086018284611dbc565b95945050505050565b5f808335601e19843603018112611e52575f80fd5b830160208101925035905067ffffffffffffffff811115611e71575f80fd5b8060061b3603821315610b30575f80fd5b8183525f60208085019450825f5b85811015611ec8578135611ea3816117c5565b6001600160a01b03168752818301358388015260409687019690910190600101611e90565b509495945050505050565b5f8235607e19833603018112611ee7575f80fd5b90910192915050565b8183526020808401935f91600585811b8301820185855b88811015611fd457858303601f19018a52611f228289611ed3565b60808135611f2f816117c5565b6001600160a01b0316855281870135878601526040611f5081840184611d35565b8383890152808489015260a093507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811115611f8a575f80fd5b881b91508181888501375085016060611fa584820185611d7a565b9450838884030182890152611fbd8484018683611dbc565b9e8a019e9750505093870193505050600101611f07565b509098975050505050505050565b5f602080835260e08301843582850152818501356040850152606060408601356060860152606086013580151580821461201a575f80fd5b60809150806080880152506120326080880188611d35565b60c060a08901529384905261010093848801600582901b89018601835f5b8481101561216b578b830360ff1901845261206b8287611ed3565b8035609e1982360301811261207e575f80fd5b8885528101803561208e816117c5565b6001600160a01b0316858a0152808c013536829003605e190181126120b1575f80fd5b60a0808701526120c76101208701838301611de4565b90506120d66040830183611e3d565b607f19808985030160c08a01526120ee848385611e82565b93506120fc8e860186611e3d565b93509150808985030160e08a015250612116838383611e82565b92505050898201358c8701528c8301358d870152604083013560408701526121408b840184611d35565b935091508581038b870152612156818484611ef0565b968d019695505050918a019150600101612050565b505061217a60a08c018c611d7a565b8b8303601f190160c08d015298509650612195818989611dbc565b9b9a5050505050505050505050565b5f80604083850312156121b5575f80fd5b505080516020909101519092909150565b5f805f606084860312156121d8575f80fd5b83516121e3816117c5565b60208501519093506121f4816117c5565b604085015190925067ffffffffffffffff811115612210575f80fd5b8401601f81018613612220575f80fd5b805161222e6119f1826119ad565b818152876020838501011115612242575f80fd5b8160208401602083015e5f602083830101528093505050509250925092565b5f60208284031215612271575f80fd5b815160ff811681146109b1575f80fd5b5f60208284031215612291575f80fd5b5051919050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f815180845260208085019450602084015f5b83811015611ec8578151875295820195908201906001016122d9565b5f8282518085526020808601955060208260051b840101602086015f5b8481101561234057601f1986840301895261232e8383516122c6565b98840198925090830190600101612312565b5090979650505050505050565b602081526001600160a01b038251166020820152602082015160408201525f604083015160e06060840152612386610100840182612298565b9050606084015160808401526080840151601f19808584030160a08601526123ae83836122f5565b925060a08601519150808584030160c08601526123cb83836122c6565b925060c08601519150808584030160e086015250611e3482826122c6565b5f82601f8301126123f8575f80fd5b815160206124086119f183611a26565b8083825260208201915060208460051b870101935086841115612429575f80fd5b602086015b848110156114f7578051835291830191830161242e565b5f8060408385031215612456575f80fd5b825167ffffffffffffffff8082111561246d575f80fd5b818501915085601f830112612480575f80fd5b815160206124906119f183611a26565b82815260059290921b840181019181810190898411156124ae575f80fd5b948201945b838610156124cc578551825294820194908201906124b3565b918801519196509093505050808211156124e4575f80fd5b506124f1858286016123e9565b9150509250929050565b828152604060208201525f61251360408301846122c6565b949350505050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52602160045260245ffd"; /// @dev The runtime bytecode of the contract. bytes constant RUNTIME_CODE = - hex"608060405260043610610034575f3560e01c806301ffc9a71461003d578063691f9ed714610070578063ea37cc511461008f57005b3661003b57005b005b348015610048575f80fd5b5061005c61005736600461179e565b6100a2565b604051901515815260200160405180910390f35b34801561007b575f80fd5b5061003b61008a3660046117d9565b6100f3565b61003b61009d36600461187b565b610148565b5f6001600160e01b0319821663691f9ed760e01b14806100d257506001600160e01b0319821663ea37cc5160e01b145b806100ed57506301ffc9a760e01b6001600160e01b03198316145b92915050565b61010186868686868661040a565b6101408683838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061046f92505050565b505050505050565b610150610520565b61015f61015c82611b8c565b50565b61016c6080830183611c48565b90505f0361018d57604051639c95219f60e01b815260040160405180910390fd5b6001600160a01b03831673f78c2c56f95e28f73f4b8b695b07ee574da5c783146101da5760405163516e822d60e01b81526001600160a01b03841660048201526024015b60405180910390fd5b5f6101e86080840184611c48565b5f8181106101f8576101f8611c8e565b905060200281019061020a9190611ca2565b6102149080611cc0565b610222906040810190611cd4565b61022f6080860186611c48565b5f81811061023f5761023f611c8e565b90506020028101906102519190611ca2565b6020013581811061026457610264611c8e565b61027a9260206040909202019081019150611d1a565b90505f61028a6080850185611c48565b5f81811061029a5761029a611c8e565b90506020028101906102ac9190611ca2565b6102b69080611cc0565b6102c4906060810190611cd4565b6102d16080870187611c48565b5f8181106102e1576102e1611c8e565b90506020028101906102f39190611ca2565b6040013581811061030657610306611c8e565b61031c9260206040909202019081019150611d1a565b90506103336001600160a01b038316865f1961054e565b60405163b0460f0760e01b81526001600160a01b0386169063b0460f079061035f908790600401611fe2565b60408051808303815f875af115801561037a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061039e91906121a4565b506103b590506001600160a01b038316865f61054e565b6103da6103c184611b8c565b836103cb856105c8565b846103d5866105c8565b61064c565b505061040560017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054600214801561044f57503373f78c2c56f95e28f73f4b8b695b07ee574da5c78314155b156101405760405163f6688adf60e01b81523360048201526024016101d1565b5f805f8380602001905181019061048691906121c6565b919450925090506001600160a01b0383166104b4576040516398521dc560e01b815260040160405180910390fd5b6001600160a01b0382166104db5760405163456ac4c360e11b815260040160405180910390fd5b6104f06001600160a01b038616845f1961054e565b6105046001600160a01b03831682476108eb565b506105196001600160a01b038616845f61054e565b5050505050565b6105286109b8565b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b61055a8383835f6109fc565b6104055761056b83835f60016109fc565b61059357604051635274afe760e01b81526001600160a01b03841660048201526024016101d1565b6105a083838360016109fc565b61040557604051635274afe760e01b81526001600160a01b03841660048201526024016101d1565b5f6105d1610a5e565b6040516354636d2b60e01b81526001600160a01b038316600482015273200e12d10bb0c5e4a17e7018f0f1161919bb9389906354636d2b906024016020604051808303815f875af1158015610628573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100ed9190612261565b6040805160018082528183019092525f91816020015b6060815260200190600190039081610662575050604080516003808252608082019092529192505f919060208201606080368337019050506040516370a0823160e01b81523060048201529091505f906001600160a01b038816906370a0823190602401602060405180830381865afa1580156106e1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107059190612281565b90508015610721576107216001600160a01b0388163383610ae9565b5f61072c8288610af6565b50905080835f8151811061074257610742611c8e565b602090810291909101015250506040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015610793573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107b79190612281565b905080156107d3576107d36001600160a01b0386163383610ae9565b5f6107de8286610af6565b50905080836001815181106107f5576107f5611c8e565b6020908102919091010152504790508015610814576108143382610b37565b5f610820826012610af6565b509050808360028151811061083757610837611c8e565b602002602001018181525050505080825f8151811061085857610858611c8e565b60209081029190910101526040805160018082528183019092525f91816020015b6040805160a0810182525f918101828152606080830193909352608082018390528152602081019190915281526020019060019003908161087957905050905087815f815181106108cc576108cc611c8e565b60200260200101819052506108e18382610b95565b5050505050505050565b6060814710156109175760405163cf47918160e01b8152476004820152602481018390526044016101d1565b5f610923858486610ddd565b905080801561094457505f3d118061094457505f856001600160a01b03163b115b1561095957610951610df2565b9150506109b1565b801561098357604051639996b31560e01b81526001600160a01b03861660048201526024016101d1565b3d1561099657610991610e0b565b6109af565b60405163d6bda27560e01b815260040160405180910390fd5b505b9392505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00546002036109fa57604051633ee5aeb560e01b815260040160405180910390fd5b565b60405163095ea7b360e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610a52578383151615610a46573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b73200e12d10bb0c5e4a17e7018f0f1161919bb93893b1580610ab5575073200e12d10bb0c5e4a17e7018f0f1161919bb93893f7f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d4114155b156109fa576040516373e6d7b360e01b815273200e12d10bb0c5e4a17e7018f0f1161919bb938960048201526024016101d1565b6105a08383836001610e16565b5f805f805f610b058787610e60565b9250925092505f80610b178585610ebc565b9150915081838015610b265750815b9650965050505050505b9250929050565b80471015610b615760405163cf47918160e01b8152476004820152602481018290526044016101d1565b610b7a828260405180602001604052805f815250610ddd565b15610b83575050565b3d1561099657610b91610e0b565b5050565b60408051600480825260a082019092525f91816020015b6060815260200190600190039081610bac5790505090505f5b8351811015610c0d57838181518110610be057610be0611c8e565b6020026020010151828281518110610bfa57610bfa611c8e565b6020908102919091010152600101610bc5565b50335f8181523060209081526040808320815160a0810183528083018581526060808301879052608083018190529082528185015282518581529384018581528484019093529093909291905b8751811015610dd257878181518110610c7557610c75611c8e565b602002602001015193505f845f015160400151511115610dca575f845f01515f01516001600160a01b031663d04dfe236040518060e00160405280885f0151602001516001600160a01b03168152602001898152602001885f01516040015181526020015f8152602001610ced8c8a6020015161112f565b8152602001878152602001868152506040518263ffffffff1660e01b8152600401610d18919061234d565b5f60405180830381865afa158015610d32573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610d599190810190612445565b9150505f81511115610dc85784516020015160405163012c676d60e21b81526001600160a01b03909116906304b19db490610d9a908a9085906004016124fb565b5f604051808303815f87803b158015610db1575f80fd5b505af1158015610dc3573d5f803e3d5ffd5b505050505b505b600101610c5a565b505050505050505050565b5f805f83516020850186885af1949350505050565b6040513d81523d5f602083013e3d602001810160405290565b6040513d5f823e3d81fd5b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610a52578383151615610a46573d5f823e3d81fd5b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff861115610eab57600a860460018201600a88065f1493509350935050610eb5565b8593509150600190505b9250925092565b5f808383601b82900b821480611007577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e1000000000000000000870515610f3d577f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000870515610f2e576305f5e10087059650600886019550610f3d565b620186a0870596506005860195505b8687601b0b14610f5857600a87059650856001019550610f3d565b7b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc7b1999999999999999999999999999999999999999999999999999999888820111611001575f600188039050808160030b03610fff5760e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff7b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff60ff8b901d18161795505f9450610b309350505050565b505b5061101e565b865f0361101e57505f935060019250610b30915050565b858660030b146110d5575f82131561107d5761103a8383611502565b156110625760405163d556b11160e01b815260048101849052602481018390526044016101d1565b637ffffffe19909501600a0a82029550637fffffff946110d5565b637fffffff19869003604381131561109f57505f9450849350610b3092505050565b80600a0a88816110b1576110b161251b565b059750875f036110cb57505f9450849350610b3092505050565b50637fffffff1995505b8186136110e557600193506110fe565b818603600a0a83816110f9576110f961251b565b071593505b5050507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff841660e084901b1791509250929050565b60605f825167ffffffffffffffff81111561114c5761114c6118f9565b604051908082528060200260200182016040528015611175578160200160208202803683370190505b5090505f835167ffffffffffffffff811115611193576111936118f9565b6040519080825280602002602001820160405280156111bc578160200160208202803683370190505b5090505f808551116111ce575f6111d4565b84516002015b86516001010190505f8167ffffffffffffffff8111156111f6576111f66118f9565b60405190808252806020026020018201604052801561122957816020015b60608152602001906001900390816112145790505b5090505f61124d604080516002815233602082015230818301526060810190915290565b82828151811061125f5761125f611c8e565b60200260200101819052505f5b88518110156112bc57818060010192505088818151811061128f5761128f611c8e565b60200260200101518383815181106112a9576112a9611c8e565b602090810291909101015260010161126c565b508651156114f7578080600101915050848282815181106112df576112df611c8e565b602002602001018190525080806001019150508382828151811061130557611305611c8e565b60200260200101819052505f5b87518110156114f55761140888828151811061133057611330611c8e565b60200260200101515f01516113e58a848151811061135057611350611c8e565b6020026020010151602001516113c68c868151811061137157611371611c8e565b60200260200101518051604091820151805160209081029181019190912083517f6ec4dff745ec96dbde88c5d41f8aa5ac13aa1664afb47b8406b44fa945a650c8815291820192909252918201526060902090565b60405161190160f01b8152600281019290925260228201526042902090565b8a84815181106113f7576113f7611c8e565b60200260200101516060015161151d565b61142857604051630a57f30960e31b8152600481018290526024016101d1565b87818151811061143a5761143a611c8e565b60200260200101515f01516001600160a01b03165f1b86828151811061146257611462611c8e565b60200260200101818152505087818151811061148057611480611c8e565b60200260200101516020015185828151811061149e5761149e611c8e565b60200260200101818152505081806001019250508781815181106114c4576114c4611c8e565b6020026020010151604001518383815181106114e2576114e2611c8e565b6020908102919091010152600101611312565b505b509695505050505050565b5f6109b15f84126115135783611517565b835f035b8361158d565b5f836001600160a01b03163b5f0361157b575f8061153b858561162b565b5090925090505f8160038111156115545761155461252f565b1480156115725750856001600160a01b0316826001600160a01b0316145b925050506109b1565b611586848484611671565b90506109b1565b5f637ffffff582136115a057505f6100ed565b637ffffffe19820160438113156115bb5750508115156100ed565b5f81126115fb5780600a0a7b80000000000000000000000000000000000000000000000000000001816115f0576115f061251b565b0484119150506100ed565b805f03600a0a7b800000000000000000000000000000000000000000000000000000020284101591505092915050565b5f805f8351604103611662576020840151604085015160608601515f1a611654888285856116d6565b955095509550505050610eb5565b505081515f9150600290610eb5565b805160408051630b135d3f60e11b8082526004820186905260248201929092525f92906020820185604483015e5f82606483010152601f820160051c60051b915060205f60648401838a5afa9050825f5114601f3d1116811693505050509392505050565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084111561170f57505f91506003905082611794565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015611760573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b03811661178b57505f925060019150829050611794565b92505f91508190505b9450945094915050565b5f602082840312156117ae575f80fd5b81356001600160e01b0319811681146109b1575f80fd5b6001600160a01b038116811461015c575f80fd5b5f805f805f8060a087890312156117ee575f80fd5b86356117f9816117c5565b95506020870135611809816117c5565b94506040870135935060608701359250608087013567ffffffffffffffff80821115611833575f80fd5b818901915089601f830112611846575f80fd5b813581811115611854575f80fd5b8a6020828501011115611865575f80fd5b6020830194508093505050509295509295509295565b5f805f6060848603121561188d575f80fd5b8335611898816117c5565b9250602084013567ffffffffffffffff808211156118b4575f80fd5b9085019060c082880312156118c7575f80fd5b909250604085013590808211156118dc575f80fd5b508401604081870312156118ee575f80fd5b809150509250925092565b634e487b7160e01b5f52604160045260245ffd5b6040516080810167ffffffffffffffff81118282101715611930576119306118f9565b60405290565b6040805190810167ffffffffffffffff81118282101715611930576119306118f9565b6040516060810167ffffffffffffffff81118282101715611930576119306118f9565b604051601f8201601f1916810167ffffffffffffffff811182821017156119a5576119a56118f9565b604052919050565b5f67ffffffffffffffff8211156119c6576119c66118f9565b50601f01601f191660200190565b5f82601f8301126119e3575f80fd5b81356119f66119f1826119ad565b61197c565b818152846020838601011115611a0a575f80fd5b816020850160208301375f918101602001919091529392505050565b5f67ffffffffffffffff821115611a3f57611a3f6118f9565b5060051b60200190565b5f82601f830112611a58575f80fd5b81356020611a686119f183611a26565b82815260059290921b84018101918181019086841115611a86575f80fd5b8286015b848110156114f757803567ffffffffffffffff80821115611aa9575f80fd5b908801906080828b03601f19011215611ac0575f80fd5b611ac861190d565b86830135611ad5816117c5565b815260408381013588830152606084013583811115611af2575f80fd5b8401603f81018d13611b02575f80fd5b88810135611b126119f182611a26565b81815260059190911b82018301908a8101908f831115611b30575f80fd5b928401925b82841015611b4e5783358252928b0192908b0190611b35565b80858701525050505050608083013582811115611b69575f80fd5b611b778c89838701016119d4565b60608301525085525050918301918301611a8a565b5f60408236031215611b9c575f80fd5b611ba4611936565b823567ffffffffffffffff80821115611bbb575f80fd5b818501915060608236031215611bcf575f80fd5b611bd7611959565b8235611be2816117c5565b81526020830135611bf2816117c5565b6020820152604083013582811115611c08575f80fd5b611c14368286016119d4565b60408301525083526020850135915080821115611c2f575f80fd5b50611c3c36828601611a49565b60208301525092915050565b5f808335601e19843603018112611c5d575f80fd5b83018035915067ffffffffffffffff821115611c77575f80fd5b6020019150600581901b3603821315610b30575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235607e19833603018112611cb6575f80fd5b9190910192915050565b5f8235609e19833603018112611cb6575f80fd5b5f808335601e19843603018112611ce9575f80fd5b83018035915067ffffffffffffffff821115611d03575f80fd5b6020019150600681901b3603821315610b30575f80fd5b5f60208284031215611d2a575f80fd5b81356109b1816117c5565b5f808335601e19843603018112611d4a575f80fd5b830160208101925035905067ffffffffffffffff811115611d69575f80fd5b8060051b3603821315610b30575f80fd5b5f808335601e19843603018112611d8f575f80fd5b830160208101925035905067ffffffffffffffff811115611dae575f80fd5b803603821315610b30575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f8135611df0816117c5565b6001600160a01b039081168452602083013590611e0c826117c5565b166020840152611e1f6040830183611d7a565b60606040860152611e34606086018284611dbc565b95945050505050565b5f808335601e19843603018112611e52575f80fd5b830160208101925035905067ffffffffffffffff811115611e71575f80fd5b8060061b3603821315610b30575f80fd5b8183525f60208085019450825f5b85811015611ec8578135611ea3816117c5565b6001600160a01b03168752818301358388015260409687019690910190600101611e90565b509495945050505050565b5f8235607e19833603018112611ee7575f80fd5b90910192915050565b8183526020808401935f91600585811b8301820185855b88811015611fd457858303601f19018a52611f228289611ed3565b60808135611f2f816117c5565b6001600160a01b0316855281870135878601526040611f5081840184611d35565b8383890152808489015260a093507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811115611f8a575f80fd5b881b91508181888501375085016060611fa584820185611d7a565b9450838884030182890152611fbd8484018683611dbc565b9e8a019e9750505093870193505050600101611f07565b509098975050505050505050565b5f602080835260e08301843582850152818501356040850152606060408601356060860152606086013580151580821461201a575f80fd5b60809150806080880152506120326080880188611d35565b60c060a08901529384905261010093848801600582901b89018601835f5b8481101561216b578b830360ff1901845261206b8287611ed3565b8035609e1982360301811261207e575f80fd5b8885528101803561208e816117c5565b6001600160a01b0316858a0152808c013536829003605e190181126120b1575f80fd5b60a0808701526120c76101208701838301611de4565b90506120d66040830183611e3d565b607f19808985030160c08a01526120ee848385611e82565b93506120fc8e860186611e3d565b93509150808985030160e08a015250612116838383611e82565b92505050898201358c8701528c8301358d870152604083013560408701526121408b840184611d35565b935091508581038b870152612156818484611ef0565b968d019695505050918a019150600101612050565b505061217a60a08c018c611d7a565b8b8303601f190160c08d015298509650612195818989611dbc565b9b9a5050505050505050505050565b5f80604083850312156121b5575f80fd5b505080516020909101519092909150565b5f805f606084860312156121d8575f80fd5b83516121e3816117c5565b60208501519093506121f4816117c5565b604085015190925067ffffffffffffffff811115612210575f80fd5b8401601f81018613612220575f80fd5b805161222e6119f1826119ad565b818152876020838501011115612242575f80fd5b8160208401602083015e5f602083830101528093505050509250925092565b5f60208284031215612271575f80fd5b815160ff811681146109b1575f80fd5b5f60208284031215612291575f80fd5b5051919050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f815180845260208085019450602084015f5b83811015611ec8578151875295820195908201906001016122d9565b5f8282518085526020808601955060208260051b840101602086015f5b8481101561234057601f1986840301895261232e8383516122c6565b98840198925090830190600101612312565b5090979650505050505050565b602081526001600160a01b038251166020820152602082015160408201525f604083015160e06060840152612386610100840182612298565b9050606084015160808401526080840151601f19808584030160a08601526123ae83836122f5565b925060a08601519150808584030160c08601526123cb83836122c6565b925060c08601519150808584030160e086015250611e3482826122c6565b5f82601f8301126123f8575f80fd5b815160206124086119f183611a26565b8083825260208201915060208460051b870101935086841115612429575f80fd5b602086015b848110156114f7578051835291830191830161242e565b5f8060408385031215612456575f80fd5b825167ffffffffffffffff8082111561246d575f80fd5b818501915085601f830112612480575f80fd5b815160206124906119f183611a26565b82815260059290921b840181019181810190898411156124ae575f80fd5b948201945b838610156124cc578551825294820194908201906124b3565b918801519196509093505050808211156124e4575f80fd5b506124f1858286016123e9565b9150509250929050565b828152604060208201525f61251360408301846122c6565b949350505050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52602160045260245ffd"; + hex"608060405260043610610034575f3560e01c806301ffc9a71461003d578063691f9ed714610070578063ea37cc511461008f57005b3661003b57005b005b348015610048575f80fd5b5061005c61005736600461179e565b6100a2565b604051901515815260200160405180910390f35b34801561007b575f80fd5b5061003b61008a3660046117d9565b6100f3565b61003b61009d36600461187b565b610148565b5f6001600160e01b0319821663691f9ed760e01b14806100d257506001600160e01b0319821663ea37cc5160e01b145b806100ed57506301ffc9a760e01b6001600160e01b03198316145b92915050565b61010186868686868661040a565b6101408683838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061046f92505050565b505050505050565b610150610520565b61015f61015c82611b8c565b50565b61016c6080830183611c48565b90505f0361018d57604051639c95219f60e01b815260040160405180910390fd5b6001600160a01b03831673531167691b4f37f0266e226d03412c77fb2977ce146101da5760405163516e822d60e01b81526001600160a01b03841660048201526024015b60405180910390fd5b5f6101e86080840184611c48565b5f8181106101f8576101f8611c8e565b905060200281019061020a9190611ca2565b6102149080611cc0565b610222906040810190611cd4565b61022f6080860186611c48565b5f81811061023f5761023f611c8e565b90506020028101906102519190611ca2565b6020013581811061026457610264611c8e565b61027a9260206040909202019081019150611d1a565b90505f61028a6080850185611c48565b5f81811061029a5761029a611c8e565b90506020028101906102ac9190611ca2565b6102b69080611cc0565b6102c4906060810190611cd4565b6102d16080870187611c48565b5f8181106102e1576102e1611c8e565b90506020028101906102f39190611ca2565b6040013581811061030657610306611c8e565b61031c9260206040909202019081019150611d1a565b90506103336001600160a01b038316865f1961054e565b60405163b0460f0760e01b81526001600160a01b0386169063b0460f079061035f908790600401611fe2565b60408051808303815f875af115801561037a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061039e91906121a4565b506103b590506001600160a01b038316865f61054e565b6103da6103c184611b8c565b836103cb856105c8565b846103d5866105c8565b61064c565b505061040560017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054600214801561044f57503373531167691b4f37f0266e226d03412c77fb2977ce14155b156101405760405163f6688adf60e01b81523360048201526024016101d1565b5f805f8380602001905181019061048691906121c6565b919450925090506001600160a01b0383166104b4576040516398521dc560e01b815260040160405180910390fd5b6001600160a01b0382166104db5760405163456ac4c360e11b815260040160405180910390fd5b6104f06001600160a01b038616845f1961054e565b6105046001600160a01b03831682476108eb565b506105196001600160a01b038616845f61054e565b5050505050565b6105286109b8565b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b61055a8383835f6109fc565b6104055761056b83835f60016109fc565b61059357604051635274afe760e01b81526001600160a01b03841660048201526024016101d1565b6105a083838360016109fc565b61040557604051635274afe760e01b81526001600160a01b03841660048201526024016101d1565b5f6105d1610a5e565b6040516354636d2b60e01b81526001600160a01b038316600482015273200e12d10bb0c5e4a17e7018f0f1161919bb9389906354636d2b906024016020604051808303815f875af1158015610628573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100ed9190612261565b6040805160018082528183019092525f91816020015b6060815260200190600190039081610662575050604080516003808252608082019092529192505f919060208201606080368337019050506040516370a0823160e01b81523060048201529091505f906001600160a01b038816906370a0823190602401602060405180830381865afa1580156106e1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107059190612281565b90508015610721576107216001600160a01b0388163383610ae9565b5f61072c8288610af6565b50905080835f8151811061074257610742611c8e565b602090810291909101015250506040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015610793573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107b79190612281565b905080156107d3576107d36001600160a01b0386163383610ae9565b5f6107de8286610af6565b50905080836001815181106107f5576107f5611c8e565b6020908102919091010152504790508015610814576108143382610b37565b5f610820826012610af6565b509050808360028151811061083757610837611c8e565b602002602001018181525050505080825f8151811061085857610858611c8e565b60209081029190910101526040805160018082528183019092525f91816020015b6040805160a0810182525f918101828152606080830193909352608082018390528152602081019190915281526020019060019003908161087957905050905087815f815181106108cc576108cc611c8e565b60200260200101819052506108e18382610b95565b5050505050505050565b6060814710156109175760405163cf47918160e01b8152476004820152602481018390526044016101d1565b5f610923858486610ddd565b905080801561094457505f3d118061094457505f856001600160a01b03163b115b1561095957610951610df2565b9150506109b1565b801561098357604051639996b31560e01b81526001600160a01b03861660048201526024016101d1565b3d1561099657610991610e0b565b6109af565b60405163d6bda27560e01b815260040160405180910390fd5b505b9392505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00546002036109fa57604051633ee5aeb560e01b815260040160405180910390fd5b565b60405163095ea7b360e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610a52578383151615610a46573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b73200e12d10bb0c5e4a17e7018f0f1161919bb93893b1580610ab5575073200e12d10bb0c5e4a17e7018f0f1161919bb93893f7f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d4114155b156109fa576040516373e6d7b360e01b815273200e12d10bb0c5e4a17e7018f0f1161919bb938960048201526024016101d1565b6105a08383836001610e16565b5f805f805f610b058787610e60565b9250925092505f80610b178585610ebc565b9150915081838015610b265750815b9650965050505050505b9250929050565b80471015610b615760405163cf47918160e01b8152476004820152602481018290526044016101d1565b610b7a828260405180602001604052805f815250610ddd565b15610b83575050565b3d1561099657610b91610e0b565b5050565b60408051600480825260a082019092525f91816020015b6060815260200190600190039081610bac5790505090505f5b8351811015610c0d57838181518110610be057610be0611c8e565b6020026020010151828281518110610bfa57610bfa611c8e565b6020908102919091010152600101610bc5565b50335f8181523060209081526040808320815160a0810183528083018581526060808301879052608083018190529082528185015282518581529384018581528484019093529093909291905b8751811015610dd257878181518110610c7557610c75611c8e565b602002602001015193505f845f015160400151511115610dca575f845f01515f01516001600160a01b031663d04dfe236040518060e00160405280885f0151602001516001600160a01b03168152602001898152602001885f01516040015181526020015f8152602001610ced8c8a6020015161112f565b8152602001878152602001868152506040518263ffffffff1660e01b8152600401610d18919061234d565b5f60405180830381865afa158015610d32573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610d599190810190612445565b9150505f81511115610dc85784516020015160405163012c676d60e21b81526001600160a01b03909116906304b19db490610d9a908a9085906004016124fb565b5f604051808303815f87803b158015610db1575f80fd5b505af1158015610dc3573d5f803e3d5ffd5b505050505b505b600101610c5a565b505050505050505050565b5f805f83516020850186885af1949350505050565b6040513d81523d5f602083013e3d602001810160405290565b6040513d5f823e3d81fd5b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610a52578383151615610a46573d5f823e3d81fd5b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff861115610eab57600a860460018201600a88065f1493509350935050610eb5565b8593509150600190505b9250925092565b5f808383601b82900b821480611007577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e1000000000000000000870515610f3d577f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000870515610f2e576305f5e10087059650600886019550610f3d565b620186a0870596506005860195505b8687601b0b14610f5857600a87059650856001019550610f3d565b7b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc7b1999999999999999999999999999999999999999999999999999999888820111611001575f600188039050808160030b03610fff5760e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff7b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff60ff8b901d18161795505f9450610b309350505050565b505b5061101e565b865f0361101e57505f935060019250610b30915050565b858660030b146110d5575f82131561107d5761103a8383611502565b156110625760405163d556b11160e01b815260048101849052602481018390526044016101d1565b637ffffffe19909501600a0a82029550637fffffff946110d5565b637fffffff19869003604381131561109f57505f9450849350610b3092505050565b80600a0a88816110b1576110b161251b565b059750875f036110cb57505f9450849350610b3092505050565b50637fffffff1995505b8186136110e557600193506110fe565b818603600a0a83816110f9576110f961251b565b071593505b5050507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff841660e084901b1791509250929050565b60605f825167ffffffffffffffff81111561114c5761114c6118f9565b604051908082528060200260200182016040528015611175578160200160208202803683370190505b5090505f835167ffffffffffffffff811115611193576111936118f9565b6040519080825280602002602001820160405280156111bc578160200160208202803683370190505b5090505f808551116111ce575f6111d4565b84516002015b86516001010190505f8167ffffffffffffffff8111156111f6576111f66118f9565b60405190808252806020026020018201604052801561122957816020015b60608152602001906001900390816112145790505b5090505f61124d604080516002815233602082015230818301526060810190915290565b82828151811061125f5761125f611c8e565b60200260200101819052505f5b88518110156112bc57818060010192505088818151811061128f5761128f611c8e565b60200260200101518383815181106112a9576112a9611c8e565b602090810291909101015260010161126c565b508651156114f7578080600101915050848282815181106112df576112df611c8e565b602002602001018190525080806001019150508382828151811061130557611305611c8e565b60200260200101819052505f5b87518110156114f55761140888828151811061133057611330611c8e565b60200260200101515f01516113e58a848151811061135057611350611c8e565b6020026020010151602001516113c68c868151811061137157611371611c8e565b60200260200101518051604091820151805160209081029181019190912083517f6ec4dff745ec96dbde88c5d41f8aa5ac13aa1664afb47b8406b44fa945a650c8815291820192909252918201526060902090565b60405161190160f01b8152600281019290925260228201526042902090565b8a84815181106113f7576113f7611c8e565b60200260200101516060015161151d565b61142857604051630a57f30960e31b8152600481018290526024016101d1565b87818151811061143a5761143a611c8e565b60200260200101515f01516001600160a01b03165f1b86828151811061146257611462611c8e565b60200260200101818152505087818151811061148057611480611c8e565b60200260200101516020015185828151811061149e5761149e611c8e565b60200260200101818152505081806001019250508781815181106114c4576114c4611c8e565b6020026020010151604001518383815181106114e2576114e2611c8e565b6020908102919091010152600101611312565b505b509695505050505050565b5f6109b15f84126115135783611517565b835f035b8361158d565b5f836001600160a01b03163b5f0361157b575f8061153b858561162b565b5090925090505f8160038111156115545761155461252f565b1480156115725750856001600160a01b0316826001600160a01b0316145b925050506109b1565b611586848484611671565b90506109b1565b5f637ffffff582136115a057505f6100ed565b637ffffffe19820160438113156115bb5750508115156100ed565b5f81126115fb5780600a0a7b80000000000000000000000000000000000000000000000000000001816115f0576115f061251b565b0484119150506100ed565b805f03600a0a7b800000000000000000000000000000000000000000000000000000020284101591505092915050565b5f805f8351604103611662576020840151604085015160608601515f1a611654888285856116d6565b955095509550505050610eb5565b505081515f9150600290610eb5565b805160408051630b135d3f60e11b8082526004820186905260248201929092525f92906020820185604483015e5f82606483010152601f820160051c60051b915060205f60648401838a5afa9050825f5114601f3d1116811693505050509392505050565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084111561170f57505f91506003905082611794565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015611760573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b03811661178b57505f925060019150829050611794565b92505f91508190505b9450945094915050565b5f602082840312156117ae575f80fd5b81356001600160e01b0319811681146109b1575f80fd5b6001600160a01b038116811461015c575f80fd5b5f805f805f8060a087890312156117ee575f80fd5b86356117f9816117c5565b95506020870135611809816117c5565b94506040870135935060608701359250608087013567ffffffffffffffff80821115611833575f80fd5b818901915089601f830112611846575f80fd5b813581811115611854575f80fd5b8a6020828501011115611865575f80fd5b6020830194508093505050509295509295509295565b5f805f6060848603121561188d575f80fd5b8335611898816117c5565b9250602084013567ffffffffffffffff808211156118b4575f80fd5b9085019060c082880312156118c7575f80fd5b909250604085013590808211156118dc575f80fd5b508401604081870312156118ee575f80fd5b809150509250925092565b634e487b7160e01b5f52604160045260245ffd5b6040516080810167ffffffffffffffff81118282101715611930576119306118f9565b60405290565b6040805190810167ffffffffffffffff81118282101715611930576119306118f9565b6040516060810167ffffffffffffffff81118282101715611930576119306118f9565b604051601f8201601f1916810167ffffffffffffffff811182821017156119a5576119a56118f9565b604052919050565b5f67ffffffffffffffff8211156119c6576119c66118f9565b50601f01601f191660200190565b5f82601f8301126119e3575f80fd5b81356119f66119f1826119ad565b61197c565b818152846020838601011115611a0a575f80fd5b816020850160208301375f918101602001919091529392505050565b5f67ffffffffffffffff821115611a3f57611a3f6118f9565b5060051b60200190565b5f82601f830112611a58575f80fd5b81356020611a686119f183611a26565b82815260059290921b84018101918181019086841115611a86575f80fd5b8286015b848110156114f757803567ffffffffffffffff80821115611aa9575f80fd5b908801906080828b03601f19011215611ac0575f80fd5b611ac861190d565b86830135611ad5816117c5565b815260408381013588830152606084013583811115611af2575f80fd5b8401603f81018d13611b02575f80fd5b88810135611b126119f182611a26565b81815260059190911b82018301908a8101908f831115611b30575f80fd5b928401925b82841015611b4e5783358252928b0192908b0190611b35565b80858701525050505050608083013582811115611b69575f80fd5b611b778c89838701016119d4565b60608301525085525050918301918301611a8a565b5f60408236031215611b9c575f80fd5b611ba4611936565b823567ffffffffffffffff80821115611bbb575f80fd5b818501915060608236031215611bcf575f80fd5b611bd7611959565b8235611be2816117c5565b81526020830135611bf2816117c5565b6020820152604083013582811115611c08575f80fd5b611c14368286016119d4565b60408301525083526020850135915080821115611c2f575f80fd5b50611c3c36828601611a49565b60208301525092915050565b5f808335601e19843603018112611c5d575f80fd5b83018035915067ffffffffffffffff821115611c77575f80fd5b6020019150600581901b3603821315610b30575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235607e19833603018112611cb6575f80fd5b9190910192915050565b5f8235609e19833603018112611cb6575f80fd5b5f808335601e19843603018112611ce9575f80fd5b83018035915067ffffffffffffffff821115611d03575f80fd5b6020019150600681901b3603821315610b30575f80fd5b5f60208284031215611d2a575f80fd5b81356109b1816117c5565b5f808335601e19843603018112611d4a575f80fd5b830160208101925035905067ffffffffffffffff811115611d69575f80fd5b8060051b3603821315610b30575f80fd5b5f808335601e19843603018112611d8f575f80fd5b830160208101925035905067ffffffffffffffff811115611dae575f80fd5b803603821315610b30575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f8135611df0816117c5565b6001600160a01b039081168452602083013590611e0c826117c5565b166020840152611e1f6040830183611d7a565b60606040860152611e34606086018284611dbc565b95945050505050565b5f808335601e19843603018112611e52575f80fd5b830160208101925035905067ffffffffffffffff811115611e71575f80fd5b8060061b3603821315610b30575f80fd5b8183525f60208085019450825f5b85811015611ec8578135611ea3816117c5565b6001600160a01b03168752818301358388015260409687019690910190600101611e90565b509495945050505050565b5f8235607e19833603018112611ee7575f80fd5b90910192915050565b8183526020808401935f91600585811b8301820185855b88811015611fd457858303601f19018a52611f228289611ed3565b60808135611f2f816117c5565b6001600160a01b0316855281870135878601526040611f5081840184611d35565b8383890152808489015260a093507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811115611f8a575f80fd5b881b91508181888501375085016060611fa584820185611d7a565b9450838884030182890152611fbd8484018683611dbc565b9e8a019e9750505093870193505050600101611f07565b509098975050505050505050565b5f602080835260e08301843582850152818501356040850152606060408601356060860152606086013580151580821461201a575f80fd5b60809150806080880152506120326080880188611d35565b60c060a08901529384905261010093848801600582901b89018601835f5b8481101561216b578b830360ff1901845261206b8287611ed3565b8035609e1982360301811261207e575f80fd5b8885528101803561208e816117c5565b6001600160a01b0316858a0152808c013536829003605e190181126120b1575f80fd5b60a0808701526120c76101208701838301611de4565b90506120d66040830183611e3d565b607f19808985030160c08a01526120ee848385611e82565b93506120fc8e860186611e3d565b93509150808985030160e08a015250612116838383611e82565b92505050898201358c8701528c8301358d870152604083013560408701526121408b840184611d35565b935091508581038b870152612156818484611ef0565b968d019695505050918a019150600101612050565b505061217a60a08c018c611d7a565b8b8303601f190160c08d015298509650612195818989611dbc565b9b9a5050505050505050505050565b5f80604083850312156121b5575f80fd5b505080516020909101519092909150565b5f805f606084860312156121d8575f80fd5b83516121e3816117c5565b60208501519093506121f4816117c5565b604085015190925067ffffffffffffffff811115612210575f80fd5b8401601f81018613612220575f80fd5b805161222e6119f1826119ad565b818152876020838501011115612242575f80fd5b8160208401602083015e5f602083830101528093505050509250925092565b5f60208284031215612271575f80fd5b815160ff811681146109b1575f80fd5b5f60208284031215612291575f80fd5b5051919050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f815180845260208085019450602084015f5b83811015611ec8578151875295820195908201906001016122d9565b5f8282518085526020808601955060208260051b840101602086015f5b8481101561234057601f1986840301895261232e8383516122c6565b98840198925090830190600101612312565b5090979650505050505050565b602081526001600160a01b038251166020820152602082015160408201525f604083015160e06060840152612386610100840182612298565b9050606084015160808401526080840151601f19808584030160a08601526123ae83836122f5565b925060a08601519150808584030160c08601526123cb83836122c6565b925060c08601519150808584030160e086015250611e3482826122c6565b5f82601f8301126123f8575f80fd5b815160206124086119f183611a26565b8083825260208201915060208460051b870101935086841115612429575f80fd5b602086015b848110156114f7578051835291830191830161242e565b5f8060408385031215612456575f80fd5b825167ffffffffffffffff8082111561246d575f80fd5b818501915085601f830112612480575f80fd5b815160206124906119f183611a26565b82815260059290921b840181019181810190898411156124ae575f80fd5b948201945b838610156124cc578551825294820194908201906124b3565b918801519196509093505050808211156124e4575f80fd5b506124f1858286016123e9565b9150509250929050565b828152604060208201525f61251360408301846122c6565b949350505050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52602160045260245ffd"; /// @dev What MUST already be on a network before this release can be /// broadcast there: an address, and the runtime code that belongs at it. /// `abi.encode`d as a `DeployDependency[]` because Solidity has no /// file-scope constant of dynamic array type. bytes constant DEPENDENCIES = - hex"0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000005940000000000000000000000000f78c2c56f95e28f73f4b8b695b07ee574da5c7830000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000588f6080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a71461180e575080632cb77e9f146117e257806341d1514f146117ab5780635343c1b7146117105780635cffe9de146115b45780635d003c4414611430578063613255ab146113ad578063687cf02a14611096578063ac9650d814610f48578063b0460f07146105f3578063b845b83e1461059b578063ca9109ba1461044c578063d9d98ce41461039b578063ddebc96f146103475763df6db3c2146100c1575f80fd5b34610321576003196040368201126103215767ffffffffffffffff9060043582811161032157806004019160a0823603918201126103215760243584811161032157610111903690600401611cd0565b909361011b612bf1565b5f946001600160a01b039485610130846125d8565b163303610325576101496101443685611b02565b612c33565b805f525f60205260405f20966001885414610190575b60208960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556040519015158152f35b9091929394959697505f600198556040519633885282602089015260606040890152816101bc8761188d565b166060890152602484013590606219018112156103215783019060a06080890152806101ea6004840161188d565b166101008901526101fd6024830161188d565b16610120880152604481013560221982360301811215610321570190602460048301359201988211610321578136038913610321577f09d18501db0080ca2d6cd7c17fa7255daff4b2d503ea93b76ff68b6752ea8e6387806103069560846102c561030e9a60209f610284906103149f9a60606101406102ef9d0152610160880191612389565b6102b66102ab61029760448801856129dc565b605f198a8603810160a08c01529491612a11565b9260648701906129dc565b918784030160c0880152612a11565b91013560e08301520390a13390919060405192600284526020840152604083015260608201604052565b906040519160018352602083015260408201604052565b9236916123a9565b90613c66565b5f8080808080808061015f565b5f80fd5b602486610331856125d8565b6040516335252be360e01b815291166004820152fd5b3461032157600319602036820112610321576004359067ffffffffffffffff82116103215760809082360301126103215761038660609160040161262c565b90604051921515835260208301526040820152f35b34610321576040366003190112610321576001600160a01b036103bc611861565b166040516370a0823160e01b8152306004820152602081602481855afa908115610441575f9161040f575b50156103f75760206040515f8152f35b60249060405190633c5bf76960e21b82526004820152fd5b90506020813d602011610439575b8161042a60209383611971565b810103126103215751826103e7565b3d915061041d565b6040513d5f823e3d90fd5b346103215761045a36611d01565b92809492610466612bf1565b610471828533613b62565b61047a816134d7565b15610567578061048e6104dd9286336140a8565b9790957f7f9dfa19cf1cc2f806f2f860fbc9c056b601fb1afc0e9b843dfe5c63616268e660806040513381526001600160a01b038416998a60208301528560408301526060820152a1336137be565b9390918561050c575b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b61055b9661030e956103069460ff93604051956005875260208701526040860152606085015260808401521660a082015260c08101604052906040519160018352602083015260408201604052565b808080808080806104e6565b506040516306dde9c360e41b81523360048201526001600160a01b03841660248201526044810191909152606490fd5b0390fd5b346103215760203660031901126103215760043567ffffffffffffffff81116103215761030e6105d26104e6923690600401611cd0565b91906105dc612bf1565b604051926105e984611955565b5f845236916123a9565b34610321576003196020368201126103215767ffffffffffffffff600435116103215760c090600435360301126103215761062c612bf1565b5f808061064160048035608481019101612511565b905015610f36576024600435013592610659846134d7565b15610f245760608060405161066d81611909565b610675612566565b81525f60208201525f6040820152015261068d612566565b506106ed6106e86106c76106bd6106b76106b1608460043501600435600401612511565b90612598565b806125b3565b60408101906124a3565b60206106e06106b1608460043501600435600401612511565b0135916125c8565b6125d8565b936001600160a01b0361073c6106e86107236107196106b76106b1608460043501600435600401612511565b60608101906124a3565b60406106e06106b1608460043501600435600401612511565b816040519761074a896118d1565b168752166020860152604085015261076c608460043501600435600401612511565b9490506001604051955f87520160051b85016040525f905f5b610799608460043501600435600401612511565b9050811080610f11575b15610d5e576107bc608460043501600435600401612511565b821015610d4a578160051b810135607e198236030181121561032157608081830136031261032157604051916107f183611909565b8181013567ffffffffffffffff81116103215761081390369084840101611b02565b835280820160208181013590850152604080820135908501526060013567ffffffffffffffff81116103215761084c9236920101611cb5565b606082015280516001600160a01b0361086e6040830151602085015190611dbe565b5151166001600160a01b0385511614801590610d16575b610d045761089d602083015160408401519083613fa5565b6108a681612c33565b91825f525f60205260405f2054155f1461090a575051604080513381526001600160a01b039092166020830152810191909152600191907fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f390606090a15b01610785565b919061093b60208497959701516040850151906060860151906040519261093084611955565b5f8452339186613235565b5f94916109a457505051604080513381526001600160a01b03909216602083015281019190915260019291907f1e6fa9678edf81f9f25bbf308bde03ad3e110db1f429394b0915ba021532941490606090a15b811561099c575b5092610904565b905088610995565b6109b9606082015160446004350135906134fa565b15610a1357505051604080513381526001600160a01b03909216602083015281019190915260019291907fe3151dc8cb7a54ffc4baabd28c1f241c94d510b5e5b502491ac3cad6c16316d59080606081015b0390a161098e565b610a2060408201516134d7565b158015610cf1575b15610a7e57505051604080513381526001600160a01b03909216602083015281019190915260019291907f500b713857325f9e6dcb52ae832eca9109d107ed1aae9cb4928b4c1e13f051aa908060608101610a0b565b9250925050600196959691610a976064600435016125ec565b15610c5e5796610b0797610b1760408401516040880151610ab88183613544565b15610c565750925b610b11848592610afa610af460608a01516001600160e01b03601b918660e01d92828816810b928260e01d9216900b6145f5565b9061456a565b9d8e9260408d015161356b565b60408c015261407e565b9961407e565b98610b228484613595565b610b2c84826135f3565b60405192338452608060208501526060610b528451608080880152610100870190611e19565b93602081015160a0870152604081015160c0870152015192607f198582030160e0860152835180825260208201906020808260051b8501019601925f5b828110610bee57505050505092806001979695937fbae4dbf76931c547f765e9def16d693d86daaa596f491de979008831789185ae93610be996604084015260608301520390a180858c5101808d5260051b8c01526138aa565b61098e565b9091929396602080610c49600193601f198782030189528b51906001600160a01b03825116815283820151848201526060610c3860408401516080604085015260808401906125f9565b920151906060818403910152611d4d565b9901950193929101610b8f565b905092610ac0565b610b0790610b176060840151610b11610c9c610af460408801516001600160e01b0394601b90868360e01d9316820b91878260e01d9216900b6145f5565b60408a0151610cab8183613544565b15610ce95750915b829c8d916060890151908116155f14610cda575060408801515b96879460408d015161356b565b610ce49085613fda565b610ccd565b905091610cb3565b50610cff6060820151613521565b610a28565b60405163936bb5ad60e01b8152600490fd5b506001600160a01b03610d326060830151604085015190611dbe565b5151166001600160a01b036020860151161415610885565b634e487b7160e01b5f52603260045260245ffd5b50919390610d706064600435016125ec565b15610f0b57835b6004356004013590610d898282613544565b610eed5750508490610da9856001600160a01b0360208701511633613bf4565b505060a46004350190610dc182600435600401612470565b905015159081610ee5575b50610e44575b506001600160a01b03610de892935116336140a8565b50505b8351811015610e105780610e0a610e0460019387611dbe565b5161371e565b01610deb565b5060409160017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005582519182526020820152f35b90506001600160a01b03602084015116610e6e6001600160a01b0385511692600435600401612470565b929091333b1561032157610eb65f93604051958694859463691f9ed760e01b8652600486015260248501528960448501528a606485015260a0608485015260a4840191612389565b038183335af190811561044157859115610dd2579050610ed69150611925565b5f836001600160a01b03610dd2565b905088610dcc565b604492506040519163573b6f4160e01b835260048301526024820152fd5b84610d77565b50610f1f60408301516134d7565b6107a3565b60405163315f9e2360e21b8152600490fd5b604051639c95219f60e01b8152600490fd5b34610321576020806003193601126103215760043567ffffffffffffffff811161032157610f7a903690600401611cd0565b919060405192610f8984611955565b5f8452828401610f9882611a55565b94610fa66040519687611971565b828652610fb283611a55565b93610fc486880195601f1901866124f5565b5f5b84811061102857604080518881528951818a018190525f92600582901b83018101918a918c9085015b828710610ffc5785850386f35b909192938280611018600193603f198a82030186528851611d4d565b9601920196019592919092610fef565b806110778861107161104460019560059d9c9d1b870187612470565b929089846040519586938585013782018381015f81528b519283915e015f83820152038084520182611971565b30613f14565b611081828a611dbe565b5261108c8189611dbe565b5001969596610fc6565b34610321576003196040368201126103215760043567ffffffffffffffff8082116103215760c08260040193833603011261032157602435908111610321576110e3903690600401611cd0565b906110ec612bf1565b61111d61111861111361110c611102888061245b565b6040810190612470565b3691611993565b613e96565b613eff565b801561139b5760011015611389576024830161113981866124a3565b90501561137757604484019461114f86826124a3565b905015611365576111b561117d966111a961117461116d858061245b565b95856124a3565b999092856124a3565b91909261119a60405197611190896118a1565b33895236906119f7565b9a60209b8c8901523691611a6d565b60408601523691611a6d565b6060830152606485013560808301526111cd82612c33565b91825f525f875260405f20958654159687611211575b888860017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055604051908152f35b6001905560a46001600160a01b03917f87491344dfbcf91f6cbbc610cbbeedc85313d37a02df0c93527f7ea5f8db717f83855116604051908152878c82015260606040820152806112656060820188611e19565b0390a101916112748385612470565b90506112b9575b505050506112ad92916103066102ef61030e933390919060405192600284526020840152604083015260608201604052565b828080808080806111e3565b6112c661110c8486612470565b6112cf816145d1565b156113425750937fd46c2c56b35c8210e9e712ec3f02242d5fc90187c0ac8ed80cc33626846ec369896112ad989795611335611318610306976102ef9761030e9b511693612470565b866040519586958652850152606060408501526060840191612389565b0390a1938395965061127b565b89610597604051928392630c89984b60e31b845260048401526024830190611d4d565b60405163540e5f0b60e01b8152600490fd5b604051636c44ef8f60e01b8152600490fd5b604051633c8270bd60e21b8152600490fd5b604051632cff108b60e21b8152600490fd5b3461032157602080600319360112610321576024816001600160a01b036113d2611861565b16604051928380926370a0823160e01b82523060048301525afa908115610441575f91611403575b50604051908152f35b90508181813d8311611429575b61141a8183611971565b810103126103215751826113fa565b503d611410565b346103215761143e36611d01565b929161144b949194612bf1565b611456838333613b62565b61145f816134d7565b15611583578160ff916114778561153a969533612a61565b6114818183613544565b1561157d575080935b61149685828533613b96565b917f8045c25080b0868951141ed0a91720bcad09a8364a2b3109ee1fd49c1f0bc8b860c06114c5898833613bf4565b97906001600160a01b0360405192338452169a8b6020840152856040840152886060840152608083015260a0820152a16040519660068852602088015260408701526060860152608085015260a08401521660c082015260e08101604052906040519160018352602083015260408201604052565b90806115665760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b6115759261030e9136916123a9565b8080806104e6565b9361148a565b50604051623a3a4d60e21b81523360048201526001600160a01b039190911660248201526044810191909152606490fd5b34610321576080366003190112610321576004356001600160a01b0390818116809103610321576115e3611877565b6044359167ffffffffffffffff91606435838111610321573660238201121561032157806004013593841161032157366024858301011161032157611670956020921693611632868587613a83565b60405196879283926323e30c8b60e01b84523360048501528760248501528860448501525f606485015260a06084850152602460a485019201612389565b03815f855af1938415610441575f946116dc575b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd984036116c3576116b893503091613afc565b602060405160018152f35b604051630b6c58a960e31b815260048101859052602490fd5b9093506020813d602011611708575b816116f860209383611971565b8101031261032157519284611684565b3d91506116eb565b34610321576101403660031901126103215767ffffffffffffffff60043581811161032157611743903690600401611b02565b6024358281116103215761175b903690600401611b02565b60c0366043190112610321576101043583811161032157611780903690600401611cb5565b90610124359384116103215761179d6104e6943690600401611cb5565b926117a6612bf1565b611eca565b346103215760603660031901126103215760206117da6117c9611861565b6117d1611877565b60443591612a61565b604051908152f35b34610321576020366003190112610321576004355f525f6020526020600160405f205414604051908152f35b34610321576020366003190112610321576004359063ffffffff60e01b82168092036103215760209163e414309160e01b8114908115611850575b5015158152f35b6301ffc9a760e01b14905083611849565b600435906001600160a01b038216820361032157565b602435906001600160a01b038216820361032157565b35906001600160a01b038216820361032157565b60a0810190811067ffffffffffffffff8211176118bd57604052565b634e487b7160e01b5f52604160045260245ffd5b6060810190811067ffffffffffffffff8211176118bd57604052565b6040810190811067ffffffffffffffff8211176118bd57604052565b6080810190811067ffffffffffffffff8211176118bd57604052565b67ffffffffffffffff81116118bd57604052565b60e0810190811067ffffffffffffffff8211176118bd57604052565b6020810190811067ffffffffffffffff8211176118bd57604052565b90601f8019910116810190811067ffffffffffffffff8211176118bd57604052565b92919267ffffffffffffffff82116118bd57604051916119bd601f8201601f191660200184611971565b829481845281830111610321578281602093845f960137010152565b9080601f83011215610321578160206119f493359101611993565b90565b91906060838203126103215760405190611a10826118d1565b8193611a1b8161188d565b8352611a296020820161188d565b602084015260408101359167ffffffffffffffff831161032157604092611a5092016119d9565b910152565b67ffffffffffffffff81116118bd5760051b60200190565b929192611a7982611a55565b604092611a896040519283611971565b819581835260208093019160061b84019381851161032157915b848310611ab257505050505050565b8583830312610321578386918251611ac9816118ed565b611ad28661188d565b81528286013583820152815201920191611aa3565b9080601f83011215610321578160206119f493359101611a6d565b91909160a0818403126103215760405190611b1c826118a1565b8193611b278261188d565b835267ffffffffffffffff9160208101358381116103215782611b4b9183016119f7565b602085015260408101358381116103215782611b68918301611ae7565b6040850152606081013592831161032157611b896080939284938301611ae7565b60608501520135910152565b90929192611ba281611a55565b91604094611bb36040519485611971565b839583855260208095019160059460051b8401948186116103215784935b868510611be2575050505050505050565b67ffffffffffffffff90853582811161032157870190608082860312610321578551611c0d81611909565b611c168361188d565b81528a8301358b8201528683013584811161032157830186601f8201121561032157803590611c4482611a55565b91611c518a519384611971565b8083528d80840191891b83010191898311610321578e809101915b838310611ca557505050508782015260608084013594851161032157611c96878d968796016119d9565b90820152815201940193611bd1565b82358152918101918f9101611c6c565b9080601f83011215610321578160206119f493359101611b95565b9181601f840112156103215782359167ffffffffffffffff8311610321576020808501948460051b01011161032157565b906080600319830112610321576004356001600160a01b0381168103610321579160243591604435916064359067ffffffffffffffff821161032157611d4991600401611cd0565b9091565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b805115610d4a5760200190565b805160011015610d4a5760400190565b805160021015610d4a5760600190565b805160031015610d4a5760800190565b805160041015610d4a5760a00190565b8051821015610d4a5760209160051b010190565b9081518082526020808093019301915f5b828110611df1575050505090565b835180516001600160a01b031686528201518583015260409094019392810192600101611de3565b90608080611e8f611e7d611e6b60406001600160a01b0380895116885260208901519060a060208a01528082511660a08a015260208201511660c08901520151606060e0880152610100870190611d4d565b60408701518682036040880152611dd2565b60608601518582036060870152611dd2565b93015191015290565b90611ea282611a55565b611eaf6040519182611971565b8281528092611ec0601f1991611a55565b0190602036910137565b92916001600160a01b038451166001600160a01b0383511614612377576001600160a01b03611f00606086015160643590611dbe565b515116906040830151916001600160a01b03611f1f6084358095611dbe565b51511614801590612337575b610d04576040850151906001600160a01b03611f4a6044358094611dbe565b5151166001600160a01b03611f6560643560608a0151611dbe565b5151161461232557611f7686612c33565b805f525f60205260405f2054156122d25750611f9184612c33565b805f525f60205260405f20541561227e5750612076929161204e917f6fa7f4c28634b0a9d6831401c45ae468195fb63aed07308935c35374ff5d9e3960405180611ff9611feb61012033845280602085015283018d611e19565b82810360408401528a611e19565b85606083015260643560808301528760a083015260a43560c083015260c43560e083015260e4356101008301520390a16001600160a01b038651166040519261204184611955565b5f8452606435908a612e9d565b9490506001600160a01b038651166040519261206984611955565b5f845260a4359086612e9d565b92905061208660408201516134d7565b15801561226a575b8015612257575b8015612244575b61223257604051916120ad83611909565b5f83525f60208401525f60408401525f60608401526120cc84836144e2565b845260408401526120f26120e083866144e2565b6020860152806060860152845161356b565b94612106602085015160408601519061356b565b9361211087613521565b8015612223575b612211576121d861220a957fd9fa84dd790c969daa5c33d8050dc06b4a9b59d5b42e2be5f5e8ae20447f618d946121ba61220f9a60a0966121598a8851613595565b6121678c6020890151613595565b6121758a60408901516135f3565b6121838c60608901516135f3565b61218c8a61371e565b6121958c61371e565b6001600160a01b036121b160c435926060606435910151611dbe565b515116336137be565b50506001600160a01b036121b160e43592606060a435910151611dbe565b5050606060405191338352805160208401526020810151604084015260408101518284015201516080820152a16138aa565b6138aa565b565b604051630d86822160e01b8152600490fd5b5061222d85613521565b612117565b6040516321badf1f60e01b8152600490fd5b506122526060840151613521565b61209c565b506122656060820151613521565b612095565b5061227860408401516134d7565b1561208e565b9351604080513381526001600160a01b039092166020830152810194909452507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f3945091925082915050606081015b0390a1565b9551604080513381526001600160a01b039092166020830152810196909652507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f3949350839250506060820190506122cd565b604051631cd2f1c760e21b8152600490fd5b506001600160a01b03612351606085015160a43590611dbe565b5151166001600160a01b0361236d604088015160443590611dbe565b5151161415611f2b565b604051630a98f1f360e21b8152600490fd5b908060209392818452848401375f828201840152601f01601f1916010190565b909291926123b681611a55565b916040916123c76040519485611971565b839581855260208095019160051b8301938185116103215783925b8584106123f25750505050505050565b67ffffffffffffffff90843582811161032157860190838286031261032157835161241c816118ed565b823584811161032157866124319185016119f7565b8152898301359384116103215761244c868b95869501611cb5565b838201528152019301926123e2565b903590605e1981360301821215610321570190565b903590601e1981360301821215610321570180359067ffffffffffffffff82116103215760200191813603831361032157565b903590601e1981360301821215610321570180359067ffffffffffffffff821161032157602001918160061b3603831361032157565b5f5b608081106124e7575050565b6060828201526020016124db565b5f5b82811061250357505050565b6060828201526020016124f7565b903590601e1981360301821215610321570180359067ffffffffffffffff821161032157602001918160051b3603831361032157565b60405190612554826118d1565b60606040835f81525f60208201520152565b60405190612573826118a1565b5f608083828152612582612547565b6020820152606060408201526060808201520152565b9015610d4a57803590607e1981360301821215610321570190565b903590609e1981360301821215610321570190565b9190811015610d4a5760061b0190565b356001600160a01b03811681036103215790565b3580151581036103215790565b9081518082526020808093019301915f5b828110612618575050505090565b83518552938101939281019260010161260a565b9061264461014461263d84806125b3565b3690611b02565b5f5260205f81526040926001845f2054036129d157916128c6916126cb85855f61284b6126748361268b9a6125b3565b612690878501359182878701359c8d923690611b02565b613fa5565b6126a861269d85806125b3565b946060810190612511565b96906126c38751966126b988611955565b8688523690611b02565b973691611b95565b906126d4612c64565b506127fb8651916126e4836118a1565b600483526126f38a84016124d9565b886126fd81612c33565b988b6001600160a01b039a8b84511690835192600384528301528282015233606082015260808101825261273086611d71565b5261273a85611d71565b508051612746816118d1565b6002815281368e83013761275986611d7e565b5261276385611d7e565b50810160ff8c6127c66127af8d80612788816127808b8a51611dbe565b515116614173565b97511690612797898851611dbe565b515116846127a68a8951611dbe565b51015191612a61565b958d6127bc828751611dbe565b5151169451611dbe565b51015192169093929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b61280482611d8e565b5261280e81611d8e565b506128328b886060810160ff8c6127c66127af8d80612788816127808b8a51611dbe565b61283b82611d9e565b5261284581611d9e565b50614251565b918385511693868601918b83519289818551169401511693878652308a5281808720915101519082519261287e84611955565b878452519561288c87611939565b86528a8601528d85015284606085015285608085015260a084015260c08301528a5180809a819463d04dfe2360e01b835260048301612de5565b03915afa95865f915f986129ab575b506128e45788513d5f823e3d90fd5b95938651600281106129945750888798998260c0979899015199015161291261290c85611dae565b51611d9e565b5161291d8183613544565b1561298a5750998a925b6129498b85919060405192600284526020840152604083015260608201604052565b61295286611d8e565b5261295c85611d8e565b5082519661296988611939565b8752860152840152866060840152608083015260a082015201526001929190565b9050998a92612927565b6024908a5190630fbb8e5560e21b82526004820152fd5b9097506129ca91503d805f833e6129c28183611971565b810190612ca1565b965f6128d5565b505f92508291829150565b9035601e198236030181121561032157016020813591019167ffffffffffffffff8211610321578160061b3603831361032157565b9190808252602080920192915f905b828210612a2e575050505090565b909192936001906001600160a01b03612a468761188d565b16815285830135838201526040908101950193920190612a20565b8215612a96576001600160a01b038091165f52600160205260405f2091165f5260205260405f20905f5260205260405f205490565b909150612aa282614173565b6001600160a01b03809316906040918251946370a0823160e01b86528416938460048701526020928387602481865afa968715612bb8575f97612bc2575b5083612af9612af283612b299a614f37565b50906149f9565b508651636eb1769f60e11b81526001600160a01b0390941660048501523060248501529297889081906044820190565b0381865afa968715612bb8575f97612b87575b50612af2612b4d916119f498614f37565b50612b588183613544565b15612b7f5750935b5f5260018252825f20905f528152815f20905f8052525f20549061407e565b905093612b60565b96508387813d8311612bb1575b612b9e8183611971565b8101031261032157955195612af2612b3c565b503d612b94565b85513d5f823e3d90fd5b96508387813d8311612bea575b612bd98183611971565b810103126103215795519583612ae0565b503d612bcf565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f006002815414612c215760029055565b604051633ee5aeb560e01b8152600490fd5b604051612c5e81612c506020820194602086526040830190611e19565b03601f198101835282611971565b51902090565b60405190612c7182611939565b606060c083612c7e612566565b81525f60208201525f60408201525f838201528260808201525f60a08201520152565b919060408382031261032157825167ffffffffffffffff908181116103215784019082601f83011215610321578151602092612cdc82611a55565b91612cea6040519384611971565b808352848084019160051b830101918683116103215785809101915b838310612d795750505050948281015191821161032157019180601f84011215610321578251612d3581611a55565b93612d436040519586611971565b818552838086019260051b820101928311610321578301905b828210612d6a575050505090565b81518152908301908301612d5c565b8251815291810191869101612d06565b90808251908181526020809101926020808460051b8301019501935f915b848310612db75750505050505090565b9091929394958480612dd5600193601f198682030187528a516125f9565b9801930193019194939290612da7565b91906020928381526001600160a01b0382511684820152838201516040820152612e1f604083015160e06060840152610100830190611d4d565b9060608301516080820152612e46608084015192601f1993848483030160a0850152612d89565b9260a081015193838382030160c08401528680865192838152019501905f5b818110612e89575050506119f494955060c060e091015192828503019101526125f9565b825187529588019591880191600101612e65565b94959395929192612eac612c64565b50604096875190612ebc826118a1565b60048252602093612ece8584016124d9565b612ed789612c33565b6001600160a01b038097818c51168d519360038552898501528d840152166060820152608081018b52612f0984611d71565b52612f1383611d71565b508951612f1f816118d1565b600281528a3687830137612f3284611d7e565b52612f3c83611d7e565b50898901908681835190612f4f91611dbe565b515116612f5b90614173565b86888c51168984865190612f6e91611dbe565b5151168285875190612f7f91611dbe565b51015190612f8c92612a61565b928981865190612f9b91611dbe565b515116945190612faa91611dbe565b5101519060ff16612fe2929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b612feb83611d8e565b52612ff582611d8e565b5060608801858782519061300891611dbe565b51511661301490614173565b868a5116878984519061302691611dbe565b515116878a85519061303791611dbe565b5101519061304492612a61565b908689898186519061305591611dbe565b51511694519061306491611dbe565b5101519060ff1661309c929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b6130a583611d9e565b526130af82611d9e565b506130b991614251565b9183875116938188019283519183818451169301511693865f523084528a805f20915101518b51916130ea83611955565b5f83528c51966130f988611939565b8752858701528b8601525f60608601526080850186905260a085015260c0840152885163d04dfe2360e01b815292839081906131389060048301612de5565b03815a935f94fa91825f915f94613217575b506131595788513d5f823e3d90fd5b979495969791948251966002881097886132005750818385015194015161318261290c87611dae565b5161318d8183613544565b156131f85750925b6131b78585919060405192600284526020840152604083015260608201604052565b6131c087611d8e565b526131ca86611d8e565b5082519a6131d78c611939565b8b528a01528801526060870152608086015260a085015260c0840152159190565b905092613195565b602490835190630fbb8e5560e21b82526004820152fd5b90935061322e91503d805f833e6129c28183611971565b925f61314a565b95949193908693613244612c64565b505f92604061335f815192613258846118a1565b6004845260209361326a8582016124d9565b6133286132768b612c33565b8b6001600160a01b03998a9283835116895191600383528b830152898201528360609b168b8201526080810189526132ad86611d71565b526132b785611d71565b5087516132c3816118d1565b6002815288368b8301376132d686611d7e565b526132e085611d7e565b5060ff896127c68a85019361331c876132fe81612780858a51611dbe565b9751168861330d848951611dbe565b515116856127a6858a51611dbe565b966127bc828751611dbe565b61333182611d8e565b5261333b81611d8e565b50612832878b8d60ff896127c68c85019361331c876132fe81612780858a51611dbe565b946133df5f868a511698869786889c0191825191888184511693015116928c8552308952878086209151015188519161339783611955565b8683528951956133a687611939565b86528a86015288850152848a8501528b608085015260a084015260c08301528551808095819463d04dfe2360e01b835260048301612de5565b03915afa90815f915f936134b9575b506134ac575050505f975b6002855110988915996134995782848701519601519061341b61290c89611dae565b51906134278284613544565b1590506134915750925b6134538685919060405192600284526020840152604083015260608201604052565b61345c88611d8e565b5261346687611d8e565b5082519b6134738d611939565b8c528b0152890152870152608086015260a085015260c08401529190565b905092613431565b50505050505050505091506119f4612c64565b91999850945093966133f9565b9092506134d091503d805f833e6129c28183611971565b915f6133ee565b6134f6905f60e01d906001600160e01b038160e01d9116601b0b614fee565b1290565b906134f6916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b61506f565b613540905f60e01d906001600160e01b038160e01d9116601b0b614fee565b1390565b90613540916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b61506f565b6119f491610af4916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614545565b6135ef9160808101826135b16135ab8351611dae565b51611dae565b526135e86135e26001600160a01b038094515116936135d96135d38551611dae565b51611d71565b51169251611dae565b51611d8e565b5191613b96565b5050565b906080810191806136076135ab8551611d9e565b526001600160a01b038092515116916136236135d38551611d9e565b51166136326135e28551611d9e565b5190816136e65761364283613521565b6136cd579183917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a95936122cd955f5260209060018252613698604094855f20835f528452855f20855f528452855f205461407e565b945f5260018252835f20905f528152825f20915f52525f20555b51604051918291338352604060208401526040830190612d89565b60405163793a8f5560e01b815260048101849052602490fd5b91613717917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a95936122cd956137be565b50506136b2565b6080810161372f6135e28251611d9e565b5191821561373c57505050565b6137566135d36001600160a01b0380935151169351611d9e565b5116815f5260209160018352604092835f20835f528152835f20855f528152835f2054936001600160e01b038516613791575b505050505050565b6137b5955f9284845260018152828420868552815282842091845252812055613bf4565b5f808080613789565b939291936137cb83613521565b6136cd57846137e7576137df939450613bf4565b50505f905f90565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f528152613824835f2054948561407e565b9561382e87613521565b613851575f97885260018252838820908852815282872091875252909320829055565b835163c5e12af560e01b815260048101889052602490fd5b90604082019082526020606081936040838201528551809452019301915f5b828110613896575050505090565b835185529381019392810192600101613888565b60c0810151908151915f92613a1e575b5061395f6020918281510151926001600160a01b039081818187511696015116928660a082019485518252308452604097888320898686510151015160808601518b519161390783611955565b8683528c519361391685611955565b8785528d519661392588611939565b8752898701528c86015260016060860152608085015260a084015260c08301528851808099819463d04dfe2360e01b835260048301612de5565b03915afa948515613a145787956139f6575b508451613982575b50505050505050565b81905101510151169051813b156139f2579184918493836139b7965180978195829463012c676d60e21b845260048401613869565b03925af19081156139e957506139d2575b8080808080613979565b6139dc8291611925565b6139e657806139c8565b80fd5b513d84823e3d90fd5b8480fd5b613a0b9195503d8089833e6129c28183611971565b9050935f613971565b86513d89823e3d90fd5b6001600160a01b03602080845101510151169060a083015190823b1561032157613a61925f928360405180968195829463012c676d60e21b845260048401613869565b03925af1801561044157156138ba57613a7b919250611925565b5f905f6138ba565b6040519263a9059cbb60e01b5f526001600160a01b0380931660045260245260205f60448180855af160015f5114811615613add575b8360405215613ac757505050565b635274afe760e01b835216600482015260249150fd5b6001811516613af357813b15153d151616613ab9565b833d5f823e3d90fd5b9092604051936323b872dd60e01b5f526001600160a01b0393848092166004521660245260445260205f60648180855af160015f5114811615613b4c575b836040525f60605215613ac757505050565b6001811516613af357813b15153d151616613b3a565b909115613b6d575050565b6040516305dbdfd960e41b81526001600160a01b03918216600482015291166024820152604490fd5b93929193613ba383613521565b6136cd5784613bb7576137df9394506140a8565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f528152613824835f2054948561356b565b90929192613c0181614574565b93613c0b81613521565b613c545784816001600160e01b03613c2a9360e01d9116601b0b615199565b50809281613c3a575b5050509190565b6001600160a01b03613c4c9316613a83565b5f8181613c33565b604051632d1671a360e11b8152600490fd5b916040805191613c75836118a1565b60048084526020613c878186016124d9565b5f5b8751811015613cbc5780613c9f6001928a611dbe565b51613caa8289611dbe565b52613cb58188611dbe565b5001613c89565b5092955092939093335f52308352855f2091865190613cda826118ed565b613ce2612547565b8252606085819301528751613cf681611955565b5f8152885191613d0583611955565b5f83525f3681375f5b8151811015613e6b57613d218183611dbe565b5190888c8b84519189818401518d8d8251613d49575b50505050505050506001915001613d0e565b5f613db897948197948c9794613d768c956001600160a01b039d8e81818d51169c0151169b015190614251565b94865199613d838b611939565b8a528901528488015286015260808501528a60a08501528b60c08501525180958194829363d04dfe2360e01b84528301612de5565b03915afa938415613e61578b915f95613e43575b508451613de1575b50908b8e89838d8d613d37565b51015116803b1561032157613e10925f918c8f84905180978195829463012c676d60e21b845233908401613869565b03925af1918215613e3957600192613e2a575b8981613dd4565b613e3390611925565b5f613e23565b8c513d5f823e3d90fd5b613e589195503d805f833e6129c28183611971565b9050935f613dcc565b8e513d5f823e3d90fd5b5050505050505050509050565b8115613e82570490565b634e487b7160e01b5f52601260045260245ffd5b6040815110613ef2576020810151908051603f198101908111613ede5760051c8211613eca5760016020920160051b010190565b5050604051613ed881611955565b5f815290565b634e487b7160e01b5f52601160045260245ffd5b50604051613ed881611955565b805115613f0f57602001515f1a90565b505f90565b905f8091602081519101845af48080613f92575b15613f485750506040513d81523d5f602083013e60203d82010160405290565b15613f6f57604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b3d15613f80576040513d5f823e3d90fd5b60405163d6bda27560e01b8152600490fd5b503d151580613f285750813b1515613f28565b91613fd0906060613fc5936001600160a01b039485916040880151611dbe565b515116940151611dbe565b5151161461232557565b6140016001600160e01b0392838316601b0b9260e01d938160e01d9116601b0b84846147b0565b90637ffffff58213614051575b90614018916149f9565b9290921580614049575b61402b57505090565b6044925060405191638eba4d0760e01b835260048301526024820152fd5b508215614022565b61405b82826156c2565b1561400e57604483856040519163d556b11160e01b835260048301526024820152fd5b6119f491610af4916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614d9e565b9291926140b482614574565b936140be81613521565b61411f5784816001600160e01b036140dd9360e01d9116601b0b615199565b929080931561410a575b508290816140f6575050509190565b613c4c926001600160a01b03309216613afc565b9092505f198114613ede57600101915f6140e7565b604051632eaefac360e21b8152600490fd5b6004111561413b57565b634e487b7160e01b5f52602160045260245ffd5b602090939291936001600160a01b03604082019516815261416f83614131565b0152565b61417b6156db565b60408051630782d7e160e01b81526001600160a01b03831660048201529091828260248173200e12d10bb0c5e4a17e7018f0f1161919bb93895afa928315614248575f925f94614213575b506141d083614131565b600183141580614201575b6141e55750505090565b5163ee07877f60e01b815291829161059791906004840161414f565b5061420b83614131565b8215156141db565b908094506142379293503d8511614241575b61422f8183611971565b810190614f0d565b919091925f6141c6565b503d614225565b513d5f823e3d90fd5b61425b8251611e98565b6142658351611e98565b9282519281518015155f146144da57600201935b6001940184019061428982611a55565b956142a460409361429c8551998a611971565b808952611a55565b6142b6602091601f1901828a016124f5565b5f9584519389896002926002885233868901523089890152606097606081018a526142e084611d71565b526142ea83611d71565b505f825b61449a575b50505050865161430a575b50505050505050505090565b9091929360028861432d8c866143268e809c9d9e018093611dbe565b528d611dbe565b50018561433a828d611dbe565b52614345818c611dbe565b505f965b614354575b506142fe565b8851871015614495576001600160a01b03614400898b856143f78c60428c8861437d8488611dbe565b51511696858261438d868a611dbe565b5101519261439b868a611dbe565b51838d82511691015182815160051b910120908451927f6ec4dff745ec96dbde88c5d41f8aa5ac13aa1664afb47b8406b44fa945a650c88452830152838201522090519161190160f01b83528d83015260228201522093611dbe565b51015191614f65565b1561447d578761446c8b8e8c8f9e9d9c9b9a999897968f614459918d61444f898f8f61443b83889f614432828f611dbe565b51511692611dbe565b52614446828b611dbe565b51015192611dbe565b52019c8d94611dbe565b5101516144668383611dbe565b52611dbe565b500196979895909192939495614349565b8851630a57f30960e31b815260048101899052602490fd5b61434e565b9091929a82518210156144d257906144c684809301809d6144bb8487611dbe565b516144668383611dbe565b50019082918d936142ee565b9a92916142f3565b505f93614279565b916040830192604061451c610af4606087519401938451906001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6145f5565b9451930161452b8151866134fa565b614533575050565b9093506119f491925051925183613fda565b919291600160ff1b840161455d57611d4993506150c4565b90611d49935f0391614d9e565b61401882826149f9565b61457c6156db565b6040805163b7bad1b160e01b81526001600160a01b0383166004820152909182826024815f73200e12d10bb0c5e4a17e7018f0f1161919bb93895af1928315614248575f925f9461421357506141d083614131565b6008815110613f0f576008015167ffffffffffffffff1667ff0a89c674ee78741490565b9091939284158215175f1461460f5750505090505f905f90565b82810192600160fd1b8082019083011760fe1c614746575b505061463281615387565b9361463c81615387565b9461464786826153a7565b90918215614737575f9083986f0785ee10d5da46d900f436a000000000808611614729575b50670de0b6b3a7640000808b1161471a575b50633b9aca00808b1161470b575b50612710808b116146fd575b5098805b6146ec57508190611d49989982600a0a9109960195817fcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccd0a93838211900382610100031b9203901c1702916153ba565b60019290920191600a90048061469c565b60049a04998a930192614698565b600991939a049901915f61468c565b601291939a049901915f61467e565b85049950602592505f61466c565b50929050611d499495506153ba565b5f82121561479a5780841361478c575b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb284131561462757909250611d499394916152c5565b909250611d4993949161532c565b8084121561475657909250611d499394916152c5565b929091806147d6576044848460405191637a97930f60e01b835260048301526024820152fd5b90919280155f146147eb57505050505f905f90565b614804936147f891615474565b92919490938492615474565b909391928461481288615387565b9161481c86615387565b947f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000094604c918688106149c3575b030191600160ff1b98838a018112155f14614990575050035b5f955f821280614987575b614969575b5f811280614957575b6149395786820103966001600160ff1b038814908161492f575b5080614926575b8061491d575b6148ff5750906148b39291615620565b915f81136148c6575b50611d49936153ba565b9091604c82136148f4576148dd91600a0a90613e78565b9081156148ea575f6148bc565b505050505f905f90565b50505050505f905f90565b876044916040519163d556b11160e01b835260048301526024820152fd5b505f85126148a3565b5082841461489d565b905088145f614896565b604489836040519163d556b11160e01b835260048301526024820152fd5b50806001600160ff1b0301821361487c565b95508087018613156149815786818703015b95614873565b5f61497b565b505f811361486e565b89985090920390506001600160ff1b03819003870182136149b45701860194614863565b5050505050505050505f905f90565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009650604b925061484a565b8115613e82570590565b8082601b82810b8314614bee577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000008405614b9a575b8380820b03614b8957507b199999999999999999999999999999999999999999999999999999987b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc84011115614b3a575b838060030b03614abe575b808413614aa25750506001600160e01b036001925b60e01b91161791565b8303600a0a8015613e82576001600160e01b0391071592614a99565b92915f841315614b0e575090614ad483836156c2565b614af057637ffffffe1901600a0a810290637fffffff92614a84565b506044916040519163d556b11160e01b835260048301526024820152fd5b637fffffff1992830390604382136148f457614b2d91600a0a906149ef565b9182156148ea5792614a84565b5f198401808060030b14614b4e5750614a79565b90506001600160e01b039293507b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff915060e01b9260ff1d181617905f90565b600190940193600a90930592614a2c565b937f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000840515614bdb576305f5e100600894058094819201955b915050614a2c565b620186a060059405809481920195614bd3565b5082614a7957505050505f90600190565b919291600160ff1b9190801580614d8c575090614c1b91615474565b9490929091905f868585858282138015614d83575b614d66575b505050508682841860ff1c94860391039081604c038111614d4b5701600a0a808205919084614d31575b505081019182821860ff1c1115614d2957826001600160ff1b0314614d0b57905f600192135f14614cdc57600a9004915b01925b81158117614ca057509190565b80614cb9575b508015614cb1579190565b505f91508190565b9192614ccf9203600160ff1b01600a0a906149ef565b600160ff1b91905f614ca6565b600a60037fe6666666666666666666666666666666666666666666666666666666666666679201040191614c90565b604490836040519163d556b11160e01b835260048301526024820152fd5b509092614c93565b8107614d3e575b80614c5f565b60ff1d600117015f614d38565b505050919350614d59579190565b60018160ff1d1790039190565b5f9a50909750909550600160ff1b94509250905086808080614c35565b50835f12614c30565b15614d975750509190565b9350919050565b9392919384158115818117614eef57505090614db991615474565b9194908295614dca82958294615474565b8096929491969387868482138015614ee6575b614ecd575b5050505050508682841860ff1c94860391039081604c038111614d4b5701600a0a808205919084614eb3575b505081019182821860ff1c1115614eab57826001600160ff1b0314614d0b57905f600192135f14614e7c57600a9004915b01925b81158117614e4f57509190565b80614e5f57508015614cb1579190565b600160ff1b93614e769291038401600a0a906149ef565b5f614ca6565b600a60037fe6666666666666666666666666666666666666666666666666666666666666679201040191614e3f565b509092614e42565b8107614ec0575b80614e0e565b60ff1d600117015f614eba565b929b5098509196509450925090505f8080808080614de2565b50858412614ddd565b9395939092919015614f05575050614cb1579190565b945092915050565b919082604091031261032157815160048110156103215760209092015160ff811681036103215790565b9060ff165f03916001600160ff1b0382115f14614f5d57600a6001818404940192061590565b909190600190565b9091813b614fa057614f779192615744565b50614f8181614131565b159182614f8d57505090565b6001600160a01b03918216911614919050565b6020918160645f935160405192630b135d3f60e11b9788855260048501526040602485015286820190604485015e8281018201859052601f01601f191601915afa905f5114601f3d11161690565b92915f9060018184145f87128715171717615068575f9280821361505a575b03604c81135f82121761504e57600a0a908461502c83820293846149ef565b146150415750501561503d575f9190565b5f90565b90935090156119f4579190565b50501561503d575f9190565b5f956001945092509061500d565b5050505f90565b93929190918083145f83125f871218831587151717176150be575f928082136150b15703604c81135f82121761504e57600a0a908461502c83820293846149ef565b919460019350919061500d565b50919050565b909291600160ff1b91828101615156575080841461514c57808413918215615144578185035b604c8111156151335750505f915b1561512457507f8000000000000000000000000000000000000000000000000000000000000001019190565b92506001600160ff1b03039190565b600a0a908115613e825704916150f8565b8482036150ea565b505090505f905f90565b9361516392945f03614bff565b80939180928114615177575b50505f039190565b915092506001600160ff1b038314614d0b57600a600191059201915f8061516f565b91925f8312156151c1576044838360405191634a7d166b60e01b835260048301526024820152fd5b9192836151d357505090505f90600190565b60ff811682019180831261529b575f83121561520b575050604c198112614cb1575f03600a0a916152048382613e78565b9283021490565b909293915f81135f1461529157604d811361526657600a0a928315613e8257835f1904831161523d5750500290600190565b60405163c849483b60e01b815260048101849052602481019290925260ff166044820152606490fd5b5060405163c849483b60e01b81526004810192909252602482015260ff919091166044820152606490fd5b5050905090600190565b60405163c849483b60e01b815260048101869052602481019190915260ff82166044820152606490fd5b909392915f6152d59181846145f5565b9490945f8483019182019412159081615322575b8115615318575b506152fa57505090565b604492506040519163d556b11160e01b835260048301526024820152fd5b905083125f6152f0565b82811291506152e9565b61534193600160fe1b908101939201906145f5565b9081815f821215615378575050604b1982126137df57615366915f03600a0a906149ef565b9081615370575f90565b600160ff1b90565b93600160ff1b90910192509050565b5f8112156119f457600160ff1b908082036153a0575090565b90505f0390565b905f198183099102908180821091030391565b92939291905f818418121561544f576001600160ff1b03928383111561543957600160ff1b938385036153ef57505050509190565b90919293508514615409575050600a600191045f03920190565b604051630ed8062160e21b8152600481019190915260248101919091526044810182905260648101849052608490fd5b5090915050600160ff1b8114613ede575f039190565b90916001600160ff1b0380841115613c33578514615409575050600a60019104920190565b919091801561561657827f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000080830515615524575b507f19999999999999999999999999999999999999999999999999999999999999997f0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc830110615515575b83136154ff5791905f90565b919060018060ff1b926001600160ff1b03030190565b9290600a02905f1901926154f3565b6f4b3b4ca85a86c47a098a22400000000080840515615604575b507728c87cb5c89a2571ebfdcb54864ada834a000000000000008305156155ed575b7b097edd871cfda3a5697758bf0e3cbb5ac5741c6400000000000000008305156155d9575b7e3899162693736ac531a5a58f1fbb4b746504382ca7e40000000000000000008305156155c9578205156155ba575b5f6154a8565b9290600a02905f1901926155b4565b9391606402916001190193615585565b93916402540be40002916009190193615585565b9391678ac7230489e8000002916012190193615560565b6025198301955092909202915f61553e565b505f915081908190565b90915f19838309928083029283808610950394808603958487101561569e5714615696579082910960018219018216809204600280826003021880830282030280830282030280830282030280830282030280830282030280920290030293600183805f03040190848311900302920304170290565b505091500490565b60648386866040519263362ced0960e11b8452600484015260248301526044820152fd5b6119f491905f8112156156d6575f0361577e565b61577e565b73200e12d10bb0c5e4a17e7018f0f1161919bb9389803b158015615719575b6157015750565b602490604051906373e6d7b360e01b82526004820152fd5b507f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d41813f14156156fa565b81519190604183036157745761576d9250602082015190606060408401519301515f1a9061580d565b9192909190565b50505f9160029190565b90637ffffff581131561580757637ffffffe1981019060438213615800575f8212156157d457637fffffff91505f0301600a0a7b8000000000000000000000000000000000000000000000000000000202111590565b50600a0a8015613e82577b80000000000000000000000000000000000000000000000000000001041090565b5050151590565b50505f90565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411615884579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa15610441575f516001600160a01b0381161561587a57905f905f90565b505f906001905f90565b5050505f9160039190560000000000000000000000000000000000000000000000000000000000200e12d10bb0c5e4a17e7018f0f1161919bb93890000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000044b608060405234801561000f575f80fd5b506004361061004a575f3560e01c80630782d7e11461004e57806354636d2b14610078578063b7bad1b11461009d578063f5c36eaf146100b0575b5f80fd5b61006161005c366004610363565b6100c3565b60405161006f929190610403565b60405180910390f35b61008b610086366004610363565b6100d8565b60405160ff909116815260200161006f565b6100616100ab366004610363565b6100e9565b61008b6100be366004610363565b6100f5565b5f806100cf5f84610100565b91509150915091565b5f6100e35f836101f0565b92915050565b5f806100cf5f84610281565b5f6100e35f83610356565b73ffffffffffffffffffffffffffffffffffffffff81165f9081526020838152604080832081518083019092525460ff8082161515835261010090910416818301527f313ce56700000000000000000000000000000000000000000000000000000000808452839283908190816004818a5afa915060203d1015610182575f91505b811561019857505f5160ff811115610198575f91505b816101af57505050602001516003925090506101e9565b83516101c3575f955093506101e992505050565b836020015160ff1681146101d85760026101db565b60015b846020015195509550505050505b9250929050565b5f805f6101fd8585610281565b909250905060018260038111156102165761021661039d565b1415801561023557505f8260038111156102325761023261039d565b14155b156102795783826040517fee07877f000000000000000000000000000000000000000000000000000000008152600401610270929190610421565b60405180910390fd5b949350505050565b5f805f8061028f8686610100565b90925090505f8260038111156102a7576102a761039d565b0361034b576040805180820182526001815260ff838116602080840191825273ffffffffffffffffffffffffffffffffffffffff8a165f908152908b9052939093209151825493517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009094169015157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff161761010093909116929092029190911790555b909590945092505050565b5f805f6101fd8585610100565b5f60208284031215610373575f80fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114610396575f80fd5b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b600481106103ff577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b9052565b6040810161041182856103ca565b60ff831660208301529392505050565b73ffffffffffffffffffffffffffffffffffffffff831681526040810161039660208301846103ca56000000000000000000000000000000000000000000"; + hex"0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000005940000000000000000000000000531167691b4f37f0266e226d03412c77fb2977ce0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000588e6080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a71461180e575080632cb77e9f146117e257806341d1514f146117ab5780635343c1b7146117105780635cffe9de146115b45780635d003c4414611430578063613255ab146113ad578063687cf02a14611096578063ac9650d814610f48578063b0460f07146105f3578063b845b83e1461059b578063ca9109ba1461044c578063d9d98ce41461039b578063ddebc96f146103475763df6db3c2146100c1575f80fd5b34610321576003196040368201126103215767ffffffffffffffff9060043582811161032157806004019160a0823603918201126103215760243584811161032157610111903690600401611cd0565b909361011b612bf0565b5f946001600160a01b039485610130846125d7565b163303610325576101496101443685611b02565b612c32565b805f525f60205260405f20966001885414610190575b60208960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556040519015158152f35b9091929394959697505f600198556040519633885282602089015260606040890152816101bc8761188d565b166060890152602484013590606219018112156103215783019060a06080890152806101ea6004840161188d565b166101008901526101fd6024830161188d565b16610120880152604481013560221982360301811215610321570190602460048301359201988211610321578136038913610321577f09d18501db0080ca2d6cd7c17fa7255daff4b2d503ea93b76ff68b6752ea8e6387806103069560846102c561030e9a60209f610284906103149f9a60606101406102ef9d0152610160880191612388565b6102b66102ab61029760448801856129db565b605f198a8603810160a08c01529491612a10565b9260648701906129db565b918784030160c0880152612a10565b91013560e08301520390a13390919060405192600284526020840152604083015260608201604052565b906040519160018352602083015260408201604052565b9236916123a8565b90613c65565b5f8080808080808061015f565b5f80fd5b602486610331856125d7565b6040516335252be360e01b815291166004820152fd5b3461032157600319602036820112610321576004359067ffffffffffffffff82116103215760809082360301126103215761038660609160040161262b565b90604051921515835260208301526040820152f35b34610321576040366003190112610321576001600160a01b036103bc611861565b166040516370a0823160e01b8152306004820152602081602481855afa908115610441575f9161040f575b50156103f75760206040515f8152f35b60249060405190633c5bf76960e21b82526004820152fd5b90506020813d602011610439575b8161042a60209383611971565b810103126103215751826103e7565b3d915061041d565b6040513d5f823e3d90fd5b346103215761045a36611d01565b92809492610466612bf0565b610471828533613b61565b61047a816134d6565b15610567578061048e6104dd9286336140a7565b9790957f7f9dfa19cf1cc2f806f2f860fbc9c056b601fb1afc0e9b843dfe5c63616268e660806040513381526001600160a01b038416998a60208301528560408301526060820152a1336137bd565b9390918561050c575b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b61055b9661030e956103069460ff93604051956005875260208701526040860152606085015260808401521660a082015260c08101604052906040519160018352602083015260408201604052565b808080808080806104e6565b506040516306dde9c360e41b81523360048201526001600160a01b03841660248201526044810191909152606490fd5b0390fd5b346103215760203660031901126103215760043567ffffffffffffffff81116103215761030e6105d26104e6923690600401611cd0565b91906105dc612bf0565b604051926105e984611955565b5f845236916123a8565b34610321576003196020368201126103215767ffffffffffffffff600435116103215760c090600435360301126103215761062c612bf0565b5f808061064160048035608481019101612510565b905015610f36576024600435013592610659846134d6565b15610f245760608060405161066d81611909565b610675612565565b81525f60208201525f6040820152015261068d612565565b506106ed6106e86106c76106bd6106b76106b1608460043501600435600401612510565b90612597565b806125b2565b60408101906124a2565b60206106e06106b1608460043501600435600401612510565b0135916125c7565b6125d7565b936001600160a01b0361073c6106e86107236107196106b76106b1608460043501600435600401612510565b60608101906124a2565b60406106e06106b1608460043501600435600401612510565b816040519761074a896118d1565b168752166020860152604085015261076c608460043501600435600401612510565b9490506001604051955f87520160051b85016040525f905f5b610799608460043501600435600401612510565b9050811080610f11575b15610d5e576107bc608460043501600435600401612510565b821015610d4a578160051b810135607e198236030181121561032157608081830136031261032157604051916107f183611909565b8181013567ffffffffffffffff81116103215761081390369084840101611b02565b835280820160208181013590850152604080820135908501526060013567ffffffffffffffff81116103215761084c9236920101611cb5565b606082015280516001600160a01b0361086e6040830151602085015190611dbe565b5151166001600160a01b0385511614801590610d16575b610d045761089d602083015160408401519083613fa4565b6108a681612c32565b91825f525f60205260405f2054155f1461090a575051604080513381526001600160a01b039092166020830152810191909152600191907fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f390606090a15b01610785565b919061093b60208497959701516040850151906060860151906040519261093084611955565b5f8452339186613234565b5f94916109a457505051604080513381526001600160a01b03909216602083015281019190915260019291907f1e6fa9678edf81f9f25bbf308bde03ad3e110db1f429394b0915ba021532941490606090a15b811561099c575b5092610904565b905088610995565b6109b9606082015160446004350135906134f9565b15610a1357505051604080513381526001600160a01b03909216602083015281019190915260019291907fe3151dc8cb7a54ffc4baabd28c1f241c94d510b5e5b502491ac3cad6c16316d59080606081015b0390a161098e565b610a2060408201516134d6565b158015610cf1575b15610a7e57505051604080513381526001600160a01b03909216602083015281019190915260019291907f500b713857325f9e6dcb52ae832eca9109d107ed1aae9cb4928b4c1e13f051aa908060608101610a0b565b9250925050600196959691610a976064600435016125eb565b15610c5e5796610b0797610b1760408401516040880151610ab88183613543565b15610c565750925b610b11848592610afa610af460608a01516001600160e01b03601b918660e01d92828816810b928260e01d9216900b6145f4565b90614569565b9d8e9260408d015161356a565b60408c015261407d565b9961407d565b98610b228484613594565b610b2c84826135f2565b60405192338452608060208501526060610b528451608080880152610100870190611e19565b93602081015160a0870152604081015160c0870152015192607f198582030160e0860152835180825260208201906020808260051b8501019601925f5b828110610bee57505050505092806001979695937fbae4dbf76931c547f765e9def16d693d86daaa596f491de979008831789185ae93610be996604084015260608301520390a180858c5101808d5260051b8c01526138a9565b61098e565b9091929396602080610c49600193601f198782030189528b51906001600160a01b03825116815283820151848201526060610c3860408401516080604085015260808401906125f8565b920151906060818403910152611d4d565b9901950193929101610b8f565b905092610ac0565b610b0790610b176060840151610b11610c9c610af460408801516001600160e01b0394601b90868360e01d9316820b91878260e01d9216900b6145f4565b60408a0151610cab8183613543565b15610ce95750915b829c8d916060890151908116155f14610cda575060408801515b96879460408d015161356a565b610ce49085613fd9565b610ccd565b905091610cb3565b50610cff6060820151613520565b610a28565b60405163936bb5ad60e01b8152600490fd5b506001600160a01b03610d326060830151604085015190611dbe565b5151166001600160a01b036020860151161415610885565b634e487b7160e01b5f52603260045260245ffd5b50919390610d706064600435016125eb565b15610f0b57835b6004356004013590610d898282613543565b610eed5750508490610da9856001600160a01b0360208701511633613bf3565b505060a46004350190610dc18260043560040161246f565b905015159081610ee5575b50610e44575b506001600160a01b03610de892935116336140a7565b50505b8351811015610e105780610e0a610e0460019387611dbe565b5161371d565b01610deb565b5060409160017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005582519182526020820152f35b90506001600160a01b03602084015116610e6e6001600160a01b038551169260043560040161246f565b929091333b1561032157610eb65f93604051958694859463691f9ed760e01b8652600486015260248501528960448501528a606485015260a0608485015260a4840191612388565b038183335af190811561044157859115610dd2579050610ed69150611925565b5f836001600160a01b03610dd2565b905088610dcc565b604492506040519163573b6f4160e01b835260048301526024820152fd5b84610d77565b50610f1f60408301516134d6565b6107a3565b60405163315f9e2360e21b8152600490fd5b604051639c95219f60e01b8152600490fd5b34610321576020806003193601126103215760043567ffffffffffffffff811161032157610f7a903690600401611cd0565b919060405192610f8984611955565b5f8452828401610f9882611a55565b94610fa66040519687611971565b828652610fb283611a55565b93610fc486880195601f1901866124f4565b5f5b84811061102857604080518881528951818a018190525f92600582901b83018101918a918c9085015b828710610ffc5785850386f35b909192938280611018600193603f198a82030186528851611d4d565b9601920196019592919092610fef565b806110778861107161104460019560059d9c9d1b87018761246f565b929089846040519586938585013782018381015f81528b519283915e015f83820152038084520182611971565b30613f13565b611081828a611dbe565b5261108c8189611dbe565b5001969596610fc6565b34610321576003196040368201126103215760043567ffffffffffffffff8082116103215760c08260040193833603011261032157602435908111610321576110e3903690600401611cd0565b906110ec612bf0565b61111d61111861111361110c611102888061245a565b604081019061246f565b3691611993565b613e95565b613efe565b801561139b5760011015611389576024830161113981866124a2565b90501561137757604484019461114f86826124a2565b905015611365576111b561117d966111a961117461116d858061245a565b95856124a2565b999092856124a2565b91909261119a60405197611190896118a1565b33895236906119f7565b9a60209b8c8901523691611a6d565b60408601523691611a6d565b6060830152606485013560808301526111cd82612c32565b91825f525f875260405f20958654159687611211575b888860017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055604051908152f35b6001905560a46001600160a01b03917f87491344dfbcf91f6cbbc610cbbeedc85313d37a02df0c93527f7ea5f8db717f83855116604051908152878c82015260606040820152806112656060820188611e19565b0390a10191611274838561246f565b90506112b9575b505050506112ad92916103066102ef61030e933390919060405192600284526020840152604083015260608201604052565b828080808080806111e3565b6112c661110c848661246f565b6112cf816145d0565b156113425750937fd46c2c56b35c8210e9e712ec3f02242d5fc90187c0ac8ed80cc33626846ec369896112ad989795611335611318610306976102ef9761030e9b51169361246f565b866040519586958652850152606060408501526060840191612388565b0390a1938395965061127b565b89610597604051928392630c89984b60e31b845260048401526024830190611d4d565b60405163540e5f0b60e01b8152600490fd5b604051636c44ef8f60e01b8152600490fd5b604051633c8270bd60e21b8152600490fd5b604051632cff108b60e21b8152600490fd5b3461032157602080600319360112610321576024816001600160a01b036113d2611861565b16604051928380926370a0823160e01b82523060048301525afa908115610441575f91611403575b50604051908152f35b90508181813d8311611429575b61141a8183611971565b810103126103215751826113fa565b503d611410565b346103215761143e36611d01565b929161144b949194612bf0565b611456838333613b61565b61145f816134d6565b15611583578160ff916114778561153a969533612a60565b6114818183613543565b1561157d575080935b61149685828533613b95565b917f8045c25080b0868951141ed0a91720bcad09a8364a2b3109ee1fd49c1f0bc8b860c06114c5898833613bf3565b97906001600160a01b0360405192338452169a8b6020840152856040840152886060840152608083015260a0820152a16040519660068852602088015260408701526060860152608085015260a08401521660c082015260e08101604052906040519160018352602083015260408201604052565b90806115665760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b6115759261030e9136916123a8565b8080806104e6565b9361148a565b50604051623a3a4d60e21b81523360048201526001600160a01b039190911660248201526044810191909152606490fd5b34610321576080366003190112610321576004356001600160a01b0390818116809103610321576115e3611877565b6044359167ffffffffffffffff91606435838111610321573660238201121561032157806004013593841161032157366024858301011161032157611670956020921693611632868587613a82565b60405196879283926323e30c8b60e01b84523360048501528760248501528860448501525f606485015260a06084850152602460a485019201612388565b03815f855af1938415610441575f946116dc575b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd984036116c3576116b893503091613afb565b602060405160018152f35b604051630b6c58a960e31b815260048101859052602490fd5b9093506020813d602011611708575b816116f860209383611971565b8101031261032157519284611684565b3d91506116eb565b34610321576101403660031901126103215767ffffffffffffffff60043581811161032157611743903690600401611b02565b6024358281116103215761175b903690600401611b02565b60c0366043190112610321576101043583811161032157611780903690600401611cb5565b90610124359384116103215761179d6104e6943690600401611cb5565b926117a6612bf0565b611eca565b346103215760603660031901126103215760206117da6117c9611861565b6117d1611877565b60443591612a60565b604051908152f35b34610321576020366003190112610321576004355f525f6020526020600160405f205414604051908152f35b34610321576020366003190112610321576004359063ffffffff60e01b82168092036103215760209163e414309160e01b8114908115611850575b5015158152f35b6301ffc9a760e01b14905083611849565b600435906001600160a01b038216820361032157565b602435906001600160a01b038216820361032157565b35906001600160a01b038216820361032157565b60a0810190811067ffffffffffffffff8211176118bd57604052565b634e487b7160e01b5f52604160045260245ffd5b6060810190811067ffffffffffffffff8211176118bd57604052565b6040810190811067ffffffffffffffff8211176118bd57604052565b6080810190811067ffffffffffffffff8211176118bd57604052565b67ffffffffffffffff81116118bd57604052565b60e0810190811067ffffffffffffffff8211176118bd57604052565b6020810190811067ffffffffffffffff8211176118bd57604052565b90601f8019910116810190811067ffffffffffffffff8211176118bd57604052565b92919267ffffffffffffffff82116118bd57604051916119bd601f8201601f191660200184611971565b829481845281830111610321578281602093845f960137010152565b9080601f83011215610321578160206119f493359101611993565b90565b91906060838203126103215760405190611a10826118d1565b8193611a1b8161188d565b8352611a296020820161188d565b602084015260408101359167ffffffffffffffff831161032157604092611a5092016119d9565b910152565b67ffffffffffffffff81116118bd5760051b60200190565b929192611a7982611a55565b604092611a896040519283611971565b819581835260208093019160061b84019381851161032157915b848310611ab257505050505050565b8583830312610321578386918251611ac9816118ed565b611ad28661188d565b81528286013583820152815201920191611aa3565b9080601f83011215610321578160206119f493359101611a6d565b91909160a0818403126103215760405190611b1c826118a1565b8193611b278261188d565b835267ffffffffffffffff9160208101358381116103215782611b4b9183016119f7565b602085015260408101358381116103215782611b68918301611ae7565b6040850152606081013592831161032157611b896080939284938301611ae7565b60608501520135910152565b90929192611ba281611a55565b91604094611bb36040519485611971565b839583855260208095019160059460051b8401948186116103215784935b868510611be2575050505050505050565b67ffffffffffffffff90853582811161032157870190608082860312610321578551611c0d81611909565b611c168361188d565b81528a8301358b8201528683013584811161032157830186601f8201121561032157803590611c4482611a55565b91611c518a519384611971565b8083528d80840191891b83010191898311610321578e809101915b838310611ca557505050508782015260608084013594851161032157611c96878d968796016119d9565b90820152815201940193611bd1565b82358152918101918f9101611c6c565b9080601f83011215610321578160206119f493359101611b95565b9181601f840112156103215782359167ffffffffffffffff8311610321576020808501948460051b01011161032157565b906080600319830112610321576004356001600160a01b0381168103610321579160243591604435916064359067ffffffffffffffff821161032157611d4991600401611cd0565b9091565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b805115610d4a5760200190565b805160011015610d4a5760400190565b805160021015610d4a5760600190565b805160031015610d4a5760800190565b805160041015610d4a5760a00190565b8051821015610d4a5760209160051b010190565b9081518082526020808093019301915f5b828110611df1575050505090565b835180516001600160a01b031686528201518583015260409094019392810192600101611de3565b90608080611e8f611e7d611e6b60406001600160a01b0380895116885260208901519060a060208a01528082511660a08a015260208201511660c08901520151606060e0880152610100870190611d4d565b60408701518682036040880152611dd2565b60608601518582036060870152611dd2565b93015191015290565b90611ea282611a55565b611eaf6040519182611971565b8281528092611ec0601f1991611a55565b0190602036910137565b926001600160a01b038451166001600160a01b0383511614612376576001600160a01b03611eff606086015160643590611dbe565b515116906040830151916001600160a01b03611f1e6084358095611dbe565b51511614801590612336575b610d04576040850151906001600160a01b03611f496044358094611dbe565b5151166001600160a01b03611f6460643560608a0151611dbe565b5151161461232457611f7586612c32565b805f525f60205260405f2054156122d15750611f9084612c32565b805f525f60205260405f20541561227d5750612075929161204d917f6fa7f4c28634b0a9d6831401c45ae468195fb63aed07308935c35374ff5d9e3960405180611ff8611fea61012033845280602085015283018d611e19565b82810360408401528a611e19565b85606083015260643560808301528760a083015260a43560c083015260c43560e083015260e4356101008301520390a16001600160a01b038651166040519261204084611955565b5f8452606435908a612e9c565b9490506001600160a01b038651166040519261206884611955565b5f845260a4359086612e9c565b92905061208560408201516134d6565b158015612269575b8015612256575b8015612243575b61223157604051916120ac83611909565b5f83525f60208401525f60408401525f60608401526120cb84836144e1565b845260408401526120f16120df83866144e1565b6020860152806060860152845161356a565b94612105602085015160408601519061356a565b9361210f87613520565b8015612222575b612210576121d7612209957fd9fa84dd790c969daa5c33d8050dc06b4a9b59d5b42e2be5f5e8ae20447f618d946121b961220e9a60a0966121588a8851613594565b6121668c6020890151613594565b6121748a60408901516135f2565b6121828c60608901516135f2565b61218b8a61371d565b6121948c61371d565b6001600160a01b036121b060c435926060606435910151611dbe565b515116336137bd565b50506001600160a01b036121b060e43592606060a435910151611dbe565b5050606060405191338352805160208401526020810151604084015260408101518284015201516080820152a16138a9565b6138a9565b565b604051630d86822160e01b8152600490fd5b5061222c85613520565b612116565b6040516321badf1f60e01b8152600490fd5b506122516060840151613520565b61209b565b506122646060820151613520565b612094565b5061227760408401516134d6565b1561208d565b9351604080513381526001600160a01b039092166020830152810194909452507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f3945091925082915050606081015b0390a1565b9551604080513381526001600160a01b039092166020830152810196909652507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f3949350839250506060820190506122cc565b604051631cd2f1c760e21b8152600490fd5b506001600160a01b03612350606085015160a43590611dbe565b5151166001600160a01b0361236c604088015160443590611dbe565b5151161415611f2a565b604051630a98f1f360e21b8152600490fd5b908060209392818452848401375f828201840152601f01601f1916010190565b909291926123b581611a55565b916040916123c66040519485611971565b839581855260208095019160051b8301938185116103215783925b8584106123f15750505050505050565b67ffffffffffffffff90843582811161032157860190838286031261032157835161241b816118ed565b823584811161032157866124309185016119f7565b8152898301359384116103215761244b868b95869501611cb5565b838201528152019301926123e1565b903590605e1981360301821215610321570190565b903590601e1981360301821215610321570180359067ffffffffffffffff82116103215760200191813603831361032157565b903590601e1981360301821215610321570180359067ffffffffffffffff821161032157602001918160061b3603831361032157565b5f5b608081106124e6575050565b6060828201526020016124da565b5f5b82811061250257505050565b6060828201526020016124f6565b903590601e1981360301821215610321570180359067ffffffffffffffff821161032157602001918160051b3603831361032157565b60405190612553826118d1565b60606040835f81525f60208201520152565b60405190612572826118a1565b5f608083828152612581612546565b6020820152606060408201526060808201520152565b9015610d4a57803590607e1981360301821215610321570190565b903590609e1981360301821215610321570190565b9190811015610d4a5760061b0190565b356001600160a01b03811681036103215790565b3580151581036103215790565b9081518082526020808093019301915f5b828110612617575050505090565b835185529381019392810192600101612609565b9061264361014461263c84806125b2565b3690611b02565b5f5260205f81526040926001845f2054036129d057916128c5916126ca85855f61284a6126738361268a9a6125b2565b61268f878501359182878701359c8d923690611b02565b613fa4565b6126a761269c85806125b2565b946060810190612510565b96906126c28751966126b888611955565b8688523690611b02565b973691611b95565b906126d3612c63565b506127fa8651916126e3836118a1565b600483526126f28a84016124d8565b886126fc81612c32565b988b6001600160a01b039a8b84511690835192600384528301528282015233606082015260808101825261272f86611d71565b5261273985611d71565b508051612745816118d1565b6002815281368e83013761275886611d7e565b5261276285611d7e565b50810160ff8c6127c56127ae8d806127878161277f8b8a51611dbe565b515116614172565b97511690612796898851611dbe565b515116846127a58a8951611dbe565b51015191612a60565b958d6127bb828751611dbe565b5151169451611dbe565b51015192169093929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b61280382611d8e565b5261280d81611d8e565b506128318b886060810160ff8c6127c56127ae8d806127878161277f8b8a51611dbe565b61283a82611d9e565b5261284481611d9e565b50614250565b918385511693868601918b83519289818551169401511693878652308a5281808720915101519082519261287d84611955565b878452519561288b87611939565b86528a8601528d85015284606085015285608085015260a084015260c08301528a5180809a819463d04dfe2360e01b835260048301612de4565b03915afa95865f915f986129aa575b506128e35788513d5f823e3d90fd5b95938651600281106129935750888798998260c0979899015199015161291161290b85611dae565b51611d9e565b5161291c8183613543565b156129895750998a925b6129488b85919060405192600284526020840152604083015260608201604052565b61295186611d8e565b5261295b85611d8e565b5082519661296888611939565b8752860152840152866060840152608083015260a082015201526001929190565b9050998a92612926565b6024908a5190630fbb8e5560e21b82526004820152fd5b9097506129c991503d805f833e6129c18183611971565b810190612ca0565b965f6128d4565b505f92508291829150565b9035601e198236030181121561032157016020813591019167ffffffffffffffff8211610321578160061b3603831361032157565b9190808252602080920192915f905b828210612a2d575050505090565b909192936001906001600160a01b03612a458761188d565b16815285830135838201526040908101950193920190612a1f565b8215612a95576001600160a01b038091165f52600160205260405f2091165f5260205260405f20905f5260205260405f205490565b909150612aa182614172565b6001600160a01b03809316906040918251946370a0823160e01b86528416938460048701526020928387602481865afa968715612bb7575f97612bc1575b5083612af8612af183612b289a614f36565b50906149f8565b508651636eb1769f60e11b81526001600160a01b0390941660048501523060248501529297889081906044820190565b0381865afa968715612bb7575f97612b86575b50612af1612b4c916119f498614f36565b50612b578183613543565b15612b7e5750935b5f5260018252825f20905f528152815f20905f8052525f20549061407d565b905093612b5f565b96508387813d8311612bb0575b612b9d8183611971565b8101031261032157955195612af1612b3b565b503d612b93565b85513d5f823e3d90fd5b96508387813d8311612be9575b612bd88183611971565b810103126103215795519583612adf565b503d612bce565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f006002815414612c205760029055565b604051633ee5aeb560e01b8152600490fd5b604051612c5d81612c4f6020820194602086526040830190611e19565b03601f198101835282611971565b51902090565b60405190612c7082611939565b606060c083612c7d612565565b81525f60208201525f60408201525f838201528260808201525f60a08201520152565b919060408382031261032157825167ffffffffffffffff908181116103215784019082601f83011215610321578151602092612cdb82611a55565b91612ce96040519384611971565b808352848084019160051b830101918683116103215785809101915b838310612d785750505050948281015191821161032157019180601f84011215610321578251612d3481611a55565b93612d426040519586611971565b818552838086019260051b820101928311610321578301905b828210612d69575050505090565b81518152908301908301612d5b565b8251815291810191869101612d05565b90808251908181526020809101926020808460051b8301019501935f915b848310612db65750505050505090565b9091929394958480612dd4600193601f198682030187528a516125f8565b9801930193019194939290612da6565b91906020928381526001600160a01b0382511684820152838201516040820152612e1e604083015160e06060840152610100830190611d4d565b9060608301516080820152612e45608084015192601f1993848483030160a0850152612d88565b9260a081015193838382030160c08401528680865192838152019501905f5b818110612e88575050506119f494955060c060e091015192828503019101526125f8565b825187529588019591880191600101612e64565b94959395929192612eab612c63565b50604096875190612ebb826118a1565b60048252602093612ecd8584016124d8565b612ed689612c32565b6001600160a01b038097818c51168d519360038552898501528d840152166060820152608081018b52612f0884611d71565b52612f1283611d71565b508951612f1e816118d1565b600281528a3687830137612f3184611d7e565b52612f3b83611d7e565b50898901908681835190612f4e91611dbe565b515116612f5a90614172565b86888c51168984865190612f6d91611dbe565b5151168285875190612f7e91611dbe565b51015190612f8b92612a60565b928981865190612f9a91611dbe565b515116945190612fa991611dbe565b5101519060ff16612fe1929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b612fea83611d8e565b52612ff482611d8e565b5060608801858782519061300791611dbe565b51511661301390614172565b868a5116878984519061302591611dbe565b515116878a85519061303691611dbe565b5101519061304392612a60565b908689898186519061305491611dbe565b51511694519061306391611dbe565b5101519060ff1661309b929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b6130a483611d9e565b526130ae82611d9e565b506130b891614250565b9183875116938188019283519183818451169301511693865f523084528a805f20915101518b51916130e983611955565b5f83528c51966130f888611939565b8752858701528b8601525f60608601526080850186905260a085015260c0840152885163d04dfe2360e01b815292839081906131379060048301612de4565b03815a935f94fa91825f915f94613216575b506131585788513d5f823e3d90fd5b979495969791948251966002881097886131ff5750818385015194015161318161290b87611dae565b5161318c8183613543565b156131f75750925b6131b68585919060405192600284526020840152604083015260608201604052565b6131bf87611d8e565b526131c986611d8e565b5082519a6131d68c611939565b8b528a01528801526060870152608086015260a085015260c0840152159190565b905092613194565b602490835190630fbb8e5560e21b82526004820152fd5b90935061322d91503d805f833e6129c18183611971565b925f613149565b95949193908693613243612c63565b505f92604061335e815192613257846118a1565b600484526020936132698582016124d8565b6133276132758b612c32565b8b6001600160a01b03998a9283835116895191600383528b830152898201528360609b168b8201526080810189526132ac86611d71565b526132b685611d71565b5087516132c2816118d1565b6002815288368b8301376132d586611d7e565b526132df85611d7e565b5060ff896127c58a85019361331b876132fd8161277f858a51611dbe565b9751168861330c848951611dbe565b515116856127a5858a51611dbe565b966127bb828751611dbe565b61333082611d8e565b5261333a81611d8e565b50612831878b8d60ff896127c58c85019361331b876132fd8161277f858a51611dbe565b946133de5f868a511698869786889c0191825191888184511693015116928c8552308952878086209151015188519161339683611955565b8683528951956133a587611939565b86528a86015288850152848a8501528b608085015260a084015260c08301528551808095819463d04dfe2360e01b835260048301612de4565b03915afa90815f915f936134b8575b506134ab575050505f975b6002855110988915996134985782848701519601519061341a61290b89611dae565b51906134268284613543565b1590506134905750925b6134528685919060405192600284526020840152604083015260608201604052565b61345b88611d8e565b5261346587611d8e565b5082519b6134728d611939565b8c528b0152890152870152608086015260a085015260c08401529190565b905092613430565b50505050505050505091506119f4612c63565b91999850945093966133f8565b9092506134cf91503d805f833e6129c18183611971565b915f6133ed565b6134f5905f60e01d906001600160e01b038160e01d9116601b0b614fed565b1290565b906134f5916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b61506e565b61353f905f60e01d906001600160e01b038160e01d9116601b0b614fed565b1390565b9061353f916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b61506e565b6119f491610af4916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614544565b6135ee9160808101826135b06135aa8351611dae565b51611dae565b526135e76135e16001600160a01b038094515116936135d86135d28551611dae565b51611d71565b51169251611dae565b51611d8e565b5191613b95565b5050565b906080810191806136066135aa8551611d9e565b526001600160a01b038092515116916136226135d28551611d9e565b51166136316135e18551611d9e565b5190816136e55761364183613520565b6136cc579183917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a95936122cc955f5260209060018252613697604094855f20835f528452855f20855f528452855f205461407d565b945f5260018252835f20905f528152825f20915f52525f20555b51604051918291338352604060208401526040830190612d88565b60405163793a8f5560e01b815260048101849052602490fd5b91613716917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a95936122cc956137bd565b50506136b1565b6080810161372e6135e18251611d9e565b5191821561373b57505050565b6137556135d26001600160a01b0380935151169351611d9e565b5116815f5260209160018352604092835f20835f528152835f20855f528152835f2054936001600160e01b038516613790575b505050505050565b6137b4955f9284845260018152828420868552815282842091845252812055613bf3565b5f808080613788565b939291936137ca83613520565b6136cc57846137e6576137de939450613bf3565b50505f905f90565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f528152613823835f2054948561407d565b9561382d87613520565b613850575f97885260018252838820908852815282872091875252909320829055565b835163c5e12af560e01b815260048101889052602490fd5b90604082019082526020606081936040838201528551809452019301915f5b828110613895575050505090565b835185529381019392810192600101613887565b60c0810151908151915f92613a1d575b5061395e6020918281510151926001600160a01b039081818187511696015116928660a082019485518252308452604097888320898686510151015160808601518b519161390683611955565b8683528c519361391585611955565b8785528d519661392488611939565b8752898701528c86015260016060860152608085015260a084015260c08301528851808099819463d04dfe2360e01b835260048301612de4565b03915afa948515613a135787956139f5575b508451613981575b50505050505050565b81905101510151169051813b156139f1579184918493836139b6965180978195829463012c676d60e21b845260048401613868565b03925af19081156139e857506139d1575b8080808080613978565b6139db8291611925565b6139e557806139c7565b80fd5b513d84823e3d90fd5b8480fd5b613a0a9195503d8089833e6129c18183611971565b9050935f613970565b86513d89823e3d90fd5b6001600160a01b03602080845101510151169060a083015190823b1561032157613a60925f928360405180968195829463012c676d60e21b845260048401613868565b03925af1801561044157156138b957613a7a919250611925565b5f905f6138b9565b6040519263a9059cbb60e01b5f526001600160a01b0380931660045260245260205f60448180855af160015f5114811615613adc575b8360405215613ac657505050565b635274afe760e01b835216600482015260249150fd5b6001811516613af257813b15153d151616613ab8565b833d5f823e3d90fd5b9092604051936323b872dd60e01b5f526001600160a01b0393848092166004521660245260445260205f60648180855af160015f5114811615613b4b575b836040525f60605215613ac657505050565b6001811516613af257813b15153d151616613b39565b909115613b6c575050565b6040516305dbdfd960e41b81526001600160a01b03918216600482015291166024820152604490fd5b93929193613ba283613520565b6136cc5784613bb6576137de9394506140a7565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f528152613823835f2054948561356a565b90929192613c0081614573565b93613c0a81613520565b613c535784816001600160e01b03613c299360e01d9116601b0b615198565b50809281613c39575b5050509190565b6001600160a01b03613c4b9316613a82565b5f8181613c32565b604051632d1671a360e11b8152600490fd5b916040805191613c74836118a1565b60048084526020613c868186016124d8565b5f5b8751811015613cbb5780613c9e6001928a611dbe565b51613ca98289611dbe565b52613cb48188611dbe565b5001613c88565b5092955092939093335f52308352855f2091865190613cd9826118ed565b613ce1612546565b8252606085819301528751613cf581611955565b5f8152885191613d0483611955565b5f83525f3681375f5b8151811015613e6a57613d208183611dbe565b5190888c8b84519189818401518d8d8251613d48575b50505050505050506001915001613d0d565b5f613db797948197948c9794613d758c956001600160a01b039d8e81818d51169c0151169b015190614250565b94865199613d828b611939565b8a528901528488015286015260808501528a60a08501528b60c08501525180958194829363d04dfe2360e01b84528301612de4565b03915afa938415613e60578b915f95613e42575b508451613de0575b50908b8e89838d8d613d36565b51015116803b1561032157613e0f925f918c8f84905180978195829463012c676d60e21b845233908401613868565b03925af1918215613e3857600192613e29575b8981613dd3565b613e3290611925565b5f613e22565b8c513d5f823e3d90fd5b613e579195503d805f833e6129c18183611971565b9050935f613dcb565b8e513d5f823e3d90fd5b5050505050505050509050565b8115613e81570490565b634e487b7160e01b5f52601260045260245ffd5b6040815110613ef1576020810151908051603f198101908111613edd5760051c8211613ec95760016020920160051b010190565b5050604051613ed781611955565b5f815290565b634e487b7160e01b5f52601160045260245ffd5b50604051613ed781611955565b805115613f0e57602001515f1a90565b505f90565b905f8091602081519101845af48080613f91575b15613f475750506040513d81523d5f602083013e60203d82010160405290565b15613f6e57604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b3d15613f7f576040513d5f823e3d90fd5b60405163d6bda27560e01b8152600490fd5b503d151580613f275750813b1515613f27565b91613fcf906060613fc4936001600160a01b039485916040880151611dbe565b515116940151611dbe565b5151161461232457565b6140006001600160e01b0392838316601b0b9260e01d938160e01d9116601b0b84846147af565b90637ffffff58213614050575b90614017916149f8565b9290921580614048575b61402a57505090565b6044925060405191638eba4d0760e01b835260048301526024820152fd5b508215614021565b61405a82826156c1565b1561400d57604483856040519163d556b11160e01b835260048301526024820152fd5b6119f491610af4916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614d9d565b9291926140b382614573565b936140bd81613520565b61411e5784816001600160e01b036140dc9360e01d9116601b0b615198565b9290809315614109575b508290816140f5575050509190565b613c4b926001600160a01b03309216613afb565b9092505f198114613edd57600101915f6140e6565b604051632eaefac360e21b8152600490fd5b6004111561413a57565b634e487b7160e01b5f52602160045260245ffd5b602090939291936001600160a01b03604082019516815261416e83614130565b0152565b61417a6156da565b60408051630782d7e160e01b81526001600160a01b03831660048201529091828260248173200e12d10bb0c5e4a17e7018f0f1161919bb93895afa928315614247575f925f94614212575b506141cf83614130565b600183141580614200575b6141e45750505090565b5163ee07877f60e01b815291829161059791906004840161414e565b5061420a83614130565b8215156141da565b908094506142369293503d8511614240575b61422e8183611971565b810190614f0c565b919091925f6141c5565b503d614224565b513d5f823e3d90fd5b61425a8251611e98565b6142648351611e98565b9282519281518015155f146144d957600201935b6001940184019061428882611a55565b956142a360409361429b8551998a611971565b808952611a55565b6142b5602091601f1901828a016124f4565b5f9584519389896002926002885233868901523089890152606097606081018a526142df84611d71565b526142e983611d71565b505f825b614499575b505050508651614309575b50505050505050505090565b9091929360028861432c8c866143258e809c9d9e018093611dbe565b528d611dbe565b500185614339828d611dbe565b52614344818c611dbe565b505f965b614353575b506142fd565b8851871015614494576001600160a01b036143ff898b856143f68c60428c8861437c8488611dbe565b51511696858261438c868a611dbe565b5101519261439a868a611dbe565b51838d82511691015182815160051b910120908451927f6ec4dff745ec96dbde88c5d41f8aa5ac13aa1664afb47b8406b44fa945a650c88452830152838201522090519161190160f01b83528d83015260228201522093611dbe565b51015191614f64565b1561447c578761446b8b8e8c8f9e9d9c9b9a999897968f614458918d61444e898f8f61443a83889f614431828f611dbe565b51511692611dbe565b52614445828b611dbe565b51015192611dbe565b52019c8d94611dbe565b5101516144658383611dbe565b52611dbe565b500196979895909192939495614348565b8851630a57f30960e31b815260048101899052602490fd5b61434d565b9091929a82518210156144d157906144c584809301809d6144ba8487611dbe565b516144658383611dbe565b50019082918d936142ed565b9a92916142f2565b505f93614278565b916040830192604061451b610af4606087519401938451906001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6145f4565b9451930161452a8151866134f9565b614532575050565b9093506119f491925051925183613fd9565b919291600160ff1b840161455c57611d4993506150c3565b90611d49935f0391614d9d565b61401782826149f8565b61457b6156da565b6040805163b7bad1b160e01b81526001600160a01b0383166004820152909182826024815f73200e12d10bb0c5e4a17e7018f0f1161919bb93895af1928315614247575f925f9461421257506141cf83614130565b6008815110613f0e576008015167ffffffffffffffff1667ff0a89c674ee78741490565b9091939284158215175f1461460e5750505090505f905f90565b82810192600160fd1b8082019083011760fe1c614745575b505061463181615386565b9361463b81615386565b9461464686826153a6565b90918215614736575f9083986f0785ee10d5da46d900f436a000000000808611614728575b50670de0b6b3a7640000808b11614719575b50633b9aca00808b1161470a575b50612710808b116146fc575b5098805b6146eb57508190611d49989982600a0a9109960195817fcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccd0a93838211900382610100031b9203901c1702916153b9565b60019290920191600a90048061469b565b60049a04998a930192614697565b600991939a049901915f61468b565b601291939a049901915f61467d565b85049950602592505f61466b565b50929050611d499495506153b9565b5f8212156147995780841361478b575b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb284131561462657909250611d499394916152c4565b909250611d4993949161532b565b8084121561475557909250611d499394916152c4565b929091806147d5576044848460405191637a97930f60e01b835260048301526024820152fd5b90919280155f146147ea57505050505f905f90565b614803936147f791615473565b92919490938492615473565b909391928461481188615386565b9161481b86615386565b947f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000094604c918688106149c2575b030191600160ff1b98838a018112155f1461498f575050035b5f955f821280614986575b614968575b5f811280614956575b6149385786820103966001600160ff1b038814908161492e575b5080614925575b8061491c575b6148fe5750906148b2929161561f565b915f81136148c5575b50611d49936153b9565b9091604c82136148f3576148dc91600a0a90613e77565b9081156148e9575f6148bb565b505050505f905f90565b50505050505f905f90565b876044916040519163d556b11160e01b835260048301526024820152fd5b505f85126148a2565b5082841461489c565b905088145f614895565b604489836040519163d556b11160e01b835260048301526024820152fd5b50806001600160ff1b0301821361487b565b95508087018613156149805786818703015b95614872565b5f61497a565b505f811361486d565b89985090920390506001600160ff1b03819003870182136149b35701860194614862565b5050505050505050505f905f90565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009650604b9250614849565b8115613e81570590565b8082601b82810b8314614bed577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000008405614b99575b8380820b03614b8857507b199999999999999999999999999999999999999999999999999999987b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc84011115614b39575b838060030b03614abd575b808413614aa15750506001600160e01b036001925b60e01b91161791565b8303600a0a8015613e81576001600160e01b0391071592614a98565b92915f841315614b0d575090614ad383836156c1565b614aef57637ffffffe1901600a0a810290637fffffff92614a83565b506044916040519163d556b11160e01b835260048301526024820152fd5b637fffffff1992830390604382136148f357614b2c91600a0a906149ee565b9182156148e95792614a83565b5f198401808060030b14614b4d5750614a78565b90506001600160e01b039293507b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff915060e01b9260ff1d181617905f90565b600190940193600a90930592614a2b565b937f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000840515614bda576305f5e100600894058094819201955b915050614a2b565b620186a060059405809481920195614bd2565b5082614a7857505050505f90600190565b919291600160ff1b9190801580614d8b575090614c1a91615473565b9490929091905f868585858282138015614d82575b614d65575b505050508682841860ff1c94860391039081604c038111614d4a5701600a0a808205919084614d30575b505081019182821860ff1c1115614d2857826001600160ff1b0314614d0a57905f600192135f14614cdb57600a9004915b01925b81158117614c9f57509190565b80614cb8575b508015614cb0579190565b505f91508190565b9192614cce9203600160ff1b01600a0a906149ee565b600160ff1b91905f614ca5565b600a60037fe6666666666666666666666666666666666666666666666666666666666666679201040191614c8f565b604490836040519163d556b11160e01b835260048301526024820152fd5b509092614c92565b8107614d3d575b80614c5e565b60ff1d600117015f614d37565b505050919350614d58579190565b60018160ff1d1790039190565b5f9a50909750909550600160ff1b94509250905086808080614c34565b50835f12614c2f565b15614d965750509190565b9350919050565b9392919384158115818117614eee57505090614db891615473565b9194908295614dc982958294615473565b8096929491969387868482138015614ee5575b614ecc575b5050505050508682841860ff1c94860391039081604c038111614d4a5701600a0a808205919084614eb2575b505081019182821860ff1c1115614eaa57826001600160ff1b0314614d0a57905f600192135f14614e7b57600a9004915b01925b81158117614e4e57509190565b80614e5e57508015614cb0579190565b600160ff1b93614e759291038401600a0a906149ee565b5f614ca5565b600a60037fe6666666666666666666666666666666666666666666666666666666666666679201040191614e3e565b509092614e41565b8107614ebf575b80614e0d565b60ff1d600117015f614eb9565b929b5098509196509450925090505f8080808080614de1565b50858412614ddc565b9395939092919015614f04575050614cb0579190565b945092915050565b919082604091031261032157815160048110156103215760209092015160ff811681036103215790565b9060ff165f03916001600160ff1b0382115f14614f5c57600a6001818404940192061590565b909190600190565b9091813b614f9f57614f769192615743565b50614f8081614130565b159182614f8c57505090565b6001600160a01b03918216911614919050565b6020918160645f935160405192630b135d3f60e11b9788855260048501526040602485015286820190604485015e8281018201859052601f01601f191601915afa905f5114601f3d11161690565b92915f9060018184145f87128715171717615067575f92808213615059575b03604c81135f82121761504d57600a0a908461502b83820293846149ee565b146150405750501561503c575f9190565b5f90565b90935090156119f4579190565b50501561503c575f9190565b5f956001945092509061500c565b5050505f90565b93929190918083145f83125f871218831587151717176150bd575f928082136150b05703604c81135f82121761504d57600a0a908461502b83820293846149ee565b919460019350919061500c565b50919050565b909291600160ff1b91828101615155575080841461514b57808413918215615143578185035b604c8111156151325750505f915b1561512357507f8000000000000000000000000000000000000000000000000000000000000001019190565b92506001600160ff1b03039190565b600a0a908115613e815704916150f7565b8482036150e9565b505090505f905f90565b9361516292945f03614bfe565b80939180928114615176575b50505f039190565b915092506001600160ff1b038314614d0a57600a600191059201915f8061516e565b91925f8312156151c0576044838360405191634a7d166b60e01b835260048301526024820152fd5b9192836151d257505090505f90600190565b60ff811682019180831261529a575f83121561520a575050604c198112614cb0575f03600a0a916152038382613e77565b9283021490565b909293915f81135f1461529057604d811361526557600a0a928315613e8157835f1904831161523c5750500290600190565b60405163c849483b60e01b815260048101849052602481019290925260ff166044820152606490fd5b5060405163c849483b60e01b81526004810192909252602482015260ff919091166044820152606490fd5b5050905090600190565b60405163c849483b60e01b815260048101869052602481019190915260ff82166044820152606490fd5b909392915f6152d49181846145f4565b9490945f8483019182019412159081615321575b8115615317575b506152f957505090565b604492506040519163d556b11160e01b835260048301526024820152fd5b905083125f6152ef565b82811291506152e8565b61534093600160fe1b908101939201906145f4565b9081815f821215615377575050604b1982126137de57615365915f03600a0a906149ee565b908161536f575f90565b600160ff1b90565b93600160ff1b90910192509050565b5f8112156119f457600160ff1b9080820361539f575090565b90505f0390565b905f198183099102908180821091030391565b92939291905f818418121561544e576001600160ff1b03928383111561543857600160ff1b938385036153ee57505050509190565b90919293508514615408575050600a600191045f03920190565b604051630ed8062160e21b8152600481019190915260248101919091526044810182905260648101849052608490fd5b5090915050600160ff1b8114613edd575f039190565b90916001600160ff1b0380841115613c32578514615408575050600a60019104920190565b919091801561561557827f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000080830515615523575b507f19999999999999999999999999999999999999999999999999999999999999997f0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc830110615514575b83136154fe5791905f90565b919060018060ff1b926001600160ff1b03030190565b9290600a02905f1901926154f2565b6f4b3b4ca85a86c47a098a22400000000080840515615603575b507728c87cb5c89a2571ebfdcb54864ada834a000000000000008305156155ec575b7b097edd871cfda3a5697758bf0e3cbb5ac5741c6400000000000000008305156155d8575b7e3899162693736ac531a5a58f1fbb4b746504382ca7e40000000000000000008305156155c8578205156155b9575b5f6154a7565b9290600a02905f1901926155b3565b9391606402916001190193615584565b93916402540be40002916009190193615584565b9391678ac7230489e800000291601219019361555f565b6025198301955092909202915f61553d565b505f915081908190565b90915f19838309928083029283808610950394808603958487101561569d5714615695579082910960018219018216809204600280826003021880830282030280830282030280830282030280830282030280830282030280920290030293600183805f03040190848311900302920304170290565b505091500490565b60648386866040519263362ced0960e11b8452600484015260248301526044820152fd5b6119f491905f8112156156d5575f0361577d565b61577d565b73200e12d10bb0c5e4a17e7018f0f1161919bb9389803b158015615718575b6157005750565b602490604051906373e6d7b360e01b82526004820152fd5b507f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d41813f14156156f9565b81519190604183036157735761576c9250602082015190606060408401519301515f1a9061580c565b9192909190565b50505f9160029190565b90637ffffff581131561580657637ffffffe19810190604382136157ff575f8212156157d357637fffffff91505f0301600a0a7b8000000000000000000000000000000000000000000000000000000202111590565b50600a0a8015613e81577b80000000000000000000000000000000000000000000000000000001041090565b5050151590565b50505f90565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411615883579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa15610441575f516001600160a01b0381161561587957905f905f90565b505f906001905f90565b5050505f916003919056000000000000000000000000000000000000000000000000000000000000200e12d10bb0c5e4a17e7018f0f1161919bb93890000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000044b608060405234801561000f575f80fd5b506004361061004a575f3560e01c80630782d7e11461004e57806354636d2b14610078578063b7bad1b11461009d578063f5c36eaf146100b0575b5f80fd5b61006161005c366004610363565b6100c3565b60405161006f929190610403565b60405180910390f35b61008b610086366004610363565b6100d8565b60405160ff909116815260200161006f565b6100616100ab366004610363565b6100e9565b61008b6100be366004610363565b6100f5565b5f806100cf5f84610100565b91509150915091565b5f6100e35f836101f0565b92915050565b5f806100cf5f84610281565b5f6100e35f83610356565b73ffffffffffffffffffffffffffffffffffffffff81165f9081526020838152604080832081518083019092525460ff8082161515835261010090910416818301527f313ce56700000000000000000000000000000000000000000000000000000000808452839283908190816004818a5afa915060203d1015610182575f91505b811561019857505f5160ff811115610198575f91505b816101af57505050602001516003925090506101e9565b83516101c3575f955093506101e992505050565b836020015160ff1681146101d85760026101db565b60015b846020015195509550505050505b9250929050565b5f805f6101fd8585610281565b909250905060018260038111156102165761021661039d565b1415801561023557505f8260038111156102325761023261039d565b14155b156102795783826040517fee07877f000000000000000000000000000000000000000000000000000000008152600401610270929190610421565b60405180910390fd5b949350505050565b5f805f8061028f8686610100565b90925090505f8260038111156102a7576102a761039d565b0361034b576040805180820182526001815260ff838116602080840191825273ffffffffffffffffffffffffffffffffffffffff8a165f908152908b9052939093209151825493517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009094169015157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff161761010093909116929092029190911790555b909590945092505050565b5f805f6101fd8585610100565b5f60208284031215610373575f80fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114610396575f80fd5b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b600481106103ff577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b9052565b6040810161041182856103ca565b60ff831660208301529392505050565b73ffffffffffffffffffffffffffffffffffffffff831681526040810161039660208301846103ca56000000000000000000000000000000000000000000"; diff --git a/src/generated/candidate/GenericPoolRaindexV6FlashBorrower.sol b/src/generated/candidate/GenericPoolRaindexV6FlashBorrower.sol index 816f36ff5a..d542a9a233 100644 --- a/src/generated/candidate/GenericPoolRaindexV6FlashBorrower.sol +++ b/src/generated/candidate/GenericPoolRaindexV6FlashBorrower.sol @@ -5,23 +5,23 @@ pragma solidity ^0.8.25; // THIS FILE IS AUTOGENERATED BY THE BUILD SCRIPT. DO NOT EDIT BY HAND. /// @dev Hash of the known bytecode. -bytes32 constant BYTECODE_HASH = bytes32(0x5b3ce3c0d954e90d560857fbd84878f47c2311b44c7f17b2fb5d6b96f02b3453); +bytes32 constant BYTECODE_HASH = bytes32(0xd38a01ef5cb6a483c623ddc8df033838d8c146b756ad87c99e97d0a10d29a514); /// @dev The deterministic deploy address of the contract when deployed via /// the Zoltu factory. -address constant DEPLOYED_ADDRESS = address(0xFe9405856A916da72AF04F49ff15285638c0D948); +address constant DEPLOYED_ADDRESS = address(0x1fc14F5F8B22a7dEC2Da3E76c065f5364855904e); /// @dev The creation bytecode of the contract. bytes constant CREATION_CODE = - hex"6080604052348015600e575f80fd5b5060017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055612ebb806100405f395ff3fe608060405260043610610034575f3560e01c806301ffc9a71461003d57806323e30c8b146100715780634bacdc9d1461009e57005b3661003b57005b005b348015610048575f80fd5b5061005c610057366004611ac5565b6100b1565b60405190151581526020015b60405180910390f35b34801561007c575f80fd5b5061009061008b366004611b4e565b6100e7565b604051908152602001610068565b61003b6100ac366004611bc5565b610204565b5f6001600160e01b031982166323e30c8b60e01b14806100e157506301ffc9a760e01b6001600160e01b03198316145b92915050565b5f3373f78c2c56f95e28f73f4b8b695b07ee574da5c7831461012257604051625e1e6f60e51b81523360048201526024015b60405180910390fd5b6001600160a01b0387163014610156576040516322c7df1960e21b81526001600160a01b0388166004820152602401610119565b5f80610164848601866121c7565b91509150610172828261057c565b60405163b0460f0760e01b8152339063b0460f07906101959085906004016123eb565b60408051808303815f875af11580156101b0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101d49190612569565b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd99a9950505050505050505050565b61020c6105f0565b61021b6102188261258b565b50565b61022860808501856125f4565b90505f0361024957604051639c95219f60e01b815260040160405180910390fd5b6001600160a01b03851673f78c2c56f95e28f73f4b8b695b07ee574da5c783146102915760405163516e822d60e01b81526001600160a01b0386166004820152602401610119565b6102a1608085016060860161263a565b6102be57604051636d3a9fe560e01b815260040160405180910390fd5b5f8484846040516020016102d4939291906128ee565b60408051601f1981840301815291905290505f6102f460808701876125f4565b5f81811061030457610304612abf565b90506020028101906103169190612ad3565b6103209080612af1565b61032e906060810190612b05565b61033b60808901896125f4565b5f81811061034b5761034b612abf565b905060200281019061035d9190612ad3565b6040013581811061037057610370612abf565b6103869260206040909202019081019150612b4b565b90505f61039660808801886125f4565b5f8181106103a6576103a6612abf565b90506020028101906103b89190612ad3565b6103c29080612af1565b6103d0906040810190612b05565b6103dd60808a018a6125f4565b5f8181106103ed576103ed612abf565b90506020028101906103ff9190612ad3565b6020013581811061041257610412612abf565b6104289260206040909202019081019150612b4b565b90505f6104348261061e565b90505f6104408461061e565b90505f61044e8a35836106a2565b90506104656001600160a01b0385168c5f196106c9565b61047a6001600160a01b0386168c5f196106c9565b604051632e7ff4ef60e11b81526001600160a01b038c1690635cffe9de906104ac903090899086908c90600401612b66565b6020604051808303815f875af11580156104c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104ec9190612b97565b610509576040516349088f5960e11b815260040160405180910390fd5b61051d6001600160a01b0386168c5f6106c9565b6105316001600160a01b0385168c5f6106c9565b61054661053d8861258b565b85858886610743565b50505050505061057560017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5050505050565b5f82608001515f8151811061059357610593612abf565b60200260200101515f01516060015183608001515f815181106105b8576105b8612abf565b602002602001015160400151815181106105d4576105d4612abf565b60200260200101515f015190506105eb81836109e2565b505050565b6105f8610a8c565b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f610627610ad0565b6040516354636d2b60e01b81526001600160a01b038316600482015273200e12d10bb0c5e4a17e7018f0f1161919bb9389906354636d2b906024016020604051808303815f875af115801561067e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100e19190612bb2565b5f6001600160e01b038316601b0b60e084901d6106c0828286610b5b565b95945050505050565b6106d58383835f610b9f565b6105eb576106e683835f6001610b9f565b61070e57604051635274afe760e01b81526001600160a01b0384166004820152602401610119565b61071b8383836001610b9f565b6105eb57604051635274afe760e01b81526001600160a01b0384166004820152602401610119565b6040805160018082528183019092525f91816020015b6060815260200190600190039081610759575050604080516003808252608082019092529192505f919060208201606080368337019050506040516370a0823160e01b81523060048201529091505f906001600160a01b038816906370a0823190602401602060405180830381865afa1580156107d8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107fc9190612bd2565b90508015610818576108186001600160a01b0388163383610c01565b5f6108238288610c0e565b50905080835f8151811061083957610839612abf565b602090810291909101015250506040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa15801561088a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108ae9190612bd2565b905080156108ca576108ca6001600160a01b0386163383610c01565b5f6108d58286610c0e565b50905080836001815181106108ec576108ec612abf565b602090810291909101015250479050801561090b5761090b3382610c4f565b5f610917826012610c0e565b509050808360028151811061092e5761092e612abf565b602002602001018181525050505080825f8151811061094f5761094f612abf565b60209081029190910101526040805160018082528183019092525f91816020015b6040805160a0810182525f918101828152606080830193909352608082018390528152602081019190915281526020019060019003908161097057905050905087815f815181106109c3576109c3612abf565b60200260200101819052506109d88382610cc6565b5050505050505050565b5f805f838060200190518101906109f99190612be9565b919450925090506001600160a01b038316610a27576040516398521dc560e01b815260040160405180910390fd5b6001600160a01b038216610a4e5760405163456ac4c360e11b815260040160405180910390fd5b610a636001600160a01b038616845f196106c9565b610a776001600160a01b0383168247610f0e565b506105756001600160a01b038616845f6106c9565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054600203610ace57604051633ee5aeb560e01b815260040160405180910390fd5b565b73200e12d10bb0c5e4a17e7018f0f1161919bb93893b1580610b27575073200e12d10bb0c5e4a17e7018f0f1161919bb93893f7f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d4114155b15610ace576040516373e6d7b360e01b815273200e12d10bb0c5e4a17e7018f0f1161919bb93896004820152602401610119565b5f805f610b69868686610fbc565b9150915080610b945760405162bc8ecf60e31b81526004810187905260248101869052604401610119565b5090505b9392505050565b60405163095ea7b360e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610bf5578383151615610be9573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b61071b838383600161112e565b5f805f805f610c1d8787611178565b9250925092505f80610c2f85856111d4565b9150915081838015610c3e5750815b9650965050505050505b9250929050565b80471015610c795760405163cf47918160e01b815247600482015260248101829052604401610119565b610c92828260405180602001604052805f81525061141d565b15610c9b575050565b3d15610cad57610ca9611432565b5050565b60405163d6bda27560e01b815260040160405180910390fd5b60408051600480825260a082019092525f91816020015b6060815260200190600190039081610cdd5790505090505f5b8351811015610d3e57838181518110610d1157610d11612abf565b6020026020010151828281518110610d2b57610d2b612abf565b6020908102919091010152600101610cf6565b50335f8181523060209081526040808320815160a0810183528083018581526060808301879052608083018190529082528185015282518581529384018581528484019093529093909291905b8751811015610f0357878181518110610da657610da6612abf565b602002602001015193505f845f015160400151511115610efb575f845f01515f01516001600160a01b031663d04dfe236040518060e00160405280885f0151602001516001600160a01b03168152602001898152602001885f01516040015181526020015f8152602001610e1e8c8a6020015161143d565b8152602001878152602001868152506040518263ffffffff1660e01b8152600401610e499190612ccf565b5f60405180830381865afa158015610e63573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610e8a9190810190612dc7565b9150505f81511115610ef95784516020015160405163012c676d60e21b81526001600160a01b03909116906304b19db490610ecb908a908590600401612e73565b5f604051808303815f87803b158015610ee2575f80fd5b505af1158015610ef4573d5f803e3d5ffd5b505050505b505b600101610d8b565b505050505050505050565b606081471015610f3a5760405163cf47918160e01b815247600482015260248101839052604401610119565b5f610f4685848661141d565b9050808015610f6757505f3d1180610f6757505f856001600160a01b03163b115b15610f7c57610f74611810565b915050610b98565b8015610fa657604051639996b31560e01b81526001600160a01b0386166004820152602401610119565b3d15610cad57610fb4611432565b509392505050565b5f805f851215610fe957604051634a7d166b60e01b81526004810186905260248101859052604401610119565b845f03610ffb57505f90506001611126565b8460ff84168501858112156110365760405163c849483b60e01b8152600481018890526024810187905260ff86166044820152606401610119565b5f805f83121561108257604c19831215611059575f809550955050505050611126565b825f03600a0a915081848161107057611070612e93565b04955050840290911491506111269050565b5f83131561111b57604d8313156110bf5760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610119565b82600a0a9150815f19816110d5576110d5612e93565b048411156111095760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610119565b50919091029250600191506111269050565b509193506001925050505b935093915050565b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610bf5578383151615610be9573d5f823e3d81fd5b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8611156111c357600a860460018201600a88065f14935093509350506111cd565b8593509150600190505b9250925092565b5f808383601b82900b82148061130a577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e1000000000000000000870515611255577f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000870515611246576305f5e10087059650600886019550611255565b620186a0870596506005860195505b8687601b0b1461127057600a87059650856001019550611255565b7b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc7b1999999999999999999999999999999999999999999999999999999888820111611304575f600188039050808160030b036113025760e01b6001600160e01b037b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff60ff8b901d18161795505f9450610c489350505050565b505b50611321565b865f0361132157505f935060019250610c48915050565b858660030b146113d8575f8213156113805761133d8383611829565b156113655760405163d556b11160e01b81526004810184905260248101839052604401610119565b637ffffffe19909501600a0a82029550637fffffff946113d8565b637fffffff1986900360438113156113a257505f9450849350610c4892505050565b80600a0a88816113b4576113b4612e93565b059750875f036113ce57505f9450849350610c4892505050565b50637fffffff1995505b8186136113e85760019350611401565b818603600a0a83816113fc576113fc612e93565b071593505b5050506001600160e01b03841660e084901b1791509250929050565b5f805f83516020850186885af1949350505050565b6040513d5f823e3d81fd5b60605f825167ffffffffffffffff81111561145a5761145a611c6c565b604051908082528060200260200182016040528015611483578160200160208202803683370190505b5090505f835167ffffffffffffffff8111156114a1576114a1611c6c565b6040519080825280602002602001820160405280156114ca578160200160208202803683370190505b5090505f808551116114dc575f6114e2565b84516002015b86516001010190505f8167ffffffffffffffff81111561150457611504611c6c565b60405190808252806020026020018201604052801561153757816020015b60608152602001906001900390816115225790505b5090505f61155b604080516002815233602082015230818301526060810190915290565b82828151811061156d5761156d612abf565b60200260200101819052505f5b88518110156115ca57818060010192505088818151811061159d5761159d612abf565b60200260200101518383815181106115b7576115b7612abf565b602090810291909101015260010161157a565b50865115611805578080600101915050848282815181106115ed576115ed612abf565b602002602001018190525080806001019150508382828151811061161357611613612abf565b60200260200101819052505f5b87518110156118035761171688828151811061163e5761163e612abf565b60200260200101515f01516116f38a848151811061165e5761165e612abf565b6020026020010151602001516116d48c868151811061167f5761167f612abf565b60200260200101518051604091820151805160209081029181019190912083517f6ec4dff745ec96dbde88c5d41f8aa5ac13aa1664afb47b8406b44fa945a650c8815291820192909252918201526060902090565b60405161190160f01b8152600281019290925260228201526042902090565b8a848151811061170557611705612abf565b602002602001015160600151611844565b61173657604051630a57f30960e31b815260048101829052602401610119565b87818151811061174857611748612abf565b60200260200101515f01516001600160a01b03165f1b86828151811061177057611770612abf565b60200260200101818152505087818151811061178e5761178e612abf565b6020026020010151602001518582815181106117ac576117ac612abf565b60200260200101818152505081806001019250508781815181106117d2576117d2612abf565b6020026020010151604001518383815181106117f0576117f0612abf565b6020908102919091010152600101611620565b505b509695505050505050565b6040513d81523d5f602083013e3d602001810160405290565b5f610b985f841261183a578361183e565b835f035b836118b4565b5f836001600160a01b03163b5f036118a2575f806118628585611952565b5090925090505f81600381111561187b5761187b612ea7565b1480156118995750856001600160a01b0316826001600160a01b0316145b92505050610b98565b6118ad848484611998565b9050610b98565b5f637ffffff582136118c757505f6100e1565b637ffffffe19820160438113156118e25750508115156100e1565b5f81126119225780600a0a7b800000000000000000000000000000000000000000000000000000018161191757611917612e93565b0484119150506100e1565b805f03600a0a7b800000000000000000000000000000000000000000000000000000020284101591505092915050565b5f805f8351604103611989576020840151604085015160608601515f1a61197b888285856119fd565b9550955095505050506111cd565b505081515f91506002906111cd565b805160408051630b135d3f60e11b8082526004820186905260248201929092525f92906020820185604483015e5f82606483010152601f820160051c60051b915060205f60648401838a5afa9050825f5114601f3d1116811693505050509392505050565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841115611a3657505f91506003905082611abb565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015611a87573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b038116611ab257505f925060019150829050611abb565b92505f91508190505b9450945094915050565b5f60208284031215611ad5575f80fd5b81356001600160e01b031981168114610b98575f80fd5b6001600160a01b0381168114610218575f80fd5b8035611b0b81611aec565b919050565b5f8083601f840112611b20575f80fd5b50813567ffffffffffffffff811115611b37575f80fd5b602083019150836020828501011115610c48575f80fd5b5f805f805f8060a08789031215611b63575f80fd5b8635611b6e81611aec565b95506020870135611b7e81611aec565b94506040870135935060608701359250608087013567ffffffffffffffff811115611ba7575f80fd5b611bb389828a01611b10565b979a9699509497509295939492505050565b5f805f805f60808688031215611bd9575f80fd5b8535611be481611aec565b9450602086013567ffffffffffffffff80821115611c00575f80fd5b9087019060c0828a031215611c13575f80fd5b90945060408701359080821115611c28575f80fd5b611c3489838a01611b10565b90955093506060880135915080821115611c4c575f80fd5b50860160408189031215611c5e575f80fd5b809150509295509295909350565b634e487b7160e01b5f52604160045260245ffd5b6040805190810167ffffffffffffffff81118282101715611ca357611ca3611c6c565b60405290565b6040516080810167ffffffffffffffff81118282101715611ca357611ca3611c6c565b60405160a0810167ffffffffffffffff81118282101715611ca357611ca3611c6c565b60405160c0810167ffffffffffffffff81118282101715611ca357611ca3611c6c565b604051601f8201601f1916810167ffffffffffffffff81118282101715611d3b57611d3b611c6c565b604052919050565b8015158114610218575f80fd5b8035611b0b81611d43565b5f67ffffffffffffffff821115611d7457611d74611c6c565b5060051b60200190565b5f67ffffffffffffffff821115611d9757611d97611c6c565b50601f01601f191660200190565b5f82601f830112611db4575f80fd5b8135611dc7611dc282611d7e565b611d12565b818152846020838601011115611ddb575f80fd5b816020850160208301375f918101602001919091529392505050565b5f60608284031215611e07575f80fd5b6040516060810167ffffffffffffffff8282108183111715611e2b57611e2b611c6c565b8160405282935084359150611e3f82611aec565b908252602084013590611e5182611aec565b8160208401526040850135915080821115611e6a575f80fd5b50611e7785828601611da5565b6040830152505092915050565b5f82601f830112611e93575f80fd5b81356020611ea3611dc283611d5b565b82815260069290921b84018101918181019086841115611ec1575f80fd5b8286015b848110156118055760408189031215611edc575f80fd5b611ee4611c80565b8135611eef81611aec565b81528185013585820152835291830191604001611ec5565b5f82601f830112611f16575f80fd5b81356020611f26611dc283611d5b565b82815260059290921b84018101918181019086841115611f44575f80fd5b8286015b8481101561180557803567ffffffffffffffff80821115611f67575f80fd5b908801906080828b03601f19011215611f7e575f80fd5b611f86611ca9565b86830135611f9381611aec565b815260408381013588830152606084013583811115611fb0575f80fd5b8401603f81018d13611fc0575f80fd5b88810135611fd0611dc282611d5b565b81815260059190911b82018301908a8101908f831115611fee575f80fd5b928401925b8284101561200c5783358252928b0192908b0190611ff3565b80858701525050505050608083013582811115612027575f80fd5b6120358c8983870101611da5565b60608301525085525050918301918301611f48565b5f82601f830112612059575f80fd5b81356020612069611dc283611d5b565b82815260059290921b84018101918181019086841115612087575f80fd5b8286015b8481101561180557803567ffffffffffffffff808211156120aa575f80fd5b90880190601f196080838c03820112156120c2575f80fd5b6120ca611ca9565b87840135838111156120da575f80fd5b840160a0818e03840112156120ed575f80fd5b6120f5611ccc565b9250612102898201611b00565b8352604081013584811115612115575f80fd5b6121238e8b83850101611df7565b8a850152506060808201358581111561213a575f80fd5b6121488f8c83860101611e84565b60408601525060808201358581111561215f575f80fd5b61216d8f8c83860101611e84565b828601525060a0820135608085015283835260408601358a84015280860135604084015260808601359350848411156121a4575f80fd5b6121b28e8b86890101611f07565b9083015250865250505091830191830161208b565b5f80604083850312156121d8575f80fd5b823567ffffffffffffffff808211156121ef575f80fd5b9084019060c08287031215612202575f80fd5b61220a611cef565b82358152602083013560208201526040830135604082015261222e60608401611d50565b6060820152608083013582811115612244575f80fd5b6122508882860161204a565b60808301525060a083013582811115612267575f80fd5b61227388828601611da5565b60a0830152509350602085013591508082111561228e575f80fd5b5061229b85828601611da5565b9150509250929050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f815180845260208085019450602084015f5b8381101561231657815180516001600160a01b0316885283015183880152604090960195908201906001016122e6565b509495945050505050565b5f815180845260208085019450602084015f5b8381101561231657815187529582019590820190600101612334565b5f82825180855260208086019550808260051b8401018186015f5b848110156123de57601f19868403018952815160806001600160a01b038251168552858201518686015260408083015182828801526123ac83880182612321565b92505050606080830151925085820381870152506123ca81836122a5565b9a86019a945050509083019060010161236b565b5090979650505050505050565b5f602080835260e08301845182850152818501516040818187015280870151915060608281880152808801519250608083151560808901526080890151935060a060c060a08a01528585518088526101009750878b019150878160051b8c010189880197505f5b8281101561253a578c820360ff190184528851805187845280516001600160a01b03908116898601528d82015188860189905280518216610120870152808f01519091166101408601528a015161016085018a90526124b56101808601826122a5565b90508a820151607f19808784030160c08801526124d283836122d3565b92508b8401519150808784030160e0880152506124ef82826122d3565b915050888201518d8601528d8301518e8601528a8301518b8601528983015192508481038a8601526125218184612350565b9b8e019b968e0196945050506001919091019050612452565b5060a08d01518c8203601f190160c08e01529950612558818b6122a5565b9d9c50505050505050505050505050565b5f806040838503121561257a575f80fd5b505080516020909101519092909150565b5f6040823603121561259b575f80fd5b6125a3611c80565b823567ffffffffffffffff808211156125ba575f80fd5b6125c636838701611df7565b835260208501359150808211156125db575f80fd5b506125e836828601611f07565b60208301525092915050565b5f808335601e19843603018112612609575f80fd5b83018035915067ffffffffffffffff821115612623575f80fd5b6020019150600581901b3603821315610c48575f80fd5b5f6020828403121561264a575f80fd5b8135610b9881611d43565b5f808335601e1984360301811261266a575f80fd5b830160208101925035905067ffffffffffffffff811115612689575f80fd5b8060051b3603821315610c48575f80fd5b5f808335601e198436030181126126af575f80fd5b830160208101925035905067ffffffffffffffff8111156126ce575f80fd5b803603821315610c48575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f813561271081611aec565b6001600160a01b03908116845260208301359061272c82611aec565b16602084015261273f604083018361269a565b606060408601526106c06060860182846126dc565b5f808335601e19843603018112612769575f80fd5b830160208101925035905067ffffffffffffffff811115612788575f80fd5b8060061b3603821315610c48575f80fd5b8183525f60208085019450825f5b858110156123165781356127ba81611aec565b6001600160a01b031687528183013583880152604096870196909101906001016127a7565b5f8235607e198336030181126127f3575f80fd5b90910192915050565b8183526020808401935f91600585811b8301820185855b888110156128e057858303601f19018a5261282e82896127df565b6080813561283b81611aec565b6001600160a01b031685528187013587860152604061285c81840184612655565b8383890152808489015260a093507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811115612896575f80fd5b881b915081818885013750850160606128b18482018561269a565b94508388840301828901526128c984840186836126dc565b9e8a019e9750505093870193505050600101612813565b509098975050505050505050565b5f604080835261010080840187358386015260208089013560608701526080848a0135608088015260608a013561292481611d43565b151560a088015261293860808b018b612655565b60c0898101529384905261012093848901600582901b8a018601835f5b84811015612a6f578c830361011f1901845261297182876127df565b8035609e19823603018112612984575f80fd5b8885528101803561299481611aec565b6001600160a01b0316858a0152808a013536829003605e190181126129b7575f80fd5b60a0808701526129cb8c8701838301612704565b90506129d98e830183612754565b607f19808985030160c08a01526129f1848385612799565b9350612a006060860186612754565b93509150808985030160e08a015250612a1a838383612799565b92505050898201358d8701528a8301358b8701528d8301358e870152612a436060840184612655565b935091508581036060870152612a5a8184846127fc565b968b0196955050509188019150600101612955565b5050612a7e60a08f018f61269a565b8c8303603f190160e08e015299509750612a99818a8a6126dc565b9850505050505085840381870152505050612ab58185876126dc565b9695505050505050565b634e487b7160e01b5f52603260045260245ffd5b5f8235607e19833603018112612ae7575f80fd5b9190910192915050565b5f8235609e19833603018112612ae7575f80fd5b5f808335601e19843603018112612b1a575f80fd5b83018035915067ffffffffffffffff821115612b34575f80fd5b6020019150600681901b3603821315610c48575f80fd5b5f60208284031215612b5b575f80fd5b8135610b9881611aec565b5f6001600160a01b03808716835280861660208401525083604083015260806060830152612ab560808301846122a5565b5f60208284031215612ba7575f80fd5b8151610b9881611d43565b5f60208284031215612bc2575f80fd5b815160ff81168114610b98575f80fd5b5f60208284031215612be2575f80fd5b5051919050565b5f805f60608486031215612bfb575f80fd5b8351612c0681611aec565b6020850151909350612c1781611aec565b604085015190925067ffffffffffffffff811115612c33575f80fd5b8401601f81018613612c43575f80fd5b8051612c51611dc282611d7e565b818152876020838501011115612c65575f80fd5b8160208401602083015e5f602083830101528093505050509250925092565b5f8282518085526020808601955060208260051b840101602086015f5b848110156123de57601f19868403018952612cbd838351612321565b98840198925090830190600101612ca1565b602081526001600160a01b038251166020820152602082015160408201525f604083015160e06060840152612d086101008401826122a5565b9050606084015160808401526080840151601f19808584030160a0860152612d308383612c84565b925060a08601519150808584030160c0860152612d4d8383612321565b925060c08601519150808584030160e0860152506106c08282612321565b5f82601f830112612d7a575f80fd5b81516020612d8a611dc283611d5b565b8083825260208201915060208460051b870101935086841115612dab575f80fd5b602086015b848110156118055780518352918301918301612db0565b5f8060408385031215612dd8575f80fd5b825167ffffffffffffffff80821115612def575f80fd5b818501915085601f830112612e02575f80fd5b81516020612e12611dc283611d5b565b82815260059290921b84018101918181019089841115612e30575f80fd5b948201945b83861015612e4e57855182529482019490820190612e35565b91880151919650909350505080821115612e66575f80fd5b5061229b85828601612d6b565b828152604060208201525f612e8b6040830184612321565b949350505050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52602160045260245ffd"; + hex"6080604052348015600e575f80fd5b5060017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055612ebb806100405f395ff3fe608060405260043610610034575f3560e01c806301ffc9a71461003d57806323e30c8b146100715780634bacdc9d1461009e57005b3661003b57005b005b348015610048575f80fd5b5061005c610057366004611ac5565b6100b1565b60405190151581526020015b60405180910390f35b34801561007c575f80fd5b5061009061008b366004611b4e565b6100e7565b604051908152602001610068565b61003b6100ac366004611bc5565b610204565b5f6001600160e01b031982166323e30c8b60e01b14806100e157506301ffc9a760e01b6001600160e01b03198316145b92915050565b5f3373531167691b4f37f0266e226d03412c77fb2977ce1461012257604051625e1e6f60e51b81523360048201526024015b60405180910390fd5b6001600160a01b0387163014610156576040516322c7df1960e21b81526001600160a01b0388166004820152602401610119565b5f80610164848601866121c7565b91509150610172828261057c565b60405163b0460f0760e01b8152339063b0460f07906101959085906004016123eb565b60408051808303815f875af11580156101b0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101d49190612569565b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd99a9950505050505050505050565b61020c6105f0565b61021b6102188261258b565b50565b61022860808501856125f4565b90505f0361024957604051639c95219f60e01b815260040160405180910390fd5b6001600160a01b03851673531167691b4f37f0266e226d03412c77fb2977ce146102915760405163516e822d60e01b81526001600160a01b0386166004820152602401610119565b6102a1608085016060860161263a565b6102be57604051636d3a9fe560e01b815260040160405180910390fd5b5f8484846040516020016102d4939291906128ee565b60408051601f1981840301815291905290505f6102f460808701876125f4565b5f81811061030457610304612abf565b90506020028101906103169190612ad3565b6103209080612af1565b61032e906060810190612b05565b61033b60808901896125f4565b5f81811061034b5761034b612abf565b905060200281019061035d9190612ad3565b6040013581811061037057610370612abf565b6103869260206040909202019081019150612b4b565b90505f61039660808801886125f4565b5f8181106103a6576103a6612abf565b90506020028101906103b89190612ad3565b6103c29080612af1565b6103d0906040810190612b05565b6103dd60808a018a6125f4565b5f8181106103ed576103ed612abf565b90506020028101906103ff9190612ad3565b6020013581811061041257610412612abf565b6104289260206040909202019081019150612b4b565b90505f6104348261061e565b90505f6104408461061e565b90505f61044e8a35836106a2565b90506104656001600160a01b0385168c5f196106c9565b61047a6001600160a01b0386168c5f196106c9565b604051632e7ff4ef60e11b81526001600160a01b038c1690635cffe9de906104ac903090899086908c90600401612b66565b6020604051808303815f875af11580156104c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104ec9190612b97565b610509576040516349088f5960e11b815260040160405180910390fd5b61051d6001600160a01b0386168c5f6106c9565b6105316001600160a01b0385168c5f6106c9565b61054661053d8861258b565b85858886610743565b50505050505061057560017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5050505050565b5f82608001515f8151811061059357610593612abf565b60200260200101515f01516060015183608001515f815181106105b8576105b8612abf565b602002602001015160400151815181106105d4576105d4612abf565b60200260200101515f015190506105eb81836109e2565b505050565b6105f8610a8c565b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f610627610ad0565b6040516354636d2b60e01b81526001600160a01b038316600482015273200e12d10bb0c5e4a17e7018f0f1161919bb9389906354636d2b906024016020604051808303815f875af115801561067e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100e19190612bb2565b5f6001600160e01b038316601b0b60e084901d6106c0828286610b5b565b95945050505050565b6106d58383835f610b9f565b6105eb576106e683835f6001610b9f565b61070e57604051635274afe760e01b81526001600160a01b0384166004820152602401610119565b61071b8383836001610b9f565b6105eb57604051635274afe760e01b81526001600160a01b0384166004820152602401610119565b6040805160018082528183019092525f91816020015b6060815260200190600190039081610759575050604080516003808252608082019092529192505f919060208201606080368337019050506040516370a0823160e01b81523060048201529091505f906001600160a01b038816906370a0823190602401602060405180830381865afa1580156107d8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107fc9190612bd2565b90508015610818576108186001600160a01b0388163383610c01565b5f6108238288610c0e565b50905080835f8151811061083957610839612abf565b602090810291909101015250506040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa15801561088a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108ae9190612bd2565b905080156108ca576108ca6001600160a01b0386163383610c01565b5f6108d58286610c0e565b50905080836001815181106108ec576108ec612abf565b602090810291909101015250479050801561090b5761090b3382610c4f565b5f610917826012610c0e565b509050808360028151811061092e5761092e612abf565b602002602001018181525050505080825f8151811061094f5761094f612abf565b60209081029190910101526040805160018082528183019092525f91816020015b6040805160a0810182525f918101828152606080830193909352608082018390528152602081019190915281526020019060019003908161097057905050905087815f815181106109c3576109c3612abf565b60200260200101819052506109d88382610cc6565b5050505050505050565b5f805f838060200190518101906109f99190612be9565b919450925090506001600160a01b038316610a27576040516398521dc560e01b815260040160405180910390fd5b6001600160a01b038216610a4e5760405163456ac4c360e11b815260040160405180910390fd5b610a636001600160a01b038616845f196106c9565b610a776001600160a01b0383168247610f0e565b506105756001600160a01b038616845f6106c9565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054600203610ace57604051633ee5aeb560e01b815260040160405180910390fd5b565b73200e12d10bb0c5e4a17e7018f0f1161919bb93893b1580610b27575073200e12d10bb0c5e4a17e7018f0f1161919bb93893f7f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d4114155b15610ace576040516373e6d7b360e01b815273200e12d10bb0c5e4a17e7018f0f1161919bb93896004820152602401610119565b5f805f610b69868686610fbc565b9150915080610b945760405162bc8ecf60e31b81526004810187905260248101869052604401610119565b5090505b9392505050565b60405163095ea7b360e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610bf5578383151615610be9573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b61071b838383600161112e565b5f805f805f610c1d8787611178565b9250925092505f80610c2f85856111d4565b9150915081838015610c3e5750815b9650965050505050505b9250929050565b80471015610c795760405163cf47918160e01b815247600482015260248101829052604401610119565b610c92828260405180602001604052805f81525061141d565b15610c9b575050565b3d15610cad57610ca9611432565b5050565b60405163d6bda27560e01b815260040160405180910390fd5b60408051600480825260a082019092525f91816020015b6060815260200190600190039081610cdd5790505090505f5b8351811015610d3e57838181518110610d1157610d11612abf565b6020026020010151828281518110610d2b57610d2b612abf565b6020908102919091010152600101610cf6565b50335f8181523060209081526040808320815160a0810183528083018581526060808301879052608083018190529082528185015282518581529384018581528484019093529093909291905b8751811015610f0357878181518110610da657610da6612abf565b602002602001015193505f845f015160400151511115610efb575f845f01515f01516001600160a01b031663d04dfe236040518060e00160405280885f0151602001516001600160a01b03168152602001898152602001885f01516040015181526020015f8152602001610e1e8c8a6020015161143d565b8152602001878152602001868152506040518263ffffffff1660e01b8152600401610e499190612ccf565b5f60405180830381865afa158015610e63573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610e8a9190810190612dc7565b9150505f81511115610ef95784516020015160405163012c676d60e21b81526001600160a01b03909116906304b19db490610ecb908a908590600401612e73565b5f604051808303815f87803b158015610ee2575f80fd5b505af1158015610ef4573d5f803e3d5ffd5b505050505b505b600101610d8b565b505050505050505050565b606081471015610f3a5760405163cf47918160e01b815247600482015260248101839052604401610119565b5f610f4685848661141d565b9050808015610f6757505f3d1180610f6757505f856001600160a01b03163b115b15610f7c57610f74611810565b915050610b98565b8015610fa657604051639996b31560e01b81526001600160a01b0386166004820152602401610119565b3d15610cad57610fb4611432565b509392505050565b5f805f851215610fe957604051634a7d166b60e01b81526004810186905260248101859052604401610119565b845f03610ffb57505f90506001611126565b8460ff84168501858112156110365760405163c849483b60e01b8152600481018890526024810187905260ff86166044820152606401610119565b5f805f83121561108257604c19831215611059575f809550955050505050611126565b825f03600a0a915081848161107057611070612e93565b04955050840290911491506111269050565b5f83131561111b57604d8313156110bf5760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610119565b82600a0a9150815f19816110d5576110d5612e93565b048411156111095760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610119565b50919091029250600191506111269050565b509193506001925050505b935093915050565b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610bf5578383151615610be9573d5f823e3d81fd5b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8611156111c357600a860460018201600a88065f14935093509350506111cd565b8593509150600190505b9250925092565b5f808383601b82900b82148061130a577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e1000000000000000000870515611255577f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000870515611246576305f5e10087059650600886019550611255565b620186a0870596506005860195505b8687601b0b1461127057600a87059650856001019550611255565b7b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc7b1999999999999999999999999999999999999999999999999999999888820111611304575f600188039050808160030b036113025760e01b6001600160e01b037b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff60ff8b901d18161795505f9450610c489350505050565b505b50611321565b865f0361132157505f935060019250610c48915050565b858660030b146113d8575f8213156113805761133d8383611829565b156113655760405163d556b11160e01b81526004810184905260248101839052604401610119565b637ffffffe19909501600a0a82029550637fffffff946113d8565b637fffffff1986900360438113156113a257505f9450849350610c4892505050565b80600a0a88816113b4576113b4612e93565b059750875f036113ce57505f9450849350610c4892505050565b50637fffffff1995505b8186136113e85760019350611401565b818603600a0a83816113fc576113fc612e93565b071593505b5050506001600160e01b03841660e084901b1791509250929050565b5f805f83516020850186885af1949350505050565b6040513d5f823e3d81fd5b60605f825167ffffffffffffffff81111561145a5761145a611c6c565b604051908082528060200260200182016040528015611483578160200160208202803683370190505b5090505f835167ffffffffffffffff8111156114a1576114a1611c6c565b6040519080825280602002602001820160405280156114ca578160200160208202803683370190505b5090505f808551116114dc575f6114e2565b84516002015b86516001010190505f8167ffffffffffffffff81111561150457611504611c6c565b60405190808252806020026020018201604052801561153757816020015b60608152602001906001900390816115225790505b5090505f61155b604080516002815233602082015230818301526060810190915290565b82828151811061156d5761156d612abf565b60200260200101819052505f5b88518110156115ca57818060010192505088818151811061159d5761159d612abf565b60200260200101518383815181106115b7576115b7612abf565b602090810291909101015260010161157a565b50865115611805578080600101915050848282815181106115ed576115ed612abf565b602002602001018190525080806001019150508382828151811061161357611613612abf565b60200260200101819052505f5b87518110156118035761171688828151811061163e5761163e612abf565b60200260200101515f01516116f38a848151811061165e5761165e612abf565b6020026020010151602001516116d48c868151811061167f5761167f612abf565b60200260200101518051604091820151805160209081029181019190912083517f6ec4dff745ec96dbde88c5d41f8aa5ac13aa1664afb47b8406b44fa945a650c8815291820192909252918201526060902090565b60405161190160f01b8152600281019290925260228201526042902090565b8a848151811061170557611705612abf565b602002602001015160600151611844565b61173657604051630a57f30960e31b815260048101829052602401610119565b87818151811061174857611748612abf565b60200260200101515f01516001600160a01b03165f1b86828151811061177057611770612abf565b60200260200101818152505087818151811061178e5761178e612abf565b6020026020010151602001518582815181106117ac576117ac612abf565b60200260200101818152505081806001019250508781815181106117d2576117d2612abf565b6020026020010151604001518383815181106117f0576117f0612abf565b6020908102919091010152600101611620565b505b509695505050505050565b6040513d81523d5f602083013e3d602001810160405290565b5f610b985f841261183a578361183e565b835f035b836118b4565b5f836001600160a01b03163b5f036118a2575f806118628585611952565b5090925090505f81600381111561187b5761187b612ea7565b1480156118995750856001600160a01b0316826001600160a01b0316145b92505050610b98565b6118ad848484611998565b9050610b98565b5f637ffffff582136118c757505f6100e1565b637ffffffe19820160438113156118e25750508115156100e1565b5f81126119225780600a0a7b800000000000000000000000000000000000000000000000000000018161191757611917612e93565b0484119150506100e1565b805f03600a0a7b800000000000000000000000000000000000000000000000000000020284101591505092915050565b5f805f8351604103611989576020840151604085015160608601515f1a61197b888285856119fd565b9550955095505050506111cd565b505081515f91506002906111cd565b805160408051630b135d3f60e11b8082526004820186905260248201929092525f92906020820185604483015e5f82606483010152601f820160051c60051b915060205f60648401838a5afa9050825f5114601f3d1116811693505050509392505050565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841115611a3657505f91506003905082611abb565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015611a87573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b038116611ab257505f925060019150829050611abb565b92505f91508190505b9450945094915050565b5f60208284031215611ad5575f80fd5b81356001600160e01b031981168114610b98575f80fd5b6001600160a01b0381168114610218575f80fd5b8035611b0b81611aec565b919050565b5f8083601f840112611b20575f80fd5b50813567ffffffffffffffff811115611b37575f80fd5b602083019150836020828501011115610c48575f80fd5b5f805f805f8060a08789031215611b63575f80fd5b8635611b6e81611aec565b95506020870135611b7e81611aec565b94506040870135935060608701359250608087013567ffffffffffffffff811115611ba7575f80fd5b611bb389828a01611b10565b979a9699509497509295939492505050565b5f805f805f60808688031215611bd9575f80fd5b8535611be481611aec565b9450602086013567ffffffffffffffff80821115611c00575f80fd5b9087019060c0828a031215611c13575f80fd5b90945060408701359080821115611c28575f80fd5b611c3489838a01611b10565b90955093506060880135915080821115611c4c575f80fd5b50860160408189031215611c5e575f80fd5b809150509295509295909350565b634e487b7160e01b5f52604160045260245ffd5b6040805190810167ffffffffffffffff81118282101715611ca357611ca3611c6c565b60405290565b6040516080810167ffffffffffffffff81118282101715611ca357611ca3611c6c565b60405160a0810167ffffffffffffffff81118282101715611ca357611ca3611c6c565b60405160c0810167ffffffffffffffff81118282101715611ca357611ca3611c6c565b604051601f8201601f1916810167ffffffffffffffff81118282101715611d3b57611d3b611c6c565b604052919050565b8015158114610218575f80fd5b8035611b0b81611d43565b5f67ffffffffffffffff821115611d7457611d74611c6c565b5060051b60200190565b5f67ffffffffffffffff821115611d9757611d97611c6c565b50601f01601f191660200190565b5f82601f830112611db4575f80fd5b8135611dc7611dc282611d7e565b611d12565b818152846020838601011115611ddb575f80fd5b816020850160208301375f918101602001919091529392505050565b5f60608284031215611e07575f80fd5b6040516060810167ffffffffffffffff8282108183111715611e2b57611e2b611c6c565b8160405282935084359150611e3f82611aec565b908252602084013590611e5182611aec565b8160208401526040850135915080821115611e6a575f80fd5b50611e7785828601611da5565b6040830152505092915050565b5f82601f830112611e93575f80fd5b81356020611ea3611dc283611d5b565b82815260069290921b84018101918181019086841115611ec1575f80fd5b8286015b848110156118055760408189031215611edc575f80fd5b611ee4611c80565b8135611eef81611aec565b81528185013585820152835291830191604001611ec5565b5f82601f830112611f16575f80fd5b81356020611f26611dc283611d5b565b82815260059290921b84018101918181019086841115611f44575f80fd5b8286015b8481101561180557803567ffffffffffffffff80821115611f67575f80fd5b908801906080828b03601f19011215611f7e575f80fd5b611f86611ca9565b86830135611f9381611aec565b815260408381013588830152606084013583811115611fb0575f80fd5b8401603f81018d13611fc0575f80fd5b88810135611fd0611dc282611d5b565b81815260059190911b82018301908a8101908f831115611fee575f80fd5b928401925b8284101561200c5783358252928b0192908b0190611ff3565b80858701525050505050608083013582811115612027575f80fd5b6120358c8983870101611da5565b60608301525085525050918301918301611f48565b5f82601f830112612059575f80fd5b81356020612069611dc283611d5b565b82815260059290921b84018101918181019086841115612087575f80fd5b8286015b8481101561180557803567ffffffffffffffff808211156120aa575f80fd5b90880190601f196080838c03820112156120c2575f80fd5b6120ca611ca9565b87840135838111156120da575f80fd5b840160a0818e03840112156120ed575f80fd5b6120f5611ccc565b9250612102898201611b00565b8352604081013584811115612115575f80fd5b6121238e8b83850101611df7565b8a850152506060808201358581111561213a575f80fd5b6121488f8c83860101611e84565b60408601525060808201358581111561215f575f80fd5b61216d8f8c83860101611e84565b828601525060a0820135608085015283835260408601358a84015280860135604084015260808601359350848411156121a4575f80fd5b6121b28e8b86890101611f07565b9083015250865250505091830191830161208b565b5f80604083850312156121d8575f80fd5b823567ffffffffffffffff808211156121ef575f80fd5b9084019060c08287031215612202575f80fd5b61220a611cef565b82358152602083013560208201526040830135604082015261222e60608401611d50565b6060820152608083013582811115612244575f80fd5b6122508882860161204a565b60808301525060a083013582811115612267575f80fd5b61227388828601611da5565b60a0830152509350602085013591508082111561228e575f80fd5b5061229b85828601611da5565b9150509250929050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f815180845260208085019450602084015f5b8381101561231657815180516001600160a01b0316885283015183880152604090960195908201906001016122e6565b509495945050505050565b5f815180845260208085019450602084015f5b8381101561231657815187529582019590820190600101612334565b5f82825180855260208086019550808260051b8401018186015f5b848110156123de57601f19868403018952815160806001600160a01b038251168552858201518686015260408083015182828801526123ac83880182612321565b92505050606080830151925085820381870152506123ca81836122a5565b9a86019a945050509083019060010161236b565b5090979650505050505050565b5f602080835260e08301845182850152818501516040818187015280870151915060608281880152808801519250608083151560808901526080890151935060a060c060a08a01528585518088526101009750878b019150878160051b8c010189880197505f5b8281101561253a578c820360ff190184528851805187845280516001600160a01b03908116898601528d82015188860189905280518216610120870152808f01519091166101408601528a015161016085018a90526124b56101808601826122a5565b90508a820151607f19808784030160c08801526124d283836122d3565b92508b8401519150808784030160e0880152506124ef82826122d3565b915050888201518d8601528d8301518e8601528a8301518b8601528983015192508481038a8601526125218184612350565b9b8e019b968e0196945050506001919091019050612452565b5060a08d01518c8203601f190160c08e01529950612558818b6122a5565b9d9c50505050505050505050505050565b5f806040838503121561257a575f80fd5b505080516020909101519092909150565b5f6040823603121561259b575f80fd5b6125a3611c80565b823567ffffffffffffffff808211156125ba575f80fd5b6125c636838701611df7565b835260208501359150808211156125db575f80fd5b506125e836828601611f07565b60208301525092915050565b5f808335601e19843603018112612609575f80fd5b83018035915067ffffffffffffffff821115612623575f80fd5b6020019150600581901b3603821315610c48575f80fd5b5f6020828403121561264a575f80fd5b8135610b9881611d43565b5f808335601e1984360301811261266a575f80fd5b830160208101925035905067ffffffffffffffff811115612689575f80fd5b8060051b3603821315610c48575f80fd5b5f808335601e198436030181126126af575f80fd5b830160208101925035905067ffffffffffffffff8111156126ce575f80fd5b803603821315610c48575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f813561271081611aec565b6001600160a01b03908116845260208301359061272c82611aec565b16602084015261273f604083018361269a565b606060408601526106c06060860182846126dc565b5f808335601e19843603018112612769575f80fd5b830160208101925035905067ffffffffffffffff811115612788575f80fd5b8060061b3603821315610c48575f80fd5b8183525f60208085019450825f5b858110156123165781356127ba81611aec565b6001600160a01b031687528183013583880152604096870196909101906001016127a7565b5f8235607e198336030181126127f3575f80fd5b90910192915050565b8183526020808401935f91600585811b8301820185855b888110156128e057858303601f19018a5261282e82896127df565b6080813561283b81611aec565b6001600160a01b031685528187013587860152604061285c81840184612655565b8383890152808489015260a093507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811115612896575f80fd5b881b915081818885013750850160606128b18482018561269a565b94508388840301828901526128c984840186836126dc565b9e8a019e9750505093870193505050600101612813565b509098975050505050505050565b5f604080835261010080840187358386015260208089013560608701526080848a0135608088015260608a013561292481611d43565b151560a088015261293860808b018b612655565b60c0898101529384905261012093848901600582901b8a018601835f5b84811015612a6f578c830361011f1901845261297182876127df565b8035609e19823603018112612984575f80fd5b8885528101803561299481611aec565b6001600160a01b0316858a0152808a013536829003605e190181126129b7575f80fd5b60a0808701526129cb8c8701838301612704565b90506129d98e830183612754565b607f19808985030160c08a01526129f1848385612799565b9350612a006060860186612754565b93509150808985030160e08a015250612a1a838383612799565b92505050898201358d8701528a8301358b8701528d8301358e870152612a436060840184612655565b935091508581036060870152612a5a8184846127fc565b968b0196955050509188019150600101612955565b5050612a7e60a08f018f61269a565b8c8303603f190160e08e015299509750612a99818a8a6126dc565b9850505050505085840381870152505050612ab58185876126dc565b9695505050505050565b634e487b7160e01b5f52603260045260245ffd5b5f8235607e19833603018112612ae7575f80fd5b9190910192915050565b5f8235609e19833603018112612ae7575f80fd5b5f808335601e19843603018112612b1a575f80fd5b83018035915067ffffffffffffffff821115612b34575f80fd5b6020019150600681901b3603821315610c48575f80fd5b5f60208284031215612b5b575f80fd5b8135610b9881611aec565b5f6001600160a01b03808716835280861660208401525083604083015260806060830152612ab560808301846122a5565b5f60208284031215612ba7575f80fd5b8151610b9881611d43565b5f60208284031215612bc2575f80fd5b815160ff81168114610b98575f80fd5b5f60208284031215612be2575f80fd5b5051919050565b5f805f60608486031215612bfb575f80fd5b8351612c0681611aec565b6020850151909350612c1781611aec565b604085015190925067ffffffffffffffff811115612c33575f80fd5b8401601f81018613612c43575f80fd5b8051612c51611dc282611d7e565b818152876020838501011115612c65575f80fd5b8160208401602083015e5f602083830101528093505050509250925092565b5f8282518085526020808601955060208260051b840101602086015f5b848110156123de57601f19868403018952612cbd838351612321565b98840198925090830190600101612ca1565b602081526001600160a01b038251166020820152602082015160408201525f604083015160e06060840152612d086101008401826122a5565b9050606084015160808401526080840151601f19808584030160a0860152612d308383612c84565b925060a08601519150808584030160c0860152612d4d8383612321565b925060c08601519150808584030160e0860152506106c08282612321565b5f82601f830112612d7a575f80fd5b81516020612d8a611dc283611d5b565b8083825260208201915060208460051b870101935086841115612dab575f80fd5b602086015b848110156118055780518352918301918301612db0565b5f8060408385031215612dd8575f80fd5b825167ffffffffffffffff80821115612def575f80fd5b818501915085601f830112612e02575f80fd5b81516020612e12611dc283611d5b565b82815260059290921b84018101918181019089841115612e30575f80fd5b948201945b83861015612e4e57855182529482019490820190612e35565b91880151919650909350505080821115612e66575f80fd5b5061229b85828601612d6b565b828152604060208201525f612e8b6040830184612321565b949350505050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52602160045260245ffd"; /// @dev The runtime bytecode of the contract. bytes constant RUNTIME_CODE = - hex"608060405260043610610034575f3560e01c806301ffc9a71461003d57806323e30c8b146100715780634bacdc9d1461009e57005b3661003b57005b005b348015610048575f80fd5b5061005c610057366004611ac5565b6100b1565b60405190151581526020015b60405180910390f35b34801561007c575f80fd5b5061009061008b366004611b4e565b6100e7565b604051908152602001610068565b61003b6100ac366004611bc5565b610204565b5f6001600160e01b031982166323e30c8b60e01b14806100e157506301ffc9a760e01b6001600160e01b03198316145b92915050565b5f3373f78c2c56f95e28f73f4b8b695b07ee574da5c7831461012257604051625e1e6f60e51b81523360048201526024015b60405180910390fd5b6001600160a01b0387163014610156576040516322c7df1960e21b81526001600160a01b0388166004820152602401610119565b5f80610164848601866121c7565b91509150610172828261057c565b60405163b0460f0760e01b8152339063b0460f07906101959085906004016123eb565b60408051808303815f875af11580156101b0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101d49190612569565b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd99a9950505050505050505050565b61020c6105f0565b61021b6102188261258b565b50565b61022860808501856125f4565b90505f0361024957604051639c95219f60e01b815260040160405180910390fd5b6001600160a01b03851673f78c2c56f95e28f73f4b8b695b07ee574da5c783146102915760405163516e822d60e01b81526001600160a01b0386166004820152602401610119565b6102a1608085016060860161263a565b6102be57604051636d3a9fe560e01b815260040160405180910390fd5b5f8484846040516020016102d4939291906128ee565b60408051601f1981840301815291905290505f6102f460808701876125f4565b5f81811061030457610304612abf565b90506020028101906103169190612ad3565b6103209080612af1565b61032e906060810190612b05565b61033b60808901896125f4565b5f81811061034b5761034b612abf565b905060200281019061035d9190612ad3565b6040013581811061037057610370612abf565b6103869260206040909202019081019150612b4b565b90505f61039660808801886125f4565b5f8181106103a6576103a6612abf565b90506020028101906103b89190612ad3565b6103c29080612af1565b6103d0906040810190612b05565b6103dd60808a018a6125f4565b5f8181106103ed576103ed612abf565b90506020028101906103ff9190612ad3565b6020013581811061041257610412612abf565b6104289260206040909202019081019150612b4b565b90505f6104348261061e565b90505f6104408461061e565b90505f61044e8a35836106a2565b90506104656001600160a01b0385168c5f196106c9565b61047a6001600160a01b0386168c5f196106c9565b604051632e7ff4ef60e11b81526001600160a01b038c1690635cffe9de906104ac903090899086908c90600401612b66565b6020604051808303815f875af11580156104c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104ec9190612b97565b610509576040516349088f5960e11b815260040160405180910390fd5b61051d6001600160a01b0386168c5f6106c9565b6105316001600160a01b0385168c5f6106c9565b61054661053d8861258b565b85858886610743565b50505050505061057560017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5050505050565b5f82608001515f8151811061059357610593612abf565b60200260200101515f01516060015183608001515f815181106105b8576105b8612abf565b602002602001015160400151815181106105d4576105d4612abf565b60200260200101515f015190506105eb81836109e2565b505050565b6105f8610a8c565b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f610627610ad0565b6040516354636d2b60e01b81526001600160a01b038316600482015273200e12d10bb0c5e4a17e7018f0f1161919bb9389906354636d2b906024016020604051808303815f875af115801561067e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100e19190612bb2565b5f6001600160e01b038316601b0b60e084901d6106c0828286610b5b565b95945050505050565b6106d58383835f610b9f565b6105eb576106e683835f6001610b9f565b61070e57604051635274afe760e01b81526001600160a01b0384166004820152602401610119565b61071b8383836001610b9f565b6105eb57604051635274afe760e01b81526001600160a01b0384166004820152602401610119565b6040805160018082528183019092525f91816020015b6060815260200190600190039081610759575050604080516003808252608082019092529192505f919060208201606080368337019050506040516370a0823160e01b81523060048201529091505f906001600160a01b038816906370a0823190602401602060405180830381865afa1580156107d8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107fc9190612bd2565b90508015610818576108186001600160a01b0388163383610c01565b5f6108238288610c0e565b50905080835f8151811061083957610839612abf565b602090810291909101015250506040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa15801561088a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108ae9190612bd2565b905080156108ca576108ca6001600160a01b0386163383610c01565b5f6108d58286610c0e565b50905080836001815181106108ec576108ec612abf565b602090810291909101015250479050801561090b5761090b3382610c4f565b5f610917826012610c0e565b509050808360028151811061092e5761092e612abf565b602002602001018181525050505080825f8151811061094f5761094f612abf565b60209081029190910101526040805160018082528183019092525f91816020015b6040805160a0810182525f918101828152606080830193909352608082018390528152602081019190915281526020019060019003908161097057905050905087815f815181106109c3576109c3612abf565b60200260200101819052506109d88382610cc6565b5050505050505050565b5f805f838060200190518101906109f99190612be9565b919450925090506001600160a01b038316610a27576040516398521dc560e01b815260040160405180910390fd5b6001600160a01b038216610a4e5760405163456ac4c360e11b815260040160405180910390fd5b610a636001600160a01b038616845f196106c9565b610a776001600160a01b0383168247610f0e565b506105756001600160a01b038616845f6106c9565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054600203610ace57604051633ee5aeb560e01b815260040160405180910390fd5b565b73200e12d10bb0c5e4a17e7018f0f1161919bb93893b1580610b27575073200e12d10bb0c5e4a17e7018f0f1161919bb93893f7f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d4114155b15610ace576040516373e6d7b360e01b815273200e12d10bb0c5e4a17e7018f0f1161919bb93896004820152602401610119565b5f805f610b69868686610fbc565b9150915080610b945760405162bc8ecf60e31b81526004810187905260248101869052604401610119565b5090505b9392505050565b60405163095ea7b360e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610bf5578383151615610be9573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b61071b838383600161112e565b5f805f805f610c1d8787611178565b9250925092505f80610c2f85856111d4565b9150915081838015610c3e5750815b9650965050505050505b9250929050565b80471015610c795760405163cf47918160e01b815247600482015260248101829052604401610119565b610c92828260405180602001604052805f81525061141d565b15610c9b575050565b3d15610cad57610ca9611432565b5050565b60405163d6bda27560e01b815260040160405180910390fd5b60408051600480825260a082019092525f91816020015b6060815260200190600190039081610cdd5790505090505f5b8351811015610d3e57838181518110610d1157610d11612abf565b6020026020010151828281518110610d2b57610d2b612abf565b6020908102919091010152600101610cf6565b50335f8181523060209081526040808320815160a0810183528083018581526060808301879052608083018190529082528185015282518581529384018581528484019093529093909291905b8751811015610f0357878181518110610da657610da6612abf565b602002602001015193505f845f015160400151511115610efb575f845f01515f01516001600160a01b031663d04dfe236040518060e00160405280885f0151602001516001600160a01b03168152602001898152602001885f01516040015181526020015f8152602001610e1e8c8a6020015161143d565b8152602001878152602001868152506040518263ffffffff1660e01b8152600401610e499190612ccf565b5f60405180830381865afa158015610e63573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610e8a9190810190612dc7565b9150505f81511115610ef95784516020015160405163012c676d60e21b81526001600160a01b03909116906304b19db490610ecb908a908590600401612e73565b5f604051808303815f87803b158015610ee2575f80fd5b505af1158015610ef4573d5f803e3d5ffd5b505050505b505b600101610d8b565b505050505050505050565b606081471015610f3a5760405163cf47918160e01b815247600482015260248101839052604401610119565b5f610f4685848661141d565b9050808015610f6757505f3d1180610f6757505f856001600160a01b03163b115b15610f7c57610f74611810565b915050610b98565b8015610fa657604051639996b31560e01b81526001600160a01b0386166004820152602401610119565b3d15610cad57610fb4611432565b509392505050565b5f805f851215610fe957604051634a7d166b60e01b81526004810186905260248101859052604401610119565b845f03610ffb57505f90506001611126565b8460ff84168501858112156110365760405163c849483b60e01b8152600481018890526024810187905260ff86166044820152606401610119565b5f805f83121561108257604c19831215611059575f809550955050505050611126565b825f03600a0a915081848161107057611070612e93565b04955050840290911491506111269050565b5f83131561111b57604d8313156110bf5760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610119565b82600a0a9150815f19816110d5576110d5612e93565b048411156111095760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610119565b50919091029250600191506111269050565b509193506001925050505b935093915050565b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610bf5578383151615610be9573d5f823e3d81fd5b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8611156111c357600a860460018201600a88065f14935093509350506111cd565b8593509150600190505b9250925092565b5f808383601b82900b82148061130a577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e1000000000000000000870515611255577f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000870515611246576305f5e10087059650600886019550611255565b620186a0870596506005860195505b8687601b0b1461127057600a87059650856001019550611255565b7b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc7b1999999999999999999999999999999999999999999999999999999888820111611304575f600188039050808160030b036113025760e01b6001600160e01b037b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff60ff8b901d18161795505f9450610c489350505050565b505b50611321565b865f0361132157505f935060019250610c48915050565b858660030b146113d8575f8213156113805761133d8383611829565b156113655760405163d556b11160e01b81526004810184905260248101839052604401610119565b637ffffffe19909501600a0a82029550637fffffff946113d8565b637fffffff1986900360438113156113a257505f9450849350610c4892505050565b80600a0a88816113b4576113b4612e93565b059750875f036113ce57505f9450849350610c4892505050565b50637fffffff1995505b8186136113e85760019350611401565b818603600a0a83816113fc576113fc612e93565b071593505b5050506001600160e01b03841660e084901b1791509250929050565b5f805f83516020850186885af1949350505050565b6040513d5f823e3d81fd5b60605f825167ffffffffffffffff81111561145a5761145a611c6c565b604051908082528060200260200182016040528015611483578160200160208202803683370190505b5090505f835167ffffffffffffffff8111156114a1576114a1611c6c565b6040519080825280602002602001820160405280156114ca578160200160208202803683370190505b5090505f808551116114dc575f6114e2565b84516002015b86516001010190505f8167ffffffffffffffff81111561150457611504611c6c565b60405190808252806020026020018201604052801561153757816020015b60608152602001906001900390816115225790505b5090505f61155b604080516002815233602082015230818301526060810190915290565b82828151811061156d5761156d612abf565b60200260200101819052505f5b88518110156115ca57818060010192505088818151811061159d5761159d612abf565b60200260200101518383815181106115b7576115b7612abf565b602090810291909101015260010161157a565b50865115611805578080600101915050848282815181106115ed576115ed612abf565b602002602001018190525080806001019150508382828151811061161357611613612abf565b60200260200101819052505f5b87518110156118035761171688828151811061163e5761163e612abf565b60200260200101515f01516116f38a848151811061165e5761165e612abf565b6020026020010151602001516116d48c868151811061167f5761167f612abf565b60200260200101518051604091820151805160209081029181019190912083517f6ec4dff745ec96dbde88c5d41f8aa5ac13aa1664afb47b8406b44fa945a650c8815291820192909252918201526060902090565b60405161190160f01b8152600281019290925260228201526042902090565b8a848151811061170557611705612abf565b602002602001015160600151611844565b61173657604051630a57f30960e31b815260048101829052602401610119565b87818151811061174857611748612abf565b60200260200101515f01516001600160a01b03165f1b86828151811061177057611770612abf565b60200260200101818152505087818151811061178e5761178e612abf565b6020026020010151602001518582815181106117ac576117ac612abf565b60200260200101818152505081806001019250508781815181106117d2576117d2612abf565b6020026020010151604001518383815181106117f0576117f0612abf565b6020908102919091010152600101611620565b505b509695505050505050565b6040513d81523d5f602083013e3d602001810160405290565b5f610b985f841261183a578361183e565b835f035b836118b4565b5f836001600160a01b03163b5f036118a2575f806118628585611952565b5090925090505f81600381111561187b5761187b612ea7565b1480156118995750856001600160a01b0316826001600160a01b0316145b92505050610b98565b6118ad848484611998565b9050610b98565b5f637ffffff582136118c757505f6100e1565b637ffffffe19820160438113156118e25750508115156100e1565b5f81126119225780600a0a7b800000000000000000000000000000000000000000000000000000018161191757611917612e93565b0484119150506100e1565b805f03600a0a7b800000000000000000000000000000000000000000000000000000020284101591505092915050565b5f805f8351604103611989576020840151604085015160608601515f1a61197b888285856119fd565b9550955095505050506111cd565b505081515f91506002906111cd565b805160408051630b135d3f60e11b8082526004820186905260248201929092525f92906020820185604483015e5f82606483010152601f820160051c60051b915060205f60648401838a5afa9050825f5114601f3d1116811693505050509392505050565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841115611a3657505f91506003905082611abb565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015611a87573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b038116611ab257505f925060019150829050611abb565b92505f91508190505b9450945094915050565b5f60208284031215611ad5575f80fd5b81356001600160e01b031981168114610b98575f80fd5b6001600160a01b0381168114610218575f80fd5b8035611b0b81611aec565b919050565b5f8083601f840112611b20575f80fd5b50813567ffffffffffffffff811115611b37575f80fd5b602083019150836020828501011115610c48575f80fd5b5f805f805f8060a08789031215611b63575f80fd5b8635611b6e81611aec565b95506020870135611b7e81611aec565b94506040870135935060608701359250608087013567ffffffffffffffff811115611ba7575f80fd5b611bb389828a01611b10565b979a9699509497509295939492505050565b5f805f805f60808688031215611bd9575f80fd5b8535611be481611aec565b9450602086013567ffffffffffffffff80821115611c00575f80fd5b9087019060c0828a031215611c13575f80fd5b90945060408701359080821115611c28575f80fd5b611c3489838a01611b10565b90955093506060880135915080821115611c4c575f80fd5b50860160408189031215611c5e575f80fd5b809150509295509295909350565b634e487b7160e01b5f52604160045260245ffd5b6040805190810167ffffffffffffffff81118282101715611ca357611ca3611c6c565b60405290565b6040516080810167ffffffffffffffff81118282101715611ca357611ca3611c6c565b60405160a0810167ffffffffffffffff81118282101715611ca357611ca3611c6c565b60405160c0810167ffffffffffffffff81118282101715611ca357611ca3611c6c565b604051601f8201601f1916810167ffffffffffffffff81118282101715611d3b57611d3b611c6c565b604052919050565b8015158114610218575f80fd5b8035611b0b81611d43565b5f67ffffffffffffffff821115611d7457611d74611c6c565b5060051b60200190565b5f67ffffffffffffffff821115611d9757611d97611c6c565b50601f01601f191660200190565b5f82601f830112611db4575f80fd5b8135611dc7611dc282611d7e565b611d12565b818152846020838601011115611ddb575f80fd5b816020850160208301375f918101602001919091529392505050565b5f60608284031215611e07575f80fd5b6040516060810167ffffffffffffffff8282108183111715611e2b57611e2b611c6c565b8160405282935084359150611e3f82611aec565b908252602084013590611e5182611aec565b8160208401526040850135915080821115611e6a575f80fd5b50611e7785828601611da5565b6040830152505092915050565b5f82601f830112611e93575f80fd5b81356020611ea3611dc283611d5b565b82815260069290921b84018101918181019086841115611ec1575f80fd5b8286015b848110156118055760408189031215611edc575f80fd5b611ee4611c80565b8135611eef81611aec565b81528185013585820152835291830191604001611ec5565b5f82601f830112611f16575f80fd5b81356020611f26611dc283611d5b565b82815260059290921b84018101918181019086841115611f44575f80fd5b8286015b8481101561180557803567ffffffffffffffff80821115611f67575f80fd5b908801906080828b03601f19011215611f7e575f80fd5b611f86611ca9565b86830135611f9381611aec565b815260408381013588830152606084013583811115611fb0575f80fd5b8401603f81018d13611fc0575f80fd5b88810135611fd0611dc282611d5b565b81815260059190911b82018301908a8101908f831115611fee575f80fd5b928401925b8284101561200c5783358252928b0192908b0190611ff3565b80858701525050505050608083013582811115612027575f80fd5b6120358c8983870101611da5565b60608301525085525050918301918301611f48565b5f82601f830112612059575f80fd5b81356020612069611dc283611d5b565b82815260059290921b84018101918181019086841115612087575f80fd5b8286015b8481101561180557803567ffffffffffffffff808211156120aa575f80fd5b90880190601f196080838c03820112156120c2575f80fd5b6120ca611ca9565b87840135838111156120da575f80fd5b840160a0818e03840112156120ed575f80fd5b6120f5611ccc565b9250612102898201611b00565b8352604081013584811115612115575f80fd5b6121238e8b83850101611df7565b8a850152506060808201358581111561213a575f80fd5b6121488f8c83860101611e84565b60408601525060808201358581111561215f575f80fd5b61216d8f8c83860101611e84565b828601525060a0820135608085015283835260408601358a84015280860135604084015260808601359350848411156121a4575f80fd5b6121b28e8b86890101611f07565b9083015250865250505091830191830161208b565b5f80604083850312156121d8575f80fd5b823567ffffffffffffffff808211156121ef575f80fd5b9084019060c08287031215612202575f80fd5b61220a611cef565b82358152602083013560208201526040830135604082015261222e60608401611d50565b6060820152608083013582811115612244575f80fd5b6122508882860161204a565b60808301525060a083013582811115612267575f80fd5b61227388828601611da5565b60a0830152509350602085013591508082111561228e575f80fd5b5061229b85828601611da5565b9150509250929050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f815180845260208085019450602084015f5b8381101561231657815180516001600160a01b0316885283015183880152604090960195908201906001016122e6565b509495945050505050565b5f815180845260208085019450602084015f5b8381101561231657815187529582019590820190600101612334565b5f82825180855260208086019550808260051b8401018186015f5b848110156123de57601f19868403018952815160806001600160a01b038251168552858201518686015260408083015182828801526123ac83880182612321565b92505050606080830151925085820381870152506123ca81836122a5565b9a86019a945050509083019060010161236b565b5090979650505050505050565b5f602080835260e08301845182850152818501516040818187015280870151915060608281880152808801519250608083151560808901526080890151935060a060c060a08a01528585518088526101009750878b019150878160051b8c010189880197505f5b8281101561253a578c820360ff190184528851805187845280516001600160a01b03908116898601528d82015188860189905280518216610120870152808f01519091166101408601528a015161016085018a90526124b56101808601826122a5565b90508a820151607f19808784030160c08801526124d283836122d3565b92508b8401519150808784030160e0880152506124ef82826122d3565b915050888201518d8601528d8301518e8601528a8301518b8601528983015192508481038a8601526125218184612350565b9b8e019b968e0196945050506001919091019050612452565b5060a08d01518c8203601f190160c08e01529950612558818b6122a5565b9d9c50505050505050505050505050565b5f806040838503121561257a575f80fd5b505080516020909101519092909150565b5f6040823603121561259b575f80fd5b6125a3611c80565b823567ffffffffffffffff808211156125ba575f80fd5b6125c636838701611df7565b835260208501359150808211156125db575f80fd5b506125e836828601611f07565b60208301525092915050565b5f808335601e19843603018112612609575f80fd5b83018035915067ffffffffffffffff821115612623575f80fd5b6020019150600581901b3603821315610c48575f80fd5b5f6020828403121561264a575f80fd5b8135610b9881611d43565b5f808335601e1984360301811261266a575f80fd5b830160208101925035905067ffffffffffffffff811115612689575f80fd5b8060051b3603821315610c48575f80fd5b5f808335601e198436030181126126af575f80fd5b830160208101925035905067ffffffffffffffff8111156126ce575f80fd5b803603821315610c48575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f813561271081611aec565b6001600160a01b03908116845260208301359061272c82611aec565b16602084015261273f604083018361269a565b606060408601526106c06060860182846126dc565b5f808335601e19843603018112612769575f80fd5b830160208101925035905067ffffffffffffffff811115612788575f80fd5b8060061b3603821315610c48575f80fd5b8183525f60208085019450825f5b858110156123165781356127ba81611aec565b6001600160a01b031687528183013583880152604096870196909101906001016127a7565b5f8235607e198336030181126127f3575f80fd5b90910192915050565b8183526020808401935f91600585811b8301820185855b888110156128e057858303601f19018a5261282e82896127df565b6080813561283b81611aec565b6001600160a01b031685528187013587860152604061285c81840184612655565b8383890152808489015260a093507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811115612896575f80fd5b881b915081818885013750850160606128b18482018561269a565b94508388840301828901526128c984840186836126dc565b9e8a019e9750505093870193505050600101612813565b509098975050505050505050565b5f604080835261010080840187358386015260208089013560608701526080848a0135608088015260608a013561292481611d43565b151560a088015261293860808b018b612655565b60c0898101529384905261012093848901600582901b8a018601835f5b84811015612a6f578c830361011f1901845261297182876127df565b8035609e19823603018112612984575f80fd5b8885528101803561299481611aec565b6001600160a01b0316858a0152808a013536829003605e190181126129b7575f80fd5b60a0808701526129cb8c8701838301612704565b90506129d98e830183612754565b607f19808985030160c08a01526129f1848385612799565b9350612a006060860186612754565b93509150808985030160e08a015250612a1a838383612799565b92505050898201358d8701528a8301358b8701528d8301358e870152612a436060840184612655565b935091508581036060870152612a5a8184846127fc565b968b0196955050509188019150600101612955565b5050612a7e60a08f018f61269a565b8c8303603f190160e08e015299509750612a99818a8a6126dc565b9850505050505085840381870152505050612ab58185876126dc565b9695505050505050565b634e487b7160e01b5f52603260045260245ffd5b5f8235607e19833603018112612ae7575f80fd5b9190910192915050565b5f8235609e19833603018112612ae7575f80fd5b5f808335601e19843603018112612b1a575f80fd5b83018035915067ffffffffffffffff821115612b34575f80fd5b6020019150600681901b3603821315610c48575f80fd5b5f60208284031215612b5b575f80fd5b8135610b9881611aec565b5f6001600160a01b03808716835280861660208401525083604083015260806060830152612ab560808301846122a5565b5f60208284031215612ba7575f80fd5b8151610b9881611d43565b5f60208284031215612bc2575f80fd5b815160ff81168114610b98575f80fd5b5f60208284031215612be2575f80fd5b5051919050565b5f805f60608486031215612bfb575f80fd5b8351612c0681611aec565b6020850151909350612c1781611aec565b604085015190925067ffffffffffffffff811115612c33575f80fd5b8401601f81018613612c43575f80fd5b8051612c51611dc282611d7e565b818152876020838501011115612c65575f80fd5b8160208401602083015e5f602083830101528093505050509250925092565b5f8282518085526020808601955060208260051b840101602086015f5b848110156123de57601f19868403018952612cbd838351612321565b98840198925090830190600101612ca1565b602081526001600160a01b038251166020820152602082015160408201525f604083015160e06060840152612d086101008401826122a5565b9050606084015160808401526080840151601f19808584030160a0860152612d308383612c84565b925060a08601519150808584030160c0860152612d4d8383612321565b925060c08601519150808584030160e0860152506106c08282612321565b5f82601f830112612d7a575f80fd5b81516020612d8a611dc283611d5b565b8083825260208201915060208460051b870101935086841115612dab575f80fd5b602086015b848110156118055780518352918301918301612db0565b5f8060408385031215612dd8575f80fd5b825167ffffffffffffffff80821115612def575f80fd5b818501915085601f830112612e02575f80fd5b81516020612e12611dc283611d5b565b82815260059290921b84018101918181019089841115612e30575f80fd5b948201945b83861015612e4e57855182529482019490820190612e35565b91880151919650909350505080821115612e66575f80fd5b5061229b85828601612d6b565b828152604060208201525f612e8b6040830184612321565b949350505050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52602160045260245ffd"; + hex"608060405260043610610034575f3560e01c806301ffc9a71461003d57806323e30c8b146100715780634bacdc9d1461009e57005b3661003b57005b005b348015610048575f80fd5b5061005c610057366004611ac5565b6100b1565b60405190151581526020015b60405180910390f35b34801561007c575f80fd5b5061009061008b366004611b4e565b6100e7565b604051908152602001610068565b61003b6100ac366004611bc5565b610204565b5f6001600160e01b031982166323e30c8b60e01b14806100e157506301ffc9a760e01b6001600160e01b03198316145b92915050565b5f3373531167691b4f37f0266e226d03412c77fb2977ce1461012257604051625e1e6f60e51b81523360048201526024015b60405180910390fd5b6001600160a01b0387163014610156576040516322c7df1960e21b81526001600160a01b0388166004820152602401610119565b5f80610164848601866121c7565b91509150610172828261057c565b60405163b0460f0760e01b8152339063b0460f07906101959085906004016123eb565b60408051808303815f875af11580156101b0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101d49190612569565b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd99a9950505050505050505050565b61020c6105f0565b61021b6102188261258b565b50565b61022860808501856125f4565b90505f0361024957604051639c95219f60e01b815260040160405180910390fd5b6001600160a01b03851673531167691b4f37f0266e226d03412c77fb2977ce146102915760405163516e822d60e01b81526001600160a01b0386166004820152602401610119565b6102a1608085016060860161263a565b6102be57604051636d3a9fe560e01b815260040160405180910390fd5b5f8484846040516020016102d4939291906128ee565b60408051601f1981840301815291905290505f6102f460808701876125f4565b5f81811061030457610304612abf565b90506020028101906103169190612ad3565b6103209080612af1565b61032e906060810190612b05565b61033b60808901896125f4565b5f81811061034b5761034b612abf565b905060200281019061035d9190612ad3565b6040013581811061037057610370612abf565b6103869260206040909202019081019150612b4b565b90505f61039660808801886125f4565b5f8181106103a6576103a6612abf565b90506020028101906103b89190612ad3565b6103c29080612af1565b6103d0906040810190612b05565b6103dd60808a018a6125f4565b5f8181106103ed576103ed612abf565b90506020028101906103ff9190612ad3565b6020013581811061041257610412612abf565b6104289260206040909202019081019150612b4b565b90505f6104348261061e565b90505f6104408461061e565b90505f61044e8a35836106a2565b90506104656001600160a01b0385168c5f196106c9565b61047a6001600160a01b0386168c5f196106c9565b604051632e7ff4ef60e11b81526001600160a01b038c1690635cffe9de906104ac903090899086908c90600401612b66565b6020604051808303815f875af11580156104c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104ec9190612b97565b610509576040516349088f5960e11b815260040160405180910390fd5b61051d6001600160a01b0386168c5f6106c9565b6105316001600160a01b0385168c5f6106c9565b61054661053d8861258b565b85858886610743565b50505050505061057560017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5050505050565b5f82608001515f8151811061059357610593612abf565b60200260200101515f01516060015183608001515f815181106105b8576105b8612abf565b602002602001015160400151815181106105d4576105d4612abf565b60200260200101515f015190506105eb81836109e2565b505050565b6105f8610a8c565b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f610627610ad0565b6040516354636d2b60e01b81526001600160a01b038316600482015273200e12d10bb0c5e4a17e7018f0f1161919bb9389906354636d2b906024016020604051808303815f875af115801561067e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100e19190612bb2565b5f6001600160e01b038316601b0b60e084901d6106c0828286610b5b565b95945050505050565b6106d58383835f610b9f565b6105eb576106e683835f6001610b9f565b61070e57604051635274afe760e01b81526001600160a01b0384166004820152602401610119565b61071b8383836001610b9f565b6105eb57604051635274afe760e01b81526001600160a01b0384166004820152602401610119565b6040805160018082528183019092525f91816020015b6060815260200190600190039081610759575050604080516003808252608082019092529192505f919060208201606080368337019050506040516370a0823160e01b81523060048201529091505f906001600160a01b038816906370a0823190602401602060405180830381865afa1580156107d8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107fc9190612bd2565b90508015610818576108186001600160a01b0388163383610c01565b5f6108238288610c0e565b50905080835f8151811061083957610839612abf565b602090810291909101015250506040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa15801561088a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108ae9190612bd2565b905080156108ca576108ca6001600160a01b0386163383610c01565b5f6108d58286610c0e565b50905080836001815181106108ec576108ec612abf565b602090810291909101015250479050801561090b5761090b3382610c4f565b5f610917826012610c0e565b509050808360028151811061092e5761092e612abf565b602002602001018181525050505080825f8151811061094f5761094f612abf565b60209081029190910101526040805160018082528183019092525f91816020015b6040805160a0810182525f918101828152606080830193909352608082018390528152602081019190915281526020019060019003908161097057905050905087815f815181106109c3576109c3612abf565b60200260200101819052506109d88382610cc6565b5050505050505050565b5f805f838060200190518101906109f99190612be9565b919450925090506001600160a01b038316610a27576040516398521dc560e01b815260040160405180910390fd5b6001600160a01b038216610a4e5760405163456ac4c360e11b815260040160405180910390fd5b610a636001600160a01b038616845f196106c9565b610a776001600160a01b0383168247610f0e565b506105756001600160a01b038616845f6106c9565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054600203610ace57604051633ee5aeb560e01b815260040160405180910390fd5b565b73200e12d10bb0c5e4a17e7018f0f1161919bb93893b1580610b27575073200e12d10bb0c5e4a17e7018f0f1161919bb93893f7f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d4114155b15610ace576040516373e6d7b360e01b815273200e12d10bb0c5e4a17e7018f0f1161919bb93896004820152602401610119565b5f805f610b69868686610fbc565b9150915080610b945760405162bc8ecf60e31b81526004810187905260248101869052604401610119565b5090505b9392505050565b60405163095ea7b360e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610bf5578383151615610be9573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b61071b838383600161112e565b5f805f805f610c1d8787611178565b9250925092505f80610c2f85856111d4565b9150915081838015610c3e5750815b9650965050505050505b9250929050565b80471015610c795760405163cf47918160e01b815247600482015260248101829052604401610119565b610c92828260405180602001604052805f81525061141d565b15610c9b575050565b3d15610cad57610ca9611432565b5050565b60405163d6bda27560e01b815260040160405180910390fd5b60408051600480825260a082019092525f91816020015b6060815260200190600190039081610cdd5790505090505f5b8351811015610d3e57838181518110610d1157610d11612abf565b6020026020010151828281518110610d2b57610d2b612abf565b6020908102919091010152600101610cf6565b50335f8181523060209081526040808320815160a0810183528083018581526060808301879052608083018190529082528185015282518581529384018581528484019093529093909291905b8751811015610f0357878181518110610da657610da6612abf565b602002602001015193505f845f015160400151511115610efb575f845f01515f01516001600160a01b031663d04dfe236040518060e00160405280885f0151602001516001600160a01b03168152602001898152602001885f01516040015181526020015f8152602001610e1e8c8a6020015161143d565b8152602001878152602001868152506040518263ffffffff1660e01b8152600401610e499190612ccf565b5f60405180830381865afa158015610e63573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610e8a9190810190612dc7565b9150505f81511115610ef95784516020015160405163012c676d60e21b81526001600160a01b03909116906304b19db490610ecb908a908590600401612e73565b5f604051808303815f87803b158015610ee2575f80fd5b505af1158015610ef4573d5f803e3d5ffd5b505050505b505b600101610d8b565b505050505050505050565b606081471015610f3a5760405163cf47918160e01b815247600482015260248101839052604401610119565b5f610f4685848661141d565b9050808015610f6757505f3d1180610f6757505f856001600160a01b03163b115b15610f7c57610f74611810565b915050610b98565b8015610fa657604051639996b31560e01b81526001600160a01b0386166004820152602401610119565b3d15610cad57610fb4611432565b509392505050565b5f805f851215610fe957604051634a7d166b60e01b81526004810186905260248101859052604401610119565b845f03610ffb57505f90506001611126565b8460ff84168501858112156110365760405163c849483b60e01b8152600481018890526024810187905260ff86166044820152606401610119565b5f805f83121561108257604c19831215611059575f809550955050505050611126565b825f03600a0a915081848161107057611070612e93565b04955050840290911491506111269050565b5f83131561111b57604d8313156110bf5760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610119565b82600a0a9150815f19816110d5576110d5612e93565b048411156111095760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610119565b50919091029250600191506111269050565b509193506001925050505b935093915050565b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610bf5578383151615610be9573d5f823e3d81fd5b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8611156111c357600a860460018201600a88065f14935093509350506111cd565b8593509150600190505b9250925092565b5f808383601b82900b82148061130a577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e1000000000000000000870515611255577f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000870515611246576305f5e10087059650600886019550611255565b620186a0870596506005860195505b8687601b0b1461127057600a87059650856001019550611255565b7b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc7b1999999999999999999999999999999999999999999999999999999888820111611304575f600188039050808160030b036113025760e01b6001600160e01b037b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff60ff8b901d18161795505f9450610c489350505050565b505b50611321565b865f0361132157505f935060019250610c48915050565b858660030b146113d8575f8213156113805761133d8383611829565b156113655760405163d556b11160e01b81526004810184905260248101839052604401610119565b637ffffffe19909501600a0a82029550637fffffff946113d8565b637fffffff1986900360438113156113a257505f9450849350610c4892505050565b80600a0a88816113b4576113b4612e93565b059750875f036113ce57505f9450849350610c4892505050565b50637fffffff1995505b8186136113e85760019350611401565b818603600a0a83816113fc576113fc612e93565b071593505b5050506001600160e01b03841660e084901b1791509250929050565b5f805f83516020850186885af1949350505050565b6040513d5f823e3d81fd5b60605f825167ffffffffffffffff81111561145a5761145a611c6c565b604051908082528060200260200182016040528015611483578160200160208202803683370190505b5090505f835167ffffffffffffffff8111156114a1576114a1611c6c565b6040519080825280602002602001820160405280156114ca578160200160208202803683370190505b5090505f808551116114dc575f6114e2565b84516002015b86516001010190505f8167ffffffffffffffff81111561150457611504611c6c565b60405190808252806020026020018201604052801561153757816020015b60608152602001906001900390816115225790505b5090505f61155b604080516002815233602082015230818301526060810190915290565b82828151811061156d5761156d612abf565b60200260200101819052505f5b88518110156115ca57818060010192505088818151811061159d5761159d612abf565b60200260200101518383815181106115b7576115b7612abf565b602090810291909101015260010161157a565b50865115611805578080600101915050848282815181106115ed576115ed612abf565b602002602001018190525080806001019150508382828151811061161357611613612abf565b60200260200101819052505f5b87518110156118035761171688828151811061163e5761163e612abf565b60200260200101515f01516116f38a848151811061165e5761165e612abf565b6020026020010151602001516116d48c868151811061167f5761167f612abf565b60200260200101518051604091820151805160209081029181019190912083517f6ec4dff745ec96dbde88c5d41f8aa5ac13aa1664afb47b8406b44fa945a650c8815291820192909252918201526060902090565b60405161190160f01b8152600281019290925260228201526042902090565b8a848151811061170557611705612abf565b602002602001015160600151611844565b61173657604051630a57f30960e31b815260048101829052602401610119565b87818151811061174857611748612abf565b60200260200101515f01516001600160a01b03165f1b86828151811061177057611770612abf565b60200260200101818152505087818151811061178e5761178e612abf565b6020026020010151602001518582815181106117ac576117ac612abf565b60200260200101818152505081806001019250508781815181106117d2576117d2612abf565b6020026020010151604001518383815181106117f0576117f0612abf565b6020908102919091010152600101611620565b505b509695505050505050565b6040513d81523d5f602083013e3d602001810160405290565b5f610b985f841261183a578361183e565b835f035b836118b4565b5f836001600160a01b03163b5f036118a2575f806118628585611952565b5090925090505f81600381111561187b5761187b612ea7565b1480156118995750856001600160a01b0316826001600160a01b0316145b92505050610b98565b6118ad848484611998565b9050610b98565b5f637ffffff582136118c757505f6100e1565b637ffffffe19820160438113156118e25750508115156100e1565b5f81126119225780600a0a7b800000000000000000000000000000000000000000000000000000018161191757611917612e93565b0484119150506100e1565b805f03600a0a7b800000000000000000000000000000000000000000000000000000020284101591505092915050565b5f805f8351604103611989576020840151604085015160608601515f1a61197b888285856119fd565b9550955095505050506111cd565b505081515f91506002906111cd565b805160408051630b135d3f60e11b8082526004820186905260248201929092525f92906020820185604483015e5f82606483010152601f820160051c60051b915060205f60648401838a5afa9050825f5114601f3d1116811693505050509392505050565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841115611a3657505f91506003905082611abb565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015611a87573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b038116611ab257505f925060019150829050611abb565b92505f91508190505b9450945094915050565b5f60208284031215611ad5575f80fd5b81356001600160e01b031981168114610b98575f80fd5b6001600160a01b0381168114610218575f80fd5b8035611b0b81611aec565b919050565b5f8083601f840112611b20575f80fd5b50813567ffffffffffffffff811115611b37575f80fd5b602083019150836020828501011115610c48575f80fd5b5f805f805f8060a08789031215611b63575f80fd5b8635611b6e81611aec565b95506020870135611b7e81611aec565b94506040870135935060608701359250608087013567ffffffffffffffff811115611ba7575f80fd5b611bb389828a01611b10565b979a9699509497509295939492505050565b5f805f805f60808688031215611bd9575f80fd5b8535611be481611aec565b9450602086013567ffffffffffffffff80821115611c00575f80fd5b9087019060c0828a031215611c13575f80fd5b90945060408701359080821115611c28575f80fd5b611c3489838a01611b10565b90955093506060880135915080821115611c4c575f80fd5b50860160408189031215611c5e575f80fd5b809150509295509295909350565b634e487b7160e01b5f52604160045260245ffd5b6040805190810167ffffffffffffffff81118282101715611ca357611ca3611c6c565b60405290565b6040516080810167ffffffffffffffff81118282101715611ca357611ca3611c6c565b60405160a0810167ffffffffffffffff81118282101715611ca357611ca3611c6c565b60405160c0810167ffffffffffffffff81118282101715611ca357611ca3611c6c565b604051601f8201601f1916810167ffffffffffffffff81118282101715611d3b57611d3b611c6c565b604052919050565b8015158114610218575f80fd5b8035611b0b81611d43565b5f67ffffffffffffffff821115611d7457611d74611c6c565b5060051b60200190565b5f67ffffffffffffffff821115611d9757611d97611c6c565b50601f01601f191660200190565b5f82601f830112611db4575f80fd5b8135611dc7611dc282611d7e565b611d12565b818152846020838601011115611ddb575f80fd5b816020850160208301375f918101602001919091529392505050565b5f60608284031215611e07575f80fd5b6040516060810167ffffffffffffffff8282108183111715611e2b57611e2b611c6c565b8160405282935084359150611e3f82611aec565b908252602084013590611e5182611aec565b8160208401526040850135915080821115611e6a575f80fd5b50611e7785828601611da5565b6040830152505092915050565b5f82601f830112611e93575f80fd5b81356020611ea3611dc283611d5b565b82815260069290921b84018101918181019086841115611ec1575f80fd5b8286015b848110156118055760408189031215611edc575f80fd5b611ee4611c80565b8135611eef81611aec565b81528185013585820152835291830191604001611ec5565b5f82601f830112611f16575f80fd5b81356020611f26611dc283611d5b565b82815260059290921b84018101918181019086841115611f44575f80fd5b8286015b8481101561180557803567ffffffffffffffff80821115611f67575f80fd5b908801906080828b03601f19011215611f7e575f80fd5b611f86611ca9565b86830135611f9381611aec565b815260408381013588830152606084013583811115611fb0575f80fd5b8401603f81018d13611fc0575f80fd5b88810135611fd0611dc282611d5b565b81815260059190911b82018301908a8101908f831115611fee575f80fd5b928401925b8284101561200c5783358252928b0192908b0190611ff3565b80858701525050505050608083013582811115612027575f80fd5b6120358c8983870101611da5565b60608301525085525050918301918301611f48565b5f82601f830112612059575f80fd5b81356020612069611dc283611d5b565b82815260059290921b84018101918181019086841115612087575f80fd5b8286015b8481101561180557803567ffffffffffffffff808211156120aa575f80fd5b90880190601f196080838c03820112156120c2575f80fd5b6120ca611ca9565b87840135838111156120da575f80fd5b840160a0818e03840112156120ed575f80fd5b6120f5611ccc565b9250612102898201611b00565b8352604081013584811115612115575f80fd5b6121238e8b83850101611df7565b8a850152506060808201358581111561213a575f80fd5b6121488f8c83860101611e84565b60408601525060808201358581111561215f575f80fd5b61216d8f8c83860101611e84565b828601525060a0820135608085015283835260408601358a84015280860135604084015260808601359350848411156121a4575f80fd5b6121b28e8b86890101611f07565b9083015250865250505091830191830161208b565b5f80604083850312156121d8575f80fd5b823567ffffffffffffffff808211156121ef575f80fd5b9084019060c08287031215612202575f80fd5b61220a611cef565b82358152602083013560208201526040830135604082015261222e60608401611d50565b6060820152608083013582811115612244575f80fd5b6122508882860161204a565b60808301525060a083013582811115612267575f80fd5b61227388828601611da5565b60a0830152509350602085013591508082111561228e575f80fd5b5061229b85828601611da5565b9150509250929050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f815180845260208085019450602084015f5b8381101561231657815180516001600160a01b0316885283015183880152604090960195908201906001016122e6565b509495945050505050565b5f815180845260208085019450602084015f5b8381101561231657815187529582019590820190600101612334565b5f82825180855260208086019550808260051b8401018186015f5b848110156123de57601f19868403018952815160806001600160a01b038251168552858201518686015260408083015182828801526123ac83880182612321565b92505050606080830151925085820381870152506123ca81836122a5565b9a86019a945050509083019060010161236b565b5090979650505050505050565b5f602080835260e08301845182850152818501516040818187015280870151915060608281880152808801519250608083151560808901526080890151935060a060c060a08a01528585518088526101009750878b019150878160051b8c010189880197505f5b8281101561253a578c820360ff190184528851805187845280516001600160a01b03908116898601528d82015188860189905280518216610120870152808f01519091166101408601528a015161016085018a90526124b56101808601826122a5565b90508a820151607f19808784030160c08801526124d283836122d3565b92508b8401519150808784030160e0880152506124ef82826122d3565b915050888201518d8601528d8301518e8601528a8301518b8601528983015192508481038a8601526125218184612350565b9b8e019b968e0196945050506001919091019050612452565b5060a08d01518c8203601f190160c08e01529950612558818b6122a5565b9d9c50505050505050505050505050565b5f806040838503121561257a575f80fd5b505080516020909101519092909150565b5f6040823603121561259b575f80fd5b6125a3611c80565b823567ffffffffffffffff808211156125ba575f80fd5b6125c636838701611df7565b835260208501359150808211156125db575f80fd5b506125e836828601611f07565b60208301525092915050565b5f808335601e19843603018112612609575f80fd5b83018035915067ffffffffffffffff821115612623575f80fd5b6020019150600581901b3603821315610c48575f80fd5b5f6020828403121561264a575f80fd5b8135610b9881611d43565b5f808335601e1984360301811261266a575f80fd5b830160208101925035905067ffffffffffffffff811115612689575f80fd5b8060051b3603821315610c48575f80fd5b5f808335601e198436030181126126af575f80fd5b830160208101925035905067ffffffffffffffff8111156126ce575f80fd5b803603821315610c48575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f813561271081611aec565b6001600160a01b03908116845260208301359061272c82611aec565b16602084015261273f604083018361269a565b606060408601526106c06060860182846126dc565b5f808335601e19843603018112612769575f80fd5b830160208101925035905067ffffffffffffffff811115612788575f80fd5b8060061b3603821315610c48575f80fd5b8183525f60208085019450825f5b858110156123165781356127ba81611aec565b6001600160a01b031687528183013583880152604096870196909101906001016127a7565b5f8235607e198336030181126127f3575f80fd5b90910192915050565b8183526020808401935f91600585811b8301820185855b888110156128e057858303601f19018a5261282e82896127df565b6080813561283b81611aec565b6001600160a01b031685528187013587860152604061285c81840184612655565b8383890152808489015260a093507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811115612896575f80fd5b881b915081818885013750850160606128b18482018561269a565b94508388840301828901526128c984840186836126dc565b9e8a019e9750505093870193505050600101612813565b509098975050505050505050565b5f604080835261010080840187358386015260208089013560608701526080848a0135608088015260608a013561292481611d43565b151560a088015261293860808b018b612655565b60c0898101529384905261012093848901600582901b8a018601835f5b84811015612a6f578c830361011f1901845261297182876127df565b8035609e19823603018112612984575f80fd5b8885528101803561299481611aec565b6001600160a01b0316858a0152808a013536829003605e190181126129b7575f80fd5b60a0808701526129cb8c8701838301612704565b90506129d98e830183612754565b607f19808985030160c08a01526129f1848385612799565b9350612a006060860186612754565b93509150808985030160e08a015250612a1a838383612799565b92505050898201358d8701528a8301358b8701528d8301358e870152612a436060840184612655565b935091508581036060870152612a5a8184846127fc565b968b0196955050509188019150600101612955565b5050612a7e60a08f018f61269a565b8c8303603f190160e08e015299509750612a99818a8a6126dc565b9850505050505085840381870152505050612ab58185876126dc565b9695505050505050565b634e487b7160e01b5f52603260045260245ffd5b5f8235607e19833603018112612ae7575f80fd5b9190910192915050565b5f8235609e19833603018112612ae7575f80fd5b5f808335601e19843603018112612b1a575f80fd5b83018035915067ffffffffffffffff821115612b34575f80fd5b6020019150600681901b3603821315610c48575f80fd5b5f60208284031215612b5b575f80fd5b8135610b9881611aec565b5f6001600160a01b03808716835280861660208401525083604083015260806060830152612ab560808301846122a5565b5f60208284031215612ba7575f80fd5b8151610b9881611d43565b5f60208284031215612bc2575f80fd5b815160ff81168114610b98575f80fd5b5f60208284031215612be2575f80fd5b5051919050565b5f805f60608486031215612bfb575f80fd5b8351612c0681611aec565b6020850151909350612c1781611aec565b604085015190925067ffffffffffffffff811115612c33575f80fd5b8401601f81018613612c43575f80fd5b8051612c51611dc282611d7e565b818152876020838501011115612c65575f80fd5b8160208401602083015e5f602083830101528093505050509250925092565b5f8282518085526020808601955060208260051b840101602086015f5b848110156123de57601f19868403018952612cbd838351612321565b98840198925090830190600101612ca1565b602081526001600160a01b038251166020820152602082015160408201525f604083015160e06060840152612d086101008401826122a5565b9050606084015160808401526080840151601f19808584030160a0860152612d308383612c84565b925060a08601519150808584030160c0860152612d4d8383612321565b925060c08601519150808584030160e0860152506106c08282612321565b5f82601f830112612d7a575f80fd5b81516020612d8a611dc283611d5b565b8083825260208201915060208460051b870101935086841115612dab575f80fd5b602086015b848110156118055780518352918301918301612db0565b5f8060408385031215612dd8575f80fd5b825167ffffffffffffffff80821115612def575f80fd5b818501915085601f830112612e02575f80fd5b81516020612e12611dc283611d5b565b82815260059290921b84018101918181019089841115612e30575f80fd5b948201945b83861015612e4e57855182529482019490820190612e35565b91880151919650909350505080821115612e66575f80fd5b5061229b85828601612d6b565b828152604060208201525f612e8b6040830184612321565b949350505050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52602160045260245ffd"; /// @dev What MUST already be on a network before this release can be /// broadcast there: an address, and the runtime code that belongs at it. /// `abi.encode`d as a `DeployDependency[]` because Solidity has no /// file-scope constant of dynamic array type. bytes constant DEPENDENCIES = - hex"0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000005940000000000000000000000000f78c2c56f95e28f73f4b8b695b07ee574da5c7830000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000588f6080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a71461180e575080632cb77e9f146117e257806341d1514f146117ab5780635343c1b7146117105780635cffe9de146115b45780635d003c4414611430578063613255ab146113ad578063687cf02a14611096578063ac9650d814610f48578063b0460f07146105f3578063b845b83e1461059b578063ca9109ba1461044c578063d9d98ce41461039b578063ddebc96f146103475763df6db3c2146100c1575f80fd5b34610321576003196040368201126103215767ffffffffffffffff9060043582811161032157806004019160a0823603918201126103215760243584811161032157610111903690600401611cd0565b909361011b612bf1565b5f946001600160a01b039485610130846125d8565b163303610325576101496101443685611b02565b612c33565b805f525f60205260405f20966001885414610190575b60208960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556040519015158152f35b9091929394959697505f600198556040519633885282602089015260606040890152816101bc8761188d565b166060890152602484013590606219018112156103215783019060a06080890152806101ea6004840161188d565b166101008901526101fd6024830161188d565b16610120880152604481013560221982360301811215610321570190602460048301359201988211610321578136038913610321577f09d18501db0080ca2d6cd7c17fa7255daff4b2d503ea93b76ff68b6752ea8e6387806103069560846102c561030e9a60209f610284906103149f9a60606101406102ef9d0152610160880191612389565b6102b66102ab61029760448801856129dc565b605f198a8603810160a08c01529491612a11565b9260648701906129dc565b918784030160c0880152612a11565b91013560e08301520390a13390919060405192600284526020840152604083015260608201604052565b906040519160018352602083015260408201604052565b9236916123a9565b90613c66565b5f8080808080808061015f565b5f80fd5b602486610331856125d8565b6040516335252be360e01b815291166004820152fd5b3461032157600319602036820112610321576004359067ffffffffffffffff82116103215760809082360301126103215761038660609160040161262c565b90604051921515835260208301526040820152f35b34610321576040366003190112610321576001600160a01b036103bc611861565b166040516370a0823160e01b8152306004820152602081602481855afa908115610441575f9161040f575b50156103f75760206040515f8152f35b60249060405190633c5bf76960e21b82526004820152fd5b90506020813d602011610439575b8161042a60209383611971565b810103126103215751826103e7565b3d915061041d565b6040513d5f823e3d90fd5b346103215761045a36611d01565b92809492610466612bf1565b610471828533613b62565b61047a816134d7565b15610567578061048e6104dd9286336140a8565b9790957f7f9dfa19cf1cc2f806f2f860fbc9c056b601fb1afc0e9b843dfe5c63616268e660806040513381526001600160a01b038416998a60208301528560408301526060820152a1336137be565b9390918561050c575b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b61055b9661030e956103069460ff93604051956005875260208701526040860152606085015260808401521660a082015260c08101604052906040519160018352602083015260408201604052565b808080808080806104e6565b506040516306dde9c360e41b81523360048201526001600160a01b03841660248201526044810191909152606490fd5b0390fd5b346103215760203660031901126103215760043567ffffffffffffffff81116103215761030e6105d26104e6923690600401611cd0565b91906105dc612bf1565b604051926105e984611955565b5f845236916123a9565b34610321576003196020368201126103215767ffffffffffffffff600435116103215760c090600435360301126103215761062c612bf1565b5f808061064160048035608481019101612511565b905015610f36576024600435013592610659846134d7565b15610f245760608060405161066d81611909565b610675612566565b81525f60208201525f6040820152015261068d612566565b506106ed6106e86106c76106bd6106b76106b1608460043501600435600401612511565b90612598565b806125b3565b60408101906124a3565b60206106e06106b1608460043501600435600401612511565b0135916125c8565b6125d8565b936001600160a01b0361073c6106e86107236107196106b76106b1608460043501600435600401612511565b60608101906124a3565b60406106e06106b1608460043501600435600401612511565b816040519761074a896118d1565b168752166020860152604085015261076c608460043501600435600401612511565b9490506001604051955f87520160051b85016040525f905f5b610799608460043501600435600401612511565b9050811080610f11575b15610d5e576107bc608460043501600435600401612511565b821015610d4a578160051b810135607e198236030181121561032157608081830136031261032157604051916107f183611909565b8181013567ffffffffffffffff81116103215761081390369084840101611b02565b835280820160208181013590850152604080820135908501526060013567ffffffffffffffff81116103215761084c9236920101611cb5565b606082015280516001600160a01b0361086e6040830151602085015190611dbe565b5151166001600160a01b0385511614801590610d16575b610d045761089d602083015160408401519083613fa5565b6108a681612c33565b91825f525f60205260405f2054155f1461090a575051604080513381526001600160a01b039092166020830152810191909152600191907fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f390606090a15b01610785565b919061093b60208497959701516040850151906060860151906040519261093084611955565b5f8452339186613235565b5f94916109a457505051604080513381526001600160a01b03909216602083015281019190915260019291907f1e6fa9678edf81f9f25bbf308bde03ad3e110db1f429394b0915ba021532941490606090a15b811561099c575b5092610904565b905088610995565b6109b9606082015160446004350135906134fa565b15610a1357505051604080513381526001600160a01b03909216602083015281019190915260019291907fe3151dc8cb7a54ffc4baabd28c1f241c94d510b5e5b502491ac3cad6c16316d59080606081015b0390a161098e565b610a2060408201516134d7565b158015610cf1575b15610a7e57505051604080513381526001600160a01b03909216602083015281019190915260019291907f500b713857325f9e6dcb52ae832eca9109d107ed1aae9cb4928b4c1e13f051aa908060608101610a0b565b9250925050600196959691610a976064600435016125ec565b15610c5e5796610b0797610b1760408401516040880151610ab88183613544565b15610c565750925b610b11848592610afa610af460608a01516001600160e01b03601b918660e01d92828816810b928260e01d9216900b6145f5565b9061456a565b9d8e9260408d015161356b565b60408c015261407e565b9961407e565b98610b228484613595565b610b2c84826135f3565b60405192338452608060208501526060610b528451608080880152610100870190611e19565b93602081015160a0870152604081015160c0870152015192607f198582030160e0860152835180825260208201906020808260051b8501019601925f5b828110610bee57505050505092806001979695937fbae4dbf76931c547f765e9def16d693d86daaa596f491de979008831789185ae93610be996604084015260608301520390a180858c5101808d5260051b8c01526138aa565b61098e565b9091929396602080610c49600193601f198782030189528b51906001600160a01b03825116815283820151848201526060610c3860408401516080604085015260808401906125f9565b920151906060818403910152611d4d565b9901950193929101610b8f565b905092610ac0565b610b0790610b176060840151610b11610c9c610af460408801516001600160e01b0394601b90868360e01d9316820b91878260e01d9216900b6145f5565b60408a0151610cab8183613544565b15610ce95750915b829c8d916060890151908116155f14610cda575060408801515b96879460408d015161356b565b610ce49085613fda565b610ccd565b905091610cb3565b50610cff6060820151613521565b610a28565b60405163936bb5ad60e01b8152600490fd5b506001600160a01b03610d326060830151604085015190611dbe565b5151166001600160a01b036020860151161415610885565b634e487b7160e01b5f52603260045260245ffd5b50919390610d706064600435016125ec565b15610f0b57835b6004356004013590610d898282613544565b610eed5750508490610da9856001600160a01b0360208701511633613bf4565b505060a46004350190610dc182600435600401612470565b905015159081610ee5575b50610e44575b506001600160a01b03610de892935116336140a8565b50505b8351811015610e105780610e0a610e0460019387611dbe565b5161371e565b01610deb565b5060409160017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005582519182526020820152f35b90506001600160a01b03602084015116610e6e6001600160a01b0385511692600435600401612470565b929091333b1561032157610eb65f93604051958694859463691f9ed760e01b8652600486015260248501528960448501528a606485015260a0608485015260a4840191612389565b038183335af190811561044157859115610dd2579050610ed69150611925565b5f836001600160a01b03610dd2565b905088610dcc565b604492506040519163573b6f4160e01b835260048301526024820152fd5b84610d77565b50610f1f60408301516134d7565b6107a3565b60405163315f9e2360e21b8152600490fd5b604051639c95219f60e01b8152600490fd5b34610321576020806003193601126103215760043567ffffffffffffffff811161032157610f7a903690600401611cd0565b919060405192610f8984611955565b5f8452828401610f9882611a55565b94610fa66040519687611971565b828652610fb283611a55565b93610fc486880195601f1901866124f5565b5f5b84811061102857604080518881528951818a018190525f92600582901b83018101918a918c9085015b828710610ffc5785850386f35b909192938280611018600193603f198a82030186528851611d4d565b9601920196019592919092610fef565b806110778861107161104460019560059d9c9d1b870187612470565b929089846040519586938585013782018381015f81528b519283915e015f83820152038084520182611971565b30613f14565b611081828a611dbe565b5261108c8189611dbe565b5001969596610fc6565b34610321576003196040368201126103215760043567ffffffffffffffff8082116103215760c08260040193833603011261032157602435908111610321576110e3903690600401611cd0565b906110ec612bf1565b61111d61111861111361110c611102888061245b565b6040810190612470565b3691611993565b613e96565b613eff565b801561139b5760011015611389576024830161113981866124a3565b90501561137757604484019461114f86826124a3565b905015611365576111b561117d966111a961117461116d858061245b565b95856124a3565b999092856124a3565b91909261119a60405197611190896118a1565b33895236906119f7565b9a60209b8c8901523691611a6d565b60408601523691611a6d565b6060830152606485013560808301526111cd82612c33565b91825f525f875260405f20958654159687611211575b888860017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055604051908152f35b6001905560a46001600160a01b03917f87491344dfbcf91f6cbbc610cbbeedc85313d37a02df0c93527f7ea5f8db717f83855116604051908152878c82015260606040820152806112656060820188611e19565b0390a101916112748385612470565b90506112b9575b505050506112ad92916103066102ef61030e933390919060405192600284526020840152604083015260608201604052565b828080808080806111e3565b6112c661110c8486612470565b6112cf816145d1565b156113425750937fd46c2c56b35c8210e9e712ec3f02242d5fc90187c0ac8ed80cc33626846ec369896112ad989795611335611318610306976102ef9761030e9b511693612470565b866040519586958652850152606060408501526060840191612389565b0390a1938395965061127b565b89610597604051928392630c89984b60e31b845260048401526024830190611d4d565b60405163540e5f0b60e01b8152600490fd5b604051636c44ef8f60e01b8152600490fd5b604051633c8270bd60e21b8152600490fd5b604051632cff108b60e21b8152600490fd5b3461032157602080600319360112610321576024816001600160a01b036113d2611861565b16604051928380926370a0823160e01b82523060048301525afa908115610441575f91611403575b50604051908152f35b90508181813d8311611429575b61141a8183611971565b810103126103215751826113fa565b503d611410565b346103215761143e36611d01565b929161144b949194612bf1565b611456838333613b62565b61145f816134d7565b15611583578160ff916114778561153a969533612a61565b6114818183613544565b1561157d575080935b61149685828533613b96565b917f8045c25080b0868951141ed0a91720bcad09a8364a2b3109ee1fd49c1f0bc8b860c06114c5898833613bf4565b97906001600160a01b0360405192338452169a8b6020840152856040840152886060840152608083015260a0820152a16040519660068852602088015260408701526060860152608085015260a08401521660c082015260e08101604052906040519160018352602083015260408201604052565b90806115665760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b6115759261030e9136916123a9565b8080806104e6565b9361148a565b50604051623a3a4d60e21b81523360048201526001600160a01b039190911660248201526044810191909152606490fd5b34610321576080366003190112610321576004356001600160a01b0390818116809103610321576115e3611877565b6044359167ffffffffffffffff91606435838111610321573660238201121561032157806004013593841161032157366024858301011161032157611670956020921693611632868587613a83565b60405196879283926323e30c8b60e01b84523360048501528760248501528860448501525f606485015260a06084850152602460a485019201612389565b03815f855af1938415610441575f946116dc575b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd984036116c3576116b893503091613afc565b602060405160018152f35b604051630b6c58a960e31b815260048101859052602490fd5b9093506020813d602011611708575b816116f860209383611971565b8101031261032157519284611684565b3d91506116eb565b34610321576101403660031901126103215767ffffffffffffffff60043581811161032157611743903690600401611b02565b6024358281116103215761175b903690600401611b02565b60c0366043190112610321576101043583811161032157611780903690600401611cb5565b90610124359384116103215761179d6104e6943690600401611cb5565b926117a6612bf1565b611eca565b346103215760603660031901126103215760206117da6117c9611861565b6117d1611877565b60443591612a61565b604051908152f35b34610321576020366003190112610321576004355f525f6020526020600160405f205414604051908152f35b34610321576020366003190112610321576004359063ffffffff60e01b82168092036103215760209163e414309160e01b8114908115611850575b5015158152f35b6301ffc9a760e01b14905083611849565b600435906001600160a01b038216820361032157565b602435906001600160a01b038216820361032157565b35906001600160a01b038216820361032157565b60a0810190811067ffffffffffffffff8211176118bd57604052565b634e487b7160e01b5f52604160045260245ffd5b6060810190811067ffffffffffffffff8211176118bd57604052565b6040810190811067ffffffffffffffff8211176118bd57604052565b6080810190811067ffffffffffffffff8211176118bd57604052565b67ffffffffffffffff81116118bd57604052565b60e0810190811067ffffffffffffffff8211176118bd57604052565b6020810190811067ffffffffffffffff8211176118bd57604052565b90601f8019910116810190811067ffffffffffffffff8211176118bd57604052565b92919267ffffffffffffffff82116118bd57604051916119bd601f8201601f191660200184611971565b829481845281830111610321578281602093845f960137010152565b9080601f83011215610321578160206119f493359101611993565b90565b91906060838203126103215760405190611a10826118d1565b8193611a1b8161188d565b8352611a296020820161188d565b602084015260408101359167ffffffffffffffff831161032157604092611a5092016119d9565b910152565b67ffffffffffffffff81116118bd5760051b60200190565b929192611a7982611a55565b604092611a896040519283611971565b819581835260208093019160061b84019381851161032157915b848310611ab257505050505050565b8583830312610321578386918251611ac9816118ed565b611ad28661188d565b81528286013583820152815201920191611aa3565b9080601f83011215610321578160206119f493359101611a6d565b91909160a0818403126103215760405190611b1c826118a1565b8193611b278261188d565b835267ffffffffffffffff9160208101358381116103215782611b4b9183016119f7565b602085015260408101358381116103215782611b68918301611ae7565b6040850152606081013592831161032157611b896080939284938301611ae7565b60608501520135910152565b90929192611ba281611a55565b91604094611bb36040519485611971565b839583855260208095019160059460051b8401948186116103215784935b868510611be2575050505050505050565b67ffffffffffffffff90853582811161032157870190608082860312610321578551611c0d81611909565b611c168361188d565b81528a8301358b8201528683013584811161032157830186601f8201121561032157803590611c4482611a55565b91611c518a519384611971565b8083528d80840191891b83010191898311610321578e809101915b838310611ca557505050508782015260608084013594851161032157611c96878d968796016119d9565b90820152815201940193611bd1565b82358152918101918f9101611c6c565b9080601f83011215610321578160206119f493359101611b95565b9181601f840112156103215782359167ffffffffffffffff8311610321576020808501948460051b01011161032157565b906080600319830112610321576004356001600160a01b0381168103610321579160243591604435916064359067ffffffffffffffff821161032157611d4991600401611cd0565b9091565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b805115610d4a5760200190565b805160011015610d4a5760400190565b805160021015610d4a5760600190565b805160031015610d4a5760800190565b805160041015610d4a5760a00190565b8051821015610d4a5760209160051b010190565b9081518082526020808093019301915f5b828110611df1575050505090565b835180516001600160a01b031686528201518583015260409094019392810192600101611de3565b90608080611e8f611e7d611e6b60406001600160a01b0380895116885260208901519060a060208a01528082511660a08a015260208201511660c08901520151606060e0880152610100870190611d4d565b60408701518682036040880152611dd2565b60608601518582036060870152611dd2565b93015191015290565b90611ea282611a55565b611eaf6040519182611971565b8281528092611ec0601f1991611a55565b0190602036910137565b92916001600160a01b038451166001600160a01b0383511614612377576001600160a01b03611f00606086015160643590611dbe565b515116906040830151916001600160a01b03611f1f6084358095611dbe565b51511614801590612337575b610d04576040850151906001600160a01b03611f4a6044358094611dbe565b5151166001600160a01b03611f6560643560608a0151611dbe565b5151161461232557611f7686612c33565b805f525f60205260405f2054156122d25750611f9184612c33565b805f525f60205260405f20541561227e5750612076929161204e917f6fa7f4c28634b0a9d6831401c45ae468195fb63aed07308935c35374ff5d9e3960405180611ff9611feb61012033845280602085015283018d611e19565b82810360408401528a611e19565b85606083015260643560808301528760a083015260a43560c083015260c43560e083015260e4356101008301520390a16001600160a01b038651166040519261204184611955565b5f8452606435908a612e9d565b9490506001600160a01b038651166040519261206984611955565b5f845260a4359086612e9d565b92905061208660408201516134d7565b15801561226a575b8015612257575b8015612244575b61223257604051916120ad83611909565b5f83525f60208401525f60408401525f60608401526120cc84836144e2565b845260408401526120f26120e083866144e2565b6020860152806060860152845161356b565b94612106602085015160408601519061356b565b9361211087613521565b8015612223575b612211576121d861220a957fd9fa84dd790c969daa5c33d8050dc06b4a9b59d5b42e2be5f5e8ae20447f618d946121ba61220f9a60a0966121598a8851613595565b6121678c6020890151613595565b6121758a60408901516135f3565b6121838c60608901516135f3565b61218c8a61371e565b6121958c61371e565b6001600160a01b036121b160c435926060606435910151611dbe565b515116336137be565b50506001600160a01b036121b160e43592606060a435910151611dbe565b5050606060405191338352805160208401526020810151604084015260408101518284015201516080820152a16138aa565b6138aa565b565b604051630d86822160e01b8152600490fd5b5061222d85613521565b612117565b6040516321badf1f60e01b8152600490fd5b506122526060840151613521565b61209c565b506122656060820151613521565b612095565b5061227860408401516134d7565b1561208e565b9351604080513381526001600160a01b039092166020830152810194909452507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f3945091925082915050606081015b0390a1565b9551604080513381526001600160a01b039092166020830152810196909652507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f3949350839250506060820190506122cd565b604051631cd2f1c760e21b8152600490fd5b506001600160a01b03612351606085015160a43590611dbe565b5151166001600160a01b0361236d604088015160443590611dbe565b5151161415611f2b565b604051630a98f1f360e21b8152600490fd5b908060209392818452848401375f828201840152601f01601f1916010190565b909291926123b681611a55565b916040916123c76040519485611971565b839581855260208095019160051b8301938185116103215783925b8584106123f25750505050505050565b67ffffffffffffffff90843582811161032157860190838286031261032157835161241c816118ed565b823584811161032157866124319185016119f7565b8152898301359384116103215761244c868b95869501611cb5565b838201528152019301926123e2565b903590605e1981360301821215610321570190565b903590601e1981360301821215610321570180359067ffffffffffffffff82116103215760200191813603831361032157565b903590601e1981360301821215610321570180359067ffffffffffffffff821161032157602001918160061b3603831361032157565b5f5b608081106124e7575050565b6060828201526020016124db565b5f5b82811061250357505050565b6060828201526020016124f7565b903590601e1981360301821215610321570180359067ffffffffffffffff821161032157602001918160051b3603831361032157565b60405190612554826118d1565b60606040835f81525f60208201520152565b60405190612573826118a1565b5f608083828152612582612547565b6020820152606060408201526060808201520152565b9015610d4a57803590607e1981360301821215610321570190565b903590609e1981360301821215610321570190565b9190811015610d4a5760061b0190565b356001600160a01b03811681036103215790565b3580151581036103215790565b9081518082526020808093019301915f5b828110612618575050505090565b83518552938101939281019260010161260a565b9061264461014461263d84806125b3565b3690611b02565b5f5260205f81526040926001845f2054036129d157916128c6916126cb85855f61284b6126748361268b9a6125b3565b612690878501359182878701359c8d923690611b02565b613fa5565b6126a861269d85806125b3565b946060810190612511565b96906126c38751966126b988611955565b8688523690611b02565b973691611b95565b906126d4612c64565b506127fb8651916126e4836118a1565b600483526126f38a84016124d9565b886126fd81612c33565b988b6001600160a01b039a8b84511690835192600384528301528282015233606082015260808101825261273086611d71565b5261273a85611d71565b508051612746816118d1565b6002815281368e83013761275986611d7e565b5261276385611d7e565b50810160ff8c6127c66127af8d80612788816127808b8a51611dbe565b515116614173565b97511690612797898851611dbe565b515116846127a68a8951611dbe565b51015191612a61565b958d6127bc828751611dbe565b5151169451611dbe565b51015192169093929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b61280482611d8e565b5261280e81611d8e565b506128328b886060810160ff8c6127c66127af8d80612788816127808b8a51611dbe565b61283b82611d9e565b5261284581611d9e565b50614251565b918385511693868601918b83519289818551169401511693878652308a5281808720915101519082519261287e84611955565b878452519561288c87611939565b86528a8601528d85015284606085015285608085015260a084015260c08301528a5180809a819463d04dfe2360e01b835260048301612de5565b03915afa95865f915f986129ab575b506128e45788513d5f823e3d90fd5b95938651600281106129945750888798998260c0979899015199015161291261290c85611dae565b51611d9e565b5161291d8183613544565b1561298a5750998a925b6129498b85919060405192600284526020840152604083015260608201604052565b61295286611d8e565b5261295c85611d8e565b5082519661296988611939565b8752860152840152866060840152608083015260a082015201526001929190565b9050998a92612927565b6024908a5190630fbb8e5560e21b82526004820152fd5b9097506129ca91503d805f833e6129c28183611971565b810190612ca1565b965f6128d5565b505f92508291829150565b9035601e198236030181121561032157016020813591019167ffffffffffffffff8211610321578160061b3603831361032157565b9190808252602080920192915f905b828210612a2e575050505090565b909192936001906001600160a01b03612a468761188d565b16815285830135838201526040908101950193920190612a20565b8215612a96576001600160a01b038091165f52600160205260405f2091165f5260205260405f20905f5260205260405f205490565b909150612aa282614173565b6001600160a01b03809316906040918251946370a0823160e01b86528416938460048701526020928387602481865afa968715612bb8575f97612bc2575b5083612af9612af283612b299a614f37565b50906149f9565b508651636eb1769f60e11b81526001600160a01b0390941660048501523060248501529297889081906044820190565b0381865afa968715612bb8575f97612b87575b50612af2612b4d916119f498614f37565b50612b588183613544565b15612b7f5750935b5f5260018252825f20905f528152815f20905f8052525f20549061407e565b905093612b60565b96508387813d8311612bb1575b612b9e8183611971565b8101031261032157955195612af2612b3c565b503d612b94565b85513d5f823e3d90fd5b96508387813d8311612bea575b612bd98183611971565b810103126103215795519583612ae0565b503d612bcf565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f006002815414612c215760029055565b604051633ee5aeb560e01b8152600490fd5b604051612c5e81612c506020820194602086526040830190611e19565b03601f198101835282611971565b51902090565b60405190612c7182611939565b606060c083612c7e612566565b81525f60208201525f60408201525f838201528260808201525f60a08201520152565b919060408382031261032157825167ffffffffffffffff908181116103215784019082601f83011215610321578151602092612cdc82611a55565b91612cea6040519384611971565b808352848084019160051b830101918683116103215785809101915b838310612d795750505050948281015191821161032157019180601f84011215610321578251612d3581611a55565b93612d436040519586611971565b818552838086019260051b820101928311610321578301905b828210612d6a575050505090565b81518152908301908301612d5c565b8251815291810191869101612d06565b90808251908181526020809101926020808460051b8301019501935f915b848310612db75750505050505090565b9091929394958480612dd5600193601f198682030187528a516125f9565b9801930193019194939290612da7565b91906020928381526001600160a01b0382511684820152838201516040820152612e1f604083015160e06060840152610100830190611d4d565b9060608301516080820152612e46608084015192601f1993848483030160a0850152612d89565b9260a081015193838382030160c08401528680865192838152019501905f5b818110612e89575050506119f494955060c060e091015192828503019101526125f9565b825187529588019591880191600101612e65565b94959395929192612eac612c64565b50604096875190612ebc826118a1565b60048252602093612ece8584016124d9565b612ed789612c33565b6001600160a01b038097818c51168d519360038552898501528d840152166060820152608081018b52612f0984611d71565b52612f1383611d71565b508951612f1f816118d1565b600281528a3687830137612f3284611d7e565b52612f3c83611d7e565b50898901908681835190612f4f91611dbe565b515116612f5b90614173565b86888c51168984865190612f6e91611dbe565b5151168285875190612f7f91611dbe565b51015190612f8c92612a61565b928981865190612f9b91611dbe565b515116945190612faa91611dbe565b5101519060ff16612fe2929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b612feb83611d8e565b52612ff582611d8e565b5060608801858782519061300891611dbe565b51511661301490614173565b868a5116878984519061302691611dbe565b515116878a85519061303791611dbe565b5101519061304492612a61565b908689898186519061305591611dbe565b51511694519061306491611dbe565b5101519060ff1661309c929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b6130a583611d9e565b526130af82611d9e565b506130b991614251565b9183875116938188019283519183818451169301511693865f523084528a805f20915101518b51916130ea83611955565b5f83528c51966130f988611939565b8752858701528b8601525f60608601526080850186905260a085015260c0840152885163d04dfe2360e01b815292839081906131389060048301612de5565b03815a935f94fa91825f915f94613217575b506131595788513d5f823e3d90fd5b979495969791948251966002881097886132005750818385015194015161318261290c87611dae565b5161318d8183613544565b156131f85750925b6131b78585919060405192600284526020840152604083015260608201604052565b6131c087611d8e565b526131ca86611d8e565b5082519a6131d78c611939565b8b528a01528801526060870152608086015260a085015260c0840152159190565b905092613195565b602490835190630fbb8e5560e21b82526004820152fd5b90935061322e91503d805f833e6129c28183611971565b925f61314a565b95949193908693613244612c64565b505f92604061335f815192613258846118a1565b6004845260209361326a8582016124d9565b6133286132768b612c33565b8b6001600160a01b03998a9283835116895191600383528b830152898201528360609b168b8201526080810189526132ad86611d71565b526132b785611d71565b5087516132c3816118d1565b6002815288368b8301376132d686611d7e565b526132e085611d7e565b5060ff896127c68a85019361331c876132fe81612780858a51611dbe565b9751168861330d848951611dbe565b515116856127a6858a51611dbe565b966127bc828751611dbe565b61333182611d8e565b5261333b81611d8e565b50612832878b8d60ff896127c68c85019361331c876132fe81612780858a51611dbe565b946133df5f868a511698869786889c0191825191888184511693015116928c8552308952878086209151015188519161339783611955565b8683528951956133a687611939565b86528a86015288850152848a8501528b608085015260a084015260c08301528551808095819463d04dfe2360e01b835260048301612de5565b03915afa90815f915f936134b9575b506134ac575050505f975b6002855110988915996134995782848701519601519061341b61290c89611dae565b51906134278284613544565b1590506134915750925b6134538685919060405192600284526020840152604083015260608201604052565b61345c88611d8e565b5261346687611d8e565b5082519b6134738d611939565b8c528b0152890152870152608086015260a085015260c08401529190565b905092613431565b50505050505050505091506119f4612c64565b91999850945093966133f9565b9092506134d091503d805f833e6129c28183611971565b915f6133ee565b6134f6905f60e01d906001600160e01b038160e01d9116601b0b614fee565b1290565b906134f6916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b61506f565b613540905f60e01d906001600160e01b038160e01d9116601b0b614fee565b1390565b90613540916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b61506f565b6119f491610af4916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614545565b6135ef9160808101826135b16135ab8351611dae565b51611dae565b526135e86135e26001600160a01b038094515116936135d96135d38551611dae565b51611d71565b51169251611dae565b51611d8e565b5191613b96565b5050565b906080810191806136076135ab8551611d9e565b526001600160a01b038092515116916136236135d38551611d9e565b51166136326135e28551611d9e565b5190816136e65761364283613521565b6136cd579183917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a95936122cd955f5260209060018252613698604094855f20835f528452855f20855f528452855f205461407e565b945f5260018252835f20905f528152825f20915f52525f20555b51604051918291338352604060208401526040830190612d89565b60405163793a8f5560e01b815260048101849052602490fd5b91613717917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a95936122cd956137be565b50506136b2565b6080810161372f6135e28251611d9e565b5191821561373c57505050565b6137566135d36001600160a01b0380935151169351611d9e565b5116815f5260209160018352604092835f20835f528152835f20855f528152835f2054936001600160e01b038516613791575b505050505050565b6137b5955f9284845260018152828420868552815282842091845252812055613bf4565b5f808080613789565b939291936137cb83613521565b6136cd57846137e7576137df939450613bf4565b50505f905f90565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f528152613824835f2054948561407e565b9561382e87613521565b613851575f97885260018252838820908852815282872091875252909320829055565b835163c5e12af560e01b815260048101889052602490fd5b90604082019082526020606081936040838201528551809452019301915f5b828110613896575050505090565b835185529381019392810192600101613888565b60c0810151908151915f92613a1e575b5061395f6020918281510151926001600160a01b039081818187511696015116928660a082019485518252308452604097888320898686510151015160808601518b519161390783611955565b8683528c519361391685611955565b8785528d519661392588611939565b8752898701528c86015260016060860152608085015260a084015260c08301528851808099819463d04dfe2360e01b835260048301612de5565b03915afa948515613a145787956139f6575b508451613982575b50505050505050565b81905101510151169051813b156139f2579184918493836139b7965180978195829463012c676d60e21b845260048401613869565b03925af19081156139e957506139d2575b8080808080613979565b6139dc8291611925565b6139e657806139c8565b80fd5b513d84823e3d90fd5b8480fd5b613a0b9195503d8089833e6129c28183611971565b9050935f613971565b86513d89823e3d90fd5b6001600160a01b03602080845101510151169060a083015190823b1561032157613a61925f928360405180968195829463012c676d60e21b845260048401613869565b03925af1801561044157156138ba57613a7b919250611925565b5f905f6138ba565b6040519263a9059cbb60e01b5f526001600160a01b0380931660045260245260205f60448180855af160015f5114811615613add575b8360405215613ac757505050565b635274afe760e01b835216600482015260249150fd5b6001811516613af357813b15153d151616613ab9565b833d5f823e3d90fd5b9092604051936323b872dd60e01b5f526001600160a01b0393848092166004521660245260445260205f60648180855af160015f5114811615613b4c575b836040525f60605215613ac757505050565b6001811516613af357813b15153d151616613b3a565b909115613b6d575050565b6040516305dbdfd960e41b81526001600160a01b03918216600482015291166024820152604490fd5b93929193613ba383613521565b6136cd5784613bb7576137df9394506140a8565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f528152613824835f2054948561356b565b90929192613c0181614574565b93613c0b81613521565b613c545784816001600160e01b03613c2a9360e01d9116601b0b615199565b50809281613c3a575b5050509190565b6001600160a01b03613c4c9316613a83565b5f8181613c33565b604051632d1671a360e11b8152600490fd5b916040805191613c75836118a1565b60048084526020613c878186016124d9565b5f5b8751811015613cbc5780613c9f6001928a611dbe565b51613caa8289611dbe565b52613cb58188611dbe565b5001613c89565b5092955092939093335f52308352855f2091865190613cda826118ed565b613ce2612547565b8252606085819301528751613cf681611955565b5f8152885191613d0583611955565b5f83525f3681375f5b8151811015613e6b57613d218183611dbe565b5190888c8b84519189818401518d8d8251613d49575b50505050505050506001915001613d0e565b5f613db897948197948c9794613d768c956001600160a01b039d8e81818d51169c0151169b015190614251565b94865199613d838b611939565b8a528901528488015286015260808501528a60a08501528b60c08501525180958194829363d04dfe2360e01b84528301612de5565b03915afa938415613e61578b915f95613e43575b508451613de1575b50908b8e89838d8d613d37565b51015116803b1561032157613e10925f918c8f84905180978195829463012c676d60e21b845233908401613869565b03925af1918215613e3957600192613e2a575b8981613dd4565b613e3390611925565b5f613e23565b8c513d5f823e3d90fd5b613e589195503d805f833e6129c28183611971565b9050935f613dcc565b8e513d5f823e3d90fd5b5050505050505050509050565b8115613e82570490565b634e487b7160e01b5f52601260045260245ffd5b6040815110613ef2576020810151908051603f198101908111613ede5760051c8211613eca5760016020920160051b010190565b5050604051613ed881611955565b5f815290565b634e487b7160e01b5f52601160045260245ffd5b50604051613ed881611955565b805115613f0f57602001515f1a90565b505f90565b905f8091602081519101845af48080613f92575b15613f485750506040513d81523d5f602083013e60203d82010160405290565b15613f6f57604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b3d15613f80576040513d5f823e3d90fd5b60405163d6bda27560e01b8152600490fd5b503d151580613f285750813b1515613f28565b91613fd0906060613fc5936001600160a01b039485916040880151611dbe565b515116940151611dbe565b5151161461232557565b6140016001600160e01b0392838316601b0b9260e01d938160e01d9116601b0b84846147b0565b90637ffffff58213614051575b90614018916149f9565b9290921580614049575b61402b57505090565b6044925060405191638eba4d0760e01b835260048301526024820152fd5b508215614022565b61405b82826156c2565b1561400e57604483856040519163d556b11160e01b835260048301526024820152fd5b6119f491610af4916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614d9e565b9291926140b482614574565b936140be81613521565b61411f5784816001600160e01b036140dd9360e01d9116601b0b615199565b929080931561410a575b508290816140f6575050509190565b613c4c926001600160a01b03309216613afc565b9092505f198114613ede57600101915f6140e7565b604051632eaefac360e21b8152600490fd5b6004111561413b57565b634e487b7160e01b5f52602160045260245ffd5b602090939291936001600160a01b03604082019516815261416f83614131565b0152565b61417b6156db565b60408051630782d7e160e01b81526001600160a01b03831660048201529091828260248173200e12d10bb0c5e4a17e7018f0f1161919bb93895afa928315614248575f925f94614213575b506141d083614131565b600183141580614201575b6141e55750505090565b5163ee07877f60e01b815291829161059791906004840161414f565b5061420b83614131565b8215156141db565b908094506142379293503d8511614241575b61422f8183611971565b810190614f0d565b919091925f6141c6565b503d614225565b513d5f823e3d90fd5b61425b8251611e98565b6142658351611e98565b9282519281518015155f146144da57600201935b6001940184019061428982611a55565b956142a460409361429c8551998a611971565b808952611a55565b6142b6602091601f1901828a016124f5565b5f9584519389896002926002885233868901523089890152606097606081018a526142e084611d71565b526142ea83611d71565b505f825b61449a575b50505050865161430a575b50505050505050505090565b9091929360028861432d8c866143268e809c9d9e018093611dbe565b528d611dbe565b50018561433a828d611dbe565b52614345818c611dbe565b505f965b614354575b506142fe565b8851871015614495576001600160a01b03614400898b856143f78c60428c8861437d8488611dbe565b51511696858261438d868a611dbe565b5101519261439b868a611dbe565b51838d82511691015182815160051b910120908451927f6ec4dff745ec96dbde88c5d41f8aa5ac13aa1664afb47b8406b44fa945a650c88452830152838201522090519161190160f01b83528d83015260228201522093611dbe565b51015191614f65565b1561447d578761446c8b8e8c8f9e9d9c9b9a999897968f614459918d61444f898f8f61443b83889f614432828f611dbe565b51511692611dbe565b52614446828b611dbe565b51015192611dbe565b52019c8d94611dbe565b5101516144668383611dbe565b52611dbe565b500196979895909192939495614349565b8851630a57f30960e31b815260048101899052602490fd5b61434e565b9091929a82518210156144d257906144c684809301809d6144bb8487611dbe565b516144668383611dbe565b50019082918d936142ee565b9a92916142f3565b505f93614279565b916040830192604061451c610af4606087519401938451906001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6145f5565b9451930161452b8151866134fa565b614533575050565b9093506119f491925051925183613fda565b919291600160ff1b840161455d57611d4993506150c4565b90611d49935f0391614d9e565b61401882826149f9565b61457c6156db565b6040805163b7bad1b160e01b81526001600160a01b0383166004820152909182826024815f73200e12d10bb0c5e4a17e7018f0f1161919bb93895af1928315614248575f925f9461421357506141d083614131565b6008815110613f0f576008015167ffffffffffffffff1667ff0a89c674ee78741490565b9091939284158215175f1461460f5750505090505f905f90565b82810192600160fd1b8082019083011760fe1c614746575b505061463281615387565b9361463c81615387565b9461464786826153a7565b90918215614737575f9083986f0785ee10d5da46d900f436a000000000808611614729575b50670de0b6b3a7640000808b1161471a575b50633b9aca00808b1161470b575b50612710808b116146fd575b5098805b6146ec57508190611d49989982600a0a9109960195817fcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccd0a93838211900382610100031b9203901c1702916153ba565b60019290920191600a90048061469c565b60049a04998a930192614698565b600991939a049901915f61468c565b601291939a049901915f61467e565b85049950602592505f61466c565b50929050611d499495506153ba565b5f82121561479a5780841361478c575b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb284131561462757909250611d499394916152c5565b909250611d4993949161532c565b8084121561475657909250611d499394916152c5565b929091806147d6576044848460405191637a97930f60e01b835260048301526024820152fd5b90919280155f146147eb57505050505f905f90565b614804936147f891615474565b92919490938492615474565b909391928461481288615387565b9161481c86615387565b947f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000094604c918688106149c3575b030191600160ff1b98838a018112155f14614990575050035b5f955f821280614987575b614969575b5f811280614957575b6149395786820103966001600160ff1b038814908161492f575b5080614926575b8061491d575b6148ff5750906148b39291615620565b915f81136148c6575b50611d49936153ba565b9091604c82136148f4576148dd91600a0a90613e78565b9081156148ea575f6148bc565b505050505f905f90565b50505050505f905f90565b876044916040519163d556b11160e01b835260048301526024820152fd5b505f85126148a3565b5082841461489d565b905088145f614896565b604489836040519163d556b11160e01b835260048301526024820152fd5b50806001600160ff1b0301821361487c565b95508087018613156149815786818703015b95614873565b5f61497b565b505f811361486e565b89985090920390506001600160ff1b03819003870182136149b45701860194614863565b5050505050505050505f905f90565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009650604b925061484a565b8115613e82570590565b8082601b82810b8314614bee577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000008405614b9a575b8380820b03614b8957507b199999999999999999999999999999999999999999999999999999987b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc84011115614b3a575b838060030b03614abe575b808413614aa25750506001600160e01b036001925b60e01b91161791565b8303600a0a8015613e82576001600160e01b0391071592614a99565b92915f841315614b0e575090614ad483836156c2565b614af057637ffffffe1901600a0a810290637fffffff92614a84565b506044916040519163d556b11160e01b835260048301526024820152fd5b637fffffff1992830390604382136148f457614b2d91600a0a906149ef565b9182156148ea5792614a84565b5f198401808060030b14614b4e5750614a79565b90506001600160e01b039293507b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff915060e01b9260ff1d181617905f90565b600190940193600a90930592614a2c565b937f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000840515614bdb576305f5e100600894058094819201955b915050614a2c565b620186a060059405809481920195614bd3565b5082614a7957505050505f90600190565b919291600160ff1b9190801580614d8c575090614c1b91615474565b9490929091905f868585858282138015614d83575b614d66575b505050508682841860ff1c94860391039081604c038111614d4b5701600a0a808205919084614d31575b505081019182821860ff1c1115614d2957826001600160ff1b0314614d0b57905f600192135f14614cdc57600a9004915b01925b81158117614ca057509190565b80614cb9575b508015614cb1579190565b505f91508190565b9192614ccf9203600160ff1b01600a0a906149ef565b600160ff1b91905f614ca6565b600a60037fe6666666666666666666666666666666666666666666666666666666666666679201040191614c90565b604490836040519163d556b11160e01b835260048301526024820152fd5b509092614c93565b8107614d3e575b80614c5f565b60ff1d600117015f614d38565b505050919350614d59579190565b60018160ff1d1790039190565b5f9a50909750909550600160ff1b94509250905086808080614c35565b50835f12614c30565b15614d975750509190565b9350919050565b9392919384158115818117614eef57505090614db991615474565b9194908295614dca82958294615474565b8096929491969387868482138015614ee6575b614ecd575b5050505050508682841860ff1c94860391039081604c038111614d4b5701600a0a808205919084614eb3575b505081019182821860ff1c1115614eab57826001600160ff1b0314614d0b57905f600192135f14614e7c57600a9004915b01925b81158117614e4f57509190565b80614e5f57508015614cb1579190565b600160ff1b93614e769291038401600a0a906149ef565b5f614ca6565b600a60037fe6666666666666666666666666666666666666666666666666666666666666679201040191614e3f565b509092614e42565b8107614ec0575b80614e0e565b60ff1d600117015f614eba565b929b5098509196509450925090505f8080808080614de2565b50858412614ddd565b9395939092919015614f05575050614cb1579190565b945092915050565b919082604091031261032157815160048110156103215760209092015160ff811681036103215790565b9060ff165f03916001600160ff1b0382115f14614f5d57600a6001818404940192061590565b909190600190565b9091813b614fa057614f779192615744565b50614f8181614131565b159182614f8d57505090565b6001600160a01b03918216911614919050565b6020918160645f935160405192630b135d3f60e11b9788855260048501526040602485015286820190604485015e8281018201859052601f01601f191601915afa905f5114601f3d11161690565b92915f9060018184145f87128715171717615068575f9280821361505a575b03604c81135f82121761504e57600a0a908461502c83820293846149ef565b146150415750501561503d575f9190565b5f90565b90935090156119f4579190565b50501561503d575f9190565b5f956001945092509061500d565b5050505f90565b93929190918083145f83125f871218831587151717176150be575f928082136150b15703604c81135f82121761504e57600a0a908461502c83820293846149ef565b919460019350919061500d565b50919050565b909291600160ff1b91828101615156575080841461514c57808413918215615144578185035b604c8111156151335750505f915b1561512457507f8000000000000000000000000000000000000000000000000000000000000001019190565b92506001600160ff1b03039190565b600a0a908115613e825704916150f8565b8482036150ea565b505090505f905f90565b9361516392945f03614bff565b80939180928114615177575b50505f039190565b915092506001600160ff1b038314614d0b57600a600191059201915f8061516f565b91925f8312156151c1576044838360405191634a7d166b60e01b835260048301526024820152fd5b9192836151d357505090505f90600190565b60ff811682019180831261529b575f83121561520b575050604c198112614cb1575f03600a0a916152048382613e78565b9283021490565b909293915f81135f1461529157604d811361526657600a0a928315613e8257835f1904831161523d5750500290600190565b60405163c849483b60e01b815260048101849052602481019290925260ff166044820152606490fd5b5060405163c849483b60e01b81526004810192909252602482015260ff919091166044820152606490fd5b5050905090600190565b60405163c849483b60e01b815260048101869052602481019190915260ff82166044820152606490fd5b909392915f6152d59181846145f5565b9490945f8483019182019412159081615322575b8115615318575b506152fa57505090565b604492506040519163d556b11160e01b835260048301526024820152fd5b905083125f6152f0565b82811291506152e9565b61534193600160fe1b908101939201906145f5565b9081815f821215615378575050604b1982126137df57615366915f03600a0a906149ef565b9081615370575f90565b600160ff1b90565b93600160ff1b90910192509050565b5f8112156119f457600160ff1b908082036153a0575090565b90505f0390565b905f198183099102908180821091030391565b92939291905f818418121561544f576001600160ff1b03928383111561543957600160ff1b938385036153ef57505050509190565b90919293508514615409575050600a600191045f03920190565b604051630ed8062160e21b8152600481019190915260248101919091526044810182905260648101849052608490fd5b5090915050600160ff1b8114613ede575f039190565b90916001600160ff1b0380841115613c33578514615409575050600a60019104920190565b919091801561561657827f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000080830515615524575b507f19999999999999999999999999999999999999999999999999999999999999997f0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc830110615515575b83136154ff5791905f90565b919060018060ff1b926001600160ff1b03030190565b9290600a02905f1901926154f3565b6f4b3b4ca85a86c47a098a22400000000080840515615604575b507728c87cb5c89a2571ebfdcb54864ada834a000000000000008305156155ed575b7b097edd871cfda3a5697758bf0e3cbb5ac5741c6400000000000000008305156155d9575b7e3899162693736ac531a5a58f1fbb4b746504382ca7e40000000000000000008305156155c9578205156155ba575b5f6154a8565b9290600a02905f1901926155b4565b9391606402916001190193615585565b93916402540be40002916009190193615585565b9391678ac7230489e8000002916012190193615560565b6025198301955092909202915f61553e565b505f915081908190565b90915f19838309928083029283808610950394808603958487101561569e5714615696579082910960018219018216809204600280826003021880830282030280830282030280830282030280830282030280830282030280920290030293600183805f03040190848311900302920304170290565b505091500490565b60648386866040519263362ced0960e11b8452600484015260248301526044820152fd5b6119f491905f8112156156d6575f0361577e565b61577e565b73200e12d10bb0c5e4a17e7018f0f1161919bb9389803b158015615719575b6157015750565b602490604051906373e6d7b360e01b82526004820152fd5b507f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d41813f14156156fa565b81519190604183036157745761576d9250602082015190606060408401519301515f1a9061580d565b9192909190565b50505f9160029190565b90637ffffff581131561580757637ffffffe1981019060438213615800575f8212156157d457637fffffff91505f0301600a0a7b8000000000000000000000000000000000000000000000000000000202111590565b50600a0a8015613e82577b80000000000000000000000000000000000000000000000000000001041090565b5050151590565b50505f90565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411615884579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa15610441575f516001600160a01b0381161561587a57905f905f90565b505f906001905f90565b5050505f9160039190560000000000000000000000000000000000000000000000000000000000200e12d10bb0c5e4a17e7018f0f1161919bb93890000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000044b608060405234801561000f575f80fd5b506004361061004a575f3560e01c80630782d7e11461004e57806354636d2b14610078578063b7bad1b11461009d578063f5c36eaf146100b0575b5f80fd5b61006161005c366004610363565b6100c3565b60405161006f929190610403565b60405180910390f35b61008b610086366004610363565b6100d8565b60405160ff909116815260200161006f565b6100616100ab366004610363565b6100e9565b61008b6100be366004610363565b6100f5565b5f806100cf5f84610100565b91509150915091565b5f6100e35f836101f0565b92915050565b5f806100cf5f84610281565b5f6100e35f83610356565b73ffffffffffffffffffffffffffffffffffffffff81165f9081526020838152604080832081518083019092525460ff8082161515835261010090910416818301527f313ce56700000000000000000000000000000000000000000000000000000000808452839283908190816004818a5afa915060203d1015610182575f91505b811561019857505f5160ff811115610198575f91505b816101af57505050602001516003925090506101e9565b83516101c3575f955093506101e992505050565b836020015160ff1681146101d85760026101db565b60015b846020015195509550505050505b9250929050565b5f805f6101fd8585610281565b909250905060018260038111156102165761021661039d565b1415801561023557505f8260038111156102325761023261039d565b14155b156102795783826040517fee07877f000000000000000000000000000000000000000000000000000000008152600401610270929190610421565b60405180910390fd5b949350505050565b5f805f8061028f8686610100565b90925090505f8260038111156102a7576102a761039d565b0361034b576040805180820182526001815260ff838116602080840191825273ffffffffffffffffffffffffffffffffffffffff8a165f908152908b9052939093209151825493517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009094169015157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff161761010093909116929092029190911790555b909590945092505050565b5f805f6101fd8585610100565b5f60208284031215610373575f80fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114610396575f80fd5b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b600481106103ff577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b9052565b6040810161041182856103ca565b60ff831660208301529392505050565b73ffffffffffffffffffffffffffffffffffffffff831681526040810161039660208301846103ca56000000000000000000000000000000000000000000"; + hex"0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000005940000000000000000000000000531167691b4f37f0266e226d03412c77fb2977ce0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000588e6080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a71461180e575080632cb77e9f146117e257806341d1514f146117ab5780635343c1b7146117105780635cffe9de146115b45780635d003c4414611430578063613255ab146113ad578063687cf02a14611096578063ac9650d814610f48578063b0460f07146105f3578063b845b83e1461059b578063ca9109ba1461044c578063d9d98ce41461039b578063ddebc96f146103475763df6db3c2146100c1575f80fd5b34610321576003196040368201126103215767ffffffffffffffff9060043582811161032157806004019160a0823603918201126103215760243584811161032157610111903690600401611cd0565b909361011b612bf0565b5f946001600160a01b039485610130846125d7565b163303610325576101496101443685611b02565b612c32565b805f525f60205260405f20966001885414610190575b60208960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556040519015158152f35b9091929394959697505f600198556040519633885282602089015260606040890152816101bc8761188d565b166060890152602484013590606219018112156103215783019060a06080890152806101ea6004840161188d565b166101008901526101fd6024830161188d565b16610120880152604481013560221982360301811215610321570190602460048301359201988211610321578136038913610321577f09d18501db0080ca2d6cd7c17fa7255daff4b2d503ea93b76ff68b6752ea8e6387806103069560846102c561030e9a60209f610284906103149f9a60606101406102ef9d0152610160880191612388565b6102b66102ab61029760448801856129db565b605f198a8603810160a08c01529491612a10565b9260648701906129db565b918784030160c0880152612a10565b91013560e08301520390a13390919060405192600284526020840152604083015260608201604052565b906040519160018352602083015260408201604052565b9236916123a8565b90613c65565b5f8080808080808061015f565b5f80fd5b602486610331856125d7565b6040516335252be360e01b815291166004820152fd5b3461032157600319602036820112610321576004359067ffffffffffffffff82116103215760809082360301126103215761038660609160040161262b565b90604051921515835260208301526040820152f35b34610321576040366003190112610321576001600160a01b036103bc611861565b166040516370a0823160e01b8152306004820152602081602481855afa908115610441575f9161040f575b50156103f75760206040515f8152f35b60249060405190633c5bf76960e21b82526004820152fd5b90506020813d602011610439575b8161042a60209383611971565b810103126103215751826103e7565b3d915061041d565b6040513d5f823e3d90fd5b346103215761045a36611d01565b92809492610466612bf0565b610471828533613b61565b61047a816134d6565b15610567578061048e6104dd9286336140a7565b9790957f7f9dfa19cf1cc2f806f2f860fbc9c056b601fb1afc0e9b843dfe5c63616268e660806040513381526001600160a01b038416998a60208301528560408301526060820152a1336137bd565b9390918561050c575b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b61055b9661030e956103069460ff93604051956005875260208701526040860152606085015260808401521660a082015260c08101604052906040519160018352602083015260408201604052565b808080808080806104e6565b506040516306dde9c360e41b81523360048201526001600160a01b03841660248201526044810191909152606490fd5b0390fd5b346103215760203660031901126103215760043567ffffffffffffffff81116103215761030e6105d26104e6923690600401611cd0565b91906105dc612bf0565b604051926105e984611955565b5f845236916123a8565b34610321576003196020368201126103215767ffffffffffffffff600435116103215760c090600435360301126103215761062c612bf0565b5f808061064160048035608481019101612510565b905015610f36576024600435013592610659846134d6565b15610f245760608060405161066d81611909565b610675612565565b81525f60208201525f6040820152015261068d612565565b506106ed6106e86106c76106bd6106b76106b1608460043501600435600401612510565b90612597565b806125b2565b60408101906124a2565b60206106e06106b1608460043501600435600401612510565b0135916125c7565b6125d7565b936001600160a01b0361073c6106e86107236107196106b76106b1608460043501600435600401612510565b60608101906124a2565b60406106e06106b1608460043501600435600401612510565b816040519761074a896118d1565b168752166020860152604085015261076c608460043501600435600401612510565b9490506001604051955f87520160051b85016040525f905f5b610799608460043501600435600401612510565b9050811080610f11575b15610d5e576107bc608460043501600435600401612510565b821015610d4a578160051b810135607e198236030181121561032157608081830136031261032157604051916107f183611909565b8181013567ffffffffffffffff81116103215761081390369084840101611b02565b835280820160208181013590850152604080820135908501526060013567ffffffffffffffff81116103215761084c9236920101611cb5565b606082015280516001600160a01b0361086e6040830151602085015190611dbe565b5151166001600160a01b0385511614801590610d16575b610d045761089d602083015160408401519083613fa4565b6108a681612c32565b91825f525f60205260405f2054155f1461090a575051604080513381526001600160a01b039092166020830152810191909152600191907fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f390606090a15b01610785565b919061093b60208497959701516040850151906060860151906040519261093084611955565b5f8452339186613234565b5f94916109a457505051604080513381526001600160a01b03909216602083015281019190915260019291907f1e6fa9678edf81f9f25bbf308bde03ad3e110db1f429394b0915ba021532941490606090a15b811561099c575b5092610904565b905088610995565b6109b9606082015160446004350135906134f9565b15610a1357505051604080513381526001600160a01b03909216602083015281019190915260019291907fe3151dc8cb7a54ffc4baabd28c1f241c94d510b5e5b502491ac3cad6c16316d59080606081015b0390a161098e565b610a2060408201516134d6565b158015610cf1575b15610a7e57505051604080513381526001600160a01b03909216602083015281019190915260019291907f500b713857325f9e6dcb52ae832eca9109d107ed1aae9cb4928b4c1e13f051aa908060608101610a0b565b9250925050600196959691610a976064600435016125eb565b15610c5e5796610b0797610b1760408401516040880151610ab88183613543565b15610c565750925b610b11848592610afa610af460608a01516001600160e01b03601b918660e01d92828816810b928260e01d9216900b6145f4565b90614569565b9d8e9260408d015161356a565b60408c015261407d565b9961407d565b98610b228484613594565b610b2c84826135f2565b60405192338452608060208501526060610b528451608080880152610100870190611e19565b93602081015160a0870152604081015160c0870152015192607f198582030160e0860152835180825260208201906020808260051b8501019601925f5b828110610bee57505050505092806001979695937fbae4dbf76931c547f765e9def16d693d86daaa596f491de979008831789185ae93610be996604084015260608301520390a180858c5101808d5260051b8c01526138a9565b61098e565b9091929396602080610c49600193601f198782030189528b51906001600160a01b03825116815283820151848201526060610c3860408401516080604085015260808401906125f8565b920151906060818403910152611d4d565b9901950193929101610b8f565b905092610ac0565b610b0790610b176060840151610b11610c9c610af460408801516001600160e01b0394601b90868360e01d9316820b91878260e01d9216900b6145f4565b60408a0151610cab8183613543565b15610ce95750915b829c8d916060890151908116155f14610cda575060408801515b96879460408d015161356a565b610ce49085613fd9565b610ccd565b905091610cb3565b50610cff6060820151613520565b610a28565b60405163936bb5ad60e01b8152600490fd5b506001600160a01b03610d326060830151604085015190611dbe565b5151166001600160a01b036020860151161415610885565b634e487b7160e01b5f52603260045260245ffd5b50919390610d706064600435016125eb565b15610f0b57835b6004356004013590610d898282613543565b610eed5750508490610da9856001600160a01b0360208701511633613bf3565b505060a46004350190610dc18260043560040161246f565b905015159081610ee5575b50610e44575b506001600160a01b03610de892935116336140a7565b50505b8351811015610e105780610e0a610e0460019387611dbe565b5161371d565b01610deb565b5060409160017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005582519182526020820152f35b90506001600160a01b03602084015116610e6e6001600160a01b038551169260043560040161246f565b929091333b1561032157610eb65f93604051958694859463691f9ed760e01b8652600486015260248501528960448501528a606485015260a0608485015260a4840191612388565b038183335af190811561044157859115610dd2579050610ed69150611925565b5f836001600160a01b03610dd2565b905088610dcc565b604492506040519163573b6f4160e01b835260048301526024820152fd5b84610d77565b50610f1f60408301516134d6565b6107a3565b60405163315f9e2360e21b8152600490fd5b604051639c95219f60e01b8152600490fd5b34610321576020806003193601126103215760043567ffffffffffffffff811161032157610f7a903690600401611cd0565b919060405192610f8984611955565b5f8452828401610f9882611a55565b94610fa66040519687611971565b828652610fb283611a55565b93610fc486880195601f1901866124f4565b5f5b84811061102857604080518881528951818a018190525f92600582901b83018101918a918c9085015b828710610ffc5785850386f35b909192938280611018600193603f198a82030186528851611d4d565b9601920196019592919092610fef565b806110778861107161104460019560059d9c9d1b87018761246f565b929089846040519586938585013782018381015f81528b519283915e015f83820152038084520182611971565b30613f13565b611081828a611dbe565b5261108c8189611dbe565b5001969596610fc6565b34610321576003196040368201126103215760043567ffffffffffffffff8082116103215760c08260040193833603011261032157602435908111610321576110e3903690600401611cd0565b906110ec612bf0565b61111d61111861111361110c611102888061245a565b604081019061246f565b3691611993565b613e95565b613efe565b801561139b5760011015611389576024830161113981866124a2565b90501561137757604484019461114f86826124a2565b905015611365576111b561117d966111a961117461116d858061245a565b95856124a2565b999092856124a2565b91909261119a60405197611190896118a1565b33895236906119f7565b9a60209b8c8901523691611a6d565b60408601523691611a6d565b6060830152606485013560808301526111cd82612c32565b91825f525f875260405f20958654159687611211575b888860017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055604051908152f35b6001905560a46001600160a01b03917f87491344dfbcf91f6cbbc610cbbeedc85313d37a02df0c93527f7ea5f8db717f83855116604051908152878c82015260606040820152806112656060820188611e19565b0390a10191611274838561246f565b90506112b9575b505050506112ad92916103066102ef61030e933390919060405192600284526020840152604083015260608201604052565b828080808080806111e3565b6112c661110c848661246f565b6112cf816145d0565b156113425750937fd46c2c56b35c8210e9e712ec3f02242d5fc90187c0ac8ed80cc33626846ec369896112ad989795611335611318610306976102ef9761030e9b51169361246f565b866040519586958652850152606060408501526060840191612388565b0390a1938395965061127b565b89610597604051928392630c89984b60e31b845260048401526024830190611d4d565b60405163540e5f0b60e01b8152600490fd5b604051636c44ef8f60e01b8152600490fd5b604051633c8270bd60e21b8152600490fd5b604051632cff108b60e21b8152600490fd5b3461032157602080600319360112610321576024816001600160a01b036113d2611861565b16604051928380926370a0823160e01b82523060048301525afa908115610441575f91611403575b50604051908152f35b90508181813d8311611429575b61141a8183611971565b810103126103215751826113fa565b503d611410565b346103215761143e36611d01565b929161144b949194612bf0565b611456838333613b61565b61145f816134d6565b15611583578160ff916114778561153a969533612a60565b6114818183613543565b1561157d575080935b61149685828533613b95565b917f8045c25080b0868951141ed0a91720bcad09a8364a2b3109ee1fd49c1f0bc8b860c06114c5898833613bf3565b97906001600160a01b0360405192338452169a8b6020840152856040840152886060840152608083015260a0820152a16040519660068852602088015260408701526060860152608085015260a08401521660c082015260e08101604052906040519160018352602083015260408201604052565b90806115665760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b6115759261030e9136916123a8565b8080806104e6565b9361148a565b50604051623a3a4d60e21b81523360048201526001600160a01b039190911660248201526044810191909152606490fd5b34610321576080366003190112610321576004356001600160a01b0390818116809103610321576115e3611877565b6044359167ffffffffffffffff91606435838111610321573660238201121561032157806004013593841161032157366024858301011161032157611670956020921693611632868587613a82565b60405196879283926323e30c8b60e01b84523360048501528760248501528860448501525f606485015260a06084850152602460a485019201612388565b03815f855af1938415610441575f946116dc575b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd984036116c3576116b893503091613afb565b602060405160018152f35b604051630b6c58a960e31b815260048101859052602490fd5b9093506020813d602011611708575b816116f860209383611971565b8101031261032157519284611684565b3d91506116eb565b34610321576101403660031901126103215767ffffffffffffffff60043581811161032157611743903690600401611b02565b6024358281116103215761175b903690600401611b02565b60c0366043190112610321576101043583811161032157611780903690600401611cb5565b90610124359384116103215761179d6104e6943690600401611cb5565b926117a6612bf0565b611eca565b346103215760603660031901126103215760206117da6117c9611861565b6117d1611877565b60443591612a60565b604051908152f35b34610321576020366003190112610321576004355f525f6020526020600160405f205414604051908152f35b34610321576020366003190112610321576004359063ffffffff60e01b82168092036103215760209163e414309160e01b8114908115611850575b5015158152f35b6301ffc9a760e01b14905083611849565b600435906001600160a01b038216820361032157565b602435906001600160a01b038216820361032157565b35906001600160a01b038216820361032157565b60a0810190811067ffffffffffffffff8211176118bd57604052565b634e487b7160e01b5f52604160045260245ffd5b6060810190811067ffffffffffffffff8211176118bd57604052565b6040810190811067ffffffffffffffff8211176118bd57604052565b6080810190811067ffffffffffffffff8211176118bd57604052565b67ffffffffffffffff81116118bd57604052565b60e0810190811067ffffffffffffffff8211176118bd57604052565b6020810190811067ffffffffffffffff8211176118bd57604052565b90601f8019910116810190811067ffffffffffffffff8211176118bd57604052565b92919267ffffffffffffffff82116118bd57604051916119bd601f8201601f191660200184611971565b829481845281830111610321578281602093845f960137010152565b9080601f83011215610321578160206119f493359101611993565b90565b91906060838203126103215760405190611a10826118d1565b8193611a1b8161188d565b8352611a296020820161188d565b602084015260408101359167ffffffffffffffff831161032157604092611a5092016119d9565b910152565b67ffffffffffffffff81116118bd5760051b60200190565b929192611a7982611a55565b604092611a896040519283611971565b819581835260208093019160061b84019381851161032157915b848310611ab257505050505050565b8583830312610321578386918251611ac9816118ed565b611ad28661188d565b81528286013583820152815201920191611aa3565b9080601f83011215610321578160206119f493359101611a6d565b91909160a0818403126103215760405190611b1c826118a1565b8193611b278261188d565b835267ffffffffffffffff9160208101358381116103215782611b4b9183016119f7565b602085015260408101358381116103215782611b68918301611ae7565b6040850152606081013592831161032157611b896080939284938301611ae7565b60608501520135910152565b90929192611ba281611a55565b91604094611bb36040519485611971565b839583855260208095019160059460051b8401948186116103215784935b868510611be2575050505050505050565b67ffffffffffffffff90853582811161032157870190608082860312610321578551611c0d81611909565b611c168361188d565b81528a8301358b8201528683013584811161032157830186601f8201121561032157803590611c4482611a55565b91611c518a519384611971565b8083528d80840191891b83010191898311610321578e809101915b838310611ca557505050508782015260608084013594851161032157611c96878d968796016119d9565b90820152815201940193611bd1565b82358152918101918f9101611c6c565b9080601f83011215610321578160206119f493359101611b95565b9181601f840112156103215782359167ffffffffffffffff8311610321576020808501948460051b01011161032157565b906080600319830112610321576004356001600160a01b0381168103610321579160243591604435916064359067ffffffffffffffff821161032157611d4991600401611cd0565b9091565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b805115610d4a5760200190565b805160011015610d4a5760400190565b805160021015610d4a5760600190565b805160031015610d4a5760800190565b805160041015610d4a5760a00190565b8051821015610d4a5760209160051b010190565b9081518082526020808093019301915f5b828110611df1575050505090565b835180516001600160a01b031686528201518583015260409094019392810192600101611de3565b90608080611e8f611e7d611e6b60406001600160a01b0380895116885260208901519060a060208a01528082511660a08a015260208201511660c08901520151606060e0880152610100870190611d4d565b60408701518682036040880152611dd2565b60608601518582036060870152611dd2565b93015191015290565b90611ea282611a55565b611eaf6040519182611971565b8281528092611ec0601f1991611a55565b0190602036910137565b926001600160a01b038451166001600160a01b0383511614612376576001600160a01b03611eff606086015160643590611dbe565b515116906040830151916001600160a01b03611f1e6084358095611dbe565b51511614801590612336575b610d04576040850151906001600160a01b03611f496044358094611dbe565b5151166001600160a01b03611f6460643560608a0151611dbe565b5151161461232457611f7586612c32565b805f525f60205260405f2054156122d15750611f9084612c32565b805f525f60205260405f20541561227d5750612075929161204d917f6fa7f4c28634b0a9d6831401c45ae468195fb63aed07308935c35374ff5d9e3960405180611ff8611fea61012033845280602085015283018d611e19565b82810360408401528a611e19565b85606083015260643560808301528760a083015260a43560c083015260c43560e083015260e4356101008301520390a16001600160a01b038651166040519261204084611955565b5f8452606435908a612e9c565b9490506001600160a01b038651166040519261206884611955565b5f845260a4359086612e9c565b92905061208560408201516134d6565b158015612269575b8015612256575b8015612243575b61223157604051916120ac83611909565b5f83525f60208401525f60408401525f60608401526120cb84836144e1565b845260408401526120f16120df83866144e1565b6020860152806060860152845161356a565b94612105602085015160408601519061356a565b9361210f87613520565b8015612222575b612210576121d7612209957fd9fa84dd790c969daa5c33d8050dc06b4a9b59d5b42e2be5f5e8ae20447f618d946121b961220e9a60a0966121588a8851613594565b6121668c6020890151613594565b6121748a60408901516135f2565b6121828c60608901516135f2565b61218b8a61371d565b6121948c61371d565b6001600160a01b036121b060c435926060606435910151611dbe565b515116336137bd565b50506001600160a01b036121b060e43592606060a435910151611dbe565b5050606060405191338352805160208401526020810151604084015260408101518284015201516080820152a16138a9565b6138a9565b565b604051630d86822160e01b8152600490fd5b5061222c85613520565b612116565b6040516321badf1f60e01b8152600490fd5b506122516060840151613520565b61209b565b506122646060820151613520565b612094565b5061227760408401516134d6565b1561208d565b9351604080513381526001600160a01b039092166020830152810194909452507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f3945091925082915050606081015b0390a1565b9551604080513381526001600160a01b039092166020830152810196909652507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f3949350839250506060820190506122cc565b604051631cd2f1c760e21b8152600490fd5b506001600160a01b03612350606085015160a43590611dbe565b5151166001600160a01b0361236c604088015160443590611dbe565b5151161415611f2a565b604051630a98f1f360e21b8152600490fd5b908060209392818452848401375f828201840152601f01601f1916010190565b909291926123b581611a55565b916040916123c66040519485611971565b839581855260208095019160051b8301938185116103215783925b8584106123f15750505050505050565b67ffffffffffffffff90843582811161032157860190838286031261032157835161241b816118ed565b823584811161032157866124309185016119f7565b8152898301359384116103215761244b868b95869501611cb5565b838201528152019301926123e1565b903590605e1981360301821215610321570190565b903590601e1981360301821215610321570180359067ffffffffffffffff82116103215760200191813603831361032157565b903590601e1981360301821215610321570180359067ffffffffffffffff821161032157602001918160061b3603831361032157565b5f5b608081106124e6575050565b6060828201526020016124da565b5f5b82811061250257505050565b6060828201526020016124f6565b903590601e1981360301821215610321570180359067ffffffffffffffff821161032157602001918160051b3603831361032157565b60405190612553826118d1565b60606040835f81525f60208201520152565b60405190612572826118a1565b5f608083828152612581612546565b6020820152606060408201526060808201520152565b9015610d4a57803590607e1981360301821215610321570190565b903590609e1981360301821215610321570190565b9190811015610d4a5760061b0190565b356001600160a01b03811681036103215790565b3580151581036103215790565b9081518082526020808093019301915f5b828110612617575050505090565b835185529381019392810192600101612609565b9061264361014461263c84806125b2565b3690611b02565b5f5260205f81526040926001845f2054036129d057916128c5916126ca85855f61284a6126738361268a9a6125b2565b61268f878501359182878701359c8d923690611b02565b613fa4565b6126a761269c85806125b2565b946060810190612510565b96906126c28751966126b888611955565b8688523690611b02565b973691611b95565b906126d3612c63565b506127fa8651916126e3836118a1565b600483526126f28a84016124d8565b886126fc81612c32565b988b6001600160a01b039a8b84511690835192600384528301528282015233606082015260808101825261272f86611d71565b5261273985611d71565b508051612745816118d1565b6002815281368e83013761275886611d7e565b5261276285611d7e565b50810160ff8c6127c56127ae8d806127878161277f8b8a51611dbe565b515116614172565b97511690612796898851611dbe565b515116846127a58a8951611dbe565b51015191612a60565b958d6127bb828751611dbe565b5151169451611dbe565b51015192169093929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b61280382611d8e565b5261280d81611d8e565b506128318b886060810160ff8c6127c56127ae8d806127878161277f8b8a51611dbe565b61283a82611d9e565b5261284481611d9e565b50614250565b918385511693868601918b83519289818551169401511693878652308a5281808720915101519082519261287d84611955565b878452519561288b87611939565b86528a8601528d85015284606085015285608085015260a084015260c08301528a5180809a819463d04dfe2360e01b835260048301612de4565b03915afa95865f915f986129aa575b506128e35788513d5f823e3d90fd5b95938651600281106129935750888798998260c0979899015199015161291161290b85611dae565b51611d9e565b5161291c8183613543565b156129895750998a925b6129488b85919060405192600284526020840152604083015260608201604052565b61295186611d8e565b5261295b85611d8e565b5082519661296888611939565b8752860152840152866060840152608083015260a082015201526001929190565b9050998a92612926565b6024908a5190630fbb8e5560e21b82526004820152fd5b9097506129c991503d805f833e6129c18183611971565b810190612ca0565b965f6128d4565b505f92508291829150565b9035601e198236030181121561032157016020813591019167ffffffffffffffff8211610321578160061b3603831361032157565b9190808252602080920192915f905b828210612a2d575050505090565b909192936001906001600160a01b03612a458761188d565b16815285830135838201526040908101950193920190612a1f565b8215612a95576001600160a01b038091165f52600160205260405f2091165f5260205260405f20905f5260205260405f205490565b909150612aa182614172565b6001600160a01b03809316906040918251946370a0823160e01b86528416938460048701526020928387602481865afa968715612bb7575f97612bc1575b5083612af8612af183612b289a614f36565b50906149f8565b508651636eb1769f60e11b81526001600160a01b0390941660048501523060248501529297889081906044820190565b0381865afa968715612bb7575f97612b86575b50612af1612b4c916119f498614f36565b50612b578183613543565b15612b7e5750935b5f5260018252825f20905f528152815f20905f8052525f20549061407d565b905093612b5f565b96508387813d8311612bb0575b612b9d8183611971565b8101031261032157955195612af1612b3b565b503d612b93565b85513d5f823e3d90fd5b96508387813d8311612be9575b612bd88183611971565b810103126103215795519583612adf565b503d612bce565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f006002815414612c205760029055565b604051633ee5aeb560e01b8152600490fd5b604051612c5d81612c4f6020820194602086526040830190611e19565b03601f198101835282611971565b51902090565b60405190612c7082611939565b606060c083612c7d612565565b81525f60208201525f60408201525f838201528260808201525f60a08201520152565b919060408382031261032157825167ffffffffffffffff908181116103215784019082601f83011215610321578151602092612cdb82611a55565b91612ce96040519384611971565b808352848084019160051b830101918683116103215785809101915b838310612d785750505050948281015191821161032157019180601f84011215610321578251612d3481611a55565b93612d426040519586611971565b818552838086019260051b820101928311610321578301905b828210612d69575050505090565b81518152908301908301612d5b565b8251815291810191869101612d05565b90808251908181526020809101926020808460051b8301019501935f915b848310612db65750505050505090565b9091929394958480612dd4600193601f198682030187528a516125f8565b9801930193019194939290612da6565b91906020928381526001600160a01b0382511684820152838201516040820152612e1e604083015160e06060840152610100830190611d4d565b9060608301516080820152612e45608084015192601f1993848483030160a0850152612d88565b9260a081015193838382030160c08401528680865192838152019501905f5b818110612e88575050506119f494955060c060e091015192828503019101526125f8565b825187529588019591880191600101612e64565b94959395929192612eab612c63565b50604096875190612ebb826118a1565b60048252602093612ecd8584016124d8565b612ed689612c32565b6001600160a01b038097818c51168d519360038552898501528d840152166060820152608081018b52612f0884611d71565b52612f1283611d71565b508951612f1e816118d1565b600281528a3687830137612f3184611d7e565b52612f3b83611d7e565b50898901908681835190612f4e91611dbe565b515116612f5a90614172565b86888c51168984865190612f6d91611dbe565b5151168285875190612f7e91611dbe565b51015190612f8b92612a60565b928981865190612f9a91611dbe565b515116945190612fa991611dbe565b5101519060ff16612fe1929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b612fea83611d8e565b52612ff482611d8e565b5060608801858782519061300791611dbe565b51511661301390614172565b868a5116878984519061302591611dbe565b515116878a85519061303691611dbe565b5101519061304392612a60565b908689898186519061305491611dbe565b51511694519061306391611dbe565b5101519060ff1661309b929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b6130a483611d9e565b526130ae82611d9e565b506130b891614250565b9183875116938188019283519183818451169301511693865f523084528a805f20915101518b51916130e983611955565b5f83528c51966130f888611939565b8752858701528b8601525f60608601526080850186905260a085015260c0840152885163d04dfe2360e01b815292839081906131379060048301612de4565b03815a935f94fa91825f915f94613216575b506131585788513d5f823e3d90fd5b979495969791948251966002881097886131ff5750818385015194015161318161290b87611dae565b5161318c8183613543565b156131f75750925b6131b68585919060405192600284526020840152604083015260608201604052565b6131bf87611d8e565b526131c986611d8e565b5082519a6131d68c611939565b8b528a01528801526060870152608086015260a085015260c0840152159190565b905092613194565b602490835190630fbb8e5560e21b82526004820152fd5b90935061322d91503d805f833e6129c18183611971565b925f613149565b95949193908693613243612c63565b505f92604061335e815192613257846118a1565b600484526020936132698582016124d8565b6133276132758b612c32565b8b6001600160a01b03998a9283835116895191600383528b830152898201528360609b168b8201526080810189526132ac86611d71565b526132b685611d71565b5087516132c2816118d1565b6002815288368b8301376132d586611d7e565b526132df85611d7e565b5060ff896127c58a85019361331b876132fd8161277f858a51611dbe565b9751168861330c848951611dbe565b515116856127a5858a51611dbe565b966127bb828751611dbe565b61333082611d8e565b5261333a81611d8e565b50612831878b8d60ff896127c58c85019361331b876132fd8161277f858a51611dbe565b946133de5f868a511698869786889c0191825191888184511693015116928c8552308952878086209151015188519161339683611955565b8683528951956133a587611939565b86528a86015288850152848a8501528b608085015260a084015260c08301528551808095819463d04dfe2360e01b835260048301612de4565b03915afa90815f915f936134b8575b506134ab575050505f975b6002855110988915996134985782848701519601519061341a61290b89611dae565b51906134268284613543565b1590506134905750925b6134528685919060405192600284526020840152604083015260608201604052565b61345b88611d8e565b5261346587611d8e565b5082519b6134728d611939565b8c528b0152890152870152608086015260a085015260c08401529190565b905092613430565b50505050505050505091506119f4612c63565b91999850945093966133f8565b9092506134cf91503d805f833e6129c18183611971565b915f6133ed565b6134f5905f60e01d906001600160e01b038160e01d9116601b0b614fed565b1290565b906134f5916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b61506e565b61353f905f60e01d906001600160e01b038160e01d9116601b0b614fed565b1390565b9061353f916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b61506e565b6119f491610af4916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614544565b6135ee9160808101826135b06135aa8351611dae565b51611dae565b526135e76135e16001600160a01b038094515116936135d86135d28551611dae565b51611d71565b51169251611dae565b51611d8e565b5191613b95565b5050565b906080810191806136066135aa8551611d9e565b526001600160a01b038092515116916136226135d28551611d9e565b51166136316135e18551611d9e565b5190816136e55761364183613520565b6136cc579183917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a95936122cc955f5260209060018252613697604094855f20835f528452855f20855f528452855f205461407d565b945f5260018252835f20905f528152825f20915f52525f20555b51604051918291338352604060208401526040830190612d88565b60405163793a8f5560e01b815260048101849052602490fd5b91613716917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a95936122cc956137bd565b50506136b1565b6080810161372e6135e18251611d9e565b5191821561373b57505050565b6137556135d26001600160a01b0380935151169351611d9e565b5116815f5260209160018352604092835f20835f528152835f20855f528152835f2054936001600160e01b038516613790575b505050505050565b6137b4955f9284845260018152828420868552815282842091845252812055613bf3565b5f808080613788565b939291936137ca83613520565b6136cc57846137e6576137de939450613bf3565b50505f905f90565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f528152613823835f2054948561407d565b9561382d87613520565b613850575f97885260018252838820908852815282872091875252909320829055565b835163c5e12af560e01b815260048101889052602490fd5b90604082019082526020606081936040838201528551809452019301915f5b828110613895575050505090565b835185529381019392810192600101613887565b60c0810151908151915f92613a1d575b5061395e6020918281510151926001600160a01b039081818187511696015116928660a082019485518252308452604097888320898686510151015160808601518b519161390683611955565b8683528c519361391585611955565b8785528d519661392488611939565b8752898701528c86015260016060860152608085015260a084015260c08301528851808099819463d04dfe2360e01b835260048301612de4565b03915afa948515613a135787956139f5575b508451613981575b50505050505050565b81905101510151169051813b156139f1579184918493836139b6965180978195829463012c676d60e21b845260048401613868565b03925af19081156139e857506139d1575b8080808080613978565b6139db8291611925565b6139e557806139c7565b80fd5b513d84823e3d90fd5b8480fd5b613a0a9195503d8089833e6129c18183611971565b9050935f613970565b86513d89823e3d90fd5b6001600160a01b03602080845101510151169060a083015190823b1561032157613a60925f928360405180968195829463012c676d60e21b845260048401613868565b03925af1801561044157156138b957613a7a919250611925565b5f905f6138b9565b6040519263a9059cbb60e01b5f526001600160a01b0380931660045260245260205f60448180855af160015f5114811615613adc575b8360405215613ac657505050565b635274afe760e01b835216600482015260249150fd5b6001811516613af257813b15153d151616613ab8565b833d5f823e3d90fd5b9092604051936323b872dd60e01b5f526001600160a01b0393848092166004521660245260445260205f60648180855af160015f5114811615613b4b575b836040525f60605215613ac657505050565b6001811516613af257813b15153d151616613b39565b909115613b6c575050565b6040516305dbdfd960e41b81526001600160a01b03918216600482015291166024820152604490fd5b93929193613ba283613520565b6136cc5784613bb6576137de9394506140a7565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f528152613823835f2054948561356a565b90929192613c0081614573565b93613c0a81613520565b613c535784816001600160e01b03613c299360e01d9116601b0b615198565b50809281613c39575b5050509190565b6001600160a01b03613c4b9316613a82565b5f8181613c32565b604051632d1671a360e11b8152600490fd5b916040805191613c74836118a1565b60048084526020613c868186016124d8565b5f5b8751811015613cbb5780613c9e6001928a611dbe565b51613ca98289611dbe565b52613cb48188611dbe565b5001613c88565b5092955092939093335f52308352855f2091865190613cd9826118ed565b613ce1612546565b8252606085819301528751613cf581611955565b5f8152885191613d0483611955565b5f83525f3681375f5b8151811015613e6a57613d208183611dbe565b5190888c8b84519189818401518d8d8251613d48575b50505050505050506001915001613d0d565b5f613db797948197948c9794613d758c956001600160a01b039d8e81818d51169c0151169b015190614250565b94865199613d828b611939565b8a528901528488015286015260808501528a60a08501528b60c08501525180958194829363d04dfe2360e01b84528301612de4565b03915afa938415613e60578b915f95613e42575b508451613de0575b50908b8e89838d8d613d36565b51015116803b1561032157613e0f925f918c8f84905180978195829463012c676d60e21b845233908401613868565b03925af1918215613e3857600192613e29575b8981613dd3565b613e3290611925565b5f613e22565b8c513d5f823e3d90fd5b613e579195503d805f833e6129c18183611971565b9050935f613dcb565b8e513d5f823e3d90fd5b5050505050505050509050565b8115613e81570490565b634e487b7160e01b5f52601260045260245ffd5b6040815110613ef1576020810151908051603f198101908111613edd5760051c8211613ec95760016020920160051b010190565b5050604051613ed781611955565b5f815290565b634e487b7160e01b5f52601160045260245ffd5b50604051613ed781611955565b805115613f0e57602001515f1a90565b505f90565b905f8091602081519101845af48080613f91575b15613f475750506040513d81523d5f602083013e60203d82010160405290565b15613f6e57604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b3d15613f7f576040513d5f823e3d90fd5b60405163d6bda27560e01b8152600490fd5b503d151580613f275750813b1515613f27565b91613fcf906060613fc4936001600160a01b039485916040880151611dbe565b515116940151611dbe565b5151161461232457565b6140006001600160e01b0392838316601b0b9260e01d938160e01d9116601b0b84846147af565b90637ffffff58213614050575b90614017916149f8565b9290921580614048575b61402a57505090565b6044925060405191638eba4d0760e01b835260048301526024820152fd5b508215614021565b61405a82826156c1565b1561400d57604483856040519163d556b11160e01b835260048301526024820152fd5b6119f491610af4916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614d9d565b9291926140b382614573565b936140bd81613520565b61411e5784816001600160e01b036140dc9360e01d9116601b0b615198565b9290809315614109575b508290816140f5575050509190565b613c4b926001600160a01b03309216613afb565b9092505f198114613edd57600101915f6140e6565b604051632eaefac360e21b8152600490fd5b6004111561413a57565b634e487b7160e01b5f52602160045260245ffd5b602090939291936001600160a01b03604082019516815261416e83614130565b0152565b61417a6156da565b60408051630782d7e160e01b81526001600160a01b03831660048201529091828260248173200e12d10bb0c5e4a17e7018f0f1161919bb93895afa928315614247575f925f94614212575b506141cf83614130565b600183141580614200575b6141e45750505090565b5163ee07877f60e01b815291829161059791906004840161414e565b5061420a83614130565b8215156141da565b908094506142369293503d8511614240575b61422e8183611971565b810190614f0c565b919091925f6141c5565b503d614224565b513d5f823e3d90fd5b61425a8251611e98565b6142648351611e98565b9282519281518015155f146144d957600201935b6001940184019061428882611a55565b956142a360409361429b8551998a611971565b808952611a55565b6142b5602091601f1901828a016124f4565b5f9584519389896002926002885233868901523089890152606097606081018a526142df84611d71565b526142e983611d71565b505f825b614499575b505050508651614309575b50505050505050505090565b9091929360028861432c8c866143258e809c9d9e018093611dbe565b528d611dbe565b500185614339828d611dbe565b52614344818c611dbe565b505f965b614353575b506142fd565b8851871015614494576001600160a01b036143ff898b856143f68c60428c8861437c8488611dbe565b51511696858261438c868a611dbe565b5101519261439a868a611dbe565b51838d82511691015182815160051b910120908451927f6ec4dff745ec96dbde88c5d41f8aa5ac13aa1664afb47b8406b44fa945a650c88452830152838201522090519161190160f01b83528d83015260228201522093611dbe565b51015191614f64565b1561447c578761446b8b8e8c8f9e9d9c9b9a999897968f614458918d61444e898f8f61443a83889f614431828f611dbe565b51511692611dbe565b52614445828b611dbe565b51015192611dbe565b52019c8d94611dbe565b5101516144658383611dbe565b52611dbe565b500196979895909192939495614348565b8851630a57f30960e31b815260048101899052602490fd5b61434d565b9091929a82518210156144d157906144c584809301809d6144ba8487611dbe565b516144658383611dbe565b50019082918d936142ed565b9a92916142f2565b505f93614278565b916040830192604061451b610af4606087519401938451906001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6145f4565b9451930161452a8151866134f9565b614532575050565b9093506119f491925051925183613fd9565b919291600160ff1b840161455c57611d4993506150c3565b90611d49935f0391614d9d565b61401782826149f8565b61457b6156da565b6040805163b7bad1b160e01b81526001600160a01b0383166004820152909182826024815f73200e12d10bb0c5e4a17e7018f0f1161919bb93895af1928315614247575f925f9461421257506141cf83614130565b6008815110613f0e576008015167ffffffffffffffff1667ff0a89c674ee78741490565b9091939284158215175f1461460e5750505090505f905f90565b82810192600160fd1b8082019083011760fe1c614745575b505061463181615386565b9361463b81615386565b9461464686826153a6565b90918215614736575f9083986f0785ee10d5da46d900f436a000000000808611614728575b50670de0b6b3a7640000808b11614719575b50633b9aca00808b1161470a575b50612710808b116146fc575b5098805b6146eb57508190611d49989982600a0a9109960195817fcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccd0a93838211900382610100031b9203901c1702916153b9565b60019290920191600a90048061469b565b60049a04998a930192614697565b600991939a049901915f61468b565b601291939a049901915f61467d565b85049950602592505f61466b565b50929050611d499495506153b9565b5f8212156147995780841361478b575b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb284131561462657909250611d499394916152c4565b909250611d4993949161532b565b8084121561475557909250611d499394916152c4565b929091806147d5576044848460405191637a97930f60e01b835260048301526024820152fd5b90919280155f146147ea57505050505f905f90565b614803936147f791615473565b92919490938492615473565b909391928461481188615386565b9161481b86615386565b947f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000094604c918688106149c2575b030191600160ff1b98838a018112155f1461498f575050035b5f955f821280614986575b614968575b5f811280614956575b6149385786820103966001600160ff1b038814908161492e575b5080614925575b8061491c575b6148fe5750906148b2929161561f565b915f81136148c5575b50611d49936153b9565b9091604c82136148f3576148dc91600a0a90613e77565b9081156148e9575f6148bb565b505050505f905f90565b50505050505f905f90565b876044916040519163d556b11160e01b835260048301526024820152fd5b505f85126148a2565b5082841461489c565b905088145f614895565b604489836040519163d556b11160e01b835260048301526024820152fd5b50806001600160ff1b0301821361487b565b95508087018613156149805786818703015b95614872565b5f61497a565b505f811361486d565b89985090920390506001600160ff1b03819003870182136149b35701860194614862565b5050505050505050505f905f90565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009650604b9250614849565b8115613e81570590565b8082601b82810b8314614bed577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000008405614b99575b8380820b03614b8857507b199999999999999999999999999999999999999999999999999999987b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc84011115614b39575b838060030b03614abd575b808413614aa15750506001600160e01b036001925b60e01b91161791565b8303600a0a8015613e81576001600160e01b0391071592614a98565b92915f841315614b0d575090614ad383836156c1565b614aef57637ffffffe1901600a0a810290637fffffff92614a83565b506044916040519163d556b11160e01b835260048301526024820152fd5b637fffffff1992830390604382136148f357614b2c91600a0a906149ee565b9182156148e95792614a83565b5f198401808060030b14614b4d5750614a78565b90506001600160e01b039293507b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff915060e01b9260ff1d181617905f90565b600190940193600a90930592614a2b565b937f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000840515614bda576305f5e100600894058094819201955b915050614a2b565b620186a060059405809481920195614bd2565b5082614a7857505050505f90600190565b919291600160ff1b9190801580614d8b575090614c1a91615473565b9490929091905f868585858282138015614d82575b614d65575b505050508682841860ff1c94860391039081604c038111614d4a5701600a0a808205919084614d30575b505081019182821860ff1c1115614d2857826001600160ff1b0314614d0a57905f600192135f14614cdb57600a9004915b01925b81158117614c9f57509190565b80614cb8575b508015614cb0579190565b505f91508190565b9192614cce9203600160ff1b01600a0a906149ee565b600160ff1b91905f614ca5565b600a60037fe6666666666666666666666666666666666666666666666666666666666666679201040191614c8f565b604490836040519163d556b11160e01b835260048301526024820152fd5b509092614c92565b8107614d3d575b80614c5e565b60ff1d600117015f614d37565b505050919350614d58579190565b60018160ff1d1790039190565b5f9a50909750909550600160ff1b94509250905086808080614c34565b50835f12614c2f565b15614d965750509190565b9350919050565b9392919384158115818117614eee57505090614db891615473565b9194908295614dc982958294615473565b8096929491969387868482138015614ee5575b614ecc575b5050505050508682841860ff1c94860391039081604c038111614d4a5701600a0a808205919084614eb2575b505081019182821860ff1c1115614eaa57826001600160ff1b0314614d0a57905f600192135f14614e7b57600a9004915b01925b81158117614e4e57509190565b80614e5e57508015614cb0579190565b600160ff1b93614e759291038401600a0a906149ee565b5f614ca5565b600a60037fe6666666666666666666666666666666666666666666666666666666666666679201040191614e3e565b509092614e41565b8107614ebf575b80614e0d565b60ff1d600117015f614eb9565b929b5098509196509450925090505f8080808080614de1565b50858412614ddc565b9395939092919015614f04575050614cb0579190565b945092915050565b919082604091031261032157815160048110156103215760209092015160ff811681036103215790565b9060ff165f03916001600160ff1b0382115f14614f5c57600a6001818404940192061590565b909190600190565b9091813b614f9f57614f769192615743565b50614f8081614130565b159182614f8c57505090565b6001600160a01b03918216911614919050565b6020918160645f935160405192630b135d3f60e11b9788855260048501526040602485015286820190604485015e8281018201859052601f01601f191601915afa905f5114601f3d11161690565b92915f9060018184145f87128715171717615067575f92808213615059575b03604c81135f82121761504d57600a0a908461502b83820293846149ee565b146150405750501561503c575f9190565b5f90565b90935090156119f4579190565b50501561503c575f9190565b5f956001945092509061500c565b5050505f90565b93929190918083145f83125f871218831587151717176150bd575f928082136150b05703604c81135f82121761504d57600a0a908461502b83820293846149ee565b919460019350919061500c565b50919050565b909291600160ff1b91828101615155575080841461514b57808413918215615143578185035b604c8111156151325750505f915b1561512357507f8000000000000000000000000000000000000000000000000000000000000001019190565b92506001600160ff1b03039190565b600a0a908115613e815704916150f7565b8482036150e9565b505090505f905f90565b9361516292945f03614bfe565b80939180928114615176575b50505f039190565b915092506001600160ff1b038314614d0a57600a600191059201915f8061516e565b91925f8312156151c0576044838360405191634a7d166b60e01b835260048301526024820152fd5b9192836151d257505090505f90600190565b60ff811682019180831261529a575f83121561520a575050604c198112614cb0575f03600a0a916152038382613e77565b9283021490565b909293915f81135f1461529057604d811361526557600a0a928315613e8157835f1904831161523c5750500290600190565b60405163c849483b60e01b815260048101849052602481019290925260ff166044820152606490fd5b5060405163c849483b60e01b81526004810192909252602482015260ff919091166044820152606490fd5b5050905090600190565b60405163c849483b60e01b815260048101869052602481019190915260ff82166044820152606490fd5b909392915f6152d49181846145f4565b9490945f8483019182019412159081615321575b8115615317575b506152f957505090565b604492506040519163d556b11160e01b835260048301526024820152fd5b905083125f6152ef565b82811291506152e8565b61534093600160fe1b908101939201906145f4565b9081815f821215615377575050604b1982126137de57615365915f03600a0a906149ee565b908161536f575f90565b600160ff1b90565b93600160ff1b90910192509050565b5f8112156119f457600160ff1b9080820361539f575090565b90505f0390565b905f198183099102908180821091030391565b92939291905f818418121561544e576001600160ff1b03928383111561543857600160ff1b938385036153ee57505050509190565b90919293508514615408575050600a600191045f03920190565b604051630ed8062160e21b8152600481019190915260248101919091526044810182905260648101849052608490fd5b5090915050600160ff1b8114613edd575f039190565b90916001600160ff1b0380841115613c32578514615408575050600a60019104920190565b919091801561561557827f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000080830515615523575b507f19999999999999999999999999999999999999999999999999999999999999997f0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc830110615514575b83136154fe5791905f90565b919060018060ff1b926001600160ff1b03030190565b9290600a02905f1901926154f2565b6f4b3b4ca85a86c47a098a22400000000080840515615603575b507728c87cb5c89a2571ebfdcb54864ada834a000000000000008305156155ec575b7b097edd871cfda3a5697758bf0e3cbb5ac5741c6400000000000000008305156155d8575b7e3899162693736ac531a5a58f1fbb4b746504382ca7e40000000000000000008305156155c8578205156155b9575b5f6154a7565b9290600a02905f1901926155b3565b9391606402916001190193615584565b93916402540be40002916009190193615584565b9391678ac7230489e800000291601219019361555f565b6025198301955092909202915f61553d565b505f915081908190565b90915f19838309928083029283808610950394808603958487101561569d5714615695579082910960018219018216809204600280826003021880830282030280830282030280830282030280830282030280830282030280920290030293600183805f03040190848311900302920304170290565b505091500490565b60648386866040519263362ced0960e11b8452600484015260248301526044820152fd5b6119f491905f8112156156d5575f0361577d565b61577d565b73200e12d10bb0c5e4a17e7018f0f1161919bb9389803b158015615718575b6157005750565b602490604051906373e6d7b360e01b82526004820152fd5b507f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d41813f14156156f9565b81519190604183036157735761576c9250602082015190606060408401519301515f1a9061580c565b9192909190565b50505f9160029190565b90637ffffff581131561580657637ffffffe19810190604382136157ff575f8212156157d357637fffffff91505f0301600a0a7b8000000000000000000000000000000000000000000000000000000202111590565b50600a0a8015613e81577b80000000000000000000000000000000000000000000000000000001041090565b5050151590565b50505f90565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411615883579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa15610441575f516001600160a01b0381161561587957905f905f90565b505f906001905f90565b5050505f916003919056000000000000000000000000000000000000000000000000000000000000200e12d10bb0c5e4a17e7018f0f1161919bb93890000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000044b608060405234801561000f575f80fd5b506004361061004a575f3560e01c80630782d7e11461004e57806354636d2b14610078578063b7bad1b11461009d578063f5c36eaf146100b0575b5f80fd5b61006161005c366004610363565b6100c3565b60405161006f929190610403565b60405180910390f35b61008b610086366004610363565b6100d8565b60405160ff909116815260200161006f565b6100616100ab366004610363565b6100e9565b61008b6100be366004610363565b6100f5565b5f806100cf5f84610100565b91509150915091565b5f6100e35f836101f0565b92915050565b5f806100cf5f84610281565b5f6100e35f83610356565b73ffffffffffffffffffffffffffffffffffffffff81165f9081526020838152604080832081518083019092525460ff8082161515835261010090910416818301527f313ce56700000000000000000000000000000000000000000000000000000000808452839283908190816004818a5afa915060203d1015610182575f91505b811561019857505f5160ff811115610198575f91505b816101af57505050602001516003925090506101e9565b83516101c3575f955093506101e992505050565b836020015160ff1681146101d85760026101db565b60015b846020015195509550505050505b9250929050565b5f805f6101fd8585610281565b909250905060018260038111156102165761021661039d565b1415801561023557505f8260038111156102325761023261039d565b14155b156102795783826040517fee07877f000000000000000000000000000000000000000000000000000000008152600401610270929190610421565b60405180910390fd5b949350505050565b5f805f8061028f8686610100565b90925090505f8260038111156102a7576102a761039d565b0361034b576040805180820182526001815260ff838116602080840191825273ffffffffffffffffffffffffffffffffffffffff8a165f908152908b9052939093209151825493517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009094169015157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff161761010093909116929092029190911790555b909590945092505050565b5f805f6101fd8585610100565b5f60208284031215610373575f80fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114610396575f80fd5b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b600481106103ff577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b9052565b6040810161041182856103ca565b60ff831660208301529392505050565b73ffffffffffffffffffffffffffffffffffffffff831681526040810161039660208301846103ca56000000000000000000000000000000000000000000"; diff --git a/src/generated/candidate/RaindexV6.sol b/src/generated/candidate/RaindexV6.sol index 6cd83583a2..6e5556aecd 100644 --- a/src/generated/candidate/RaindexV6.sol +++ b/src/generated/candidate/RaindexV6.sol @@ -5,19 +5,19 @@ pragma solidity ^0.8.25; // THIS FILE IS AUTOGENERATED BY THE BUILD SCRIPT. DO NOT EDIT BY HAND. /// @dev Hash of the known bytecode. -bytes32 constant BYTECODE_HASH = bytes32(0xd599692a7d86bfc5b78074effccb620aa955d5081f6ff751c1ebfed36b3e7bcb); +bytes32 constant BYTECODE_HASH = bytes32(0xda75698cbc7f94bb7dbb0586d7645d5b367eaeab0a0a325ed251fe3369572fcf); /// @dev The deterministic deploy address of the contract when deployed via /// the Zoltu factory. -address constant DEPLOYED_ADDRESS = address(0xF78C2C56f95e28F73f4b8b695B07Ee574dA5c783); +address constant DEPLOYED_ADDRESS = address(0x531167691b4f37f0266e226d03412c77Fb2977ce); /// @dev The creation bytecode of the contract. bytes constant CREATION_CODE = - hex"6080806040523460395760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005561588f908161003e8239f35b5f80fdfe6080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a71461180e575080632cb77e9f146117e257806341d1514f146117ab5780635343c1b7146117105780635cffe9de146115b45780635d003c4414611430578063613255ab146113ad578063687cf02a14611096578063ac9650d814610f48578063b0460f07146105f3578063b845b83e1461059b578063ca9109ba1461044c578063d9d98ce41461039b578063ddebc96f146103475763df6db3c2146100c1575f80fd5b34610321576003196040368201126103215767ffffffffffffffff9060043582811161032157806004019160a0823603918201126103215760243584811161032157610111903690600401611cd0565b909361011b612bf1565b5f946001600160a01b039485610130846125d8565b163303610325576101496101443685611b02565b612c33565b805f525f60205260405f20966001885414610190575b60208960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556040519015158152f35b9091929394959697505f600198556040519633885282602089015260606040890152816101bc8761188d565b166060890152602484013590606219018112156103215783019060a06080890152806101ea6004840161188d565b166101008901526101fd6024830161188d565b16610120880152604481013560221982360301811215610321570190602460048301359201988211610321578136038913610321577f09d18501db0080ca2d6cd7c17fa7255daff4b2d503ea93b76ff68b6752ea8e6387806103069560846102c561030e9a60209f610284906103149f9a60606101406102ef9d0152610160880191612389565b6102b66102ab61029760448801856129dc565b605f198a8603810160a08c01529491612a11565b9260648701906129dc565b918784030160c0880152612a11565b91013560e08301520390a13390919060405192600284526020840152604083015260608201604052565b906040519160018352602083015260408201604052565b9236916123a9565b90613c66565b5f8080808080808061015f565b5f80fd5b602486610331856125d8565b6040516335252be360e01b815291166004820152fd5b3461032157600319602036820112610321576004359067ffffffffffffffff82116103215760809082360301126103215761038660609160040161262c565b90604051921515835260208301526040820152f35b34610321576040366003190112610321576001600160a01b036103bc611861565b166040516370a0823160e01b8152306004820152602081602481855afa908115610441575f9161040f575b50156103f75760206040515f8152f35b60249060405190633c5bf76960e21b82526004820152fd5b90506020813d602011610439575b8161042a60209383611971565b810103126103215751826103e7565b3d915061041d565b6040513d5f823e3d90fd5b346103215761045a36611d01565b92809492610466612bf1565b610471828533613b62565b61047a816134d7565b15610567578061048e6104dd9286336140a8565b9790957f7f9dfa19cf1cc2f806f2f860fbc9c056b601fb1afc0e9b843dfe5c63616268e660806040513381526001600160a01b038416998a60208301528560408301526060820152a1336137be565b9390918561050c575b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b61055b9661030e956103069460ff93604051956005875260208701526040860152606085015260808401521660a082015260c08101604052906040519160018352602083015260408201604052565b808080808080806104e6565b506040516306dde9c360e41b81523360048201526001600160a01b03841660248201526044810191909152606490fd5b0390fd5b346103215760203660031901126103215760043567ffffffffffffffff81116103215761030e6105d26104e6923690600401611cd0565b91906105dc612bf1565b604051926105e984611955565b5f845236916123a9565b34610321576003196020368201126103215767ffffffffffffffff600435116103215760c090600435360301126103215761062c612bf1565b5f808061064160048035608481019101612511565b905015610f36576024600435013592610659846134d7565b15610f245760608060405161066d81611909565b610675612566565b81525f60208201525f6040820152015261068d612566565b506106ed6106e86106c76106bd6106b76106b1608460043501600435600401612511565b90612598565b806125b3565b60408101906124a3565b60206106e06106b1608460043501600435600401612511565b0135916125c8565b6125d8565b936001600160a01b0361073c6106e86107236107196106b76106b1608460043501600435600401612511565b60608101906124a3565b60406106e06106b1608460043501600435600401612511565b816040519761074a896118d1565b168752166020860152604085015261076c608460043501600435600401612511565b9490506001604051955f87520160051b85016040525f905f5b610799608460043501600435600401612511565b9050811080610f11575b15610d5e576107bc608460043501600435600401612511565b821015610d4a578160051b810135607e198236030181121561032157608081830136031261032157604051916107f183611909565b8181013567ffffffffffffffff81116103215761081390369084840101611b02565b835280820160208181013590850152604080820135908501526060013567ffffffffffffffff81116103215761084c9236920101611cb5565b606082015280516001600160a01b0361086e6040830151602085015190611dbe565b5151166001600160a01b0385511614801590610d16575b610d045761089d602083015160408401519083613fa5565b6108a681612c33565b91825f525f60205260405f2054155f1461090a575051604080513381526001600160a01b039092166020830152810191909152600191907fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f390606090a15b01610785565b919061093b60208497959701516040850151906060860151906040519261093084611955565b5f8452339186613235565b5f94916109a457505051604080513381526001600160a01b03909216602083015281019190915260019291907f1e6fa9678edf81f9f25bbf308bde03ad3e110db1f429394b0915ba021532941490606090a15b811561099c575b5092610904565b905088610995565b6109b9606082015160446004350135906134fa565b15610a1357505051604080513381526001600160a01b03909216602083015281019190915260019291907fe3151dc8cb7a54ffc4baabd28c1f241c94d510b5e5b502491ac3cad6c16316d59080606081015b0390a161098e565b610a2060408201516134d7565b158015610cf1575b15610a7e57505051604080513381526001600160a01b03909216602083015281019190915260019291907f500b713857325f9e6dcb52ae832eca9109d107ed1aae9cb4928b4c1e13f051aa908060608101610a0b565b9250925050600196959691610a976064600435016125ec565b15610c5e5796610b0797610b1760408401516040880151610ab88183613544565b15610c565750925b610b11848592610afa610af460608a01516001600160e01b03601b918660e01d92828816810b928260e01d9216900b6145f5565b9061456a565b9d8e9260408d015161356b565b60408c015261407e565b9961407e565b98610b228484613595565b610b2c84826135f3565b60405192338452608060208501526060610b528451608080880152610100870190611e19565b93602081015160a0870152604081015160c0870152015192607f198582030160e0860152835180825260208201906020808260051b8501019601925f5b828110610bee57505050505092806001979695937fbae4dbf76931c547f765e9def16d693d86daaa596f491de979008831789185ae93610be996604084015260608301520390a180858c5101808d5260051b8c01526138aa565b61098e565b9091929396602080610c49600193601f198782030189528b51906001600160a01b03825116815283820151848201526060610c3860408401516080604085015260808401906125f9565b920151906060818403910152611d4d565b9901950193929101610b8f565b905092610ac0565b610b0790610b176060840151610b11610c9c610af460408801516001600160e01b0394601b90868360e01d9316820b91878260e01d9216900b6145f5565b60408a0151610cab8183613544565b15610ce95750915b829c8d916060890151908116155f14610cda575060408801515b96879460408d015161356b565b610ce49085613fda565b610ccd565b905091610cb3565b50610cff6060820151613521565b610a28565b60405163936bb5ad60e01b8152600490fd5b506001600160a01b03610d326060830151604085015190611dbe565b5151166001600160a01b036020860151161415610885565b634e487b7160e01b5f52603260045260245ffd5b50919390610d706064600435016125ec565b15610f0b57835b6004356004013590610d898282613544565b610eed5750508490610da9856001600160a01b0360208701511633613bf4565b505060a46004350190610dc182600435600401612470565b905015159081610ee5575b50610e44575b506001600160a01b03610de892935116336140a8565b50505b8351811015610e105780610e0a610e0460019387611dbe565b5161371e565b01610deb565b5060409160017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005582519182526020820152f35b90506001600160a01b03602084015116610e6e6001600160a01b0385511692600435600401612470565b929091333b1561032157610eb65f93604051958694859463691f9ed760e01b8652600486015260248501528960448501528a606485015260a0608485015260a4840191612389565b038183335af190811561044157859115610dd2579050610ed69150611925565b5f836001600160a01b03610dd2565b905088610dcc565b604492506040519163573b6f4160e01b835260048301526024820152fd5b84610d77565b50610f1f60408301516134d7565b6107a3565b60405163315f9e2360e21b8152600490fd5b604051639c95219f60e01b8152600490fd5b34610321576020806003193601126103215760043567ffffffffffffffff811161032157610f7a903690600401611cd0565b919060405192610f8984611955565b5f8452828401610f9882611a55565b94610fa66040519687611971565b828652610fb283611a55565b93610fc486880195601f1901866124f5565b5f5b84811061102857604080518881528951818a018190525f92600582901b83018101918a918c9085015b828710610ffc5785850386f35b909192938280611018600193603f198a82030186528851611d4d565b9601920196019592919092610fef565b806110778861107161104460019560059d9c9d1b870187612470565b929089846040519586938585013782018381015f81528b519283915e015f83820152038084520182611971565b30613f14565b611081828a611dbe565b5261108c8189611dbe565b5001969596610fc6565b34610321576003196040368201126103215760043567ffffffffffffffff8082116103215760c08260040193833603011261032157602435908111610321576110e3903690600401611cd0565b906110ec612bf1565b61111d61111861111361110c611102888061245b565b6040810190612470565b3691611993565b613e96565b613eff565b801561139b5760011015611389576024830161113981866124a3565b90501561137757604484019461114f86826124a3565b905015611365576111b561117d966111a961117461116d858061245b565b95856124a3565b999092856124a3565b91909261119a60405197611190896118a1565b33895236906119f7565b9a60209b8c8901523691611a6d565b60408601523691611a6d565b6060830152606485013560808301526111cd82612c33565b91825f525f875260405f20958654159687611211575b888860017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055604051908152f35b6001905560a46001600160a01b03917f87491344dfbcf91f6cbbc610cbbeedc85313d37a02df0c93527f7ea5f8db717f83855116604051908152878c82015260606040820152806112656060820188611e19565b0390a101916112748385612470565b90506112b9575b505050506112ad92916103066102ef61030e933390919060405192600284526020840152604083015260608201604052565b828080808080806111e3565b6112c661110c8486612470565b6112cf816145d1565b156113425750937fd46c2c56b35c8210e9e712ec3f02242d5fc90187c0ac8ed80cc33626846ec369896112ad989795611335611318610306976102ef9761030e9b511693612470565b866040519586958652850152606060408501526060840191612389565b0390a1938395965061127b565b89610597604051928392630c89984b60e31b845260048401526024830190611d4d565b60405163540e5f0b60e01b8152600490fd5b604051636c44ef8f60e01b8152600490fd5b604051633c8270bd60e21b8152600490fd5b604051632cff108b60e21b8152600490fd5b3461032157602080600319360112610321576024816001600160a01b036113d2611861565b16604051928380926370a0823160e01b82523060048301525afa908115610441575f91611403575b50604051908152f35b90508181813d8311611429575b61141a8183611971565b810103126103215751826113fa565b503d611410565b346103215761143e36611d01565b929161144b949194612bf1565b611456838333613b62565b61145f816134d7565b15611583578160ff916114778561153a969533612a61565b6114818183613544565b1561157d575080935b61149685828533613b96565b917f8045c25080b0868951141ed0a91720bcad09a8364a2b3109ee1fd49c1f0bc8b860c06114c5898833613bf4565b97906001600160a01b0360405192338452169a8b6020840152856040840152886060840152608083015260a0820152a16040519660068852602088015260408701526060860152608085015260a08401521660c082015260e08101604052906040519160018352602083015260408201604052565b90806115665760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b6115759261030e9136916123a9565b8080806104e6565b9361148a565b50604051623a3a4d60e21b81523360048201526001600160a01b039190911660248201526044810191909152606490fd5b34610321576080366003190112610321576004356001600160a01b0390818116809103610321576115e3611877565b6044359167ffffffffffffffff91606435838111610321573660238201121561032157806004013593841161032157366024858301011161032157611670956020921693611632868587613a83565b60405196879283926323e30c8b60e01b84523360048501528760248501528860448501525f606485015260a06084850152602460a485019201612389565b03815f855af1938415610441575f946116dc575b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd984036116c3576116b893503091613afc565b602060405160018152f35b604051630b6c58a960e31b815260048101859052602490fd5b9093506020813d602011611708575b816116f860209383611971565b8101031261032157519284611684565b3d91506116eb565b34610321576101403660031901126103215767ffffffffffffffff60043581811161032157611743903690600401611b02565b6024358281116103215761175b903690600401611b02565b60c0366043190112610321576101043583811161032157611780903690600401611cb5565b90610124359384116103215761179d6104e6943690600401611cb5565b926117a6612bf1565b611eca565b346103215760603660031901126103215760206117da6117c9611861565b6117d1611877565b60443591612a61565b604051908152f35b34610321576020366003190112610321576004355f525f6020526020600160405f205414604051908152f35b34610321576020366003190112610321576004359063ffffffff60e01b82168092036103215760209163e414309160e01b8114908115611850575b5015158152f35b6301ffc9a760e01b14905083611849565b600435906001600160a01b038216820361032157565b602435906001600160a01b038216820361032157565b35906001600160a01b038216820361032157565b60a0810190811067ffffffffffffffff8211176118bd57604052565b634e487b7160e01b5f52604160045260245ffd5b6060810190811067ffffffffffffffff8211176118bd57604052565b6040810190811067ffffffffffffffff8211176118bd57604052565b6080810190811067ffffffffffffffff8211176118bd57604052565b67ffffffffffffffff81116118bd57604052565b60e0810190811067ffffffffffffffff8211176118bd57604052565b6020810190811067ffffffffffffffff8211176118bd57604052565b90601f8019910116810190811067ffffffffffffffff8211176118bd57604052565b92919267ffffffffffffffff82116118bd57604051916119bd601f8201601f191660200184611971565b829481845281830111610321578281602093845f960137010152565b9080601f83011215610321578160206119f493359101611993565b90565b91906060838203126103215760405190611a10826118d1565b8193611a1b8161188d565b8352611a296020820161188d565b602084015260408101359167ffffffffffffffff831161032157604092611a5092016119d9565b910152565b67ffffffffffffffff81116118bd5760051b60200190565b929192611a7982611a55565b604092611a896040519283611971565b819581835260208093019160061b84019381851161032157915b848310611ab257505050505050565b8583830312610321578386918251611ac9816118ed565b611ad28661188d565b81528286013583820152815201920191611aa3565b9080601f83011215610321578160206119f493359101611a6d565b91909160a0818403126103215760405190611b1c826118a1565b8193611b278261188d565b835267ffffffffffffffff9160208101358381116103215782611b4b9183016119f7565b602085015260408101358381116103215782611b68918301611ae7565b6040850152606081013592831161032157611b896080939284938301611ae7565b60608501520135910152565b90929192611ba281611a55565b91604094611bb36040519485611971565b839583855260208095019160059460051b8401948186116103215784935b868510611be2575050505050505050565b67ffffffffffffffff90853582811161032157870190608082860312610321578551611c0d81611909565b611c168361188d565b81528a8301358b8201528683013584811161032157830186601f8201121561032157803590611c4482611a55565b91611c518a519384611971565b8083528d80840191891b83010191898311610321578e809101915b838310611ca557505050508782015260608084013594851161032157611c96878d968796016119d9565b90820152815201940193611bd1565b82358152918101918f9101611c6c565b9080601f83011215610321578160206119f493359101611b95565b9181601f840112156103215782359167ffffffffffffffff8311610321576020808501948460051b01011161032157565b906080600319830112610321576004356001600160a01b0381168103610321579160243591604435916064359067ffffffffffffffff821161032157611d4991600401611cd0565b9091565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b805115610d4a5760200190565b805160011015610d4a5760400190565b805160021015610d4a5760600190565b805160031015610d4a5760800190565b805160041015610d4a5760a00190565b8051821015610d4a5760209160051b010190565b9081518082526020808093019301915f5b828110611df1575050505090565b835180516001600160a01b031686528201518583015260409094019392810192600101611de3565b90608080611e8f611e7d611e6b60406001600160a01b0380895116885260208901519060a060208a01528082511660a08a015260208201511660c08901520151606060e0880152610100870190611d4d565b60408701518682036040880152611dd2565b60608601518582036060870152611dd2565b93015191015290565b90611ea282611a55565b611eaf6040519182611971565b8281528092611ec0601f1991611a55565b0190602036910137565b92916001600160a01b038451166001600160a01b0383511614612377576001600160a01b03611f00606086015160643590611dbe565b515116906040830151916001600160a01b03611f1f6084358095611dbe565b51511614801590612337575b610d04576040850151906001600160a01b03611f4a6044358094611dbe565b5151166001600160a01b03611f6560643560608a0151611dbe565b5151161461232557611f7686612c33565b805f525f60205260405f2054156122d25750611f9184612c33565b805f525f60205260405f20541561227e5750612076929161204e917f6fa7f4c28634b0a9d6831401c45ae468195fb63aed07308935c35374ff5d9e3960405180611ff9611feb61012033845280602085015283018d611e19565b82810360408401528a611e19565b85606083015260643560808301528760a083015260a43560c083015260c43560e083015260e4356101008301520390a16001600160a01b038651166040519261204184611955565b5f8452606435908a612e9d565b9490506001600160a01b038651166040519261206984611955565b5f845260a4359086612e9d565b92905061208660408201516134d7565b15801561226a575b8015612257575b8015612244575b61223257604051916120ad83611909565b5f83525f60208401525f60408401525f60608401526120cc84836144e2565b845260408401526120f26120e083866144e2565b6020860152806060860152845161356b565b94612106602085015160408601519061356b565b9361211087613521565b8015612223575b612211576121d861220a957fd9fa84dd790c969daa5c33d8050dc06b4a9b59d5b42e2be5f5e8ae20447f618d946121ba61220f9a60a0966121598a8851613595565b6121678c6020890151613595565b6121758a60408901516135f3565b6121838c60608901516135f3565b61218c8a61371e565b6121958c61371e565b6001600160a01b036121b160c435926060606435910151611dbe565b515116336137be565b50506001600160a01b036121b160e43592606060a435910151611dbe565b5050606060405191338352805160208401526020810151604084015260408101518284015201516080820152a16138aa565b6138aa565b565b604051630d86822160e01b8152600490fd5b5061222d85613521565b612117565b6040516321badf1f60e01b8152600490fd5b506122526060840151613521565b61209c565b506122656060820151613521565b612095565b5061227860408401516134d7565b1561208e565b9351604080513381526001600160a01b039092166020830152810194909452507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f3945091925082915050606081015b0390a1565b9551604080513381526001600160a01b039092166020830152810196909652507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f3949350839250506060820190506122cd565b604051631cd2f1c760e21b8152600490fd5b506001600160a01b03612351606085015160a43590611dbe565b5151166001600160a01b0361236d604088015160443590611dbe565b5151161415611f2b565b604051630a98f1f360e21b8152600490fd5b908060209392818452848401375f828201840152601f01601f1916010190565b909291926123b681611a55565b916040916123c76040519485611971565b839581855260208095019160051b8301938185116103215783925b8584106123f25750505050505050565b67ffffffffffffffff90843582811161032157860190838286031261032157835161241c816118ed565b823584811161032157866124319185016119f7565b8152898301359384116103215761244c868b95869501611cb5565b838201528152019301926123e2565b903590605e1981360301821215610321570190565b903590601e1981360301821215610321570180359067ffffffffffffffff82116103215760200191813603831361032157565b903590601e1981360301821215610321570180359067ffffffffffffffff821161032157602001918160061b3603831361032157565b5f5b608081106124e7575050565b6060828201526020016124db565b5f5b82811061250357505050565b6060828201526020016124f7565b903590601e1981360301821215610321570180359067ffffffffffffffff821161032157602001918160051b3603831361032157565b60405190612554826118d1565b60606040835f81525f60208201520152565b60405190612573826118a1565b5f608083828152612582612547565b6020820152606060408201526060808201520152565b9015610d4a57803590607e1981360301821215610321570190565b903590609e1981360301821215610321570190565b9190811015610d4a5760061b0190565b356001600160a01b03811681036103215790565b3580151581036103215790565b9081518082526020808093019301915f5b828110612618575050505090565b83518552938101939281019260010161260a565b9061264461014461263d84806125b3565b3690611b02565b5f5260205f81526040926001845f2054036129d157916128c6916126cb85855f61284b6126748361268b9a6125b3565b612690878501359182878701359c8d923690611b02565b613fa5565b6126a861269d85806125b3565b946060810190612511565b96906126c38751966126b988611955565b8688523690611b02565b973691611b95565b906126d4612c64565b506127fb8651916126e4836118a1565b600483526126f38a84016124d9565b886126fd81612c33565b988b6001600160a01b039a8b84511690835192600384528301528282015233606082015260808101825261273086611d71565b5261273a85611d71565b508051612746816118d1565b6002815281368e83013761275986611d7e565b5261276385611d7e565b50810160ff8c6127c66127af8d80612788816127808b8a51611dbe565b515116614173565b97511690612797898851611dbe565b515116846127a68a8951611dbe565b51015191612a61565b958d6127bc828751611dbe565b5151169451611dbe565b51015192169093929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b61280482611d8e565b5261280e81611d8e565b506128328b886060810160ff8c6127c66127af8d80612788816127808b8a51611dbe565b61283b82611d9e565b5261284581611d9e565b50614251565b918385511693868601918b83519289818551169401511693878652308a5281808720915101519082519261287e84611955565b878452519561288c87611939565b86528a8601528d85015284606085015285608085015260a084015260c08301528a5180809a819463d04dfe2360e01b835260048301612de5565b03915afa95865f915f986129ab575b506128e45788513d5f823e3d90fd5b95938651600281106129945750888798998260c0979899015199015161291261290c85611dae565b51611d9e565b5161291d8183613544565b1561298a5750998a925b6129498b85919060405192600284526020840152604083015260608201604052565b61295286611d8e565b5261295c85611d8e565b5082519661296988611939565b8752860152840152866060840152608083015260a082015201526001929190565b9050998a92612927565b6024908a5190630fbb8e5560e21b82526004820152fd5b9097506129ca91503d805f833e6129c28183611971565b810190612ca1565b965f6128d5565b505f92508291829150565b9035601e198236030181121561032157016020813591019167ffffffffffffffff8211610321578160061b3603831361032157565b9190808252602080920192915f905b828210612a2e575050505090565b909192936001906001600160a01b03612a468761188d565b16815285830135838201526040908101950193920190612a20565b8215612a96576001600160a01b038091165f52600160205260405f2091165f5260205260405f20905f5260205260405f205490565b909150612aa282614173565b6001600160a01b03809316906040918251946370a0823160e01b86528416938460048701526020928387602481865afa968715612bb8575f97612bc2575b5083612af9612af283612b299a614f37565b50906149f9565b508651636eb1769f60e11b81526001600160a01b0390941660048501523060248501529297889081906044820190565b0381865afa968715612bb8575f97612b87575b50612af2612b4d916119f498614f37565b50612b588183613544565b15612b7f5750935b5f5260018252825f20905f528152815f20905f8052525f20549061407e565b905093612b60565b96508387813d8311612bb1575b612b9e8183611971565b8101031261032157955195612af2612b3c565b503d612b94565b85513d5f823e3d90fd5b96508387813d8311612bea575b612bd98183611971565b810103126103215795519583612ae0565b503d612bcf565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f006002815414612c215760029055565b604051633ee5aeb560e01b8152600490fd5b604051612c5e81612c506020820194602086526040830190611e19565b03601f198101835282611971565b51902090565b60405190612c7182611939565b606060c083612c7e612566565b81525f60208201525f60408201525f838201528260808201525f60a08201520152565b919060408382031261032157825167ffffffffffffffff908181116103215784019082601f83011215610321578151602092612cdc82611a55565b91612cea6040519384611971565b808352848084019160051b830101918683116103215785809101915b838310612d795750505050948281015191821161032157019180601f84011215610321578251612d3581611a55565b93612d436040519586611971565b818552838086019260051b820101928311610321578301905b828210612d6a575050505090565b81518152908301908301612d5c565b8251815291810191869101612d06565b90808251908181526020809101926020808460051b8301019501935f915b848310612db75750505050505090565b9091929394958480612dd5600193601f198682030187528a516125f9565b9801930193019194939290612da7565b91906020928381526001600160a01b0382511684820152838201516040820152612e1f604083015160e06060840152610100830190611d4d565b9060608301516080820152612e46608084015192601f1993848483030160a0850152612d89565b9260a081015193838382030160c08401528680865192838152019501905f5b818110612e89575050506119f494955060c060e091015192828503019101526125f9565b825187529588019591880191600101612e65565b94959395929192612eac612c64565b50604096875190612ebc826118a1565b60048252602093612ece8584016124d9565b612ed789612c33565b6001600160a01b038097818c51168d519360038552898501528d840152166060820152608081018b52612f0984611d71565b52612f1383611d71565b508951612f1f816118d1565b600281528a3687830137612f3284611d7e565b52612f3c83611d7e565b50898901908681835190612f4f91611dbe565b515116612f5b90614173565b86888c51168984865190612f6e91611dbe565b5151168285875190612f7f91611dbe565b51015190612f8c92612a61565b928981865190612f9b91611dbe565b515116945190612faa91611dbe565b5101519060ff16612fe2929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b612feb83611d8e565b52612ff582611d8e565b5060608801858782519061300891611dbe565b51511661301490614173565b868a5116878984519061302691611dbe565b515116878a85519061303791611dbe565b5101519061304492612a61565b908689898186519061305591611dbe565b51511694519061306491611dbe565b5101519060ff1661309c929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b6130a583611d9e565b526130af82611d9e565b506130b991614251565b9183875116938188019283519183818451169301511693865f523084528a805f20915101518b51916130ea83611955565b5f83528c51966130f988611939565b8752858701528b8601525f60608601526080850186905260a085015260c0840152885163d04dfe2360e01b815292839081906131389060048301612de5565b03815a935f94fa91825f915f94613217575b506131595788513d5f823e3d90fd5b979495969791948251966002881097886132005750818385015194015161318261290c87611dae565b5161318d8183613544565b156131f85750925b6131b78585919060405192600284526020840152604083015260608201604052565b6131c087611d8e565b526131ca86611d8e565b5082519a6131d78c611939565b8b528a01528801526060870152608086015260a085015260c0840152159190565b905092613195565b602490835190630fbb8e5560e21b82526004820152fd5b90935061322e91503d805f833e6129c28183611971565b925f61314a565b95949193908693613244612c64565b505f92604061335f815192613258846118a1565b6004845260209361326a8582016124d9565b6133286132768b612c33565b8b6001600160a01b03998a9283835116895191600383528b830152898201528360609b168b8201526080810189526132ad86611d71565b526132b785611d71565b5087516132c3816118d1565b6002815288368b8301376132d686611d7e565b526132e085611d7e565b5060ff896127c68a85019361331c876132fe81612780858a51611dbe565b9751168861330d848951611dbe565b515116856127a6858a51611dbe565b966127bc828751611dbe565b61333182611d8e565b5261333b81611d8e565b50612832878b8d60ff896127c68c85019361331c876132fe81612780858a51611dbe565b946133df5f868a511698869786889c0191825191888184511693015116928c8552308952878086209151015188519161339783611955565b8683528951956133a687611939565b86528a86015288850152848a8501528b608085015260a084015260c08301528551808095819463d04dfe2360e01b835260048301612de5565b03915afa90815f915f936134b9575b506134ac575050505f975b6002855110988915996134995782848701519601519061341b61290c89611dae565b51906134278284613544565b1590506134915750925b6134538685919060405192600284526020840152604083015260608201604052565b61345c88611d8e565b5261346687611d8e565b5082519b6134738d611939565b8c528b0152890152870152608086015260a085015260c08401529190565b905092613431565b50505050505050505091506119f4612c64565b91999850945093966133f9565b9092506134d091503d805f833e6129c28183611971565b915f6133ee565b6134f6905f60e01d906001600160e01b038160e01d9116601b0b614fee565b1290565b906134f6916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b61506f565b613540905f60e01d906001600160e01b038160e01d9116601b0b614fee565b1390565b90613540916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b61506f565b6119f491610af4916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614545565b6135ef9160808101826135b16135ab8351611dae565b51611dae565b526135e86135e26001600160a01b038094515116936135d96135d38551611dae565b51611d71565b51169251611dae565b51611d8e565b5191613b96565b5050565b906080810191806136076135ab8551611d9e565b526001600160a01b038092515116916136236135d38551611d9e565b51166136326135e28551611d9e565b5190816136e65761364283613521565b6136cd579183917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a95936122cd955f5260209060018252613698604094855f20835f528452855f20855f528452855f205461407e565b945f5260018252835f20905f528152825f20915f52525f20555b51604051918291338352604060208401526040830190612d89565b60405163793a8f5560e01b815260048101849052602490fd5b91613717917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a95936122cd956137be565b50506136b2565b6080810161372f6135e28251611d9e565b5191821561373c57505050565b6137566135d36001600160a01b0380935151169351611d9e565b5116815f5260209160018352604092835f20835f528152835f20855f528152835f2054936001600160e01b038516613791575b505050505050565b6137b5955f9284845260018152828420868552815282842091845252812055613bf4565b5f808080613789565b939291936137cb83613521565b6136cd57846137e7576137df939450613bf4565b50505f905f90565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f528152613824835f2054948561407e565b9561382e87613521565b613851575f97885260018252838820908852815282872091875252909320829055565b835163c5e12af560e01b815260048101889052602490fd5b90604082019082526020606081936040838201528551809452019301915f5b828110613896575050505090565b835185529381019392810192600101613888565b60c0810151908151915f92613a1e575b5061395f6020918281510151926001600160a01b039081818187511696015116928660a082019485518252308452604097888320898686510151015160808601518b519161390783611955565b8683528c519361391685611955565b8785528d519661392588611939565b8752898701528c86015260016060860152608085015260a084015260c08301528851808099819463d04dfe2360e01b835260048301612de5565b03915afa948515613a145787956139f6575b508451613982575b50505050505050565b81905101510151169051813b156139f2579184918493836139b7965180978195829463012c676d60e21b845260048401613869565b03925af19081156139e957506139d2575b8080808080613979565b6139dc8291611925565b6139e657806139c8565b80fd5b513d84823e3d90fd5b8480fd5b613a0b9195503d8089833e6129c28183611971565b9050935f613971565b86513d89823e3d90fd5b6001600160a01b03602080845101510151169060a083015190823b1561032157613a61925f928360405180968195829463012c676d60e21b845260048401613869565b03925af1801561044157156138ba57613a7b919250611925565b5f905f6138ba565b6040519263a9059cbb60e01b5f526001600160a01b0380931660045260245260205f60448180855af160015f5114811615613add575b8360405215613ac757505050565b635274afe760e01b835216600482015260249150fd5b6001811516613af357813b15153d151616613ab9565b833d5f823e3d90fd5b9092604051936323b872dd60e01b5f526001600160a01b0393848092166004521660245260445260205f60648180855af160015f5114811615613b4c575b836040525f60605215613ac757505050565b6001811516613af357813b15153d151616613b3a565b909115613b6d575050565b6040516305dbdfd960e41b81526001600160a01b03918216600482015291166024820152604490fd5b93929193613ba383613521565b6136cd5784613bb7576137df9394506140a8565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f528152613824835f2054948561356b565b90929192613c0181614574565b93613c0b81613521565b613c545784816001600160e01b03613c2a9360e01d9116601b0b615199565b50809281613c3a575b5050509190565b6001600160a01b03613c4c9316613a83565b5f8181613c33565b604051632d1671a360e11b8152600490fd5b916040805191613c75836118a1565b60048084526020613c878186016124d9565b5f5b8751811015613cbc5780613c9f6001928a611dbe565b51613caa8289611dbe565b52613cb58188611dbe565b5001613c89565b5092955092939093335f52308352855f2091865190613cda826118ed565b613ce2612547565b8252606085819301528751613cf681611955565b5f8152885191613d0583611955565b5f83525f3681375f5b8151811015613e6b57613d218183611dbe565b5190888c8b84519189818401518d8d8251613d49575b50505050505050506001915001613d0e565b5f613db897948197948c9794613d768c956001600160a01b039d8e81818d51169c0151169b015190614251565b94865199613d838b611939565b8a528901528488015286015260808501528a60a08501528b60c08501525180958194829363d04dfe2360e01b84528301612de5565b03915afa938415613e61578b915f95613e43575b508451613de1575b50908b8e89838d8d613d37565b51015116803b1561032157613e10925f918c8f84905180978195829463012c676d60e21b845233908401613869565b03925af1918215613e3957600192613e2a575b8981613dd4565b613e3390611925565b5f613e23565b8c513d5f823e3d90fd5b613e589195503d805f833e6129c28183611971565b9050935f613dcc565b8e513d5f823e3d90fd5b5050505050505050509050565b8115613e82570490565b634e487b7160e01b5f52601260045260245ffd5b6040815110613ef2576020810151908051603f198101908111613ede5760051c8211613eca5760016020920160051b010190565b5050604051613ed881611955565b5f815290565b634e487b7160e01b5f52601160045260245ffd5b50604051613ed881611955565b805115613f0f57602001515f1a90565b505f90565b905f8091602081519101845af48080613f92575b15613f485750506040513d81523d5f602083013e60203d82010160405290565b15613f6f57604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b3d15613f80576040513d5f823e3d90fd5b60405163d6bda27560e01b8152600490fd5b503d151580613f285750813b1515613f28565b91613fd0906060613fc5936001600160a01b039485916040880151611dbe565b515116940151611dbe565b5151161461232557565b6140016001600160e01b0392838316601b0b9260e01d938160e01d9116601b0b84846147b0565b90637ffffff58213614051575b90614018916149f9565b9290921580614049575b61402b57505090565b6044925060405191638eba4d0760e01b835260048301526024820152fd5b508215614022565b61405b82826156c2565b1561400e57604483856040519163d556b11160e01b835260048301526024820152fd5b6119f491610af4916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614d9e565b9291926140b482614574565b936140be81613521565b61411f5784816001600160e01b036140dd9360e01d9116601b0b615199565b929080931561410a575b508290816140f6575050509190565b613c4c926001600160a01b03309216613afc565b9092505f198114613ede57600101915f6140e7565b604051632eaefac360e21b8152600490fd5b6004111561413b57565b634e487b7160e01b5f52602160045260245ffd5b602090939291936001600160a01b03604082019516815261416f83614131565b0152565b61417b6156db565b60408051630782d7e160e01b81526001600160a01b03831660048201529091828260248173200e12d10bb0c5e4a17e7018f0f1161919bb93895afa928315614248575f925f94614213575b506141d083614131565b600183141580614201575b6141e55750505090565b5163ee07877f60e01b815291829161059791906004840161414f565b5061420b83614131565b8215156141db565b908094506142379293503d8511614241575b61422f8183611971565b810190614f0d565b919091925f6141c6565b503d614225565b513d5f823e3d90fd5b61425b8251611e98565b6142658351611e98565b9282519281518015155f146144da57600201935b6001940184019061428982611a55565b956142a460409361429c8551998a611971565b808952611a55565b6142b6602091601f1901828a016124f5565b5f9584519389896002926002885233868901523089890152606097606081018a526142e084611d71565b526142ea83611d71565b505f825b61449a575b50505050865161430a575b50505050505050505090565b9091929360028861432d8c866143268e809c9d9e018093611dbe565b528d611dbe565b50018561433a828d611dbe565b52614345818c611dbe565b505f965b614354575b506142fe565b8851871015614495576001600160a01b03614400898b856143f78c60428c8861437d8488611dbe565b51511696858261438d868a611dbe565b5101519261439b868a611dbe565b51838d82511691015182815160051b910120908451927f6ec4dff745ec96dbde88c5d41f8aa5ac13aa1664afb47b8406b44fa945a650c88452830152838201522090519161190160f01b83528d83015260228201522093611dbe565b51015191614f65565b1561447d578761446c8b8e8c8f9e9d9c9b9a999897968f614459918d61444f898f8f61443b83889f614432828f611dbe565b51511692611dbe565b52614446828b611dbe565b51015192611dbe565b52019c8d94611dbe565b5101516144668383611dbe565b52611dbe565b500196979895909192939495614349565b8851630a57f30960e31b815260048101899052602490fd5b61434e565b9091929a82518210156144d257906144c684809301809d6144bb8487611dbe565b516144668383611dbe565b50019082918d936142ee565b9a92916142f3565b505f93614279565b916040830192604061451c610af4606087519401938451906001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6145f5565b9451930161452b8151866134fa565b614533575050565b9093506119f491925051925183613fda565b919291600160ff1b840161455d57611d4993506150c4565b90611d49935f0391614d9e565b61401882826149f9565b61457c6156db565b6040805163b7bad1b160e01b81526001600160a01b0383166004820152909182826024815f73200e12d10bb0c5e4a17e7018f0f1161919bb93895af1928315614248575f925f9461421357506141d083614131565b6008815110613f0f576008015167ffffffffffffffff1667ff0a89c674ee78741490565b9091939284158215175f1461460f5750505090505f905f90565b82810192600160fd1b8082019083011760fe1c614746575b505061463281615387565b9361463c81615387565b9461464786826153a7565b90918215614737575f9083986f0785ee10d5da46d900f436a000000000808611614729575b50670de0b6b3a7640000808b1161471a575b50633b9aca00808b1161470b575b50612710808b116146fd575b5098805b6146ec57508190611d49989982600a0a9109960195817fcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccd0a93838211900382610100031b9203901c1702916153ba565b60019290920191600a90048061469c565b60049a04998a930192614698565b600991939a049901915f61468c565b601291939a049901915f61467e565b85049950602592505f61466c565b50929050611d499495506153ba565b5f82121561479a5780841361478c575b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb284131561462757909250611d499394916152c5565b909250611d4993949161532c565b8084121561475657909250611d499394916152c5565b929091806147d6576044848460405191637a97930f60e01b835260048301526024820152fd5b90919280155f146147eb57505050505f905f90565b614804936147f891615474565b92919490938492615474565b909391928461481288615387565b9161481c86615387565b947f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000094604c918688106149c3575b030191600160ff1b98838a018112155f14614990575050035b5f955f821280614987575b614969575b5f811280614957575b6149395786820103966001600160ff1b038814908161492f575b5080614926575b8061491d575b6148ff5750906148b39291615620565b915f81136148c6575b50611d49936153ba565b9091604c82136148f4576148dd91600a0a90613e78565b9081156148ea575f6148bc565b505050505f905f90565b50505050505f905f90565b876044916040519163d556b11160e01b835260048301526024820152fd5b505f85126148a3565b5082841461489d565b905088145f614896565b604489836040519163d556b11160e01b835260048301526024820152fd5b50806001600160ff1b0301821361487c565b95508087018613156149815786818703015b95614873565b5f61497b565b505f811361486e565b89985090920390506001600160ff1b03819003870182136149b45701860194614863565b5050505050505050505f905f90565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009650604b925061484a565b8115613e82570590565b8082601b82810b8314614bee577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000008405614b9a575b8380820b03614b8957507b199999999999999999999999999999999999999999999999999999987b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc84011115614b3a575b838060030b03614abe575b808413614aa25750506001600160e01b036001925b60e01b91161791565b8303600a0a8015613e82576001600160e01b0391071592614a99565b92915f841315614b0e575090614ad483836156c2565b614af057637ffffffe1901600a0a810290637fffffff92614a84565b506044916040519163d556b11160e01b835260048301526024820152fd5b637fffffff1992830390604382136148f457614b2d91600a0a906149ef565b9182156148ea5792614a84565b5f198401808060030b14614b4e5750614a79565b90506001600160e01b039293507b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff915060e01b9260ff1d181617905f90565b600190940193600a90930592614a2c565b937f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000840515614bdb576305f5e100600894058094819201955b915050614a2c565b620186a060059405809481920195614bd3565b5082614a7957505050505f90600190565b919291600160ff1b9190801580614d8c575090614c1b91615474565b9490929091905f868585858282138015614d83575b614d66575b505050508682841860ff1c94860391039081604c038111614d4b5701600a0a808205919084614d31575b505081019182821860ff1c1115614d2957826001600160ff1b0314614d0b57905f600192135f14614cdc57600a9004915b01925b81158117614ca057509190565b80614cb9575b508015614cb1579190565b505f91508190565b9192614ccf9203600160ff1b01600a0a906149ef565b600160ff1b91905f614ca6565b600a60037fe6666666666666666666666666666666666666666666666666666666666666679201040191614c90565b604490836040519163d556b11160e01b835260048301526024820152fd5b509092614c93565b8107614d3e575b80614c5f565b60ff1d600117015f614d38565b505050919350614d59579190565b60018160ff1d1790039190565b5f9a50909750909550600160ff1b94509250905086808080614c35565b50835f12614c30565b15614d975750509190565b9350919050565b9392919384158115818117614eef57505090614db991615474565b9194908295614dca82958294615474565b8096929491969387868482138015614ee6575b614ecd575b5050505050508682841860ff1c94860391039081604c038111614d4b5701600a0a808205919084614eb3575b505081019182821860ff1c1115614eab57826001600160ff1b0314614d0b57905f600192135f14614e7c57600a9004915b01925b81158117614e4f57509190565b80614e5f57508015614cb1579190565b600160ff1b93614e769291038401600a0a906149ef565b5f614ca6565b600a60037fe6666666666666666666666666666666666666666666666666666666666666679201040191614e3f565b509092614e42565b8107614ec0575b80614e0e565b60ff1d600117015f614eba565b929b5098509196509450925090505f8080808080614de2565b50858412614ddd565b9395939092919015614f05575050614cb1579190565b945092915050565b919082604091031261032157815160048110156103215760209092015160ff811681036103215790565b9060ff165f03916001600160ff1b0382115f14614f5d57600a6001818404940192061590565b909190600190565b9091813b614fa057614f779192615744565b50614f8181614131565b159182614f8d57505090565b6001600160a01b03918216911614919050565b6020918160645f935160405192630b135d3f60e11b9788855260048501526040602485015286820190604485015e8281018201859052601f01601f191601915afa905f5114601f3d11161690565b92915f9060018184145f87128715171717615068575f9280821361505a575b03604c81135f82121761504e57600a0a908461502c83820293846149ef565b146150415750501561503d575f9190565b5f90565b90935090156119f4579190565b50501561503d575f9190565b5f956001945092509061500d565b5050505f90565b93929190918083145f83125f871218831587151717176150be575f928082136150b15703604c81135f82121761504e57600a0a908461502c83820293846149ef565b919460019350919061500d565b50919050565b909291600160ff1b91828101615156575080841461514c57808413918215615144578185035b604c8111156151335750505f915b1561512457507f8000000000000000000000000000000000000000000000000000000000000001019190565b92506001600160ff1b03039190565b600a0a908115613e825704916150f8565b8482036150ea565b505090505f905f90565b9361516392945f03614bff565b80939180928114615177575b50505f039190565b915092506001600160ff1b038314614d0b57600a600191059201915f8061516f565b91925f8312156151c1576044838360405191634a7d166b60e01b835260048301526024820152fd5b9192836151d357505090505f90600190565b60ff811682019180831261529b575f83121561520b575050604c198112614cb1575f03600a0a916152048382613e78565b9283021490565b909293915f81135f1461529157604d811361526657600a0a928315613e8257835f1904831161523d5750500290600190565b60405163c849483b60e01b815260048101849052602481019290925260ff166044820152606490fd5b5060405163c849483b60e01b81526004810192909252602482015260ff919091166044820152606490fd5b5050905090600190565b60405163c849483b60e01b815260048101869052602481019190915260ff82166044820152606490fd5b909392915f6152d59181846145f5565b9490945f8483019182019412159081615322575b8115615318575b506152fa57505090565b604492506040519163d556b11160e01b835260048301526024820152fd5b905083125f6152f0565b82811291506152e9565b61534193600160fe1b908101939201906145f5565b9081815f821215615378575050604b1982126137df57615366915f03600a0a906149ef565b9081615370575f90565b600160ff1b90565b93600160ff1b90910192509050565b5f8112156119f457600160ff1b908082036153a0575090565b90505f0390565b905f198183099102908180821091030391565b92939291905f818418121561544f576001600160ff1b03928383111561543957600160ff1b938385036153ef57505050509190565b90919293508514615409575050600a600191045f03920190565b604051630ed8062160e21b8152600481019190915260248101919091526044810182905260648101849052608490fd5b5090915050600160ff1b8114613ede575f039190565b90916001600160ff1b0380841115613c33578514615409575050600a60019104920190565b919091801561561657827f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000080830515615524575b507f19999999999999999999999999999999999999999999999999999999999999997f0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc830110615515575b83136154ff5791905f90565b919060018060ff1b926001600160ff1b03030190565b9290600a02905f1901926154f3565b6f4b3b4ca85a86c47a098a22400000000080840515615604575b507728c87cb5c89a2571ebfdcb54864ada834a000000000000008305156155ed575b7b097edd871cfda3a5697758bf0e3cbb5ac5741c6400000000000000008305156155d9575b7e3899162693736ac531a5a58f1fbb4b746504382ca7e40000000000000000008305156155c9578205156155ba575b5f6154a8565b9290600a02905f1901926155b4565b9391606402916001190193615585565b93916402540be40002916009190193615585565b9391678ac7230489e8000002916012190193615560565b6025198301955092909202915f61553e565b505f915081908190565b90915f19838309928083029283808610950394808603958487101561569e5714615696579082910960018219018216809204600280826003021880830282030280830282030280830282030280830282030280830282030280920290030293600183805f03040190848311900302920304170290565b505091500490565b60648386866040519263362ced0960e11b8452600484015260248301526044820152fd5b6119f491905f8112156156d6575f0361577e565b61577e565b73200e12d10bb0c5e4a17e7018f0f1161919bb9389803b158015615719575b6157015750565b602490604051906373e6d7b360e01b82526004820152fd5b507f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d41813f14156156fa565b81519190604183036157745761576d9250602082015190606060408401519301515f1a9061580d565b9192909190565b50505f9160029190565b90637ffffff581131561580757637ffffffe1981019060438213615800575f8212156157d457637fffffff91505f0301600a0a7b8000000000000000000000000000000000000000000000000000000202111590565b50600a0a8015613e82577b80000000000000000000000000000000000000000000000000000001041090565b5050151590565b50505f90565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411615884579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa15610441575f516001600160a01b0381161561587a57905f905f90565b505f906001905f90565b5050505f916003919056"; + hex"6080806040523460395760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005561588e908161003e8239f35b5f80fdfe6080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a71461180e575080632cb77e9f146117e257806341d1514f146117ab5780635343c1b7146117105780635cffe9de146115b45780635d003c4414611430578063613255ab146113ad578063687cf02a14611096578063ac9650d814610f48578063b0460f07146105f3578063b845b83e1461059b578063ca9109ba1461044c578063d9d98ce41461039b578063ddebc96f146103475763df6db3c2146100c1575f80fd5b34610321576003196040368201126103215767ffffffffffffffff9060043582811161032157806004019160a0823603918201126103215760243584811161032157610111903690600401611cd0565b909361011b612bf0565b5f946001600160a01b039485610130846125d7565b163303610325576101496101443685611b02565b612c32565b805f525f60205260405f20966001885414610190575b60208960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556040519015158152f35b9091929394959697505f600198556040519633885282602089015260606040890152816101bc8761188d565b166060890152602484013590606219018112156103215783019060a06080890152806101ea6004840161188d565b166101008901526101fd6024830161188d565b16610120880152604481013560221982360301811215610321570190602460048301359201988211610321578136038913610321577f09d18501db0080ca2d6cd7c17fa7255daff4b2d503ea93b76ff68b6752ea8e6387806103069560846102c561030e9a60209f610284906103149f9a60606101406102ef9d0152610160880191612388565b6102b66102ab61029760448801856129db565b605f198a8603810160a08c01529491612a10565b9260648701906129db565b918784030160c0880152612a10565b91013560e08301520390a13390919060405192600284526020840152604083015260608201604052565b906040519160018352602083015260408201604052565b9236916123a8565b90613c65565b5f8080808080808061015f565b5f80fd5b602486610331856125d7565b6040516335252be360e01b815291166004820152fd5b3461032157600319602036820112610321576004359067ffffffffffffffff82116103215760809082360301126103215761038660609160040161262b565b90604051921515835260208301526040820152f35b34610321576040366003190112610321576001600160a01b036103bc611861565b166040516370a0823160e01b8152306004820152602081602481855afa908115610441575f9161040f575b50156103f75760206040515f8152f35b60249060405190633c5bf76960e21b82526004820152fd5b90506020813d602011610439575b8161042a60209383611971565b810103126103215751826103e7565b3d915061041d565b6040513d5f823e3d90fd5b346103215761045a36611d01565b92809492610466612bf0565b610471828533613b61565b61047a816134d6565b15610567578061048e6104dd9286336140a7565b9790957f7f9dfa19cf1cc2f806f2f860fbc9c056b601fb1afc0e9b843dfe5c63616268e660806040513381526001600160a01b038416998a60208301528560408301526060820152a1336137bd565b9390918561050c575b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b61055b9661030e956103069460ff93604051956005875260208701526040860152606085015260808401521660a082015260c08101604052906040519160018352602083015260408201604052565b808080808080806104e6565b506040516306dde9c360e41b81523360048201526001600160a01b03841660248201526044810191909152606490fd5b0390fd5b346103215760203660031901126103215760043567ffffffffffffffff81116103215761030e6105d26104e6923690600401611cd0565b91906105dc612bf0565b604051926105e984611955565b5f845236916123a8565b34610321576003196020368201126103215767ffffffffffffffff600435116103215760c090600435360301126103215761062c612bf0565b5f808061064160048035608481019101612510565b905015610f36576024600435013592610659846134d6565b15610f245760608060405161066d81611909565b610675612565565b81525f60208201525f6040820152015261068d612565565b506106ed6106e86106c76106bd6106b76106b1608460043501600435600401612510565b90612597565b806125b2565b60408101906124a2565b60206106e06106b1608460043501600435600401612510565b0135916125c7565b6125d7565b936001600160a01b0361073c6106e86107236107196106b76106b1608460043501600435600401612510565b60608101906124a2565b60406106e06106b1608460043501600435600401612510565b816040519761074a896118d1565b168752166020860152604085015261076c608460043501600435600401612510565b9490506001604051955f87520160051b85016040525f905f5b610799608460043501600435600401612510565b9050811080610f11575b15610d5e576107bc608460043501600435600401612510565b821015610d4a578160051b810135607e198236030181121561032157608081830136031261032157604051916107f183611909565b8181013567ffffffffffffffff81116103215761081390369084840101611b02565b835280820160208181013590850152604080820135908501526060013567ffffffffffffffff81116103215761084c9236920101611cb5565b606082015280516001600160a01b0361086e6040830151602085015190611dbe565b5151166001600160a01b0385511614801590610d16575b610d045761089d602083015160408401519083613fa4565b6108a681612c32565b91825f525f60205260405f2054155f1461090a575051604080513381526001600160a01b039092166020830152810191909152600191907fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f390606090a15b01610785565b919061093b60208497959701516040850151906060860151906040519261093084611955565b5f8452339186613234565b5f94916109a457505051604080513381526001600160a01b03909216602083015281019190915260019291907f1e6fa9678edf81f9f25bbf308bde03ad3e110db1f429394b0915ba021532941490606090a15b811561099c575b5092610904565b905088610995565b6109b9606082015160446004350135906134f9565b15610a1357505051604080513381526001600160a01b03909216602083015281019190915260019291907fe3151dc8cb7a54ffc4baabd28c1f241c94d510b5e5b502491ac3cad6c16316d59080606081015b0390a161098e565b610a2060408201516134d6565b158015610cf1575b15610a7e57505051604080513381526001600160a01b03909216602083015281019190915260019291907f500b713857325f9e6dcb52ae832eca9109d107ed1aae9cb4928b4c1e13f051aa908060608101610a0b565b9250925050600196959691610a976064600435016125eb565b15610c5e5796610b0797610b1760408401516040880151610ab88183613543565b15610c565750925b610b11848592610afa610af460608a01516001600160e01b03601b918660e01d92828816810b928260e01d9216900b6145f4565b90614569565b9d8e9260408d015161356a565b60408c015261407d565b9961407d565b98610b228484613594565b610b2c84826135f2565b60405192338452608060208501526060610b528451608080880152610100870190611e19565b93602081015160a0870152604081015160c0870152015192607f198582030160e0860152835180825260208201906020808260051b8501019601925f5b828110610bee57505050505092806001979695937fbae4dbf76931c547f765e9def16d693d86daaa596f491de979008831789185ae93610be996604084015260608301520390a180858c5101808d5260051b8c01526138a9565b61098e565b9091929396602080610c49600193601f198782030189528b51906001600160a01b03825116815283820151848201526060610c3860408401516080604085015260808401906125f8565b920151906060818403910152611d4d565b9901950193929101610b8f565b905092610ac0565b610b0790610b176060840151610b11610c9c610af460408801516001600160e01b0394601b90868360e01d9316820b91878260e01d9216900b6145f4565b60408a0151610cab8183613543565b15610ce95750915b829c8d916060890151908116155f14610cda575060408801515b96879460408d015161356a565b610ce49085613fd9565b610ccd565b905091610cb3565b50610cff6060820151613520565b610a28565b60405163936bb5ad60e01b8152600490fd5b506001600160a01b03610d326060830151604085015190611dbe565b5151166001600160a01b036020860151161415610885565b634e487b7160e01b5f52603260045260245ffd5b50919390610d706064600435016125eb565b15610f0b57835b6004356004013590610d898282613543565b610eed5750508490610da9856001600160a01b0360208701511633613bf3565b505060a46004350190610dc18260043560040161246f565b905015159081610ee5575b50610e44575b506001600160a01b03610de892935116336140a7565b50505b8351811015610e105780610e0a610e0460019387611dbe565b5161371d565b01610deb565b5060409160017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005582519182526020820152f35b90506001600160a01b03602084015116610e6e6001600160a01b038551169260043560040161246f565b929091333b1561032157610eb65f93604051958694859463691f9ed760e01b8652600486015260248501528960448501528a606485015260a0608485015260a4840191612388565b038183335af190811561044157859115610dd2579050610ed69150611925565b5f836001600160a01b03610dd2565b905088610dcc565b604492506040519163573b6f4160e01b835260048301526024820152fd5b84610d77565b50610f1f60408301516134d6565b6107a3565b60405163315f9e2360e21b8152600490fd5b604051639c95219f60e01b8152600490fd5b34610321576020806003193601126103215760043567ffffffffffffffff811161032157610f7a903690600401611cd0565b919060405192610f8984611955565b5f8452828401610f9882611a55565b94610fa66040519687611971565b828652610fb283611a55565b93610fc486880195601f1901866124f4565b5f5b84811061102857604080518881528951818a018190525f92600582901b83018101918a918c9085015b828710610ffc5785850386f35b909192938280611018600193603f198a82030186528851611d4d565b9601920196019592919092610fef565b806110778861107161104460019560059d9c9d1b87018761246f565b929089846040519586938585013782018381015f81528b519283915e015f83820152038084520182611971565b30613f13565b611081828a611dbe565b5261108c8189611dbe565b5001969596610fc6565b34610321576003196040368201126103215760043567ffffffffffffffff8082116103215760c08260040193833603011261032157602435908111610321576110e3903690600401611cd0565b906110ec612bf0565b61111d61111861111361110c611102888061245a565b604081019061246f565b3691611993565b613e95565b613efe565b801561139b5760011015611389576024830161113981866124a2565b90501561137757604484019461114f86826124a2565b905015611365576111b561117d966111a961117461116d858061245a565b95856124a2565b999092856124a2565b91909261119a60405197611190896118a1565b33895236906119f7565b9a60209b8c8901523691611a6d565b60408601523691611a6d565b6060830152606485013560808301526111cd82612c32565b91825f525f875260405f20958654159687611211575b888860017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055604051908152f35b6001905560a46001600160a01b03917f87491344dfbcf91f6cbbc610cbbeedc85313d37a02df0c93527f7ea5f8db717f83855116604051908152878c82015260606040820152806112656060820188611e19565b0390a10191611274838561246f565b90506112b9575b505050506112ad92916103066102ef61030e933390919060405192600284526020840152604083015260608201604052565b828080808080806111e3565b6112c661110c848661246f565b6112cf816145d0565b156113425750937fd46c2c56b35c8210e9e712ec3f02242d5fc90187c0ac8ed80cc33626846ec369896112ad989795611335611318610306976102ef9761030e9b51169361246f565b866040519586958652850152606060408501526060840191612388565b0390a1938395965061127b565b89610597604051928392630c89984b60e31b845260048401526024830190611d4d565b60405163540e5f0b60e01b8152600490fd5b604051636c44ef8f60e01b8152600490fd5b604051633c8270bd60e21b8152600490fd5b604051632cff108b60e21b8152600490fd5b3461032157602080600319360112610321576024816001600160a01b036113d2611861565b16604051928380926370a0823160e01b82523060048301525afa908115610441575f91611403575b50604051908152f35b90508181813d8311611429575b61141a8183611971565b810103126103215751826113fa565b503d611410565b346103215761143e36611d01565b929161144b949194612bf0565b611456838333613b61565b61145f816134d6565b15611583578160ff916114778561153a969533612a60565b6114818183613543565b1561157d575080935b61149685828533613b95565b917f8045c25080b0868951141ed0a91720bcad09a8364a2b3109ee1fd49c1f0bc8b860c06114c5898833613bf3565b97906001600160a01b0360405192338452169a8b6020840152856040840152886060840152608083015260a0820152a16040519660068852602088015260408701526060860152608085015260a08401521660c082015260e08101604052906040519160018352602083015260408201604052565b90806115665760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b6115759261030e9136916123a8565b8080806104e6565b9361148a565b50604051623a3a4d60e21b81523360048201526001600160a01b039190911660248201526044810191909152606490fd5b34610321576080366003190112610321576004356001600160a01b0390818116809103610321576115e3611877565b6044359167ffffffffffffffff91606435838111610321573660238201121561032157806004013593841161032157366024858301011161032157611670956020921693611632868587613a82565b60405196879283926323e30c8b60e01b84523360048501528760248501528860448501525f606485015260a06084850152602460a485019201612388565b03815f855af1938415610441575f946116dc575b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd984036116c3576116b893503091613afb565b602060405160018152f35b604051630b6c58a960e31b815260048101859052602490fd5b9093506020813d602011611708575b816116f860209383611971565b8101031261032157519284611684565b3d91506116eb565b34610321576101403660031901126103215767ffffffffffffffff60043581811161032157611743903690600401611b02565b6024358281116103215761175b903690600401611b02565b60c0366043190112610321576101043583811161032157611780903690600401611cb5565b90610124359384116103215761179d6104e6943690600401611cb5565b926117a6612bf0565b611eca565b346103215760603660031901126103215760206117da6117c9611861565b6117d1611877565b60443591612a60565b604051908152f35b34610321576020366003190112610321576004355f525f6020526020600160405f205414604051908152f35b34610321576020366003190112610321576004359063ffffffff60e01b82168092036103215760209163e414309160e01b8114908115611850575b5015158152f35b6301ffc9a760e01b14905083611849565b600435906001600160a01b038216820361032157565b602435906001600160a01b038216820361032157565b35906001600160a01b038216820361032157565b60a0810190811067ffffffffffffffff8211176118bd57604052565b634e487b7160e01b5f52604160045260245ffd5b6060810190811067ffffffffffffffff8211176118bd57604052565b6040810190811067ffffffffffffffff8211176118bd57604052565b6080810190811067ffffffffffffffff8211176118bd57604052565b67ffffffffffffffff81116118bd57604052565b60e0810190811067ffffffffffffffff8211176118bd57604052565b6020810190811067ffffffffffffffff8211176118bd57604052565b90601f8019910116810190811067ffffffffffffffff8211176118bd57604052565b92919267ffffffffffffffff82116118bd57604051916119bd601f8201601f191660200184611971565b829481845281830111610321578281602093845f960137010152565b9080601f83011215610321578160206119f493359101611993565b90565b91906060838203126103215760405190611a10826118d1565b8193611a1b8161188d565b8352611a296020820161188d565b602084015260408101359167ffffffffffffffff831161032157604092611a5092016119d9565b910152565b67ffffffffffffffff81116118bd5760051b60200190565b929192611a7982611a55565b604092611a896040519283611971565b819581835260208093019160061b84019381851161032157915b848310611ab257505050505050565b8583830312610321578386918251611ac9816118ed565b611ad28661188d565b81528286013583820152815201920191611aa3565b9080601f83011215610321578160206119f493359101611a6d565b91909160a0818403126103215760405190611b1c826118a1565b8193611b278261188d565b835267ffffffffffffffff9160208101358381116103215782611b4b9183016119f7565b602085015260408101358381116103215782611b68918301611ae7565b6040850152606081013592831161032157611b896080939284938301611ae7565b60608501520135910152565b90929192611ba281611a55565b91604094611bb36040519485611971565b839583855260208095019160059460051b8401948186116103215784935b868510611be2575050505050505050565b67ffffffffffffffff90853582811161032157870190608082860312610321578551611c0d81611909565b611c168361188d565b81528a8301358b8201528683013584811161032157830186601f8201121561032157803590611c4482611a55565b91611c518a519384611971565b8083528d80840191891b83010191898311610321578e809101915b838310611ca557505050508782015260608084013594851161032157611c96878d968796016119d9565b90820152815201940193611bd1565b82358152918101918f9101611c6c565b9080601f83011215610321578160206119f493359101611b95565b9181601f840112156103215782359167ffffffffffffffff8311610321576020808501948460051b01011161032157565b906080600319830112610321576004356001600160a01b0381168103610321579160243591604435916064359067ffffffffffffffff821161032157611d4991600401611cd0565b9091565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b805115610d4a5760200190565b805160011015610d4a5760400190565b805160021015610d4a5760600190565b805160031015610d4a5760800190565b805160041015610d4a5760a00190565b8051821015610d4a5760209160051b010190565b9081518082526020808093019301915f5b828110611df1575050505090565b835180516001600160a01b031686528201518583015260409094019392810192600101611de3565b90608080611e8f611e7d611e6b60406001600160a01b0380895116885260208901519060a060208a01528082511660a08a015260208201511660c08901520151606060e0880152610100870190611d4d565b60408701518682036040880152611dd2565b60608601518582036060870152611dd2565b93015191015290565b90611ea282611a55565b611eaf6040519182611971565b8281528092611ec0601f1991611a55565b0190602036910137565b926001600160a01b038451166001600160a01b0383511614612376576001600160a01b03611eff606086015160643590611dbe565b515116906040830151916001600160a01b03611f1e6084358095611dbe565b51511614801590612336575b610d04576040850151906001600160a01b03611f496044358094611dbe565b5151166001600160a01b03611f6460643560608a0151611dbe565b5151161461232457611f7586612c32565b805f525f60205260405f2054156122d15750611f9084612c32565b805f525f60205260405f20541561227d5750612075929161204d917f6fa7f4c28634b0a9d6831401c45ae468195fb63aed07308935c35374ff5d9e3960405180611ff8611fea61012033845280602085015283018d611e19565b82810360408401528a611e19565b85606083015260643560808301528760a083015260a43560c083015260c43560e083015260e4356101008301520390a16001600160a01b038651166040519261204084611955565b5f8452606435908a612e9c565b9490506001600160a01b038651166040519261206884611955565b5f845260a4359086612e9c565b92905061208560408201516134d6565b158015612269575b8015612256575b8015612243575b61223157604051916120ac83611909565b5f83525f60208401525f60408401525f60608401526120cb84836144e1565b845260408401526120f16120df83866144e1565b6020860152806060860152845161356a565b94612105602085015160408601519061356a565b9361210f87613520565b8015612222575b612210576121d7612209957fd9fa84dd790c969daa5c33d8050dc06b4a9b59d5b42e2be5f5e8ae20447f618d946121b961220e9a60a0966121588a8851613594565b6121668c6020890151613594565b6121748a60408901516135f2565b6121828c60608901516135f2565b61218b8a61371d565b6121948c61371d565b6001600160a01b036121b060c435926060606435910151611dbe565b515116336137bd565b50506001600160a01b036121b060e43592606060a435910151611dbe565b5050606060405191338352805160208401526020810151604084015260408101518284015201516080820152a16138a9565b6138a9565b565b604051630d86822160e01b8152600490fd5b5061222c85613520565b612116565b6040516321badf1f60e01b8152600490fd5b506122516060840151613520565b61209b565b506122646060820151613520565b612094565b5061227760408401516134d6565b1561208d565b9351604080513381526001600160a01b039092166020830152810194909452507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f3945091925082915050606081015b0390a1565b9551604080513381526001600160a01b039092166020830152810196909652507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f3949350839250506060820190506122cc565b604051631cd2f1c760e21b8152600490fd5b506001600160a01b03612350606085015160a43590611dbe565b5151166001600160a01b0361236c604088015160443590611dbe565b5151161415611f2a565b604051630a98f1f360e21b8152600490fd5b908060209392818452848401375f828201840152601f01601f1916010190565b909291926123b581611a55565b916040916123c66040519485611971565b839581855260208095019160051b8301938185116103215783925b8584106123f15750505050505050565b67ffffffffffffffff90843582811161032157860190838286031261032157835161241b816118ed565b823584811161032157866124309185016119f7565b8152898301359384116103215761244b868b95869501611cb5565b838201528152019301926123e1565b903590605e1981360301821215610321570190565b903590601e1981360301821215610321570180359067ffffffffffffffff82116103215760200191813603831361032157565b903590601e1981360301821215610321570180359067ffffffffffffffff821161032157602001918160061b3603831361032157565b5f5b608081106124e6575050565b6060828201526020016124da565b5f5b82811061250257505050565b6060828201526020016124f6565b903590601e1981360301821215610321570180359067ffffffffffffffff821161032157602001918160051b3603831361032157565b60405190612553826118d1565b60606040835f81525f60208201520152565b60405190612572826118a1565b5f608083828152612581612546565b6020820152606060408201526060808201520152565b9015610d4a57803590607e1981360301821215610321570190565b903590609e1981360301821215610321570190565b9190811015610d4a5760061b0190565b356001600160a01b03811681036103215790565b3580151581036103215790565b9081518082526020808093019301915f5b828110612617575050505090565b835185529381019392810192600101612609565b9061264361014461263c84806125b2565b3690611b02565b5f5260205f81526040926001845f2054036129d057916128c5916126ca85855f61284a6126738361268a9a6125b2565b61268f878501359182878701359c8d923690611b02565b613fa4565b6126a761269c85806125b2565b946060810190612510565b96906126c28751966126b888611955565b8688523690611b02565b973691611b95565b906126d3612c63565b506127fa8651916126e3836118a1565b600483526126f28a84016124d8565b886126fc81612c32565b988b6001600160a01b039a8b84511690835192600384528301528282015233606082015260808101825261272f86611d71565b5261273985611d71565b508051612745816118d1565b6002815281368e83013761275886611d7e565b5261276285611d7e565b50810160ff8c6127c56127ae8d806127878161277f8b8a51611dbe565b515116614172565b97511690612796898851611dbe565b515116846127a58a8951611dbe565b51015191612a60565b958d6127bb828751611dbe565b5151169451611dbe565b51015192169093929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b61280382611d8e565b5261280d81611d8e565b506128318b886060810160ff8c6127c56127ae8d806127878161277f8b8a51611dbe565b61283a82611d9e565b5261284481611d9e565b50614250565b918385511693868601918b83519289818551169401511693878652308a5281808720915101519082519261287d84611955565b878452519561288b87611939565b86528a8601528d85015284606085015285608085015260a084015260c08301528a5180809a819463d04dfe2360e01b835260048301612de4565b03915afa95865f915f986129aa575b506128e35788513d5f823e3d90fd5b95938651600281106129935750888798998260c0979899015199015161291161290b85611dae565b51611d9e565b5161291c8183613543565b156129895750998a925b6129488b85919060405192600284526020840152604083015260608201604052565b61295186611d8e565b5261295b85611d8e565b5082519661296888611939565b8752860152840152866060840152608083015260a082015201526001929190565b9050998a92612926565b6024908a5190630fbb8e5560e21b82526004820152fd5b9097506129c991503d805f833e6129c18183611971565b810190612ca0565b965f6128d4565b505f92508291829150565b9035601e198236030181121561032157016020813591019167ffffffffffffffff8211610321578160061b3603831361032157565b9190808252602080920192915f905b828210612a2d575050505090565b909192936001906001600160a01b03612a458761188d565b16815285830135838201526040908101950193920190612a1f565b8215612a95576001600160a01b038091165f52600160205260405f2091165f5260205260405f20905f5260205260405f205490565b909150612aa182614172565b6001600160a01b03809316906040918251946370a0823160e01b86528416938460048701526020928387602481865afa968715612bb7575f97612bc1575b5083612af8612af183612b289a614f36565b50906149f8565b508651636eb1769f60e11b81526001600160a01b0390941660048501523060248501529297889081906044820190565b0381865afa968715612bb7575f97612b86575b50612af1612b4c916119f498614f36565b50612b578183613543565b15612b7e5750935b5f5260018252825f20905f528152815f20905f8052525f20549061407d565b905093612b5f565b96508387813d8311612bb0575b612b9d8183611971565b8101031261032157955195612af1612b3b565b503d612b93565b85513d5f823e3d90fd5b96508387813d8311612be9575b612bd88183611971565b810103126103215795519583612adf565b503d612bce565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f006002815414612c205760029055565b604051633ee5aeb560e01b8152600490fd5b604051612c5d81612c4f6020820194602086526040830190611e19565b03601f198101835282611971565b51902090565b60405190612c7082611939565b606060c083612c7d612565565b81525f60208201525f60408201525f838201528260808201525f60a08201520152565b919060408382031261032157825167ffffffffffffffff908181116103215784019082601f83011215610321578151602092612cdb82611a55565b91612ce96040519384611971565b808352848084019160051b830101918683116103215785809101915b838310612d785750505050948281015191821161032157019180601f84011215610321578251612d3481611a55565b93612d426040519586611971565b818552838086019260051b820101928311610321578301905b828210612d69575050505090565b81518152908301908301612d5b565b8251815291810191869101612d05565b90808251908181526020809101926020808460051b8301019501935f915b848310612db65750505050505090565b9091929394958480612dd4600193601f198682030187528a516125f8565b9801930193019194939290612da6565b91906020928381526001600160a01b0382511684820152838201516040820152612e1e604083015160e06060840152610100830190611d4d565b9060608301516080820152612e45608084015192601f1993848483030160a0850152612d88565b9260a081015193838382030160c08401528680865192838152019501905f5b818110612e88575050506119f494955060c060e091015192828503019101526125f8565b825187529588019591880191600101612e64565b94959395929192612eab612c63565b50604096875190612ebb826118a1565b60048252602093612ecd8584016124d8565b612ed689612c32565b6001600160a01b038097818c51168d519360038552898501528d840152166060820152608081018b52612f0884611d71565b52612f1283611d71565b508951612f1e816118d1565b600281528a3687830137612f3184611d7e565b52612f3b83611d7e565b50898901908681835190612f4e91611dbe565b515116612f5a90614172565b86888c51168984865190612f6d91611dbe565b5151168285875190612f7e91611dbe565b51015190612f8b92612a60565b928981865190612f9a91611dbe565b515116945190612fa991611dbe565b5101519060ff16612fe1929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b612fea83611d8e565b52612ff482611d8e565b5060608801858782519061300791611dbe565b51511661301390614172565b868a5116878984519061302591611dbe565b515116878a85519061303691611dbe565b5101519061304392612a60565b908689898186519061305491611dbe565b51511694519061306391611dbe565b5101519060ff1661309b929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b6130a483611d9e565b526130ae82611d9e565b506130b891614250565b9183875116938188019283519183818451169301511693865f523084528a805f20915101518b51916130e983611955565b5f83528c51966130f888611939565b8752858701528b8601525f60608601526080850186905260a085015260c0840152885163d04dfe2360e01b815292839081906131379060048301612de4565b03815a935f94fa91825f915f94613216575b506131585788513d5f823e3d90fd5b979495969791948251966002881097886131ff5750818385015194015161318161290b87611dae565b5161318c8183613543565b156131f75750925b6131b68585919060405192600284526020840152604083015260608201604052565b6131bf87611d8e565b526131c986611d8e565b5082519a6131d68c611939565b8b528a01528801526060870152608086015260a085015260c0840152159190565b905092613194565b602490835190630fbb8e5560e21b82526004820152fd5b90935061322d91503d805f833e6129c18183611971565b925f613149565b95949193908693613243612c63565b505f92604061335e815192613257846118a1565b600484526020936132698582016124d8565b6133276132758b612c32565b8b6001600160a01b03998a9283835116895191600383528b830152898201528360609b168b8201526080810189526132ac86611d71565b526132b685611d71565b5087516132c2816118d1565b6002815288368b8301376132d586611d7e565b526132df85611d7e565b5060ff896127c58a85019361331b876132fd8161277f858a51611dbe565b9751168861330c848951611dbe565b515116856127a5858a51611dbe565b966127bb828751611dbe565b61333082611d8e565b5261333a81611d8e565b50612831878b8d60ff896127c58c85019361331b876132fd8161277f858a51611dbe565b946133de5f868a511698869786889c0191825191888184511693015116928c8552308952878086209151015188519161339683611955565b8683528951956133a587611939565b86528a86015288850152848a8501528b608085015260a084015260c08301528551808095819463d04dfe2360e01b835260048301612de4565b03915afa90815f915f936134b8575b506134ab575050505f975b6002855110988915996134985782848701519601519061341a61290b89611dae565b51906134268284613543565b1590506134905750925b6134528685919060405192600284526020840152604083015260608201604052565b61345b88611d8e565b5261346587611d8e565b5082519b6134728d611939565b8c528b0152890152870152608086015260a085015260c08401529190565b905092613430565b50505050505050505091506119f4612c63565b91999850945093966133f8565b9092506134cf91503d805f833e6129c18183611971565b915f6133ed565b6134f5905f60e01d906001600160e01b038160e01d9116601b0b614fed565b1290565b906134f5916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b61506e565b61353f905f60e01d906001600160e01b038160e01d9116601b0b614fed565b1390565b9061353f916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b61506e565b6119f491610af4916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614544565b6135ee9160808101826135b06135aa8351611dae565b51611dae565b526135e76135e16001600160a01b038094515116936135d86135d28551611dae565b51611d71565b51169251611dae565b51611d8e565b5191613b95565b5050565b906080810191806136066135aa8551611d9e565b526001600160a01b038092515116916136226135d28551611d9e565b51166136316135e18551611d9e565b5190816136e55761364183613520565b6136cc579183917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a95936122cc955f5260209060018252613697604094855f20835f528452855f20855f528452855f205461407d565b945f5260018252835f20905f528152825f20915f52525f20555b51604051918291338352604060208401526040830190612d88565b60405163793a8f5560e01b815260048101849052602490fd5b91613716917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a95936122cc956137bd565b50506136b1565b6080810161372e6135e18251611d9e565b5191821561373b57505050565b6137556135d26001600160a01b0380935151169351611d9e565b5116815f5260209160018352604092835f20835f528152835f20855f528152835f2054936001600160e01b038516613790575b505050505050565b6137b4955f9284845260018152828420868552815282842091845252812055613bf3565b5f808080613788565b939291936137ca83613520565b6136cc57846137e6576137de939450613bf3565b50505f905f90565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f528152613823835f2054948561407d565b9561382d87613520565b613850575f97885260018252838820908852815282872091875252909320829055565b835163c5e12af560e01b815260048101889052602490fd5b90604082019082526020606081936040838201528551809452019301915f5b828110613895575050505090565b835185529381019392810192600101613887565b60c0810151908151915f92613a1d575b5061395e6020918281510151926001600160a01b039081818187511696015116928660a082019485518252308452604097888320898686510151015160808601518b519161390683611955565b8683528c519361391585611955565b8785528d519661392488611939565b8752898701528c86015260016060860152608085015260a084015260c08301528851808099819463d04dfe2360e01b835260048301612de4565b03915afa948515613a135787956139f5575b508451613981575b50505050505050565b81905101510151169051813b156139f1579184918493836139b6965180978195829463012c676d60e21b845260048401613868565b03925af19081156139e857506139d1575b8080808080613978565b6139db8291611925565b6139e557806139c7565b80fd5b513d84823e3d90fd5b8480fd5b613a0a9195503d8089833e6129c18183611971565b9050935f613970565b86513d89823e3d90fd5b6001600160a01b03602080845101510151169060a083015190823b1561032157613a60925f928360405180968195829463012c676d60e21b845260048401613868565b03925af1801561044157156138b957613a7a919250611925565b5f905f6138b9565b6040519263a9059cbb60e01b5f526001600160a01b0380931660045260245260205f60448180855af160015f5114811615613adc575b8360405215613ac657505050565b635274afe760e01b835216600482015260249150fd5b6001811516613af257813b15153d151616613ab8565b833d5f823e3d90fd5b9092604051936323b872dd60e01b5f526001600160a01b0393848092166004521660245260445260205f60648180855af160015f5114811615613b4b575b836040525f60605215613ac657505050565b6001811516613af257813b15153d151616613b39565b909115613b6c575050565b6040516305dbdfd960e41b81526001600160a01b03918216600482015291166024820152604490fd5b93929193613ba283613520565b6136cc5784613bb6576137de9394506140a7565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f528152613823835f2054948561356a565b90929192613c0081614573565b93613c0a81613520565b613c535784816001600160e01b03613c299360e01d9116601b0b615198565b50809281613c39575b5050509190565b6001600160a01b03613c4b9316613a82565b5f8181613c32565b604051632d1671a360e11b8152600490fd5b916040805191613c74836118a1565b60048084526020613c868186016124d8565b5f5b8751811015613cbb5780613c9e6001928a611dbe565b51613ca98289611dbe565b52613cb48188611dbe565b5001613c88565b5092955092939093335f52308352855f2091865190613cd9826118ed565b613ce1612546565b8252606085819301528751613cf581611955565b5f8152885191613d0483611955565b5f83525f3681375f5b8151811015613e6a57613d208183611dbe565b5190888c8b84519189818401518d8d8251613d48575b50505050505050506001915001613d0d565b5f613db797948197948c9794613d758c956001600160a01b039d8e81818d51169c0151169b015190614250565b94865199613d828b611939565b8a528901528488015286015260808501528a60a08501528b60c08501525180958194829363d04dfe2360e01b84528301612de4565b03915afa938415613e60578b915f95613e42575b508451613de0575b50908b8e89838d8d613d36565b51015116803b1561032157613e0f925f918c8f84905180978195829463012c676d60e21b845233908401613868565b03925af1918215613e3857600192613e29575b8981613dd3565b613e3290611925565b5f613e22565b8c513d5f823e3d90fd5b613e579195503d805f833e6129c18183611971565b9050935f613dcb565b8e513d5f823e3d90fd5b5050505050505050509050565b8115613e81570490565b634e487b7160e01b5f52601260045260245ffd5b6040815110613ef1576020810151908051603f198101908111613edd5760051c8211613ec95760016020920160051b010190565b5050604051613ed781611955565b5f815290565b634e487b7160e01b5f52601160045260245ffd5b50604051613ed781611955565b805115613f0e57602001515f1a90565b505f90565b905f8091602081519101845af48080613f91575b15613f475750506040513d81523d5f602083013e60203d82010160405290565b15613f6e57604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b3d15613f7f576040513d5f823e3d90fd5b60405163d6bda27560e01b8152600490fd5b503d151580613f275750813b1515613f27565b91613fcf906060613fc4936001600160a01b039485916040880151611dbe565b515116940151611dbe565b5151161461232457565b6140006001600160e01b0392838316601b0b9260e01d938160e01d9116601b0b84846147af565b90637ffffff58213614050575b90614017916149f8565b9290921580614048575b61402a57505090565b6044925060405191638eba4d0760e01b835260048301526024820152fd5b508215614021565b61405a82826156c1565b1561400d57604483856040519163d556b11160e01b835260048301526024820152fd5b6119f491610af4916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614d9d565b9291926140b382614573565b936140bd81613520565b61411e5784816001600160e01b036140dc9360e01d9116601b0b615198565b9290809315614109575b508290816140f5575050509190565b613c4b926001600160a01b03309216613afb565b9092505f198114613edd57600101915f6140e6565b604051632eaefac360e21b8152600490fd5b6004111561413a57565b634e487b7160e01b5f52602160045260245ffd5b602090939291936001600160a01b03604082019516815261416e83614130565b0152565b61417a6156da565b60408051630782d7e160e01b81526001600160a01b03831660048201529091828260248173200e12d10bb0c5e4a17e7018f0f1161919bb93895afa928315614247575f925f94614212575b506141cf83614130565b600183141580614200575b6141e45750505090565b5163ee07877f60e01b815291829161059791906004840161414e565b5061420a83614130565b8215156141da565b908094506142369293503d8511614240575b61422e8183611971565b810190614f0c565b919091925f6141c5565b503d614224565b513d5f823e3d90fd5b61425a8251611e98565b6142648351611e98565b9282519281518015155f146144d957600201935b6001940184019061428882611a55565b956142a360409361429b8551998a611971565b808952611a55565b6142b5602091601f1901828a016124f4565b5f9584519389896002926002885233868901523089890152606097606081018a526142df84611d71565b526142e983611d71565b505f825b614499575b505050508651614309575b50505050505050505090565b9091929360028861432c8c866143258e809c9d9e018093611dbe565b528d611dbe565b500185614339828d611dbe565b52614344818c611dbe565b505f965b614353575b506142fd565b8851871015614494576001600160a01b036143ff898b856143f68c60428c8861437c8488611dbe565b51511696858261438c868a611dbe565b5101519261439a868a611dbe565b51838d82511691015182815160051b910120908451927f6ec4dff745ec96dbde88c5d41f8aa5ac13aa1664afb47b8406b44fa945a650c88452830152838201522090519161190160f01b83528d83015260228201522093611dbe565b51015191614f64565b1561447c578761446b8b8e8c8f9e9d9c9b9a999897968f614458918d61444e898f8f61443a83889f614431828f611dbe565b51511692611dbe565b52614445828b611dbe565b51015192611dbe565b52019c8d94611dbe565b5101516144658383611dbe565b52611dbe565b500196979895909192939495614348565b8851630a57f30960e31b815260048101899052602490fd5b61434d565b9091929a82518210156144d157906144c584809301809d6144ba8487611dbe565b516144658383611dbe565b50019082918d936142ed565b9a92916142f2565b505f93614278565b916040830192604061451b610af4606087519401938451906001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6145f4565b9451930161452a8151866134f9565b614532575050565b9093506119f491925051925183613fd9565b919291600160ff1b840161455c57611d4993506150c3565b90611d49935f0391614d9d565b61401782826149f8565b61457b6156da565b6040805163b7bad1b160e01b81526001600160a01b0383166004820152909182826024815f73200e12d10bb0c5e4a17e7018f0f1161919bb93895af1928315614247575f925f9461421257506141cf83614130565b6008815110613f0e576008015167ffffffffffffffff1667ff0a89c674ee78741490565b9091939284158215175f1461460e5750505090505f905f90565b82810192600160fd1b8082019083011760fe1c614745575b505061463181615386565b9361463b81615386565b9461464686826153a6565b90918215614736575f9083986f0785ee10d5da46d900f436a000000000808611614728575b50670de0b6b3a7640000808b11614719575b50633b9aca00808b1161470a575b50612710808b116146fc575b5098805b6146eb57508190611d49989982600a0a9109960195817fcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccd0a93838211900382610100031b9203901c1702916153b9565b60019290920191600a90048061469b565b60049a04998a930192614697565b600991939a049901915f61468b565b601291939a049901915f61467d565b85049950602592505f61466b565b50929050611d499495506153b9565b5f8212156147995780841361478b575b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb284131561462657909250611d499394916152c4565b909250611d4993949161532b565b8084121561475557909250611d499394916152c4565b929091806147d5576044848460405191637a97930f60e01b835260048301526024820152fd5b90919280155f146147ea57505050505f905f90565b614803936147f791615473565b92919490938492615473565b909391928461481188615386565b9161481b86615386565b947f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000094604c918688106149c2575b030191600160ff1b98838a018112155f1461498f575050035b5f955f821280614986575b614968575b5f811280614956575b6149385786820103966001600160ff1b038814908161492e575b5080614925575b8061491c575b6148fe5750906148b2929161561f565b915f81136148c5575b50611d49936153b9565b9091604c82136148f3576148dc91600a0a90613e77565b9081156148e9575f6148bb565b505050505f905f90565b50505050505f905f90565b876044916040519163d556b11160e01b835260048301526024820152fd5b505f85126148a2565b5082841461489c565b905088145f614895565b604489836040519163d556b11160e01b835260048301526024820152fd5b50806001600160ff1b0301821361487b565b95508087018613156149805786818703015b95614872565b5f61497a565b505f811361486d565b89985090920390506001600160ff1b03819003870182136149b35701860194614862565b5050505050505050505f905f90565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009650604b9250614849565b8115613e81570590565b8082601b82810b8314614bed577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000008405614b99575b8380820b03614b8857507b199999999999999999999999999999999999999999999999999999987b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc84011115614b39575b838060030b03614abd575b808413614aa15750506001600160e01b036001925b60e01b91161791565b8303600a0a8015613e81576001600160e01b0391071592614a98565b92915f841315614b0d575090614ad383836156c1565b614aef57637ffffffe1901600a0a810290637fffffff92614a83565b506044916040519163d556b11160e01b835260048301526024820152fd5b637fffffff1992830390604382136148f357614b2c91600a0a906149ee565b9182156148e95792614a83565b5f198401808060030b14614b4d5750614a78565b90506001600160e01b039293507b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff915060e01b9260ff1d181617905f90565b600190940193600a90930592614a2b565b937f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000840515614bda576305f5e100600894058094819201955b915050614a2b565b620186a060059405809481920195614bd2565b5082614a7857505050505f90600190565b919291600160ff1b9190801580614d8b575090614c1a91615473565b9490929091905f868585858282138015614d82575b614d65575b505050508682841860ff1c94860391039081604c038111614d4a5701600a0a808205919084614d30575b505081019182821860ff1c1115614d2857826001600160ff1b0314614d0a57905f600192135f14614cdb57600a9004915b01925b81158117614c9f57509190565b80614cb8575b508015614cb0579190565b505f91508190565b9192614cce9203600160ff1b01600a0a906149ee565b600160ff1b91905f614ca5565b600a60037fe6666666666666666666666666666666666666666666666666666666666666679201040191614c8f565b604490836040519163d556b11160e01b835260048301526024820152fd5b509092614c92565b8107614d3d575b80614c5e565b60ff1d600117015f614d37565b505050919350614d58579190565b60018160ff1d1790039190565b5f9a50909750909550600160ff1b94509250905086808080614c34565b50835f12614c2f565b15614d965750509190565b9350919050565b9392919384158115818117614eee57505090614db891615473565b9194908295614dc982958294615473565b8096929491969387868482138015614ee5575b614ecc575b5050505050508682841860ff1c94860391039081604c038111614d4a5701600a0a808205919084614eb2575b505081019182821860ff1c1115614eaa57826001600160ff1b0314614d0a57905f600192135f14614e7b57600a9004915b01925b81158117614e4e57509190565b80614e5e57508015614cb0579190565b600160ff1b93614e759291038401600a0a906149ee565b5f614ca5565b600a60037fe6666666666666666666666666666666666666666666666666666666666666679201040191614e3e565b509092614e41565b8107614ebf575b80614e0d565b60ff1d600117015f614eb9565b929b5098509196509450925090505f8080808080614de1565b50858412614ddc565b9395939092919015614f04575050614cb0579190565b945092915050565b919082604091031261032157815160048110156103215760209092015160ff811681036103215790565b9060ff165f03916001600160ff1b0382115f14614f5c57600a6001818404940192061590565b909190600190565b9091813b614f9f57614f769192615743565b50614f8081614130565b159182614f8c57505090565b6001600160a01b03918216911614919050565b6020918160645f935160405192630b135d3f60e11b9788855260048501526040602485015286820190604485015e8281018201859052601f01601f191601915afa905f5114601f3d11161690565b92915f9060018184145f87128715171717615067575f92808213615059575b03604c81135f82121761504d57600a0a908461502b83820293846149ee565b146150405750501561503c575f9190565b5f90565b90935090156119f4579190565b50501561503c575f9190565b5f956001945092509061500c565b5050505f90565b93929190918083145f83125f871218831587151717176150bd575f928082136150b05703604c81135f82121761504d57600a0a908461502b83820293846149ee565b919460019350919061500c565b50919050565b909291600160ff1b91828101615155575080841461514b57808413918215615143578185035b604c8111156151325750505f915b1561512357507f8000000000000000000000000000000000000000000000000000000000000001019190565b92506001600160ff1b03039190565b600a0a908115613e815704916150f7565b8482036150e9565b505090505f905f90565b9361516292945f03614bfe565b80939180928114615176575b50505f039190565b915092506001600160ff1b038314614d0a57600a600191059201915f8061516e565b91925f8312156151c0576044838360405191634a7d166b60e01b835260048301526024820152fd5b9192836151d257505090505f90600190565b60ff811682019180831261529a575f83121561520a575050604c198112614cb0575f03600a0a916152038382613e77565b9283021490565b909293915f81135f1461529057604d811361526557600a0a928315613e8157835f1904831161523c5750500290600190565b60405163c849483b60e01b815260048101849052602481019290925260ff166044820152606490fd5b5060405163c849483b60e01b81526004810192909252602482015260ff919091166044820152606490fd5b5050905090600190565b60405163c849483b60e01b815260048101869052602481019190915260ff82166044820152606490fd5b909392915f6152d49181846145f4565b9490945f8483019182019412159081615321575b8115615317575b506152f957505090565b604492506040519163d556b11160e01b835260048301526024820152fd5b905083125f6152ef565b82811291506152e8565b61534093600160fe1b908101939201906145f4565b9081815f821215615377575050604b1982126137de57615365915f03600a0a906149ee565b908161536f575f90565b600160ff1b90565b93600160ff1b90910192509050565b5f8112156119f457600160ff1b9080820361539f575090565b90505f0390565b905f198183099102908180821091030391565b92939291905f818418121561544e576001600160ff1b03928383111561543857600160ff1b938385036153ee57505050509190565b90919293508514615408575050600a600191045f03920190565b604051630ed8062160e21b8152600481019190915260248101919091526044810182905260648101849052608490fd5b5090915050600160ff1b8114613edd575f039190565b90916001600160ff1b0380841115613c32578514615408575050600a60019104920190565b919091801561561557827f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000080830515615523575b507f19999999999999999999999999999999999999999999999999999999999999997f0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc830110615514575b83136154fe5791905f90565b919060018060ff1b926001600160ff1b03030190565b9290600a02905f1901926154f2565b6f4b3b4ca85a86c47a098a22400000000080840515615603575b507728c87cb5c89a2571ebfdcb54864ada834a000000000000008305156155ec575b7b097edd871cfda3a5697758bf0e3cbb5ac5741c6400000000000000008305156155d8575b7e3899162693736ac531a5a58f1fbb4b746504382ca7e40000000000000000008305156155c8578205156155b9575b5f6154a7565b9290600a02905f1901926155b3565b9391606402916001190193615584565b93916402540be40002916009190193615584565b9391678ac7230489e800000291601219019361555f565b6025198301955092909202915f61553d565b505f915081908190565b90915f19838309928083029283808610950394808603958487101561569d5714615695579082910960018219018216809204600280826003021880830282030280830282030280830282030280830282030280830282030280920290030293600183805f03040190848311900302920304170290565b505091500490565b60648386866040519263362ced0960e11b8452600484015260248301526044820152fd5b6119f491905f8112156156d5575f0361577d565b61577d565b73200e12d10bb0c5e4a17e7018f0f1161919bb9389803b158015615718575b6157005750565b602490604051906373e6d7b360e01b82526004820152fd5b507f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d41813f14156156f9565b81519190604183036157735761576c9250602082015190606060408401519301515f1a9061580c565b9192909190565b50505f9160029190565b90637ffffff581131561580657637ffffffe19810190604382136157ff575f8212156157d357637fffffff91505f0301600a0a7b8000000000000000000000000000000000000000000000000000000202111590565b50600a0a8015613e81577b80000000000000000000000000000000000000000000000000000001041090565b5050151590565b50505f90565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411615883579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa15610441575f516001600160a01b0381161561587957905f905f90565b505f906001905f90565b5050505f916003919056"; /// @dev The runtime bytecode of the contract. bytes constant RUNTIME_CODE = - hex"6080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a71461180e575080632cb77e9f146117e257806341d1514f146117ab5780635343c1b7146117105780635cffe9de146115b45780635d003c4414611430578063613255ab146113ad578063687cf02a14611096578063ac9650d814610f48578063b0460f07146105f3578063b845b83e1461059b578063ca9109ba1461044c578063d9d98ce41461039b578063ddebc96f146103475763df6db3c2146100c1575f80fd5b34610321576003196040368201126103215767ffffffffffffffff9060043582811161032157806004019160a0823603918201126103215760243584811161032157610111903690600401611cd0565b909361011b612bf1565b5f946001600160a01b039485610130846125d8565b163303610325576101496101443685611b02565b612c33565b805f525f60205260405f20966001885414610190575b60208960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556040519015158152f35b9091929394959697505f600198556040519633885282602089015260606040890152816101bc8761188d565b166060890152602484013590606219018112156103215783019060a06080890152806101ea6004840161188d565b166101008901526101fd6024830161188d565b16610120880152604481013560221982360301811215610321570190602460048301359201988211610321578136038913610321577f09d18501db0080ca2d6cd7c17fa7255daff4b2d503ea93b76ff68b6752ea8e6387806103069560846102c561030e9a60209f610284906103149f9a60606101406102ef9d0152610160880191612389565b6102b66102ab61029760448801856129dc565b605f198a8603810160a08c01529491612a11565b9260648701906129dc565b918784030160c0880152612a11565b91013560e08301520390a13390919060405192600284526020840152604083015260608201604052565b906040519160018352602083015260408201604052565b9236916123a9565b90613c66565b5f8080808080808061015f565b5f80fd5b602486610331856125d8565b6040516335252be360e01b815291166004820152fd5b3461032157600319602036820112610321576004359067ffffffffffffffff82116103215760809082360301126103215761038660609160040161262c565b90604051921515835260208301526040820152f35b34610321576040366003190112610321576001600160a01b036103bc611861565b166040516370a0823160e01b8152306004820152602081602481855afa908115610441575f9161040f575b50156103f75760206040515f8152f35b60249060405190633c5bf76960e21b82526004820152fd5b90506020813d602011610439575b8161042a60209383611971565b810103126103215751826103e7565b3d915061041d565b6040513d5f823e3d90fd5b346103215761045a36611d01565b92809492610466612bf1565b610471828533613b62565b61047a816134d7565b15610567578061048e6104dd9286336140a8565b9790957f7f9dfa19cf1cc2f806f2f860fbc9c056b601fb1afc0e9b843dfe5c63616268e660806040513381526001600160a01b038416998a60208301528560408301526060820152a1336137be565b9390918561050c575b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b61055b9661030e956103069460ff93604051956005875260208701526040860152606085015260808401521660a082015260c08101604052906040519160018352602083015260408201604052565b808080808080806104e6565b506040516306dde9c360e41b81523360048201526001600160a01b03841660248201526044810191909152606490fd5b0390fd5b346103215760203660031901126103215760043567ffffffffffffffff81116103215761030e6105d26104e6923690600401611cd0565b91906105dc612bf1565b604051926105e984611955565b5f845236916123a9565b34610321576003196020368201126103215767ffffffffffffffff600435116103215760c090600435360301126103215761062c612bf1565b5f808061064160048035608481019101612511565b905015610f36576024600435013592610659846134d7565b15610f245760608060405161066d81611909565b610675612566565b81525f60208201525f6040820152015261068d612566565b506106ed6106e86106c76106bd6106b76106b1608460043501600435600401612511565b90612598565b806125b3565b60408101906124a3565b60206106e06106b1608460043501600435600401612511565b0135916125c8565b6125d8565b936001600160a01b0361073c6106e86107236107196106b76106b1608460043501600435600401612511565b60608101906124a3565b60406106e06106b1608460043501600435600401612511565b816040519761074a896118d1565b168752166020860152604085015261076c608460043501600435600401612511565b9490506001604051955f87520160051b85016040525f905f5b610799608460043501600435600401612511565b9050811080610f11575b15610d5e576107bc608460043501600435600401612511565b821015610d4a578160051b810135607e198236030181121561032157608081830136031261032157604051916107f183611909565b8181013567ffffffffffffffff81116103215761081390369084840101611b02565b835280820160208181013590850152604080820135908501526060013567ffffffffffffffff81116103215761084c9236920101611cb5565b606082015280516001600160a01b0361086e6040830151602085015190611dbe565b5151166001600160a01b0385511614801590610d16575b610d045761089d602083015160408401519083613fa5565b6108a681612c33565b91825f525f60205260405f2054155f1461090a575051604080513381526001600160a01b039092166020830152810191909152600191907fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f390606090a15b01610785565b919061093b60208497959701516040850151906060860151906040519261093084611955565b5f8452339186613235565b5f94916109a457505051604080513381526001600160a01b03909216602083015281019190915260019291907f1e6fa9678edf81f9f25bbf308bde03ad3e110db1f429394b0915ba021532941490606090a15b811561099c575b5092610904565b905088610995565b6109b9606082015160446004350135906134fa565b15610a1357505051604080513381526001600160a01b03909216602083015281019190915260019291907fe3151dc8cb7a54ffc4baabd28c1f241c94d510b5e5b502491ac3cad6c16316d59080606081015b0390a161098e565b610a2060408201516134d7565b158015610cf1575b15610a7e57505051604080513381526001600160a01b03909216602083015281019190915260019291907f500b713857325f9e6dcb52ae832eca9109d107ed1aae9cb4928b4c1e13f051aa908060608101610a0b565b9250925050600196959691610a976064600435016125ec565b15610c5e5796610b0797610b1760408401516040880151610ab88183613544565b15610c565750925b610b11848592610afa610af460608a01516001600160e01b03601b918660e01d92828816810b928260e01d9216900b6145f5565b9061456a565b9d8e9260408d015161356b565b60408c015261407e565b9961407e565b98610b228484613595565b610b2c84826135f3565b60405192338452608060208501526060610b528451608080880152610100870190611e19565b93602081015160a0870152604081015160c0870152015192607f198582030160e0860152835180825260208201906020808260051b8501019601925f5b828110610bee57505050505092806001979695937fbae4dbf76931c547f765e9def16d693d86daaa596f491de979008831789185ae93610be996604084015260608301520390a180858c5101808d5260051b8c01526138aa565b61098e565b9091929396602080610c49600193601f198782030189528b51906001600160a01b03825116815283820151848201526060610c3860408401516080604085015260808401906125f9565b920151906060818403910152611d4d565b9901950193929101610b8f565b905092610ac0565b610b0790610b176060840151610b11610c9c610af460408801516001600160e01b0394601b90868360e01d9316820b91878260e01d9216900b6145f5565b60408a0151610cab8183613544565b15610ce95750915b829c8d916060890151908116155f14610cda575060408801515b96879460408d015161356b565b610ce49085613fda565b610ccd565b905091610cb3565b50610cff6060820151613521565b610a28565b60405163936bb5ad60e01b8152600490fd5b506001600160a01b03610d326060830151604085015190611dbe565b5151166001600160a01b036020860151161415610885565b634e487b7160e01b5f52603260045260245ffd5b50919390610d706064600435016125ec565b15610f0b57835b6004356004013590610d898282613544565b610eed5750508490610da9856001600160a01b0360208701511633613bf4565b505060a46004350190610dc182600435600401612470565b905015159081610ee5575b50610e44575b506001600160a01b03610de892935116336140a8565b50505b8351811015610e105780610e0a610e0460019387611dbe565b5161371e565b01610deb565b5060409160017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005582519182526020820152f35b90506001600160a01b03602084015116610e6e6001600160a01b0385511692600435600401612470565b929091333b1561032157610eb65f93604051958694859463691f9ed760e01b8652600486015260248501528960448501528a606485015260a0608485015260a4840191612389565b038183335af190811561044157859115610dd2579050610ed69150611925565b5f836001600160a01b03610dd2565b905088610dcc565b604492506040519163573b6f4160e01b835260048301526024820152fd5b84610d77565b50610f1f60408301516134d7565b6107a3565b60405163315f9e2360e21b8152600490fd5b604051639c95219f60e01b8152600490fd5b34610321576020806003193601126103215760043567ffffffffffffffff811161032157610f7a903690600401611cd0565b919060405192610f8984611955565b5f8452828401610f9882611a55565b94610fa66040519687611971565b828652610fb283611a55565b93610fc486880195601f1901866124f5565b5f5b84811061102857604080518881528951818a018190525f92600582901b83018101918a918c9085015b828710610ffc5785850386f35b909192938280611018600193603f198a82030186528851611d4d565b9601920196019592919092610fef565b806110778861107161104460019560059d9c9d1b870187612470565b929089846040519586938585013782018381015f81528b519283915e015f83820152038084520182611971565b30613f14565b611081828a611dbe565b5261108c8189611dbe565b5001969596610fc6565b34610321576003196040368201126103215760043567ffffffffffffffff8082116103215760c08260040193833603011261032157602435908111610321576110e3903690600401611cd0565b906110ec612bf1565b61111d61111861111361110c611102888061245b565b6040810190612470565b3691611993565b613e96565b613eff565b801561139b5760011015611389576024830161113981866124a3565b90501561137757604484019461114f86826124a3565b905015611365576111b561117d966111a961117461116d858061245b565b95856124a3565b999092856124a3565b91909261119a60405197611190896118a1565b33895236906119f7565b9a60209b8c8901523691611a6d565b60408601523691611a6d565b6060830152606485013560808301526111cd82612c33565b91825f525f875260405f20958654159687611211575b888860017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055604051908152f35b6001905560a46001600160a01b03917f87491344dfbcf91f6cbbc610cbbeedc85313d37a02df0c93527f7ea5f8db717f83855116604051908152878c82015260606040820152806112656060820188611e19565b0390a101916112748385612470565b90506112b9575b505050506112ad92916103066102ef61030e933390919060405192600284526020840152604083015260608201604052565b828080808080806111e3565b6112c661110c8486612470565b6112cf816145d1565b156113425750937fd46c2c56b35c8210e9e712ec3f02242d5fc90187c0ac8ed80cc33626846ec369896112ad989795611335611318610306976102ef9761030e9b511693612470565b866040519586958652850152606060408501526060840191612389565b0390a1938395965061127b565b89610597604051928392630c89984b60e31b845260048401526024830190611d4d565b60405163540e5f0b60e01b8152600490fd5b604051636c44ef8f60e01b8152600490fd5b604051633c8270bd60e21b8152600490fd5b604051632cff108b60e21b8152600490fd5b3461032157602080600319360112610321576024816001600160a01b036113d2611861565b16604051928380926370a0823160e01b82523060048301525afa908115610441575f91611403575b50604051908152f35b90508181813d8311611429575b61141a8183611971565b810103126103215751826113fa565b503d611410565b346103215761143e36611d01565b929161144b949194612bf1565b611456838333613b62565b61145f816134d7565b15611583578160ff916114778561153a969533612a61565b6114818183613544565b1561157d575080935b61149685828533613b96565b917f8045c25080b0868951141ed0a91720bcad09a8364a2b3109ee1fd49c1f0bc8b860c06114c5898833613bf4565b97906001600160a01b0360405192338452169a8b6020840152856040840152886060840152608083015260a0820152a16040519660068852602088015260408701526060860152608085015260a08401521660c082015260e08101604052906040519160018352602083015260408201604052565b90806115665760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b6115759261030e9136916123a9565b8080806104e6565b9361148a565b50604051623a3a4d60e21b81523360048201526001600160a01b039190911660248201526044810191909152606490fd5b34610321576080366003190112610321576004356001600160a01b0390818116809103610321576115e3611877565b6044359167ffffffffffffffff91606435838111610321573660238201121561032157806004013593841161032157366024858301011161032157611670956020921693611632868587613a83565b60405196879283926323e30c8b60e01b84523360048501528760248501528860448501525f606485015260a06084850152602460a485019201612389565b03815f855af1938415610441575f946116dc575b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd984036116c3576116b893503091613afc565b602060405160018152f35b604051630b6c58a960e31b815260048101859052602490fd5b9093506020813d602011611708575b816116f860209383611971565b8101031261032157519284611684565b3d91506116eb565b34610321576101403660031901126103215767ffffffffffffffff60043581811161032157611743903690600401611b02565b6024358281116103215761175b903690600401611b02565b60c0366043190112610321576101043583811161032157611780903690600401611cb5565b90610124359384116103215761179d6104e6943690600401611cb5565b926117a6612bf1565b611eca565b346103215760603660031901126103215760206117da6117c9611861565b6117d1611877565b60443591612a61565b604051908152f35b34610321576020366003190112610321576004355f525f6020526020600160405f205414604051908152f35b34610321576020366003190112610321576004359063ffffffff60e01b82168092036103215760209163e414309160e01b8114908115611850575b5015158152f35b6301ffc9a760e01b14905083611849565b600435906001600160a01b038216820361032157565b602435906001600160a01b038216820361032157565b35906001600160a01b038216820361032157565b60a0810190811067ffffffffffffffff8211176118bd57604052565b634e487b7160e01b5f52604160045260245ffd5b6060810190811067ffffffffffffffff8211176118bd57604052565b6040810190811067ffffffffffffffff8211176118bd57604052565b6080810190811067ffffffffffffffff8211176118bd57604052565b67ffffffffffffffff81116118bd57604052565b60e0810190811067ffffffffffffffff8211176118bd57604052565b6020810190811067ffffffffffffffff8211176118bd57604052565b90601f8019910116810190811067ffffffffffffffff8211176118bd57604052565b92919267ffffffffffffffff82116118bd57604051916119bd601f8201601f191660200184611971565b829481845281830111610321578281602093845f960137010152565b9080601f83011215610321578160206119f493359101611993565b90565b91906060838203126103215760405190611a10826118d1565b8193611a1b8161188d565b8352611a296020820161188d565b602084015260408101359167ffffffffffffffff831161032157604092611a5092016119d9565b910152565b67ffffffffffffffff81116118bd5760051b60200190565b929192611a7982611a55565b604092611a896040519283611971565b819581835260208093019160061b84019381851161032157915b848310611ab257505050505050565b8583830312610321578386918251611ac9816118ed565b611ad28661188d565b81528286013583820152815201920191611aa3565b9080601f83011215610321578160206119f493359101611a6d565b91909160a0818403126103215760405190611b1c826118a1565b8193611b278261188d565b835267ffffffffffffffff9160208101358381116103215782611b4b9183016119f7565b602085015260408101358381116103215782611b68918301611ae7565b6040850152606081013592831161032157611b896080939284938301611ae7565b60608501520135910152565b90929192611ba281611a55565b91604094611bb36040519485611971565b839583855260208095019160059460051b8401948186116103215784935b868510611be2575050505050505050565b67ffffffffffffffff90853582811161032157870190608082860312610321578551611c0d81611909565b611c168361188d565b81528a8301358b8201528683013584811161032157830186601f8201121561032157803590611c4482611a55565b91611c518a519384611971565b8083528d80840191891b83010191898311610321578e809101915b838310611ca557505050508782015260608084013594851161032157611c96878d968796016119d9565b90820152815201940193611bd1565b82358152918101918f9101611c6c565b9080601f83011215610321578160206119f493359101611b95565b9181601f840112156103215782359167ffffffffffffffff8311610321576020808501948460051b01011161032157565b906080600319830112610321576004356001600160a01b0381168103610321579160243591604435916064359067ffffffffffffffff821161032157611d4991600401611cd0565b9091565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b805115610d4a5760200190565b805160011015610d4a5760400190565b805160021015610d4a5760600190565b805160031015610d4a5760800190565b805160041015610d4a5760a00190565b8051821015610d4a5760209160051b010190565b9081518082526020808093019301915f5b828110611df1575050505090565b835180516001600160a01b031686528201518583015260409094019392810192600101611de3565b90608080611e8f611e7d611e6b60406001600160a01b0380895116885260208901519060a060208a01528082511660a08a015260208201511660c08901520151606060e0880152610100870190611d4d565b60408701518682036040880152611dd2565b60608601518582036060870152611dd2565b93015191015290565b90611ea282611a55565b611eaf6040519182611971565b8281528092611ec0601f1991611a55565b0190602036910137565b92916001600160a01b038451166001600160a01b0383511614612377576001600160a01b03611f00606086015160643590611dbe565b515116906040830151916001600160a01b03611f1f6084358095611dbe565b51511614801590612337575b610d04576040850151906001600160a01b03611f4a6044358094611dbe565b5151166001600160a01b03611f6560643560608a0151611dbe565b5151161461232557611f7686612c33565b805f525f60205260405f2054156122d25750611f9184612c33565b805f525f60205260405f20541561227e5750612076929161204e917f6fa7f4c28634b0a9d6831401c45ae468195fb63aed07308935c35374ff5d9e3960405180611ff9611feb61012033845280602085015283018d611e19565b82810360408401528a611e19565b85606083015260643560808301528760a083015260a43560c083015260c43560e083015260e4356101008301520390a16001600160a01b038651166040519261204184611955565b5f8452606435908a612e9d565b9490506001600160a01b038651166040519261206984611955565b5f845260a4359086612e9d565b92905061208660408201516134d7565b15801561226a575b8015612257575b8015612244575b61223257604051916120ad83611909565b5f83525f60208401525f60408401525f60608401526120cc84836144e2565b845260408401526120f26120e083866144e2565b6020860152806060860152845161356b565b94612106602085015160408601519061356b565b9361211087613521565b8015612223575b612211576121d861220a957fd9fa84dd790c969daa5c33d8050dc06b4a9b59d5b42e2be5f5e8ae20447f618d946121ba61220f9a60a0966121598a8851613595565b6121678c6020890151613595565b6121758a60408901516135f3565b6121838c60608901516135f3565b61218c8a61371e565b6121958c61371e565b6001600160a01b036121b160c435926060606435910151611dbe565b515116336137be565b50506001600160a01b036121b160e43592606060a435910151611dbe565b5050606060405191338352805160208401526020810151604084015260408101518284015201516080820152a16138aa565b6138aa565b565b604051630d86822160e01b8152600490fd5b5061222d85613521565b612117565b6040516321badf1f60e01b8152600490fd5b506122526060840151613521565b61209c565b506122656060820151613521565b612095565b5061227860408401516134d7565b1561208e565b9351604080513381526001600160a01b039092166020830152810194909452507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f3945091925082915050606081015b0390a1565b9551604080513381526001600160a01b039092166020830152810196909652507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f3949350839250506060820190506122cd565b604051631cd2f1c760e21b8152600490fd5b506001600160a01b03612351606085015160a43590611dbe565b5151166001600160a01b0361236d604088015160443590611dbe565b5151161415611f2b565b604051630a98f1f360e21b8152600490fd5b908060209392818452848401375f828201840152601f01601f1916010190565b909291926123b681611a55565b916040916123c76040519485611971565b839581855260208095019160051b8301938185116103215783925b8584106123f25750505050505050565b67ffffffffffffffff90843582811161032157860190838286031261032157835161241c816118ed565b823584811161032157866124319185016119f7565b8152898301359384116103215761244c868b95869501611cb5565b838201528152019301926123e2565b903590605e1981360301821215610321570190565b903590601e1981360301821215610321570180359067ffffffffffffffff82116103215760200191813603831361032157565b903590601e1981360301821215610321570180359067ffffffffffffffff821161032157602001918160061b3603831361032157565b5f5b608081106124e7575050565b6060828201526020016124db565b5f5b82811061250357505050565b6060828201526020016124f7565b903590601e1981360301821215610321570180359067ffffffffffffffff821161032157602001918160051b3603831361032157565b60405190612554826118d1565b60606040835f81525f60208201520152565b60405190612573826118a1565b5f608083828152612582612547565b6020820152606060408201526060808201520152565b9015610d4a57803590607e1981360301821215610321570190565b903590609e1981360301821215610321570190565b9190811015610d4a5760061b0190565b356001600160a01b03811681036103215790565b3580151581036103215790565b9081518082526020808093019301915f5b828110612618575050505090565b83518552938101939281019260010161260a565b9061264461014461263d84806125b3565b3690611b02565b5f5260205f81526040926001845f2054036129d157916128c6916126cb85855f61284b6126748361268b9a6125b3565b612690878501359182878701359c8d923690611b02565b613fa5565b6126a861269d85806125b3565b946060810190612511565b96906126c38751966126b988611955565b8688523690611b02565b973691611b95565b906126d4612c64565b506127fb8651916126e4836118a1565b600483526126f38a84016124d9565b886126fd81612c33565b988b6001600160a01b039a8b84511690835192600384528301528282015233606082015260808101825261273086611d71565b5261273a85611d71565b508051612746816118d1565b6002815281368e83013761275986611d7e565b5261276385611d7e565b50810160ff8c6127c66127af8d80612788816127808b8a51611dbe565b515116614173565b97511690612797898851611dbe565b515116846127a68a8951611dbe565b51015191612a61565b958d6127bc828751611dbe565b5151169451611dbe565b51015192169093929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b61280482611d8e565b5261280e81611d8e565b506128328b886060810160ff8c6127c66127af8d80612788816127808b8a51611dbe565b61283b82611d9e565b5261284581611d9e565b50614251565b918385511693868601918b83519289818551169401511693878652308a5281808720915101519082519261287e84611955565b878452519561288c87611939565b86528a8601528d85015284606085015285608085015260a084015260c08301528a5180809a819463d04dfe2360e01b835260048301612de5565b03915afa95865f915f986129ab575b506128e45788513d5f823e3d90fd5b95938651600281106129945750888798998260c0979899015199015161291261290c85611dae565b51611d9e565b5161291d8183613544565b1561298a5750998a925b6129498b85919060405192600284526020840152604083015260608201604052565b61295286611d8e565b5261295c85611d8e565b5082519661296988611939565b8752860152840152866060840152608083015260a082015201526001929190565b9050998a92612927565b6024908a5190630fbb8e5560e21b82526004820152fd5b9097506129ca91503d805f833e6129c28183611971565b810190612ca1565b965f6128d5565b505f92508291829150565b9035601e198236030181121561032157016020813591019167ffffffffffffffff8211610321578160061b3603831361032157565b9190808252602080920192915f905b828210612a2e575050505090565b909192936001906001600160a01b03612a468761188d565b16815285830135838201526040908101950193920190612a20565b8215612a96576001600160a01b038091165f52600160205260405f2091165f5260205260405f20905f5260205260405f205490565b909150612aa282614173565b6001600160a01b03809316906040918251946370a0823160e01b86528416938460048701526020928387602481865afa968715612bb8575f97612bc2575b5083612af9612af283612b299a614f37565b50906149f9565b508651636eb1769f60e11b81526001600160a01b0390941660048501523060248501529297889081906044820190565b0381865afa968715612bb8575f97612b87575b50612af2612b4d916119f498614f37565b50612b588183613544565b15612b7f5750935b5f5260018252825f20905f528152815f20905f8052525f20549061407e565b905093612b60565b96508387813d8311612bb1575b612b9e8183611971565b8101031261032157955195612af2612b3c565b503d612b94565b85513d5f823e3d90fd5b96508387813d8311612bea575b612bd98183611971565b810103126103215795519583612ae0565b503d612bcf565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f006002815414612c215760029055565b604051633ee5aeb560e01b8152600490fd5b604051612c5e81612c506020820194602086526040830190611e19565b03601f198101835282611971565b51902090565b60405190612c7182611939565b606060c083612c7e612566565b81525f60208201525f60408201525f838201528260808201525f60a08201520152565b919060408382031261032157825167ffffffffffffffff908181116103215784019082601f83011215610321578151602092612cdc82611a55565b91612cea6040519384611971565b808352848084019160051b830101918683116103215785809101915b838310612d795750505050948281015191821161032157019180601f84011215610321578251612d3581611a55565b93612d436040519586611971565b818552838086019260051b820101928311610321578301905b828210612d6a575050505090565b81518152908301908301612d5c565b8251815291810191869101612d06565b90808251908181526020809101926020808460051b8301019501935f915b848310612db75750505050505090565b9091929394958480612dd5600193601f198682030187528a516125f9565b9801930193019194939290612da7565b91906020928381526001600160a01b0382511684820152838201516040820152612e1f604083015160e06060840152610100830190611d4d565b9060608301516080820152612e46608084015192601f1993848483030160a0850152612d89565b9260a081015193838382030160c08401528680865192838152019501905f5b818110612e89575050506119f494955060c060e091015192828503019101526125f9565b825187529588019591880191600101612e65565b94959395929192612eac612c64565b50604096875190612ebc826118a1565b60048252602093612ece8584016124d9565b612ed789612c33565b6001600160a01b038097818c51168d519360038552898501528d840152166060820152608081018b52612f0984611d71565b52612f1383611d71565b508951612f1f816118d1565b600281528a3687830137612f3284611d7e565b52612f3c83611d7e565b50898901908681835190612f4f91611dbe565b515116612f5b90614173565b86888c51168984865190612f6e91611dbe565b5151168285875190612f7f91611dbe565b51015190612f8c92612a61565b928981865190612f9b91611dbe565b515116945190612faa91611dbe565b5101519060ff16612fe2929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b612feb83611d8e565b52612ff582611d8e565b5060608801858782519061300891611dbe565b51511661301490614173565b868a5116878984519061302691611dbe565b515116878a85519061303791611dbe565b5101519061304492612a61565b908689898186519061305591611dbe565b51511694519061306491611dbe565b5101519060ff1661309c929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b6130a583611d9e565b526130af82611d9e565b506130b991614251565b9183875116938188019283519183818451169301511693865f523084528a805f20915101518b51916130ea83611955565b5f83528c51966130f988611939565b8752858701528b8601525f60608601526080850186905260a085015260c0840152885163d04dfe2360e01b815292839081906131389060048301612de5565b03815a935f94fa91825f915f94613217575b506131595788513d5f823e3d90fd5b979495969791948251966002881097886132005750818385015194015161318261290c87611dae565b5161318d8183613544565b156131f85750925b6131b78585919060405192600284526020840152604083015260608201604052565b6131c087611d8e565b526131ca86611d8e565b5082519a6131d78c611939565b8b528a01528801526060870152608086015260a085015260c0840152159190565b905092613195565b602490835190630fbb8e5560e21b82526004820152fd5b90935061322e91503d805f833e6129c28183611971565b925f61314a565b95949193908693613244612c64565b505f92604061335f815192613258846118a1565b6004845260209361326a8582016124d9565b6133286132768b612c33565b8b6001600160a01b03998a9283835116895191600383528b830152898201528360609b168b8201526080810189526132ad86611d71565b526132b785611d71565b5087516132c3816118d1565b6002815288368b8301376132d686611d7e565b526132e085611d7e565b5060ff896127c68a85019361331c876132fe81612780858a51611dbe565b9751168861330d848951611dbe565b515116856127a6858a51611dbe565b966127bc828751611dbe565b61333182611d8e565b5261333b81611d8e565b50612832878b8d60ff896127c68c85019361331c876132fe81612780858a51611dbe565b946133df5f868a511698869786889c0191825191888184511693015116928c8552308952878086209151015188519161339783611955565b8683528951956133a687611939565b86528a86015288850152848a8501528b608085015260a084015260c08301528551808095819463d04dfe2360e01b835260048301612de5565b03915afa90815f915f936134b9575b506134ac575050505f975b6002855110988915996134995782848701519601519061341b61290c89611dae565b51906134278284613544565b1590506134915750925b6134538685919060405192600284526020840152604083015260608201604052565b61345c88611d8e565b5261346687611d8e565b5082519b6134738d611939565b8c528b0152890152870152608086015260a085015260c08401529190565b905092613431565b50505050505050505091506119f4612c64565b91999850945093966133f9565b9092506134d091503d805f833e6129c28183611971565b915f6133ee565b6134f6905f60e01d906001600160e01b038160e01d9116601b0b614fee565b1290565b906134f6916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b61506f565b613540905f60e01d906001600160e01b038160e01d9116601b0b614fee565b1390565b90613540916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b61506f565b6119f491610af4916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614545565b6135ef9160808101826135b16135ab8351611dae565b51611dae565b526135e86135e26001600160a01b038094515116936135d96135d38551611dae565b51611d71565b51169251611dae565b51611d8e565b5191613b96565b5050565b906080810191806136076135ab8551611d9e565b526001600160a01b038092515116916136236135d38551611d9e565b51166136326135e28551611d9e565b5190816136e65761364283613521565b6136cd579183917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a95936122cd955f5260209060018252613698604094855f20835f528452855f20855f528452855f205461407e565b945f5260018252835f20905f528152825f20915f52525f20555b51604051918291338352604060208401526040830190612d89565b60405163793a8f5560e01b815260048101849052602490fd5b91613717917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a95936122cd956137be565b50506136b2565b6080810161372f6135e28251611d9e565b5191821561373c57505050565b6137566135d36001600160a01b0380935151169351611d9e565b5116815f5260209160018352604092835f20835f528152835f20855f528152835f2054936001600160e01b038516613791575b505050505050565b6137b5955f9284845260018152828420868552815282842091845252812055613bf4565b5f808080613789565b939291936137cb83613521565b6136cd57846137e7576137df939450613bf4565b50505f905f90565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f528152613824835f2054948561407e565b9561382e87613521565b613851575f97885260018252838820908852815282872091875252909320829055565b835163c5e12af560e01b815260048101889052602490fd5b90604082019082526020606081936040838201528551809452019301915f5b828110613896575050505090565b835185529381019392810192600101613888565b60c0810151908151915f92613a1e575b5061395f6020918281510151926001600160a01b039081818187511696015116928660a082019485518252308452604097888320898686510151015160808601518b519161390783611955565b8683528c519361391685611955565b8785528d519661392588611939565b8752898701528c86015260016060860152608085015260a084015260c08301528851808099819463d04dfe2360e01b835260048301612de5565b03915afa948515613a145787956139f6575b508451613982575b50505050505050565b81905101510151169051813b156139f2579184918493836139b7965180978195829463012c676d60e21b845260048401613869565b03925af19081156139e957506139d2575b8080808080613979565b6139dc8291611925565b6139e657806139c8565b80fd5b513d84823e3d90fd5b8480fd5b613a0b9195503d8089833e6129c28183611971565b9050935f613971565b86513d89823e3d90fd5b6001600160a01b03602080845101510151169060a083015190823b1561032157613a61925f928360405180968195829463012c676d60e21b845260048401613869565b03925af1801561044157156138ba57613a7b919250611925565b5f905f6138ba565b6040519263a9059cbb60e01b5f526001600160a01b0380931660045260245260205f60448180855af160015f5114811615613add575b8360405215613ac757505050565b635274afe760e01b835216600482015260249150fd5b6001811516613af357813b15153d151616613ab9565b833d5f823e3d90fd5b9092604051936323b872dd60e01b5f526001600160a01b0393848092166004521660245260445260205f60648180855af160015f5114811615613b4c575b836040525f60605215613ac757505050565b6001811516613af357813b15153d151616613b3a565b909115613b6d575050565b6040516305dbdfd960e41b81526001600160a01b03918216600482015291166024820152604490fd5b93929193613ba383613521565b6136cd5784613bb7576137df9394506140a8565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f528152613824835f2054948561356b565b90929192613c0181614574565b93613c0b81613521565b613c545784816001600160e01b03613c2a9360e01d9116601b0b615199565b50809281613c3a575b5050509190565b6001600160a01b03613c4c9316613a83565b5f8181613c33565b604051632d1671a360e11b8152600490fd5b916040805191613c75836118a1565b60048084526020613c878186016124d9565b5f5b8751811015613cbc5780613c9f6001928a611dbe565b51613caa8289611dbe565b52613cb58188611dbe565b5001613c89565b5092955092939093335f52308352855f2091865190613cda826118ed565b613ce2612547565b8252606085819301528751613cf681611955565b5f8152885191613d0583611955565b5f83525f3681375f5b8151811015613e6b57613d218183611dbe565b5190888c8b84519189818401518d8d8251613d49575b50505050505050506001915001613d0e565b5f613db897948197948c9794613d768c956001600160a01b039d8e81818d51169c0151169b015190614251565b94865199613d838b611939565b8a528901528488015286015260808501528a60a08501528b60c08501525180958194829363d04dfe2360e01b84528301612de5565b03915afa938415613e61578b915f95613e43575b508451613de1575b50908b8e89838d8d613d37565b51015116803b1561032157613e10925f918c8f84905180978195829463012c676d60e21b845233908401613869565b03925af1918215613e3957600192613e2a575b8981613dd4565b613e3390611925565b5f613e23565b8c513d5f823e3d90fd5b613e589195503d805f833e6129c28183611971565b9050935f613dcc565b8e513d5f823e3d90fd5b5050505050505050509050565b8115613e82570490565b634e487b7160e01b5f52601260045260245ffd5b6040815110613ef2576020810151908051603f198101908111613ede5760051c8211613eca5760016020920160051b010190565b5050604051613ed881611955565b5f815290565b634e487b7160e01b5f52601160045260245ffd5b50604051613ed881611955565b805115613f0f57602001515f1a90565b505f90565b905f8091602081519101845af48080613f92575b15613f485750506040513d81523d5f602083013e60203d82010160405290565b15613f6f57604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b3d15613f80576040513d5f823e3d90fd5b60405163d6bda27560e01b8152600490fd5b503d151580613f285750813b1515613f28565b91613fd0906060613fc5936001600160a01b039485916040880151611dbe565b515116940151611dbe565b5151161461232557565b6140016001600160e01b0392838316601b0b9260e01d938160e01d9116601b0b84846147b0565b90637ffffff58213614051575b90614018916149f9565b9290921580614049575b61402b57505090565b6044925060405191638eba4d0760e01b835260048301526024820152fd5b508215614022565b61405b82826156c2565b1561400e57604483856040519163d556b11160e01b835260048301526024820152fd5b6119f491610af4916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614d9e565b9291926140b482614574565b936140be81613521565b61411f5784816001600160e01b036140dd9360e01d9116601b0b615199565b929080931561410a575b508290816140f6575050509190565b613c4c926001600160a01b03309216613afc565b9092505f198114613ede57600101915f6140e7565b604051632eaefac360e21b8152600490fd5b6004111561413b57565b634e487b7160e01b5f52602160045260245ffd5b602090939291936001600160a01b03604082019516815261416f83614131565b0152565b61417b6156db565b60408051630782d7e160e01b81526001600160a01b03831660048201529091828260248173200e12d10bb0c5e4a17e7018f0f1161919bb93895afa928315614248575f925f94614213575b506141d083614131565b600183141580614201575b6141e55750505090565b5163ee07877f60e01b815291829161059791906004840161414f565b5061420b83614131565b8215156141db565b908094506142379293503d8511614241575b61422f8183611971565b810190614f0d565b919091925f6141c6565b503d614225565b513d5f823e3d90fd5b61425b8251611e98565b6142658351611e98565b9282519281518015155f146144da57600201935b6001940184019061428982611a55565b956142a460409361429c8551998a611971565b808952611a55565b6142b6602091601f1901828a016124f5565b5f9584519389896002926002885233868901523089890152606097606081018a526142e084611d71565b526142ea83611d71565b505f825b61449a575b50505050865161430a575b50505050505050505090565b9091929360028861432d8c866143268e809c9d9e018093611dbe565b528d611dbe565b50018561433a828d611dbe565b52614345818c611dbe565b505f965b614354575b506142fe565b8851871015614495576001600160a01b03614400898b856143f78c60428c8861437d8488611dbe565b51511696858261438d868a611dbe565b5101519261439b868a611dbe565b51838d82511691015182815160051b910120908451927f6ec4dff745ec96dbde88c5d41f8aa5ac13aa1664afb47b8406b44fa945a650c88452830152838201522090519161190160f01b83528d83015260228201522093611dbe565b51015191614f65565b1561447d578761446c8b8e8c8f9e9d9c9b9a999897968f614459918d61444f898f8f61443b83889f614432828f611dbe565b51511692611dbe565b52614446828b611dbe565b51015192611dbe565b52019c8d94611dbe565b5101516144668383611dbe565b52611dbe565b500196979895909192939495614349565b8851630a57f30960e31b815260048101899052602490fd5b61434e565b9091929a82518210156144d257906144c684809301809d6144bb8487611dbe565b516144668383611dbe565b50019082918d936142ee565b9a92916142f3565b505f93614279565b916040830192604061451c610af4606087519401938451906001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6145f5565b9451930161452b8151866134fa565b614533575050565b9093506119f491925051925183613fda565b919291600160ff1b840161455d57611d4993506150c4565b90611d49935f0391614d9e565b61401882826149f9565b61457c6156db565b6040805163b7bad1b160e01b81526001600160a01b0383166004820152909182826024815f73200e12d10bb0c5e4a17e7018f0f1161919bb93895af1928315614248575f925f9461421357506141d083614131565b6008815110613f0f576008015167ffffffffffffffff1667ff0a89c674ee78741490565b9091939284158215175f1461460f5750505090505f905f90565b82810192600160fd1b8082019083011760fe1c614746575b505061463281615387565b9361463c81615387565b9461464786826153a7565b90918215614737575f9083986f0785ee10d5da46d900f436a000000000808611614729575b50670de0b6b3a7640000808b1161471a575b50633b9aca00808b1161470b575b50612710808b116146fd575b5098805b6146ec57508190611d49989982600a0a9109960195817fcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccd0a93838211900382610100031b9203901c1702916153ba565b60019290920191600a90048061469c565b60049a04998a930192614698565b600991939a049901915f61468c565b601291939a049901915f61467e565b85049950602592505f61466c565b50929050611d499495506153ba565b5f82121561479a5780841361478c575b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb284131561462757909250611d499394916152c5565b909250611d4993949161532c565b8084121561475657909250611d499394916152c5565b929091806147d6576044848460405191637a97930f60e01b835260048301526024820152fd5b90919280155f146147eb57505050505f905f90565b614804936147f891615474565b92919490938492615474565b909391928461481288615387565b9161481c86615387565b947f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000094604c918688106149c3575b030191600160ff1b98838a018112155f14614990575050035b5f955f821280614987575b614969575b5f811280614957575b6149395786820103966001600160ff1b038814908161492f575b5080614926575b8061491d575b6148ff5750906148b39291615620565b915f81136148c6575b50611d49936153ba565b9091604c82136148f4576148dd91600a0a90613e78565b9081156148ea575f6148bc565b505050505f905f90565b50505050505f905f90565b876044916040519163d556b11160e01b835260048301526024820152fd5b505f85126148a3565b5082841461489d565b905088145f614896565b604489836040519163d556b11160e01b835260048301526024820152fd5b50806001600160ff1b0301821361487c565b95508087018613156149815786818703015b95614873565b5f61497b565b505f811361486e565b89985090920390506001600160ff1b03819003870182136149b45701860194614863565b5050505050505050505f905f90565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009650604b925061484a565b8115613e82570590565b8082601b82810b8314614bee577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000008405614b9a575b8380820b03614b8957507b199999999999999999999999999999999999999999999999999999987b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc84011115614b3a575b838060030b03614abe575b808413614aa25750506001600160e01b036001925b60e01b91161791565b8303600a0a8015613e82576001600160e01b0391071592614a99565b92915f841315614b0e575090614ad483836156c2565b614af057637ffffffe1901600a0a810290637fffffff92614a84565b506044916040519163d556b11160e01b835260048301526024820152fd5b637fffffff1992830390604382136148f457614b2d91600a0a906149ef565b9182156148ea5792614a84565b5f198401808060030b14614b4e5750614a79565b90506001600160e01b039293507b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff915060e01b9260ff1d181617905f90565b600190940193600a90930592614a2c565b937f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000840515614bdb576305f5e100600894058094819201955b915050614a2c565b620186a060059405809481920195614bd3565b5082614a7957505050505f90600190565b919291600160ff1b9190801580614d8c575090614c1b91615474565b9490929091905f868585858282138015614d83575b614d66575b505050508682841860ff1c94860391039081604c038111614d4b5701600a0a808205919084614d31575b505081019182821860ff1c1115614d2957826001600160ff1b0314614d0b57905f600192135f14614cdc57600a9004915b01925b81158117614ca057509190565b80614cb9575b508015614cb1579190565b505f91508190565b9192614ccf9203600160ff1b01600a0a906149ef565b600160ff1b91905f614ca6565b600a60037fe6666666666666666666666666666666666666666666666666666666666666679201040191614c90565b604490836040519163d556b11160e01b835260048301526024820152fd5b509092614c93565b8107614d3e575b80614c5f565b60ff1d600117015f614d38565b505050919350614d59579190565b60018160ff1d1790039190565b5f9a50909750909550600160ff1b94509250905086808080614c35565b50835f12614c30565b15614d975750509190565b9350919050565b9392919384158115818117614eef57505090614db991615474565b9194908295614dca82958294615474565b8096929491969387868482138015614ee6575b614ecd575b5050505050508682841860ff1c94860391039081604c038111614d4b5701600a0a808205919084614eb3575b505081019182821860ff1c1115614eab57826001600160ff1b0314614d0b57905f600192135f14614e7c57600a9004915b01925b81158117614e4f57509190565b80614e5f57508015614cb1579190565b600160ff1b93614e769291038401600a0a906149ef565b5f614ca6565b600a60037fe6666666666666666666666666666666666666666666666666666666666666679201040191614e3f565b509092614e42565b8107614ec0575b80614e0e565b60ff1d600117015f614eba565b929b5098509196509450925090505f8080808080614de2565b50858412614ddd565b9395939092919015614f05575050614cb1579190565b945092915050565b919082604091031261032157815160048110156103215760209092015160ff811681036103215790565b9060ff165f03916001600160ff1b0382115f14614f5d57600a6001818404940192061590565b909190600190565b9091813b614fa057614f779192615744565b50614f8181614131565b159182614f8d57505090565b6001600160a01b03918216911614919050565b6020918160645f935160405192630b135d3f60e11b9788855260048501526040602485015286820190604485015e8281018201859052601f01601f191601915afa905f5114601f3d11161690565b92915f9060018184145f87128715171717615068575f9280821361505a575b03604c81135f82121761504e57600a0a908461502c83820293846149ef565b146150415750501561503d575f9190565b5f90565b90935090156119f4579190565b50501561503d575f9190565b5f956001945092509061500d565b5050505f90565b93929190918083145f83125f871218831587151717176150be575f928082136150b15703604c81135f82121761504e57600a0a908461502c83820293846149ef565b919460019350919061500d565b50919050565b909291600160ff1b91828101615156575080841461514c57808413918215615144578185035b604c8111156151335750505f915b1561512457507f8000000000000000000000000000000000000000000000000000000000000001019190565b92506001600160ff1b03039190565b600a0a908115613e825704916150f8565b8482036150ea565b505090505f905f90565b9361516392945f03614bff565b80939180928114615177575b50505f039190565b915092506001600160ff1b038314614d0b57600a600191059201915f8061516f565b91925f8312156151c1576044838360405191634a7d166b60e01b835260048301526024820152fd5b9192836151d357505090505f90600190565b60ff811682019180831261529b575f83121561520b575050604c198112614cb1575f03600a0a916152048382613e78565b9283021490565b909293915f81135f1461529157604d811361526657600a0a928315613e8257835f1904831161523d5750500290600190565b60405163c849483b60e01b815260048101849052602481019290925260ff166044820152606490fd5b5060405163c849483b60e01b81526004810192909252602482015260ff919091166044820152606490fd5b5050905090600190565b60405163c849483b60e01b815260048101869052602481019190915260ff82166044820152606490fd5b909392915f6152d59181846145f5565b9490945f8483019182019412159081615322575b8115615318575b506152fa57505090565b604492506040519163d556b11160e01b835260048301526024820152fd5b905083125f6152f0565b82811291506152e9565b61534193600160fe1b908101939201906145f5565b9081815f821215615378575050604b1982126137df57615366915f03600a0a906149ef565b9081615370575f90565b600160ff1b90565b93600160ff1b90910192509050565b5f8112156119f457600160ff1b908082036153a0575090565b90505f0390565b905f198183099102908180821091030391565b92939291905f818418121561544f576001600160ff1b03928383111561543957600160ff1b938385036153ef57505050509190565b90919293508514615409575050600a600191045f03920190565b604051630ed8062160e21b8152600481019190915260248101919091526044810182905260648101849052608490fd5b5090915050600160ff1b8114613ede575f039190565b90916001600160ff1b0380841115613c33578514615409575050600a60019104920190565b919091801561561657827f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000080830515615524575b507f19999999999999999999999999999999999999999999999999999999999999997f0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc830110615515575b83136154ff5791905f90565b919060018060ff1b926001600160ff1b03030190565b9290600a02905f1901926154f3565b6f4b3b4ca85a86c47a098a22400000000080840515615604575b507728c87cb5c89a2571ebfdcb54864ada834a000000000000008305156155ed575b7b097edd871cfda3a5697758bf0e3cbb5ac5741c6400000000000000008305156155d9575b7e3899162693736ac531a5a58f1fbb4b746504382ca7e40000000000000000008305156155c9578205156155ba575b5f6154a8565b9290600a02905f1901926155b4565b9391606402916001190193615585565b93916402540be40002916009190193615585565b9391678ac7230489e8000002916012190193615560565b6025198301955092909202915f61553e565b505f915081908190565b90915f19838309928083029283808610950394808603958487101561569e5714615696579082910960018219018216809204600280826003021880830282030280830282030280830282030280830282030280830282030280920290030293600183805f03040190848311900302920304170290565b505091500490565b60648386866040519263362ced0960e11b8452600484015260248301526044820152fd5b6119f491905f8112156156d6575f0361577e565b61577e565b73200e12d10bb0c5e4a17e7018f0f1161919bb9389803b158015615719575b6157015750565b602490604051906373e6d7b360e01b82526004820152fd5b507f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d41813f14156156fa565b81519190604183036157745761576d9250602082015190606060408401519301515f1a9061580d565b9192909190565b50505f9160029190565b90637ffffff581131561580757637ffffffe1981019060438213615800575f8212156157d457637fffffff91505f0301600a0a7b8000000000000000000000000000000000000000000000000000000202111590565b50600a0a8015613e82577b80000000000000000000000000000000000000000000000000000001041090565b5050151590565b50505f90565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411615884579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa15610441575f516001600160a01b0381161561587a57905f905f90565b505f906001905f90565b5050505f916003919056"; + hex"6080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a71461180e575080632cb77e9f146117e257806341d1514f146117ab5780635343c1b7146117105780635cffe9de146115b45780635d003c4414611430578063613255ab146113ad578063687cf02a14611096578063ac9650d814610f48578063b0460f07146105f3578063b845b83e1461059b578063ca9109ba1461044c578063d9d98ce41461039b578063ddebc96f146103475763df6db3c2146100c1575f80fd5b34610321576003196040368201126103215767ffffffffffffffff9060043582811161032157806004019160a0823603918201126103215760243584811161032157610111903690600401611cd0565b909361011b612bf0565b5f946001600160a01b039485610130846125d7565b163303610325576101496101443685611b02565b612c32565b805f525f60205260405f20966001885414610190575b60208960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556040519015158152f35b9091929394959697505f600198556040519633885282602089015260606040890152816101bc8761188d565b166060890152602484013590606219018112156103215783019060a06080890152806101ea6004840161188d565b166101008901526101fd6024830161188d565b16610120880152604481013560221982360301811215610321570190602460048301359201988211610321578136038913610321577f09d18501db0080ca2d6cd7c17fa7255daff4b2d503ea93b76ff68b6752ea8e6387806103069560846102c561030e9a60209f610284906103149f9a60606101406102ef9d0152610160880191612388565b6102b66102ab61029760448801856129db565b605f198a8603810160a08c01529491612a10565b9260648701906129db565b918784030160c0880152612a10565b91013560e08301520390a13390919060405192600284526020840152604083015260608201604052565b906040519160018352602083015260408201604052565b9236916123a8565b90613c65565b5f8080808080808061015f565b5f80fd5b602486610331856125d7565b6040516335252be360e01b815291166004820152fd5b3461032157600319602036820112610321576004359067ffffffffffffffff82116103215760809082360301126103215761038660609160040161262b565b90604051921515835260208301526040820152f35b34610321576040366003190112610321576001600160a01b036103bc611861565b166040516370a0823160e01b8152306004820152602081602481855afa908115610441575f9161040f575b50156103f75760206040515f8152f35b60249060405190633c5bf76960e21b82526004820152fd5b90506020813d602011610439575b8161042a60209383611971565b810103126103215751826103e7565b3d915061041d565b6040513d5f823e3d90fd5b346103215761045a36611d01565b92809492610466612bf0565b610471828533613b61565b61047a816134d6565b15610567578061048e6104dd9286336140a7565b9790957f7f9dfa19cf1cc2f806f2f860fbc9c056b601fb1afc0e9b843dfe5c63616268e660806040513381526001600160a01b038416998a60208301528560408301526060820152a1336137bd565b9390918561050c575b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b61055b9661030e956103069460ff93604051956005875260208701526040860152606085015260808401521660a082015260c08101604052906040519160018352602083015260408201604052565b808080808080806104e6565b506040516306dde9c360e41b81523360048201526001600160a01b03841660248201526044810191909152606490fd5b0390fd5b346103215760203660031901126103215760043567ffffffffffffffff81116103215761030e6105d26104e6923690600401611cd0565b91906105dc612bf0565b604051926105e984611955565b5f845236916123a8565b34610321576003196020368201126103215767ffffffffffffffff600435116103215760c090600435360301126103215761062c612bf0565b5f808061064160048035608481019101612510565b905015610f36576024600435013592610659846134d6565b15610f245760608060405161066d81611909565b610675612565565b81525f60208201525f6040820152015261068d612565565b506106ed6106e86106c76106bd6106b76106b1608460043501600435600401612510565b90612597565b806125b2565b60408101906124a2565b60206106e06106b1608460043501600435600401612510565b0135916125c7565b6125d7565b936001600160a01b0361073c6106e86107236107196106b76106b1608460043501600435600401612510565b60608101906124a2565b60406106e06106b1608460043501600435600401612510565b816040519761074a896118d1565b168752166020860152604085015261076c608460043501600435600401612510565b9490506001604051955f87520160051b85016040525f905f5b610799608460043501600435600401612510565b9050811080610f11575b15610d5e576107bc608460043501600435600401612510565b821015610d4a578160051b810135607e198236030181121561032157608081830136031261032157604051916107f183611909565b8181013567ffffffffffffffff81116103215761081390369084840101611b02565b835280820160208181013590850152604080820135908501526060013567ffffffffffffffff81116103215761084c9236920101611cb5565b606082015280516001600160a01b0361086e6040830151602085015190611dbe565b5151166001600160a01b0385511614801590610d16575b610d045761089d602083015160408401519083613fa4565b6108a681612c32565b91825f525f60205260405f2054155f1461090a575051604080513381526001600160a01b039092166020830152810191909152600191907fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f390606090a15b01610785565b919061093b60208497959701516040850151906060860151906040519261093084611955565b5f8452339186613234565b5f94916109a457505051604080513381526001600160a01b03909216602083015281019190915260019291907f1e6fa9678edf81f9f25bbf308bde03ad3e110db1f429394b0915ba021532941490606090a15b811561099c575b5092610904565b905088610995565b6109b9606082015160446004350135906134f9565b15610a1357505051604080513381526001600160a01b03909216602083015281019190915260019291907fe3151dc8cb7a54ffc4baabd28c1f241c94d510b5e5b502491ac3cad6c16316d59080606081015b0390a161098e565b610a2060408201516134d6565b158015610cf1575b15610a7e57505051604080513381526001600160a01b03909216602083015281019190915260019291907f500b713857325f9e6dcb52ae832eca9109d107ed1aae9cb4928b4c1e13f051aa908060608101610a0b565b9250925050600196959691610a976064600435016125eb565b15610c5e5796610b0797610b1760408401516040880151610ab88183613543565b15610c565750925b610b11848592610afa610af460608a01516001600160e01b03601b918660e01d92828816810b928260e01d9216900b6145f4565b90614569565b9d8e9260408d015161356a565b60408c015261407d565b9961407d565b98610b228484613594565b610b2c84826135f2565b60405192338452608060208501526060610b528451608080880152610100870190611e19565b93602081015160a0870152604081015160c0870152015192607f198582030160e0860152835180825260208201906020808260051b8501019601925f5b828110610bee57505050505092806001979695937fbae4dbf76931c547f765e9def16d693d86daaa596f491de979008831789185ae93610be996604084015260608301520390a180858c5101808d5260051b8c01526138a9565b61098e565b9091929396602080610c49600193601f198782030189528b51906001600160a01b03825116815283820151848201526060610c3860408401516080604085015260808401906125f8565b920151906060818403910152611d4d565b9901950193929101610b8f565b905092610ac0565b610b0790610b176060840151610b11610c9c610af460408801516001600160e01b0394601b90868360e01d9316820b91878260e01d9216900b6145f4565b60408a0151610cab8183613543565b15610ce95750915b829c8d916060890151908116155f14610cda575060408801515b96879460408d015161356a565b610ce49085613fd9565b610ccd565b905091610cb3565b50610cff6060820151613520565b610a28565b60405163936bb5ad60e01b8152600490fd5b506001600160a01b03610d326060830151604085015190611dbe565b5151166001600160a01b036020860151161415610885565b634e487b7160e01b5f52603260045260245ffd5b50919390610d706064600435016125eb565b15610f0b57835b6004356004013590610d898282613543565b610eed5750508490610da9856001600160a01b0360208701511633613bf3565b505060a46004350190610dc18260043560040161246f565b905015159081610ee5575b50610e44575b506001600160a01b03610de892935116336140a7565b50505b8351811015610e105780610e0a610e0460019387611dbe565b5161371d565b01610deb565b5060409160017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005582519182526020820152f35b90506001600160a01b03602084015116610e6e6001600160a01b038551169260043560040161246f565b929091333b1561032157610eb65f93604051958694859463691f9ed760e01b8652600486015260248501528960448501528a606485015260a0608485015260a4840191612388565b038183335af190811561044157859115610dd2579050610ed69150611925565b5f836001600160a01b03610dd2565b905088610dcc565b604492506040519163573b6f4160e01b835260048301526024820152fd5b84610d77565b50610f1f60408301516134d6565b6107a3565b60405163315f9e2360e21b8152600490fd5b604051639c95219f60e01b8152600490fd5b34610321576020806003193601126103215760043567ffffffffffffffff811161032157610f7a903690600401611cd0565b919060405192610f8984611955565b5f8452828401610f9882611a55565b94610fa66040519687611971565b828652610fb283611a55565b93610fc486880195601f1901866124f4565b5f5b84811061102857604080518881528951818a018190525f92600582901b83018101918a918c9085015b828710610ffc5785850386f35b909192938280611018600193603f198a82030186528851611d4d565b9601920196019592919092610fef565b806110778861107161104460019560059d9c9d1b87018761246f565b929089846040519586938585013782018381015f81528b519283915e015f83820152038084520182611971565b30613f13565b611081828a611dbe565b5261108c8189611dbe565b5001969596610fc6565b34610321576003196040368201126103215760043567ffffffffffffffff8082116103215760c08260040193833603011261032157602435908111610321576110e3903690600401611cd0565b906110ec612bf0565b61111d61111861111361110c611102888061245a565b604081019061246f565b3691611993565b613e95565b613efe565b801561139b5760011015611389576024830161113981866124a2565b90501561137757604484019461114f86826124a2565b905015611365576111b561117d966111a961117461116d858061245a565b95856124a2565b999092856124a2565b91909261119a60405197611190896118a1565b33895236906119f7565b9a60209b8c8901523691611a6d565b60408601523691611a6d565b6060830152606485013560808301526111cd82612c32565b91825f525f875260405f20958654159687611211575b888860017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055604051908152f35b6001905560a46001600160a01b03917f87491344dfbcf91f6cbbc610cbbeedc85313d37a02df0c93527f7ea5f8db717f83855116604051908152878c82015260606040820152806112656060820188611e19565b0390a10191611274838561246f565b90506112b9575b505050506112ad92916103066102ef61030e933390919060405192600284526020840152604083015260608201604052565b828080808080806111e3565b6112c661110c848661246f565b6112cf816145d0565b156113425750937fd46c2c56b35c8210e9e712ec3f02242d5fc90187c0ac8ed80cc33626846ec369896112ad989795611335611318610306976102ef9761030e9b51169361246f565b866040519586958652850152606060408501526060840191612388565b0390a1938395965061127b565b89610597604051928392630c89984b60e31b845260048401526024830190611d4d565b60405163540e5f0b60e01b8152600490fd5b604051636c44ef8f60e01b8152600490fd5b604051633c8270bd60e21b8152600490fd5b604051632cff108b60e21b8152600490fd5b3461032157602080600319360112610321576024816001600160a01b036113d2611861565b16604051928380926370a0823160e01b82523060048301525afa908115610441575f91611403575b50604051908152f35b90508181813d8311611429575b61141a8183611971565b810103126103215751826113fa565b503d611410565b346103215761143e36611d01565b929161144b949194612bf0565b611456838333613b61565b61145f816134d6565b15611583578160ff916114778561153a969533612a60565b6114818183613543565b1561157d575080935b61149685828533613b95565b917f8045c25080b0868951141ed0a91720bcad09a8364a2b3109ee1fd49c1f0bc8b860c06114c5898833613bf3565b97906001600160a01b0360405192338452169a8b6020840152856040840152886060840152608083015260a0820152a16040519660068852602088015260408701526060860152608085015260a08401521660c082015260e08101604052906040519160018352602083015260408201604052565b90806115665760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b6115759261030e9136916123a8565b8080806104e6565b9361148a565b50604051623a3a4d60e21b81523360048201526001600160a01b039190911660248201526044810191909152606490fd5b34610321576080366003190112610321576004356001600160a01b0390818116809103610321576115e3611877565b6044359167ffffffffffffffff91606435838111610321573660238201121561032157806004013593841161032157366024858301011161032157611670956020921693611632868587613a82565b60405196879283926323e30c8b60e01b84523360048501528760248501528860448501525f606485015260a06084850152602460a485019201612388565b03815f855af1938415610441575f946116dc575b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd984036116c3576116b893503091613afb565b602060405160018152f35b604051630b6c58a960e31b815260048101859052602490fd5b9093506020813d602011611708575b816116f860209383611971565b8101031261032157519284611684565b3d91506116eb565b34610321576101403660031901126103215767ffffffffffffffff60043581811161032157611743903690600401611b02565b6024358281116103215761175b903690600401611b02565b60c0366043190112610321576101043583811161032157611780903690600401611cb5565b90610124359384116103215761179d6104e6943690600401611cb5565b926117a6612bf0565b611eca565b346103215760603660031901126103215760206117da6117c9611861565b6117d1611877565b60443591612a60565b604051908152f35b34610321576020366003190112610321576004355f525f6020526020600160405f205414604051908152f35b34610321576020366003190112610321576004359063ffffffff60e01b82168092036103215760209163e414309160e01b8114908115611850575b5015158152f35b6301ffc9a760e01b14905083611849565b600435906001600160a01b038216820361032157565b602435906001600160a01b038216820361032157565b35906001600160a01b038216820361032157565b60a0810190811067ffffffffffffffff8211176118bd57604052565b634e487b7160e01b5f52604160045260245ffd5b6060810190811067ffffffffffffffff8211176118bd57604052565b6040810190811067ffffffffffffffff8211176118bd57604052565b6080810190811067ffffffffffffffff8211176118bd57604052565b67ffffffffffffffff81116118bd57604052565b60e0810190811067ffffffffffffffff8211176118bd57604052565b6020810190811067ffffffffffffffff8211176118bd57604052565b90601f8019910116810190811067ffffffffffffffff8211176118bd57604052565b92919267ffffffffffffffff82116118bd57604051916119bd601f8201601f191660200184611971565b829481845281830111610321578281602093845f960137010152565b9080601f83011215610321578160206119f493359101611993565b90565b91906060838203126103215760405190611a10826118d1565b8193611a1b8161188d565b8352611a296020820161188d565b602084015260408101359167ffffffffffffffff831161032157604092611a5092016119d9565b910152565b67ffffffffffffffff81116118bd5760051b60200190565b929192611a7982611a55565b604092611a896040519283611971565b819581835260208093019160061b84019381851161032157915b848310611ab257505050505050565b8583830312610321578386918251611ac9816118ed565b611ad28661188d565b81528286013583820152815201920191611aa3565b9080601f83011215610321578160206119f493359101611a6d565b91909160a0818403126103215760405190611b1c826118a1565b8193611b278261188d565b835267ffffffffffffffff9160208101358381116103215782611b4b9183016119f7565b602085015260408101358381116103215782611b68918301611ae7565b6040850152606081013592831161032157611b896080939284938301611ae7565b60608501520135910152565b90929192611ba281611a55565b91604094611bb36040519485611971565b839583855260208095019160059460051b8401948186116103215784935b868510611be2575050505050505050565b67ffffffffffffffff90853582811161032157870190608082860312610321578551611c0d81611909565b611c168361188d565b81528a8301358b8201528683013584811161032157830186601f8201121561032157803590611c4482611a55565b91611c518a519384611971565b8083528d80840191891b83010191898311610321578e809101915b838310611ca557505050508782015260608084013594851161032157611c96878d968796016119d9565b90820152815201940193611bd1565b82358152918101918f9101611c6c565b9080601f83011215610321578160206119f493359101611b95565b9181601f840112156103215782359167ffffffffffffffff8311610321576020808501948460051b01011161032157565b906080600319830112610321576004356001600160a01b0381168103610321579160243591604435916064359067ffffffffffffffff821161032157611d4991600401611cd0565b9091565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b805115610d4a5760200190565b805160011015610d4a5760400190565b805160021015610d4a5760600190565b805160031015610d4a5760800190565b805160041015610d4a5760a00190565b8051821015610d4a5760209160051b010190565b9081518082526020808093019301915f5b828110611df1575050505090565b835180516001600160a01b031686528201518583015260409094019392810192600101611de3565b90608080611e8f611e7d611e6b60406001600160a01b0380895116885260208901519060a060208a01528082511660a08a015260208201511660c08901520151606060e0880152610100870190611d4d565b60408701518682036040880152611dd2565b60608601518582036060870152611dd2565b93015191015290565b90611ea282611a55565b611eaf6040519182611971565b8281528092611ec0601f1991611a55565b0190602036910137565b926001600160a01b038451166001600160a01b0383511614612376576001600160a01b03611eff606086015160643590611dbe565b515116906040830151916001600160a01b03611f1e6084358095611dbe565b51511614801590612336575b610d04576040850151906001600160a01b03611f496044358094611dbe565b5151166001600160a01b03611f6460643560608a0151611dbe565b5151161461232457611f7586612c32565b805f525f60205260405f2054156122d15750611f9084612c32565b805f525f60205260405f20541561227d5750612075929161204d917f6fa7f4c28634b0a9d6831401c45ae468195fb63aed07308935c35374ff5d9e3960405180611ff8611fea61012033845280602085015283018d611e19565b82810360408401528a611e19565b85606083015260643560808301528760a083015260a43560c083015260c43560e083015260e4356101008301520390a16001600160a01b038651166040519261204084611955565b5f8452606435908a612e9c565b9490506001600160a01b038651166040519261206884611955565b5f845260a4359086612e9c565b92905061208560408201516134d6565b158015612269575b8015612256575b8015612243575b61223157604051916120ac83611909565b5f83525f60208401525f60408401525f60608401526120cb84836144e1565b845260408401526120f16120df83866144e1565b6020860152806060860152845161356a565b94612105602085015160408601519061356a565b9361210f87613520565b8015612222575b612210576121d7612209957fd9fa84dd790c969daa5c33d8050dc06b4a9b59d5b42e2be5f5e8ae20447f618d946121b961220e9a60a0966121588a8851613594565b6121668c6020890151613594565b6121748a60408901516135f2565b6121828c60608901516135f2565b61218b8a61371d565b6121948c61371d565b6001600160a01b036121b060c435926060606435910151611dbe565b515116336137bd565b50506001600160a01b036121b060e43592606060a435910151611dbe565b5050606060405191338352805160208401526020810151604084015260408101518284015201516080820152a16138a9565b6138a9565b565b604051630d86822160e01b8152600490fd5b5061222c85613520565b612116565b6040516321badf1f60e01b8152600490fd5b506122516060840151613520565b61209b565b506122646060820151613520565b612094565b5061227760408401516134d6565b1561208d565b9351604080513381526001600160a01b039092166020830152810194909452507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f3945091925082915050606081015b0390a1565b9551604080513381526001600160a01b039092166020830152810196909652507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f3949350839250506060820190506122cc565b604051631cd2f1c760e21b8152600490fd5b506001600160a01b03612350606085015160a43590611dbe565b5151166001600160a01b0361236c604088015160443590611dbe565b5151161415611f2a565b604051630a98f1f360e21b8152600490fd5b908060209392818452848401375f828201840152601f01601f1916010190565b909291926123b581611a55565b916040916123c66040519485611971565b839581855260208095019160051b8301938185116103215783925b8584106123f15750505050505050565b67ffffffffffffffff90843582811161032157860190838286031261032157835161241b816118ed565b823584811161032157866124309185016119f7565b8152898301359384116103215761244b868b95869501611cb5565b838201528152019301926123e1565b903590605e1981360301821215610321570190565b903590601e1981360301821215610321570180359067ffffffffffffffff82116103215760200191813603831361032157565b903590601e1981360301821215610321570180359067ffffffffffffffff821161032157602001918160061b3603831361032157565b5f5b608081106124e6575050565b6060828201526020016124da565b5f5b82811061250257505050565b6060828201526020016124f6565b903590601e1981360301821215610321570180359067ffffffffffffffff821161032157602001918160051b3603831361032157565b60405190612553826118d1565b60606040835f81525f60208201520152565b60405190612572826118a1565b5f608083828152612581612546565b6020820152606060408201526060808201520152565b9015610d4a57803590607e1981360301821215610321570190565b903590609e1981360301821215610321570190565b9190811015610d4a5760061b0190565b356001600160a01b03811681036103215790565b3580151581036103215790565b9081518082526020808093019301915f5b828110612617575050505090565b835185529381019392810192600101612609565b9061264361014461263c84806125b2565b3690611b02565b5f5260205f81526040926001845f2054036129d057916128c5916126ca85855f61284a6126738361268a9a6125b2565b61268f878501359182878701359c8d923690611b02565b613fa4565b6126a761269c85806125b2565b946060810190612510565b96906126c28751966126b888611955565b8688523690611b02565b973691611b95565b906126d3612c63565b506127fa8651916126e3836118a1565b600483526126f28a84016124d8565b886126fc81612c32565b988b6001600160a01b039a8b84511690835192600384528301528282015233606082015260808101825261272f86611d71565b5261273985611d71565b508051612745816118d1565b6002815281368e83013761275886611d7e565b5261276285611d7e565b50810160ff8c6127c56127ae8d806127878161277f8b8a51611dbe565b515116614172565b97511690612796898851611dbe565b515116846127a58a8951611dbe565b51015191612a60565b958d6127bb828751611dbe565b5151169451611dbe565b51015192169093929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b61280382611d8e565b5261280d81611d8e565b506128318b886060810160ff8c6127c56127ae8d806127878161277f8b8a51611dbe565b61283a82611d9e565b5261284481611d9e565b50614250565b918385511693868601918b83519289818551169401511693878652308a5281808720915101519082519261287d84611955565b878452519561288b87611939565b86528a8601528d85015284606085015285608085015260a084015260c08301528a5180809a819463d04dfe2360e01b835260048301612de4565b03915afa95865f915f986129aa575b506128e35788513d5f823e3d90fd5b95938651600281106129935750888798998260c0979899015199015161291161290b85611dae565b51611d9e565b5161291c8183613543565b156129895750998a925b6129488b85919060405192600284526020840152604083015260608201604052565b61295186611d8e565b5261295b85611d8e565b5082519661296888611939565b8752860152840152866060840152608083015260a082015201526001929190565b9050998a92612926565b6024908a5190630fbb8e5560e21b82526004820152fd5b9097506129c991503d805f833e6129c18183611971565b810190612ca0565b965f6128d4565b505f92508291829150565b9035601e198236030181121561032157016020813591019167ffffffffffffffff8211610321578160061b3603831361032157565b9190808252602080920192915f905b828210612a2d575050505090565b909192936001906001600160a01b03612a458761188d565b16815285830135838201526040908101950193920190612a1f565b8215612a95576001600160a01b038091165f52600160205260405f2091165f5260205260405f20905f5260205260405f205490565b909150612aa182614172565b6001600160a01b03809316906040918251946370a0823160e01b86528416938460048701526020928387602481865afa968715612bb7575f97612bc1575b5083612af8612af183612b289a614f36565b50906149f8565b508651636eb1769f60e11b81526001600160a01b0390941660048501523060248501529297889081906044820190565b0381865afa968715612bb7575f97612b86575b50612af1612b4c916119f498614f36565b50612b578183613543565b15612b7e5750935b5f5260018252825f20905f528152815f20905f8052525f20549061407d565b905093612b5f565b96508387813d8311612bb0575b612b9d8183611971565b8101031261032157955195612af1612b3b565b503d612b93565b85513d5f823e3d90fd5b96508387813d8311612be9575b612bd88183611971565b810103126103215795519583612adf565b503d612bce565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f006002815414612c205760029055565b604051633ee5aeb560e01b8152600490fd5b604051612c5d81612c4f6020820194602086526040830190611e19565b03601f198101835282611971565b51902090565b60405190612c7082611939565b606060c083612c7d612565565b81525f60208201525f60408201525f838201528260808201525f60a08201520152565b919060408382031261032157825167ffffffffffffffff908181116103215784019082601f83011215610321578151602092612cdb82611a55565b91612ce96040519384611971565b808352848084019160051b830101918683116103215785809101915b838310612d785750505050948281015191821161032157019180601f84011215610321578251612d3481611a55565b93612d426040519586611971565b818552838086019260051b820101928311610321578301905b828210612d69575050505090565b81518152908301908301612d5b565b8251815291810191869101612d05565b90808251908181526020809101926020808460051b8301019501935f915b848310612db65750505050505090565b9091929394958480612dd4600193601f198682030187528a516125f8565b9801930193019194939290612da6565b91906020928381526001600160a01b0382511684820152838201516040820152612e1e604083015160e06060840152610100830190611d4d565b9060608301516080820152612e45608084015192601f1993848483030160a0850152612d88565b9260a081015193838382030160c08401528680865192838152019501905f5b818110612e88575050506119f494955060c060e091015192828503019101526125f8565b825187529588019591880191600101612e64565b94959395929192612eab612c63565b50604096875190612ebb826118a1565b60048252602093612ecd8584016124d8565b612ed689612c32565b6001600160a01b038097818c51168d519360038552898501528d840152166060820152608081018b52612f0884611d71565b52612f1283611d71565b508951612f1e816118d1565b600281528a3687830137612f3184611d7e565b52612f3b83611d7e565b50898901908681835190612f4e91611dbe565b515116612f5a90614172565b86888c51168984865190612f6d91611dbe565b5151168285875190612f7e91611dbe565b51015190612f8b92612a60565b928981865190612f9a91611dbe565b515116945190612fa991611dbe565b5101519060ff16612fe1929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b612fea83611d8e565b52612ff482611d8e565b5060608801858782519061300791611dbe565b51511661301390614172565b868a5116878984519061302591611dbe565b515116878a85519061303691611dbe565b5101519061304392612a60565b908689898186519061305491611dbe565b51511694519061306391611dbe565b5101519060ff1661309b929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b6130a483611d9e565b526130ae82611d9e565b506130b891614250565b9183875116938188019283519183818451169301511693865f523084528a805f20915101518b51916130e983611955565b5f83528c51966130f888611939565b8752858701528b8601525f60608601526080850186905260a085015260c0840152885163d04dfe2360e01b815292839081906131379060048301612de4565b03815a935f94fa91825f915f94613216575b506131585788513d5f823e3d90fd5b979495969791948251966002881097886131ff5750818385015194015161318161290b87611dae565b5161318c8183613543565b156131f75750925b6131b68585919060405192600284526020840152604083015260608201604052565b6131bf87611d8e565b526131c986611d8e565b5082519a6131d68c611939565b8b528a01528801526060870152608086015260a085015260c0840152159190565b905092613194565b602490835190630fbb8e5560e21b82526004820152fd5b90935061322d91503d805f833e6129c18183611971565b925f613149565b95949193908693613243612c63565b505f92604061335e815192613257846118a1565b600484526020936132698582016124d8565b6133276132758b612c32565b8b6001600160a01b03998a9283835116895191600383528b830152898201528360609b168b8201526080810189526132ac86611d71565b526132b685611d71565b5087516132c2816118d1565b6002815288368b8301376132d586611d7e565b526132df85611d7e565b5060ff896127c58a85019361331b876132fd8161277f858a51611dbe565b9751168861330c848951611dbe565b515116856127a5858a51611dbe565b966127bb828751611dbe565b61333082611d8e565b5261333a81611d8e565b50612831878b8d60ff896127c58c85019361331b876132fd8161277f858a51611dbe565b946133de5f868a511698869786889c0191825191888184511693015116928c8552308952878086209151015188519161339683611955565b8683528951956133a587611939565b86528a86015288850152848a8501528b608085015260a084015260c08301528551808095819463d04dfe2360e01b835260048301612de4565b03915afa90815f915f936134b8575b506134ab575050505f975b6002855110988915996134985782848701519601519061341a61290b89611dae565b51906134268284613543565b1590506134905750925b6134528685919060405192600284526020840152604083015260608201604052565b61345b88611d8e565b5261346587611d8e565b5082519b6134728d611939565b8c528b0152890152870152608086015260a085015260c08401529190565b905092613430565b50505050505050505091506119f4612c63565b91999850945093966133f8565b9092506134cf91503d805f833e6129c18183611971565b915f6133ed565b6134f5905f60e01d906001600160e01b038160e01d9116601b0b614fed565b1290565b906134f5916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b61506e565b61353f905f60e01d906001600160e01b038160e01d9116601b0b614fed565b1390565b9061353f916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b61506e565b6119f491610af4916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614544565b6135ee9160808101826135b06135aa8351611dae565b51611dae565b526135e76135e16001600160a01b038094515116936135d86135d28551611dae565b51611d71565b51169251611dae565b51611d8e565b5191613b95565b5050565b906080810191806136066135aa8551611d9e565b526001600160a01b038092515116916136226135d28551611d9e565b51166136316135e18551611d9e565b5190816136e55761364183613520565b6136cc579183917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a95936122cc955f5260209060018252613697604094855f20835f528452855f20855f528452855f205461407d565b945f5260018252835f20905f528152825f20915f52525f20555b51604051918291338352604060208401526040830190612d88565b60405163793a8f5560e01b815260048101849052602490fd5b91613716917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a95936122cc956137bd565b50506136b1565b6080810161372e6135e18251611d9e565b5191821561373b57505050565b6137556135d26001600160a01b0380935151169351611d9e565b5116815f5260209160018352604092835f20835f528152835f20855f528152835f2054936001600160e01b038516613790575b505050505050565b6137b4955f9284845260018152828420868552815282842091845252812055613bf3565b5f808080613788565b939291936137ca83613520565b6136cc57846137e6576137de939450613bf3565b50505f905f90565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f528152613823835f2054948561407d565b9561382d87613520565b613850575f97885260018252838820908852815282872091875252909320829055565b835163c5e12af560e01b815260048101889052602490fd5b90604082019082526020606081936040838201528551809452019301915f5b828110613895575050505090565b835185529381019392810192600101613887565b60c0810151908151915f92613a1d575b5061395e6020918281510151926001600160a01b039081818187511696015116928660a082019485518252308452604097888320898686510151015160808601518b519161390683611955565b8683528c519361391585611955565b8785528d519661392488611939565b8752898701528c86015260016060860152608085015260a084015260c08301528851808099819463d04dfe2360e01b835260048301612de4565b03915afa948515613a135787956139f5575b508451613981575b50505050505050565b81905101510151169051813b156139f1579184918493836139b6965180978195829463012c676d60e21b845260048401613868565b03925af19081156139e857506139d1575b8080808080613978565b6139db8291611925565b6139e557806139c7565b80fd5b513d84823e3d90fd5b8480fd5b613a0a9195503d8089833e6129c18183611971565b9050935f613970565b86513d89823e3d90fd5b6001600160a01b03602080845101510151169060a083015190823b1561032157613a60925f928360405180968195829463012c676d60e21b845260048401613868565b03925af1801561044157156138b957613a7a919250611925565b5f905f6138b9565b6040519263a9059cbb60e01b5f526001600160a01b0380931660045260245260205f60448180855af160015f5114811615613adc575b8360405215613ac657505050565b635274afe760e01b835216600482015260249150fd5b6001811516613af257813b15153d151616613ab8565b833d5f823e3d90fd5b9092604051936323b872dd60e01b5f526001600160a01b0393848092166004521660245260445260205f60648180855af160015f5114811615613b4b575b836040525f60605215613ac657505050565b6001811516613af257813b15153d151616613b39565b909115613b6c575050565b6040516305dbdfd960e41b81526001600160a01b03918216600482015291166024820152604490fd5b93929193613ba283613520565b6136cc5784613bb6576137de9394506140a7565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f528152613823835f2054948561356a565b90929192613c0081614573565b93613c0a81613520565b613c535784816001600160e01b03613c299360e01d9116601b0b615198565b50809281613c39575b5050509190565b6001600160a01b03613c4b9316613a82565b5f8181613c32565b604051632d1671a360e11b8152600490fd5b916040805191613c74836118a1565b60048084526020613c868186016124d8565b5f5b8751811015613cbb5780613c9e6001928a611dbe565b51613ca98289611dbe565b52613cb48188611dbe565b5001613c88565b5092955092939093335f52308352855f2091865190613cd9826118ed565b613ce1612546565b8252606085819301528751613cf581611955565b5f8152885191613d0483611955565b5f83525f3681375f5b8151811015613e6a57613d208183611dbe565b5190888c8b84519189818401518d8d8251613d48575b50505050505050506001915001613d0d565b5f613db797948197948c9794613d758c956001600160a01b039d8e81818d51169c0151169b015190614250565b94865199613d828b611939565b8a528901528488015286015260808501528a60a08501528b60c08501525180958194829363d04dfe2360e01b84528301612de4565b03915afa938415613e60578b915f95613e42575b508451613de0575b50908b8e89838d8d613d36565b51015116803b1561032157613e0f925f918c8f84905180978195829463012c676d60e21b845233908401613868565b03925af1918215613e3857600192613e29575b8981613dd3565b613e3290611925565b5f613e22565b8c513d5f823e3d90fd5b613e579195503d805f833e6129c18183611971565b9050935f613dcb565b8e513d5f823e3d90fd5b5050505050505050509050565b8115613e81570490565b634e487b7160e01b5f52601260045260245ffd5b6040815110613ef1576020810151908051603f198101908111613edd5760051c8211613ec95760016020920160051b010190565b5050604051613ed781611955565b5f815290565b634e487b7160e01b5f52601160045260245ffd5b50604051613ed781611955565b805115613f0e57602001515f1a90565b505f90565b905f8091602081519101845af48080613f91575b15613f475750506040513d81523d5f602083013e60203d82010160405290565b15613f6e57604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b3d15613f7f576040513d5f823e3d90fd5b60405163d6bda27560e01b8152600490fd5b503d151580613f275750813b1515613f27565b91613fcf906060613fc4936001600160a01b039485916040880151611dbe565b515116940151611dbe565b5151161461232457565b6140006001600160e01b0392838316601b0b9260e01d938160e01d9116601b0b84846147af565b90637ffffff58213614050575b90614017916149f8565b9290921580614048575b61402a57505090565b6044925060405191638eba4d0760e01b835260048301526024820152fd5b508215614021565b61405a82826156c1565b1561400d57604483856040519163d556b11160e01b835260048301526024820152fd5b6119f491610af4916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614d9d565b9291926140b382614573565b936140bd81613520565b61411e5784816001600160e01b036140dc9360e01d9116601b0b615198565b9290809315614109575b508290816140f5575050509190565b613c4b926001600160a01b03309216613afb565b9092505f198114613edd57600101915f6140e6565b604051632eaefac360e21b8152600490fd5b6004111561413a57565b634e487b7160e01b5f52602160045260245ffd5b602090939291936001600160a01b03604082019516815261416e83614130565b0152565b61417a6156da565b60408051630782d7e160e01b81526001600160a01b03831660048201529091828260248173200e12d10bb0c5e4a17e7018f0f1161919bb93895afa928315614247575f925f94614212575b506141cf83614130565b600183141580614200575b6141e45750505090565b5163ee07877f60e01b815291829161059791906004840161414e565b5061420a83614130565b8215156141da565b908094506142369293503d8511614240575b61422e8183611971565b810190614f0c565b919091925f6141c5565b503d614224565b513d5f823e3d90fd5b61425a8251611e98565b6142648351611e98565b9282519281518015155f146144d957600201935b6001940184019061428882611a55565b956142a360409361429b8551998a611971565b808952611a55565b6142b5602091601f1901828a016124f4565b5f9584519389896002926002885233868901523089890152606097606081018a526142df84611d71565b526142e983611d71565b505f825b614499575b505050508651614309575b50505050505050505090565b9091929360028861432c8c866143258e809c9d9e018093611dbe565b528d611dbe565b500185614339828d611dbe565b52614344818c611dbe565b505f965b614353575b506142fd565b8851871015614494576001600160a01b036143ff898b856143f68c60428c8861437c8488611dbe565b51511696858261438c868a611dbe565b5101519261439a868a611dbe565b51838d82511691015182815160051b910120908451927f6ec4dff745ec96dbde88c5d41f8aa5ac13aa1664afb47b8406b44fa945a650c88452830152838201522090519161190160f01b83528d83015260228201522093611dbe565b51015191614f64565b1561447c578761446b8b8e8c8f9e9d9c9b9a999897968f614458918d61444e898f8f61443a83889f614431828f611dbe565b51511692611dbe565b52614445828b611dbe565b51015192611dbe565b52019c8d94611dbe565b5101516144658383611dbe565b52611dbe565b500196979895909192939495614348565b8851630a57f30960e31b815260048101899052602490fd5b61434d565b9091929a82518210156144d157906144c584809301809d6144ba8487611dbe565b516144658383611dbe565b50019082918d936142ed565b9a92916142f2565b505f93614278565b916040830192604061451b610af4606087519401938451906001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6145f4565b9451930161452a8151866134f9565b614532575050565b9093506119f491925051925183613fd9565b919291600160ff1b840161455c57611d4993506150c3565b90611d49935f0391614d9d565b61401782826149f8565b61457b6156da565b6040805163b7bad1b160e01b81526001600160a01b0383166004820152909182826024815f73200e12d10bb0c5e4a17e7018f0f1161919bb93895af1928315614247575f925f9461421257506141cf83614130565b6008815110613f0e576008015167ffffffffffffffff1667ff0a89c674ee78741490565b9091939284158215175f1461460e5750505090505f905f90565b82810192600160fd1b8082019083011760fe1c614745575b505061463181615386565b9361463b81615386565b9461464686826153a6565b90918215614736575f9083986f0785ee10d5da46d900f436a000000000808611614728575b50670de0b6b3a7640000808b11614719575b50633b9aca00808b1161470a575b50612710808b116146fc575b5098805b6146eb57508190611d49989982600a0a9109960195817fcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccd0a93838211900382610100031b9203901c1702916153b9565b60019290920191600a90048061469b565b60049a04998a930192614697565b600991939a049901915f61468b565b601291939a049901915f61467d565b85049950602592505f61466b565b50929050611d499495506153b9565b5f8212156147995780841361478b575b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb284131561462657909250611d499394916152c4565b909250611d4993949161532b565b8084121561475557909250611d499394916152c4565b929091806147d5576044848460405191637a97930f60e01b835260048301526024820152fd5b90919280155f146147ea57505050505f905f90565b614803936147f791615473565b92919490938492615473565b909391928461481188615386565b9161481b86615386565b947f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000094604c918688106149c2575b030191600160ff1b98838a018112155f1461498f575050035b5f955f821280614986575b614968575b5f811280614956575b6149385786820103966001600160ff1b038814908161492e575b5080614925575b8061491c575b6148fe5750906148b2929161561f565b915f81136148c5575b50611d49936153b9565b9091604c82136148f3576148dc91600a0a90613e77565b9081156148e9575f6148bb565b505050505f905f90565b50505050505f905f90565b876044916040519163d556b11160e01b835260048301526024820152fd5b505f85126148a2565b5082841461489c565b905088145f614895565b604489836040519163d556b11160e01b835260048301526024820152fd5b50806001600160ff1b0301821361487b565b95508087018613156149805786818703015b95614872565b5f61497a565b505f811361486d565b89985090920390506001600160ff1b03819003870182136149b35701860194614862565b5050505050505050505f905f90565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009650604b9250614849565b8115613e81570590565b8082601b82810b8314614bed577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000008405614b99575b8380820b03614b8857507b199999999999999999999999999999999999999999999999999999987b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc84011115614b39575b838060030b03614abd575b808413614aa15750506001600160e01b036001925b60e01b91161791565b8303600a0a8015613e81576001600160e01b0391071592614a98565b92915f841315614b0d575090614ad383836156c1565b614aef57637ffffffe1901600a0a810290637fffffff92614a83565b506044916040519163d556b11160e01b835260048301526024820152fd5b637fffffff1992830390604382136148f357614b2c91600a0a906149ee565b9182156148e95792614a83565b5f198401808060030b14614b4d5750614a78565b90506001600160e01b039293507b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff915060e01b9260ff1d181617905f90565b600190940193600a90930592614a2b565b937f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000840515614bda576305f5e100600894058094819201955b915050614a2b565b620186a060059405809481920195614bd2565b5082614a7857505050505f90600190565b919291600160ff1b9190801580614d8b575090614c1a91615473565b9490929091905f868585858282138015614d82575b614d65575b505050508682841860ff1c94860391039081604c038111614d4a5701600a0a808205919084614d30575b505081019182821860ff1c1115614d2857826001600160ff1b0314614d0a57905f600192135f14614cdb57600a9004915b01925b81158117614c9f57509190565b80614cb8575b508015614cb0579190565b505f91508190565b9192614cce9203600160ff1b01600a0a906149ee565b600160ff1b91905f614ca5565b600a60037fe6666666666666666666666666666666666666666666666666666666666666679201040191614c8f565b604490836040519163d556b11160e01b835260048301526024820152fd5b509092614c92565b8107614d3d575b80614c5e565b60ff1d600117015f614d37565b505050919350614d58579190565b60018160ff1d1790039190565b5f9a50909750909550600160ff1b94509250905086808080614c34565b50835f12614c2f565b15614d965750509190565b9350919050565b9392919384158115818117614eee57505090614db891615473565b9194908295614dc982958294615473565b8096929491969387868482138015614ee5575b614ecc575b5050505050508682841860ff1c94860391039081604c038111614d4a5701600a0a808205919084614eb2575b505081019182821860ff1c1115614eaa57826001600160ff1b0314614d0a57905f600192135f14614e7b57600a9004915b01925b81158117614e4e57509190565b80614e5e57508015614cb0579190565b600160ff1b93614e759291038401600a0a906149ee565b5f614ca5565b600a60037fe6666666666666666666666666666666666666666666666666666666666666679201040191614e3e565b509092614e41565b8107614ebf575b80614e0d565b60ff1d600117015f614eb9565b929b5098509196509450925090505f8080808080614de1565b50858412614ddc565b9395939092919015614f04575050614cb0579190565b945092915050565b919082604091031261032157815160048110156103215760209092015160ff811681036103215790565b9060ff165f03916001600160ff1b0382115f14614f5c57600a6001818404940192061590565b909190600190565b9091813b614f9f57614f769192615743565b50614f8081614130565b159182614f8c57505090565b6001600160a01b03918216911614919050565b6020918160645f935160405192630b135d3f60e11b9788855260048501526040602485015286820190604485015e8281018201859052601f01601f191601915afa905f5114601f3d11161690565b92915f9060018184145f87128715171717615067575f92808213615059575b03604c81135f82121761504d57600a0a908461502b83820293846149ee565b146150405750501561503c575f9190565b5f90565b90935090156119f4579190565b50501561503c575f9190565b5f956001945092509061500c565b5050505f90565b93929190918083145f83125f871218831587151717176150bd575f928082136150b05703604c81135f82121761504d57600a0a908461502b83820293846149ee565b919460019350919061500c565b50919050565b909291600160ff1b91828101615155575080841461514b57808413918215615143578185035b604c8111156151325750505f915b1561512357507f8000000000000000000000000000000000000000000000000000000000000001019190565b92506001600160ff1b03039190565b600a0a908115613e815704916150f7565b8482036150e9565b505090505f905f90565b9361516292945f03614bfe565b80939180928114615176575b50505f039190565b915092506001600160ff1b038314614d0a57600a600191059201915f8061516e565b91925f8312156151c0576044838360405191634a7d166b60e01b835260048301526024820152fd5b9192836151d257505090505f90600190565b60ff811682019180831261529a575f83121561520a575050604c198112614cb0575f03600a0a916152038382613e77565b9283021490565b909293915f81135f1461529057604d811361526557600a0a928315613e8157835f1904831161523c5750500290600190565b60405163c849483b60e01b815260048101849052602481019290925260ff166044820152606490fd5b5060405163c849483b60e01b81526004810192909252602482015260ff919091166044820152606490fd5b5050905090600190565b60405163c849483b60e01b815260048101869052602481019190915260ff82166044820152606490fd5b909392915f6152d49181846145f4565b9490945f8483019182019412159081615321575b8115615317575b506152f957505090565b604492506040519163d556b11160e01b835260048301526024820152fd5b905083125f6152ef565b82811291506152e8565b61534093600160fe1b908101939201906145f4565b9081815f821215615377575050604b1982126137de57615365915f03600a0a906149ee565b908161536f575f90565b600160ff1b90565b93600160ff1b90910192509050565b5f8112156119f457600160ff1b9080820361539f575090565b90505f0390565b905f198183099102908180821091030391565b92939291905f818418121561544e576001600160ff1b03928383111561543857600160ff1b938385036153ee57505050509190565b90919293508514615408575050600a600191045f03920190565b604051630ed8062160e21b8152600481019190915260248101919091526044810182905260648101849052608490fd5b5090915050600160ff1b8114613edd575f039190565b90916001600160ff1b0380841115613c32578514615408575050600a60019104920190565b919091801561561557827f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000080830515615523575b507f19999999999999999999999999999999999999999999999999999999999999997f0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc830110615514575b83136154fe5791905f90565b919060018060ff1b926001600160ff1b03030190565b9290600a02905f1901926154f2565b6f4b3b4ca85a86c47a098a22400000000080840515615603575b507728c87cb5c89a2571ebfdcb54864ada834a000000000000008305156155ec575b7b097edd871cfda3a5697758bf0e3cbb5ac5741c6400000000000000008305156155d8575b7e3899162693736ac531a5a58f1fbb4b746504382ca7e40000000000000000008305156155c8578205156155b9575b5f6154a7565b9290600a02905f1901926155b3565b9391606402916001190193615584565b93916402540be40002916009190193615584565b9391678ac7230489e800000291601219019361555f565b6025198301955092909202915f61553d565b505f915081908190565b90915f19838309928083029283808610950394808603958487101561569d5714615695579082910960018219018216809204600280826003021880830282030280830282030280830282030280830282030280830282030280920290030293600183805f03040190848311900302920304170290565b505091500490565b60648386866040519263362ced0960e11b8452600484015260248301526044820152fd5b6119f491905f8112156156d5575f0361577d565b61577d565b73200e12d10bb0c5e4a17e7018f0f1161919bb9389803b158015615718575b6157005750565b602490604051906373e6d7b360e01b82526004820152fd5b507f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d41813f14156156f9565b81519190604183036157735761576c9250602082015190606060408401519301515f1a9061580c565b9192909190565b50505f9160029190565b90637ffffff581131561580657637ffffffe19810190604382136157ff575f8212156157d357637fffffff91505f0301600a0a7b8000000000000000000000000000000000000000000000000000000202111590565b50600a0a8015613e81577b80000000000000000000000000000000000000000000000000000001041090565b5050151590565b50505f90565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411615883579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa15610441575f516001600160a01b0381161561587957905f905f90565b505f906001905f90565b5050505f916003919056"; /// @dev What MUST already be on a network before this release can be /// broadcast there: an address, and the runtime code that belongs at it. diff --git a/src/generated/candidate/RouteProcessorRaindexV6ArbOrderTaker.sol b/src/generated/candidate/RouteProcessorRaindexV6ArbOrderTaker.sol index 99419c4f3e..9c4a538cf0 100644 --- a/src/generated/candidate/RouteProcessorRaindexV6ArbOrderTaker.sol +++ b/src/generated/candidate/RouteProcessorRaindexV6ArbOrderTaker.sol @@ -5,23 +5,23 @@ pragma solidity ^0.8.25; // THIS FILE IS AUTOGENERATED BY THE BUILD SCRIPT. DO NOT EDIT BY HAND. /// @dev Hash of the known bytecode. -bytes32 constant BYTECODE_HASH = bytes32(0x7995ff588d498de907b163c9a1ce2cdc660aa60a1d589e70aa95004d82063fe5); +bytes32 constant BYTECODE_HASH = bytes32(0x39b8833d3404cf2dcc78fa2f094c6d1b9322fd2dd2a6e8abb480c1eda17c7846); /// @dev The deterministic deploy address of the contract when deployed via /// the Zoltu factory. -address constant DEPLOYED_ADDRESS = address(0xEaf3bE9AC48666C249FC37a2c246e41D9dB155bd); +address constant DEPLOYED_ADDRESS = address(0xaA28Ab43bb7D7610DFb3B051DD89Ab462d2F5Fa0); /// @dev The creation bytecode of the contract. bytes constant CREATION_CODE = - hex"6080604052348015600e575f80fd5b5060017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055612605806100405f395ff3fe608060405260043610610034575f3560e01c806301ffc9a71461003d578063691f9ed714610070578063ea37cc511461008f57005b3661003b57005b005b348015610048575f80fd5b5061005c61005736600461186a565b6100a2565b604051901515815260200160405180910390f35b34801561007b575f80fd5b5061003b61008a3660046118a5565b6100f3565b61003b61009d366004611947565b61020e565b5f6001600160e01b0319821663691f9ed760e01b14806100d257506001600160e01b0319821663ea37cc5160e01b145b806100ed57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6101018686868686866104d0565b736e2d0e71d900474b262e545bc4c98b71ab368d2161012b6001600160a01b038816825f1961053d565b5f61013883850185611ae5565b90505f61014d876101488b6105b7565b61063b565b5090505f8061015f886101488c6105b7565b9150915080610176578161017281611b17565b9250505b604051632646478b60e01b81526001600160a01b03861690632646478b906101ac908e9087908f90889030908c90600401611b69565b6020604051808303815f875af11580156101c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101ec9190611bb4565b506102016001600160a01b038c16865f61053d565b5050505050505050505050565b610216610668565b61022561022282611d36565b50565b6102326080830183611df2565b90505f0361025357604051639c95219f60e01b815260040160405180910390fd5b6001600160a01b03831673f78c2c56f95e28f73f4b8b695b07ee574da5c783146102a05760405163516e822d60e01b81526001600160a01b03841660048201526024015b60405180910390fd5b5f6102ae6080840184611df2565b5f8181106102be576102be611e38565b90506020028101906102d09190611e4c565b6102da9080611e6a565b6102e8906040810190611e7e565b6102f56080860186611df2565b5f81811061030557610305611e38565b90506020028101906103179190611e4c565b6020013581811061032a5761032a611e38565b6103409260206040909202019081019150611ec4565b90505f6103506080850185611df2565b5f81811061036057610360611e38565b90506020028101906103729190611e4c565b61037c9080611e6a565b61038a906060810190611e7e565b6103976080870187611df2565b5f8181106103a7576103a7611e38565b90506020028101906103b99190611e4c565b604001358181106103cc576103cc611e38565b6103e29260206040909202019081019150611ec4565b90506103f96001600160a01b038316865f1961053d565b60405163b0460f0760e01b81526001600160a01b0386169063b0460f079061042590879060040161218c565b60408051808303815f875af1158015610440573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610464919061234e565b5061047b90506001600160a01b038316865f61053d565b6104a061048784611d36565b83610491856105b7565b8461049b866105b7565b610696565b50506104cb60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054600214801561051557503373f78c2c56f95e28f73f4b8b695b07ee574da5c78314155b156105355760405163f6688adf60e01b8152336004820152602401610297565b505050505050565b6105498383835f610935565b6104cb5761055a83835f6001610935565b61058257604051635274afe760e01b81526001600160a01b0384166004820152602401610297565b61058f8383836001610935565b6104cb57604051635274afe760e01b81526001600160a01b0384166004820152602401610297565b5f6105c0610997565b6040516354636d2b60e01b81526001600160a01b038316600482015273200e12d10bb0c5e4a17e7018f0f1161919bb9389906354636d2b906024016020604051808303815f875af1158015610617573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100ed9190612370565b5f806001600160e01b038416601b0b60e085901d61065a828287610a24565b9350935050505b9250929050565b610670610b96565b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b6040805160018082528183019092525f91816020015b60608152602001906001900390816106ac575050604080516003808252608082019092529192505f919060208201606080368337019050506040516370a0823160e01b81523060048201529091505f906001600160a01b038816906370a0823190602401602060405180830381865afa15801561072b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061074f9190611bb4565b9050801561076b5761076b6001600160a01b0388163383610bd8565b5f6107768288610be5565b50905080835f8151811061078c5761078c611e38565b602090810291909101015250506040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa1580156107dd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108019190611bb4565b9050801561081d5761081d6001600160a01b0386163383610bd8565b5f6108288286610be5565b509050808360018151811061083f5761083f611e38565b602090810291909101015250479050801561085e5761085e3382610c25565b5f61086a826012610be5565b509050808360028151811061088157610881611e38565b602002602001018181525050505080825f815181106108a2576108a2611e38565b60209081029190910101526040805160018082528183019092525f91816020015b6040805160a0810182525f91810182815260608083019390935260808201839052815260208101919091528152602001906001900390816108c357905050905087815f8151811061091657610916611e38565b602002602001018190525061092b8382610c9c565b5050505050505050565b60405163095ea7b360e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f5114831661098b57838315161561097f573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b73200e12d10bb0c5e4a17e7018f0f1161919bb93893b15806109ee575073200e12d10bb0c5e4a17e7018f0f1161919bb93893f7f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d4114155b15610a22576040516373e6d7b360e01b815273200e12d10bb0c5e4a17e7018f0f1161919bb93896004820152602401610297565b565b5f805f851215610a5157604051634a7d166b60e01b81526004810186905260248101859052604401610297565b845f03610a6357505f90506001610b8e565b8460ff8416850185811215610a9e5760405163c849483b60e01b8152600481018890526024810187905260ff86166044820152606401610297565b5f805f831215610aea57604c19831215610ac1575f809550955050505050610b8e565b825f03600a0a9150818481610ad857610ad8612390565b0495505084029091149150610b8e9050565b5f831315610b8357604d831315610b275760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610297565b82600a0a9150815f1981610b3d57610b3d612390565b04841115610b715760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610297565b5091909102925060019150610b8e9050565b509193506001925050505b935093915050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054600203610a2257604051633ee5aeb560e01b815260040160405180910390fd5b61058f8383836001610ee4565b5f805f805f610bf48787610f2e565b9250925092505f80610c068585610f8a565b9150915081838015610c155750815b9650965050505050509250929050565b80471015610c4f5760405163cf47918160e01b815247600482015260248101829052604401610297565b610c68828260405180602001604052805f8152506111d3565b15610c71575050565b3d15610c8357610c7f6111e8565b5050565b60405163d6bda27560e01b815260040160405180910390fd5b60408051600480825260a082019092525f91816020015b6060815260200190600190039081610cb35790505090505f5b8351811015610d1457838181518110610ce757610ce7611e38565b6020026020010151828281518110610d0157610d01611e38565b6020908102919091010152600101610ccc565b50335f8181523060209081526040808320815160a0810183528083018581526060808301879052608083018190529082528185015282518581529384018581528484019093529093909291905b8751811015610ed957878181518110610d7c57610d7c611e38565b602002602001015193505f845f015160400151511115610ed1575f845f01515f01516001600160a01b031663d04dfe236040518060e00160405280885f0151602001516001600160a01b03168152602001898152602001885f01516040015181526020015f8152602001610df48c8a602001516111f3565b8152602001878152602001868152506040518263ffffffff1660e01b8152600401610e1f919061242b565b5f60405180830381865afa158015610e39573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610e609190810190612523565b9150505f81511115610ecf5784516020015160405163012c676d60e21b81526001600160a01b03909116906304b19db490610ea1908a9085906004016125d9565b5f604051808303815f87803b158015610eb8575f80fd5b505af1158015610eca573d5f803e3d5ffd5b505050505b505b600101610d61565b505050505050505050565b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f5114831661098b57838315161561097f573d5f823e3d81fd5b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff861115610f7957600a860460018201600a88065f1493509350935050610f83565b8593509150600190505b9250925092565b5f808383601b82900b8214806110c0577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e100000000000000000087051561100b577f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000870515610ffc576305f5e1008705965060088601955061100b565b620186a0870596506005860195505b8687601b0b1461102657600a8705965085600101955061100b565b7b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc7b19999999999999999999999999999999999999999999999999999998888201116110ba575f600188039050808160030b036110b85760e01b6001600160e01b037b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff60ff8b901d18161795505f94506106619350505050565b505b506110d7565b865f036110d757505f935060019250610661915050565b858660030b1461118e575f821315611136576110f383836115c6565b1561111b5760405163d556b11160e01b81526004810184905260248101839052604401610297565b637ffffffe19909501600a0a82029550637fffffff9461118e565b637fffffff19869003604381131561115857505f945084935061066192505050565b80600a0a888161116a5761116a612390565b059750875f0361118457505f945084935061066192505050565b50637fffffff1995505b81861361119e57600193506111b7565b818603600a0a83816111b2576111b2612390565b071593505b5050506001600160e01b03841660e084901b1791509250929050565b5f805f83516020850186885af1949350505050565b6040513d5f823e3d81fd5b60605f825167ffffffffffffffff811115611210576112106119c5565b604051908082528060200260200182016040528015611239578160200160208202803683370190505b5090505f835167ffffffffffffffff811115611257576112576119c5565b604051908082528060200260200182016040528015611280578160200160208202803683370190505b5090505f80855111611292575f611298565b84516002015b86516001010190505f8167ffffffffffffffff8111156112ba576112ba6119c5565b6040519080825280602002602001820160405280156112ed57816020015b60608152602001906001900390816112d85790505b5090505f611311604080516002815233602082015230818301526060810190915290565b82828151811061132357611323611e38565b60200260200101819052505f5b885181101561138057818060010192505088818151811061135357611353611e38565b602002602001015183838151811061136d5761136d611e38565b6020908102919091010152600101611330565b508651156115bb578080600101915050848282815181106113a3576113a3611e38565b60200260200101819052508080600101915050838282815181106113c9576113c9611e38565b60200260200101819052505f5b87518110156115b9576114cc8882815181106113f4576113f4611e38565b60200260200101515f01516114a98a848151811061141457611414611e38565b60200260200101516020015161148a8c868151811061143557611435611e38565b60200260200101518051604091820151805160209081029181019190912083517f6ec4dff745ec96dbde88c5d41f8aa5ac13aa1664afb47b8406b44fa945a650c8815291820192909252918201526060902090565b60405161190160f01b8152600281019290925260228201526042902090565b8a84815181106114bb576114bb611e38565b6020026020010151606001516115e8565b6114ec57604051630a57f30960e31b815260048101829052602401610297565b8781815181106114fe576114fe611e38565b60200260200101515f01516001600160a01b03165f1b86828151811061152657611526611e38565b60200260200101818152505087818151811061154457611544611e38565b60200260200101516020015185828151811061156257611562611e38565b602002602001018181525050818060010192505087818151811061158857611588611e38565b6020026020010151604001518383815181106115a6576115a6611e38565b60209081029190910101526001016113d6565b505b509695505050505050565b5f6115e15f84126115d757836115db565b835f035b83611659565b9392505050565b5f836001600160a01b03163b5f03611646575f8061160685856116f7565b5090925090505f81600381111561161f5761161f6125f1565b14801561163d5750856001600160a01b0316826001600160a01b0316145b925050506115e1565b61165184848461173d565b949350505050565b5f637ffffff5821361166c57505f6100ed565b637ffffffe19820160438113156116875750508115156100ed565b5f81126116c75780600a0a7b80000000000000000000000000000000000000000000000000000001816116bc576116bc612390565b0484119150506100ed565b805f03600a0a7b800000000000000000000000000000000000000000000000000000020284101591505092915050565b5f805f835160410361172e576020840151604085015160608601515f1a611720888285856117a2565b955095509550505050610f83565b505081515f9150600290610f83565b805160408051630b135d3f60e11b8082526004820186905260248201929092525f92906020820185604483015e5f82606483010152601f820160051c60051b915060205f60648401838a5afa9050825f5114601f3d1116811693505050509392505050565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411156117db57505f91506003905082611860565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa15801561182c573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b03811661185757505f925060019150829050611860565b92505f91508190505b9450945094915050565b5f6020828403121561187a575f80fd5b81356001600160e01b0319811681146115e1575f80fd5b6001600160a01b0381168114610222575f80fd5b5f805f805f8060a087890312156118ba575f80fd5b86356118c581611891565b955060208701356118d581611891565b94506040870135935060608701359250608087013567ffffffffffffffff808211156118ff575f80fd5b818901915089601f830112611912575f80fd5b813581811115611920575f80fd5b8a6020828501011115611931575f80fd5b6020830194508093505050509295509295509295565b5f805f60608486031215611959575f80fd5b833561196481611891565b9250602084013567ffffffffffffffff80821115611980575f80fd5b9085019060c08288031215611993575f80fd5b909250604085013590808211156119a8575f80fd5b508401604081870312156119ba575f80fd5b809150509250925092565b634e487b7160e01b5f52604160045260245ffd5b6040516080810167ffffffffffffffff811182821017156119fc576119fc6119c5565b60405290565b6040805190810167ffffffffffffffff811182821017156119fc576119fc6119c5565b6040516060810167ffffffffffffffff811182821017156119fc576119fc6119c5565b604051601f8201601f1916810167ffffffffffffffff81118282101715611a7157611a716119c5565b604052919050565b5f82601f830112611a88575f80fd5b813567ffffffffffffffff811115611aa257611aa26119c5565b611ab5601f8201601f1916602001611a48565b818152846020838601011115611ac9575f80fd5b816020850160208301375f918101602001919091529392505050565b5f60208284031215611af5575f80fd5b813567ffffffffffffffff811115611b0b575f80fd5b61165184828501611a79565b5f60018201611b3457634e487b7160e01b5f52601160045260245ffd5b5060010190565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f6001600160a01b038089168352876020840152808716604084015285606084015280851660808401525060c060a0830152611ba860c0830184611b3b565b98975050505050505050565b5f60208284031215611bc4575f80fd5b5051919050565b5f67ffffffffffffffff821115611be457611be46119c5565b5060051b60200190565b5f82601f830112611bfd575f80fd5b81356020611c12611c0d83611bcb565b611a48565b82815260059290921b84018101918181019086841115611c30575f80fd5b8286015b848110156115bb57803567ffffffffffffffff80821115611c53575f80fd5b908801906080828b03601f19011215611c6a575f80fd5b611c726119d9565b86830135611c7f81611891565b815260408381013588830152606084013583811115611c9c575f80fd5b8401603f81018d13611cac575f80fd5b88810135611cbc611c0d82611bcb565b81815260059190911b82018301908a8101908f831115611cda575f80fd5b928401925b82841015611cf85783358252928b0192908b0190611cdf565b80858701525050505050608083013582811115611d13575f80fd5b611d218c8983870101611a79565b60608301525085525050918301918301611c34565b5f60408236031215611d46575f80fd5b611d4e611a02565b823567ffffffffffffffff80821115611d65575f80fd5b818501915060608236031215611d79575f80fd5b611d81611a25565b8235611d8c81611891565b81526020830135611d9c81611891565b6020820152604083013582811115611db2575f80fd5b611dbe36828601611a79565b60408301525083526020850135915080821115611dd9575f80fd5b50611de636828601611bee565b60208301525092915050565b5f808335601e19843603018112611e07575f80fd5b83018035915067ffffffffffffffff821115611e21575f80fd5b6020019150600581901b3603821315610661575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235607e19833603018112611e60575f80fd5b9190910192915050565b5f8235609e19833603018112611e60575f80fd5b5f808335601e19843603018112611e93575f80fd5b83018035915067ffffffffffffffff821115611ead575f80fd5b6020019150600681901b3603821315610661575f80fd5b5f60208284031215611ed4575f80fd5b81356115e181611891565b5f808335601e19843603018112611ef4575f80fd5b830160208101925035905067ffffffffffffffff811115611f13575f80fd5b8060051b3603821315610661575f80fd5b5f808335601e19843603018112611f39575f80fd5b830160208101925035905067ffffffffffffffff811115611f58575f80fd5b803603821315610661575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f8135611f9a81611891565b6001600160a01b039081168452602083013590611fb682611891565b166020840152611fc96040830183611f24565b60606040860152611fde606086018284611f66565b95945050505050565b5f808335601e19843603018112611ffc575f80fd5b830160208101925035905067ffffffffffffffff81111561201b575f80fd5b8060061b3603821315610661575f80fd5b8183525f60208085019450825f5b8581101561207257813561204d81611891565b6001600160a01b0316875281830135838801526040968701969091019060010161203a565b509495945050505050565b5f8235607e19833603018112612091575f80fd5b90910192915050565b8183526020808401935f91600585811b8301820185855b8881101561217e57858303601f19018a526120cc828961207d565b608081356120d981611891565b6001600160a01b03168552818701358786015260406120fa81840184611edf565b8383890152808489015260a093507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811115612134575f80fd5b881b9150818188850137508501606061214f84820185611f24565b94508388840301828901526121678484018683611f66565b9e8a019e97505050938701935050506001016120b1565b509098975050505050505050565b5f602080835260e0830184358285015281850135604085015260606040860135606086015260608601358015158082146121c4575f80fd5b60809150806080880152506121dc6080880188611edf565b60c060a08901529384905261010093848801600582901b89018601835f5b84811015612315578b830360ff19018452612215828761207d565b8035609e19823603018112612228575f80fd5b8885528101803561223881611891565b6001600160a01b0316858a0152808c013536829003605e1901811261225b575f80fd5b60a0808701526122716101208701838301611f8e565b90506122806040830183611fe7565b607f19808985030160c08a015261229884838561202c565b93506122a68e860186611fe7565b93509150808985030160e08a0152506122c083838361202c565b92505050898201358c8701528c8301358d870152604083013560408701526122ea8b840184611edf565b935091508581038b87015261230081848461209a565b968d019695505050918a0191506001016121fa565b505061232460a08c018c611f24565b8b8303601f190160c08d01529850965061233f818989611f66565b9b9a5050505050505050505050565b5f806040838503121561235f575f80fd5b505080516020909101519092909150565b5f60208284031215612380575f80fd5b815160ff811681146115e1575f80fd5b634e487b7160e01b5f52601260045260245ffd5b5f815180845260208085019450602084015f5b83811015612072578151875295820195908201906001016123b7565b5f8282518085526020808601955060208260051b840101602086015f5b8481101561241e57601f1986840301895261240c8383516123a4565b988401989250908301906001016123f0565b5090979650505050505050565b602081526001600160a01b038251166020820152602082015160408201525f604083015160e06060840152612464610100840182611b3b565b9050606084015160808401526080840151601f19808584030160a086015261248c83836123d3565b925060a08601519150808584030160c08601526124a983836123a4565b925060c08601519150808584030160e086015250611fde82826123a4565b5f82601f8301126124d6575f80fd5b815160206124e6611c0d83611bcb565b8083825260208201915060208460051b870101935086841115612507575f80fd5b602086015b848110156115bb578051835291830191830161250c565b5f8060408385031215612534575f80fd5b825167ffffffffffffffff8082111561254b575f80fd5b818501915085601f83011261255e575f80fd5b8151602061256e611c0d83611bcb565b82815260059290921b8401810191818101908984111561258c575f80fd5b948201945b838610156125aa57855182529482019490820190612591565b918801519196509093505050808211156125c2575f80fd5b506125cf858286016124c7565b9150509250929050565b828152604060208201525f61165160408301846123a4565b634e487b7160e01b5f52602160045260245ffd"; + hex"6080604052348015600e575f80fd5b5060017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055612605806100405f395ff3fe608060405260043610610034575f3560e01c806301ffc9a71461003d578063691f9ed714610070578063ea37cc511461008f57005b3661003b57005b005b348015610048575f80fd5b5061005c61005736600461186a565b6100a2565b604051901515815260200160405180910390f35b34801561007b575f80fd5b5061003b61008a3660046118a5565b6100f3565b61003b61009d366004611947565b61020e565b5f6001600160e01b0319821663691f9ed760e01b14806100d257506001600160e01b0319821663ea37cc5160e01b145b806100ed57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6101018686868686866104d0565b736e2d0e71d900474b262e545bc4c98b71ab368d2161012b6001600160a01b038816825f1961053d565b5f61013883850185611ae5565b90505f61014d876101488b6105b7565b61063b565b5090505f8061015f886101488c6105b7565b9150915080610176578161017281611b17565b9250505b604051632646478b60e01b81526001600160a01b03861690632646478b906101ac908e9087908f90889030908c90600401611b69565b6020604051808303815f875af11580156101c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101ec9190611bb4565b506102016001600160a01b038c16865f61053d565b5050505050505050505050565b610216610668565b61022561022282611d36565b50565b6102326080830183611df2565b90505f0361025357604051639c95219f60e01b815260040160405180910390fd5b6001600160a01b03831673531167691b4f37f0266e226d03412c77fb2977ce146102a05760405163516e822d60e01b81526001600160a01b03841660048201526024015b60405180910390fd5b5f6102ae6080840184611df2565b5f8181106102be576102be611e38565b90506020028101906102d09190611e4c565b6102da9080611e6a565b6102e8906040810190611e7e565b6102f56080860186611df2565b5f81811061030557610305611e38565b90506020028101906103179190611e4c565b6020013581811061032a5761032a611e38565b6103409260206040909202019081019150611ec4565b90505f6103506080850185611df2565b5f81811061036057610360611e38565b90506020028101906103729190611e4c565b61037c9080611e6a565b61038a906060810190611e7e565b6103976080870187611df2565b5f8181106103a7576103a7611e38565b90506020028101906103b99190611e4c565b604001358181106103cc576103cc611e38565b6103e29260206040909202019081019150611ec4565b90506103f96001600160a01b038316865f1961053d565b60405163b0460f0760e01b81526001600160a01b0386169063b0460f079061042590879060040161218c565b60408051808303815f875af1158015610440573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610464919061234e565b5061047b90506001600160a01b038316865f61053d565b6104a061048784611d36565b83610491856105b7565b8461049b866105b7565b610696565b50506104cb60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054600214801561051557503373531167691b4f37f0266e226d03412c77fb2977ce14155b156105355760405163f6688adf60e01b8152336004820152602401610297565b505050505050565b6105498383835f610935565b6104cb5761055a83835f6001610935565b61058257604051635274afe760e01b81526001600160a01b0384166004820152602401610297565b61058f8383836001610935565b6104cb57604051635274afe760e01b81526001600160a01b0384166004820152602401610297565b5f6105c0610997565b6040516354636d2b60e01b81526001600160a01b038316600482015273200e12d10bb0c5e4a17e7018f0f1161919bb9389906354636d2b906024016020604051808303815f875af1158015610617573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100ed9190612370565b5f806001600160e01b038416601b0b60e085901d61065a828287610a24565b9350935050505b9250929050565b610670610b96565b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b6040805160018082528183019092525f91816020015b60608152602001906001900390816106ac575050604080516003808252608082019092529192505f919060208201606080368337019050506040516370a0823160e01b81523060048201529091505f906001600160a01b038816906370a0823190602401602060405180830381865afa15801561072b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061074f9190611bb4565b9050801561076b5761076b6001600160a01b0388163383610bd8565b5f6107768288610be5565b50905080835f8151811061078c5761078c611e38565b602090810291909101015250506040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa1580156107dd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108019190611bb4565b9050801561081d5761081d6001600160a01b0386163383610bd8565b5f6108288286610be5565b509050808360018151811061083f5761083f611e38565b602090810291909101015250479050801561085e5761085e3382610c25565b5f61086a826012610be5565b509050808360028151811061088157610881611e38565b602002602001018181525050505080825f815181106108a2576108a2611e38565b60209081029190910101526040805160018082528183019092525f91816020015b6040805160a0810182525f91810182815260608083019390935260808201839052815260208101919091528152602001906001900390816108c357905050905087815f8151811061091657610916611e38565b602002602001018190525061092b8382610c9c565b5050505050505050565b60405163095ea7b360e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f5114831661098b57838315161561097f573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b73200e12d10bb0c5e4a17e7018f0f1161919bb93893b15806109ee575073200e12d10bb0c5e4a17e7018f0f1161919bb93893f7f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d4114155b15610a22576040516373e6d7b360e01b815273200e12d10bb0c5e4a17e7018f0f1161919bb93896004820152602401610297565b565b5f805f851215610a5157604051634a7d166b60e01b81526004810186905260248101859052604401610297565b845f03610a6357505f90506001610b8e565b8460ff8416850185811215610a9e5760405163c849483b60e01b8152600481018890526024810187905260ff86166044820152606401610297565b5f805f831215610aea57604c19831215610ac1575f809550955050505050610b8e565b825f03600a0a9150818481610ad857610ad8612390565b0495505084029091149150610b8e9050565b5f831315610b8357604d831315610b275760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610297565b82600a0a9150815f1981610b3d57610b3d612390565b04841115610b715760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610297565b5091909102925060019150610b8e9050565b509193506001925050505b935093915050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054600203610a2257604051633ee5aeb560e01b815260040160405180910390fd5b61058f8383836001610ee4565b5f805f805f610bf48787610f2e565b9250925092505f80610c068585610f8a565b9150915081838015610c155750815b9650965050505050509250929050565b80471015610c4f5760405163cf47918160e01b815247600482015260248101829052604401610297565b610c68828260405180602001604052805f8152506111d3565b15610c71575050565b3d15610c8357610c7f6111e8565b5050565b60405163d6bda27560e01b815260040160405180910390fd5b60408051600480825260a082019092525f91816020015b6060815260200190600190039081610cb35790505090505f5b8351811015610d1457838181518110610ce757610ce7611e38565b6020026020010151828281518110610d0157610d01611e38565b6020908102919091010152600101610ccc565b50335f8181523060209081526040808320815160a0810183528083018581526060808301879052608083018190529082528185015282518581529384018581528484019093529093909291905b8751811015610ed957878181518110610d7c57610d7c611e38565b602002602001015193505f845f015160400151511115610ed1575f845f01515f01516001600160a01b031663d04dfe236040518060e00160405280885f0151602001516001600160a01b03168152602001898152602001885f01516040015181526020015f8152602001610df48c8a602001516111f3565b8152602001878152602001868152506040518263ffffffff1660e01b8152600401610e1f919061242b565b5f60405180830381865afa158015610e39573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610e609190810190612523565b9150505f81511115610ecf5784516020015160405163012c676d60e21b81526001600160a01b03909116906304b19db490610ea1908a9085906004016125d9565b5f604051808303815f87803b158015610eb8575f80fd5b505af1158015610eca573d5f803e3d5ffd5b505050505b505b600101610d61565b505050505050505050565b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f5114831661098b57838315161561097f573d5f823e3d81fd5b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff861115610f7957600a860460018201600a88065f1493509350935050610f83565b8593509150600190505b9250925092565b5f808383601b82900b8214806110c0577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e100000000000000000087051561100b577f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000870515610ffc576305f5e1008705965060088601955061100b565b620186a0870596506005860195505b8687601b0b1461102657600a8705965085600101955061100b565b7b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc7b19999999999999999999999999999999999999999999999999999998888201116110ba575f600188039050808160030b036110b85760e01b6001600160e01b037b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff60ff8b901d18161795505f94506106619350505050565b505b506110d7565b865f036110d757505f935060019250610661915050565b858660030b1461118e575f821315611136576110f383836115c6565b1561111b5760405163d556b11160e01b81526004810184905260248101839052604401610297565b637ffffffe19909501600a0a82029550637fffffff9461118e565b637fffffff19869003604381131561115857505f945084935061066192505050565b80600a0a888161116a5761116a612390565b059750875f0361118457505f945084935061066192505050565b50637fffffff1995505b81861361119e57600193506111b7565b818603600a0a83816111b2576111b2612390565b071593505b5050506001600160e01b03841660e084901b1791509250929050565b5f805f83516020850186885af1949350505050565b6040513d5f823e3d81fd5b60605f825167ffffffffffffffff811115611210576112106119c5565b604051908082528060200260200182016040528015611239578160200160208202803683370190505b5090505f835167ffffffffffffffff811115611257576112576119c5565b604051908082528060200260200182016040528015611280578160200160208202803683370190505b5090505f80855111611292575f611298565b84516002015b86516001010190505f8167ffffffffffffffff8111156112ba576112ba6119c5565b6040519080825280602002602001820160405280156112ed57816020015b60608152602001906001900390816112d85790505b5090505f611311604080516002815233602082015230818301526060810190915290565b82828151811061132357611323611e38565b60200260200101819052505f5b885181101561138057818060010192505088818151811061135357611353611e38565b602002602001015183838151811061136d5761136d611e38565b6020908102919091010152600101611330565b508651156115bb578080600101915050848282815181106113a3576113a3611e38565b60200260200101819052508080600101915050838282815181106113c9576113c9611e38565b60200260200101819052505f5b87518110156115b9576114cc8882815181106113f4576113f4611e38565b60200260200101515f01516114a98a848151811061141457611414611e38565b60200260200101516020015161148a8c868151811061143557611435611e38565b60200260200101518051604091820151805160209081029181019190912083517f6ec4dff745ec96dbde88c5d41f8aa5ac13aa1664afb47b8406b44fa945a650c8815291820192909252918201526060902090565b60405161190160f01b8152600281019290925260228201526042902090565b8a84815181106114bb576114bb611e38565b6020026020010151606001516115e8565b6114ec57604051630a57f30960e31b815260048101829052602401610297565b8781815181106114fe576114fe611e38565b60200260200101515f01516001600160a01b03165f1b86828151811061152657611526611e38565b60200260200101818152505087818151811061154457611544611e38565b60200260200101516020015185828151811061156257611562611e38565b602002602001018181525050818060010192505087818151811061158857611588611e38565b6020026020010151604001518383815181106115a6576115a6611e38565b60209081029190910101526001016113d6565b505b509695505050505050565b5f6115e15f84126115d757836115db565b835f035b83611659565b9392505050565b5f836001600160a01b03163b5f03611646575f8061160685856116f7565b5090925090505f81600381111561161f5761161f6125f1565b14801561163d5750856001600160a01b0316826001600160a01b0316145b925050506115e1565b61165184848461173d565b949350505050565b5f637ffffff5821361166c57505f6100ed565b637ffffffe19820160438113156116875750508115156100ed565b5f81126116c75780600a0a7b80000000000000000000000000000000000000000000000000000001816116bc576116bc612390565b0484119150506100ed565b805f03600a0a7b800000000000000000000000000000000000000000000000000000020284101591505092915050565b5f805f835160410361172e576020840151604085015160608601515f1a611720888285856117a2565b955095509550505050610f83565b505081515f9150600290610f83565b805160408051630b135d3f60e11b8082526004820186905260248201929092525f92906020820185604483015e5f82606483010152601f820160051c60051b915060205f60648401838a5afa9050825f5114601f3d1116811693505050509392505050565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411156117db57505f91506003905082611860565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa15801561182c573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b03811661185757505f925060019150829050611860565b92505f91508190505b9450945094915050565b5f6020828403121561187a575f80fd5b81356001600160e01b0319811681146115e1575f80fd5b6001600160a01b0381168114610222575f80fd5b5f805f805f8060a087890312156118ba575f80fd5b86356118c581611891565b955060208701356118d581611891565b94506040870135935060608701359250608087013567ffffffffffffffff808211156118ff575f80fd5b818901915089601f830112611912575f80fd5b813581811115611920575f80fd5b8a6020828501011115611931575f80fd5b6020830194508093505050509295509295509295565b5f805f60608486031215611959575f80fd5b833561196481611891565b9250602084013567ffffffffffffffff80821115611980575f80fd5b9085019060c08288031215611993575f80fd5b909250604085013590808211156119a8575f80fd5b508401604081870312156119ba575f80fd5b809150509250925092565b634e487b7160e01b5f52604160045260245ffd5b6040516080810167ffffffffffffffff811182821017156119fc576119fc6119c5565b60405290565b6040805190810167ffffffffffffffff811182821017156119fc576119fc6119c5565b6040516060810167ffffffffffffffff811182821017156119fc576119fc6119c5565b604051601f8201601f1916810167ffffffffffffffff81118282101715611a7157611a716119c5565b604052919050565b5f82601f830112611a88575f80fd5b813567ffffffffffffffff811115611aa257611aa26119c5565b611ab5601f8201601f1916602001611a48565b818152846020838601011115611ac9575f80fd5b816020850160208301375f918101602001919091529392505050565b5f60208284031215611af5575f80fd5b813567ffffffffffffffff811115611b0b575f80fd5b61165184828501611a79565b5f60018201611b3457634e487b7160e01b5f52601160045260245ffd5b5060010190565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f6001600160a01b038089168352876020840152808716604084015285606084015280851660808401525060c060a0830152611ba860c0830184611b3b565b98975050505050505050565b5f60208284031215611bc4575f80fd5b5051919050565b5f67ffffffffffffffff821115611be457611be46119c5565b5060051b60200190565b5f82601f830112611bfd575f80fd5b81356020611c12611c0d83611bcb565b611a48565b82815260059290921b84018101918181019086841115611c30575f80fd5b8286015b848110156115bb57803567ffffffffffffffff80821115611c53575f80fd5b908801906080828b03601f19011215611c6a575f80fd5b611c726119d9565b86830135611c7f81611891565b815260408381013588830152606084013583811115611c9c575f80fd5b8401603f81018d13611cac575f80fd5b88810135611cbc611c0d82611bcb565b81815260059190911b82018301908a8101908f831115611cda575f80fd5b928401925b82841015611cf85783358252928b0192908b0190611cdf565b80858701525050505050608083013582811115611d13575f80fd5b611d218c8983870101611a79565b60608301525085525050918301918301611c34565b5f60408236031215611d46575f80fd5b611d4e611a02565b823567ffffffffffffffff80821115611d65575f80fd5b818501915060608236031215611d79575f80fd5b611d81611a25565b8235611d8c81611891565b81526020830135611d9c81611891565b6020820152604083013582811115611db2575f80fd5b611dbe36828601611a79565b60408301525083526020850135915080821115611dd9575f80fd5b50611de636828601611bee565b60208301525092915050565b5f808335601e19843603018112611e07575f80fd5b83018035915067ffffffffffffffff821115611e21575f80fd5b6020019150600581901b3603821315610661575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235607e19833603018112611e60575f80fd5b9190910192915050565b5f8235609e19833603018112611e60575f80fd5b5f808335601e19843603018112611e93575f80fd5b83018035915067ffffffffffffffff821115611ead575f80fd5b6020019150600681901b3603821315610661575f80fd5b5f60208284031215611ed4575f80fd5b81356115e181611891565b5f808335601e19843603018112611ef4575f80fd5b830160208101925035905067ffffffffffffffff811115611f13575f80fd5b8060051b3603821315610661575f80fd5b5f808335601e19843603018112611f39575f80fd5b830160208101925035905067ffffffffffffffff811115611f58575f80fd5b803603821315610661575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f8135611f9a81611891565b6001600160a01b039081168452602083013590611fb682611891565b166020840152611fc96040830183611f24565b60606040860152611fde606086018284611f66565b95945050505050565b5f808335601e19843603018112611ffc575f80fd5b830160208101925035905067ffffffffffffffff81111561201b575f80fd5b8060061b3603821315610661575f80fd5b8183525f60208085019450825f5b8581101561207257813561204d81611891565b6001600160a01b0316875281830135838801526040968701969091019060010161203a565b509495945050505050565b5f8235607e19833603018112612091575f80fd5b90910192915050565b8183526020808401935f91600585811b8301820185855b8881101561217e57858303601f19018a526120cc828961207d565b608081356120d981611891565b6001600160a01b03168552818701358786015260406120fa81840184611edf565b8383890152808489015260a093507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811115612134575f80fd5b881b9150818188850137508501606061214f84820185611f24565b94508388840301828901526121678484018683611f66565b9e8a019e97505050938701935050506001016120b1565b509098975050505050505050565b5f602080835260e0830184358285015281850135604085015260606040860135606086015260608601358015158082146121c4575f80fd5b60809150806080880152506121dc6080880188611edf565b60c060a08901529384905261010093848801600582901b89018601835f5b84811015612315578b830360ff19018452612215828761207d565b8035609e19823603018112612228575f80fd5b8885528101803561223881611891565b6001600160a01b0316858a0152808c013536829003605e1901811261225b575f80fd5b60a0808701526122716101208701838301611f8e565b90506122806040830183611fe7565b607f19808985030160c08a015261229884838561202c565b93506122a68e860186611fe7565b93509150808985030160e08a0152506122c083838361202c565b92505050898201358c8701528c8301358d870152604083013560408701526122ea8b840184611edf565b935091508581038b87015261230081848461209a565b968d019695505050918a0191506001016121fa565b505061232460a08c018c611f24565b8b8303601f190160c08d01529850965061233f818989611f66565b9b9a5050505050505050505050565b5f806040838503121561235f575f80fd5b505080516020909101519092909150565b5f60208284031215612380575f80fd5b815160ff811681146115e1575f80fd5b634e487b7160e01b5f52601260045260245ffd5b5f815180845260208085019450602084015f5b83811015612072578151875295820195908201906001016123b7565b5f8282518085526020808601955060208260051b840101602086015f5b8481101561241e57601f1986840301895261240c8383516123a4565b988401989250908301906001016123f0565b5090979650505050505050565b602081526001600160a01b038251166020820152602082015160408201525f604083015160e06060840152612464610100840182611b3b565b9050606084015160808401526080840151601f19808584030160a086015261248c83836123d3565b925060a08601519150808584030160c08601526124a983836123a4565b925060c08601519150808584030160e086015250611fde82826123a4565b5f82601f8301126124d6575f80fd5b815160206124e6611c0d83611bcb565b8083825260208201915060208460051b870101935086841115612507575f80fd5b602086015b848110156115bb578051835291830191830161250c565b5f8060408385031215612534575f80fd5b825167ffffffffffffffff8082111561254b575f80fd5b818501915085601f83011261255e575f80fd5b8151602061256e611c0d83611bcb565b82815260059290921b8401810191818101908984111561258c575f80fd5b948201945b838610156125aa57855182529482019490820190612591565b918801519196509093505050808211156125c2575f80fd5b506125cf858286016124c7565b9150509250929050565b828152604060208201525f61165160408301846123a4565b634e487b7160e01b5f52602160045260245ffd"; /// @dev The runtime bytecode of the contract. bytes constant RUNTIME_CODE = - hex"608060405260043610610034575f3560e01c806301ffc9a71461003d578063691f9ed714610070578063ea37cc511461008f57005b3661003b57005b005b348015610048575f80fd5b5061005c61005736600461186a565b6100a2565b604051901515815260200160405180910390f35b34801561007b575f80fd5b5061003b61008a3660046118a5565b6100f3565b61003b61009d366004611947565b61020e565b5f6001600160e01b0319821663691f9ed760e01b14806100d257506001600160e01b0319821663ea37cc5160e01b145b806100ed57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6101018686868686866104d0565b736e2d0e71d900474b262e545bc4c98b71ab368d2161012b6001600160a01b038816825f1961053d565b5f61013883850185611ae5565b90505f61014d876101488b6105b7565b61063b565b5090505f8061015f886101488c6105b7565b9150915080610176578161017281611b17565b9250505b604051632646478b60e01b81526001600160a01b03861690632646478b906101ac908e9087908f90889030908c90600401611b69565b6020604051808303815f875af11580156101c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101ec9190611bb4565b506102016001600160a01b038c16865f61053d565b5050505050505050505050565b610216610668565b61022561022282611d36565b50565b6102326080830183611df2565b90505f0361025357604051639c95219f60e01b815260040160405180910390fd5b6001600160a01b03831673f78c2c56f95e28f73f4b8b695b07ee574da5c783146102a05760405163516e822d60e01b81526001600160a01b03841660048201526024015b60405180910390fd5b5f6102ae6080840184611df2565b5f8181106102be576102be611e38565b90506020028101906102d09190611e4c565b6102da9080611e6a565b6102e8906040810190611e7e565b6102f56080860186611df2565b5f81811061030557610305611e38565b90506020028101906103179190611e4c565b6020013581811061032a5761032a611e38565b6103409260206040909202019081019150611ec4565b90505f6103506080850185611df2565b5f81811061036057610360611e38565b90506020028101906103729190611e4c565b61037c9080611e6a565b61038a906060810190611e7e565b6103976080870187611df2565b5f8181106103a7576103a7611e38565b90506020028101906103b99190611e4c565b604001358181106103cc576103cc611e38565b6103e29260206040909202019081019150611ec4565b90506103f96001600160a01b038316865f1961053d565b60405163b0460f0760e01b81526001600160a01b0386169063b0460f079061042590879060040161218c565b60408051808303815f875af1158015610440573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610464919061234e565b5061047b90506001600160a01b038316865f61053d565b6104a061048784611d36565b83610491856105b7565b8461049b866105b7565b610696565b50506104cb60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054600214801561051557503373f78c2c56f95e28f73f4b8b695b07ee574da5c78314155b156105355760405163f6688adf60e01b8152336004820152602401610297565b505050505050565b6105498383835f610935565b6104cb5761055a83835f6001610935565b61058257604051635274afe760e01b81526001600160a01b0384166004820152602401610297565b61058f8383836001610935565b6104cb57604051635274afe760e01b81526001600160a01b0384166004820152602401610297565b5f6105c0610997565b6040516354636d2b60e01b81526001600160a01b038316600482015273200e12d10bb0c5e4a17e7018f0f1161919bb9389906354636d2b906024016020604051808303815f875af1158015610617573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100ed9190612370565b5f806001600160e01b038416601b0b60e085901d61065a828287610a24565b9350935050505b9250929050565b610670610b96565b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b6040805160018082528183019092525f91816020015b60608152602001906001900390816106ac575050604080516003808252608082019092529192505f919060208201606080368337019050506040516370a0823160e01b81523060048201529091505f906001600160a01b038816906370a0823190602401602060405180830381865afa15801561072b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061074f9190611bb4565b9050801561076b5761076b6001600160a01b0388163383610bd8565b5f6107768288610be5565b50905080835f8151811061078c5761078c611e38565b602090810291909101015250506040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa1580156107dd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108019190611bb4565b9050801561081d5761081d6001600160a01b0386163383610bd8565b5f6108288286610be5565b509050808360018151811061083f5761083f611e38565b602090810291909101015250479050801561085e5761085e3382610c25565b5f61086a826012610be5565b509050808360028151811061088157610881611e38565b602002602001018181525050505080825f815181106108a2576108a2611e38565b60209081029190910101526040805160018082528183019092525f91816020015b6040805160a0810182525f91810182815260608083019390935260808201839052815260208101919091528152602001906001900390816108c357905050905087815f8151811061091657610916611e38565b602002602001018190525061092b8382610c9c565b5050505050505050565b60405163095ea7b360e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f5114831661098b57838315161561097f573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b73200e12d10bb0c5e4a17e7018f0f1161919bb93893b15806109ee575073200e12d10bb0c5e4a17e7018f0f1161919bb93893f7f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d4114155b15610a22576040516373e6d7b360e01b815273200e12d10bb0c5e4a17e7018f0f1161919bb93896004820152602401610297565b565b5f805f851215610a5157604051634a7d166b60e01b81526004810186905260248101859052604401610297565b845f03610a6357505f90506001610b8e565b8460ff8416850185811215610a9e5760405163c849483b60e01b8152600481018890526024810187905260ff86166044820152606401610297565b5f805f831215610aea57604c19831215610ac1575f809550955050505050610b8e565b825f03600a0a9150818481610ad857610ad8612390565b0495505084029091149150610b8e9050565b5f831315610b8357604d831315610b275760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610297565b82600a0a9150815f1981610b3d57610b3d612390565b04841115610b715760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610297565b5091909102925060019150610b8e9050565b509193506001925050505b935093915050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054600203610a2257604051633ee5aeb560e01b815260040160405180910390fd5b61058f8383836001610ee4565b5f805f805f610bf48787610f2e565b9250925092505f80610c068585610f8a565b9150915081838015610c155750815b9650965050505050509250929050565b80471015610c4f5760405163cf47918160e01b815247600482015260248101829052604401610297565b610c68828260405180602001604052805f8152506111d3565b15610c71575050565b3d15610c8357610c7f6111e8565b5050565b60405163d6bda27560e01b815260040160405180910390fd5b60408051600480825260a082019092525f91816020015b6060815260200190600190039081610cb35790505090505f5b8351811015610d1457838181518110610ce757610ce7611e38565b6020026020010151828281518110610d0157610d01611e38565b6020908102919091010152600101610ccc565b50335f8181523060209081526040808320815160a0810183528083018581526060808301879052608083018190529082528185015282518581529384018581528484019093529093909291905b8751811015610ed957878181518110610d7c57610d7c611e38565b602002602001015193505f845f015160400151511115610ed1575f845f01515f01516001600160a01b031663d04dfe236040518060e00160405280885f0151602001516001600160a01b03168152602001898152602001885f01516040015181526020015f8152602001610df48c8a602001516111f3565b8152602001878152602001868152506040518263ffffffff1660e01b8152600401610e1f919061242b565b5f60405180830381865afa158015610e39573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610e609190810190612523565b9150505f81511115610ecf5784516020015160405163012c676d60e21b81526001600160a01b03909116906304b19db490610ea1908a9085906004016125d9565b5f604051808303815f87803b158015610eb8575f80fd5b505af1158015610eca573d5f803e3d5ffd5b505050505b505b600101610d61565b505050505050505050565b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f5114831661098b57838315161561097f573d5f823e3d81fd5b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff861115610f7957600a860460018201600a88065f1493509350935050610f83565b8593509150600190505b9250925092565b5f808383601b82900b8214806110c0577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e100000000000000000087051561100b577f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000870515610ffc576305f5e1008705965060088601955061100b565b620186a0870596506005860195505b8687601b0b1461102657600a8705965085600101955061100b565b7b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc7b19999999999999999999999999999999999999999999999999999998888201116110ba575f600188039050808160030b036110b85760e01b6001600160e01b037b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff60ff8b901d18161795505f94506106619350505050565b505b506110d7565b865f036110d757505f935060019250610661915050565b858660030b1461118e575f821315611136576110f383836115c6565b1561111b5760405163d556b11160e01b81526004810184905260248101839052604401610297565b637ffffffe19909501600a0a82029550637fffffff9461118e565b637fffffff19869003604381131561115857505f945084935061066192505050565b80600a0a888161116a5761116a612390565b059750875f0361118457505f945084935061066192505050565b50637fffffff1995505b81861361119e57600193506111b7565b818603600a0a83816111b2576111b2612390565b071593505b5050506001600160e01b03841660e084901b1791509250929050565b5f805f83516020850186885af1949350505050565b6040513d5f823e3d81fd5b60605f825167ffffffffffffffff811115611210576112106119c5565b604051908082528060200260200182016040528015611239578160200160208202803683370190505b5090505f835167ffffffffffffffff811115611257576112576119c5565b604051908082528060200260200182016040528015611280578160200160208202803683370190505b5090505f80855111611292575f611298565b84516002015b86516001010190505f8167ffffffffffffffff8111156112ba576112ba6119c5565b6040519080825280602002602001820160405280156112ed57816020015b60608152602001906001900390816112d85790505b5090505f611311604080516002815233602082015230818301526060810190915290565b82828151811061132357611323611e38565b60200260200101819052505f5b885181101561138057818060010192505088818151811061135357611353611e38565b602002602001015183838151811061136d5761136d611e38565b6020908102919091010152600101611330565b508651156115bb578080600101915050848282815181106113a3576113a3611e38565b60200260200101819052508080600101915050838282815181106113c9576113c9611e38565b60200260200101819052505f5b87518110156115b9576114cc8882815181106113f4576113f4611e38565b60200260200101515f01516114a98a848151811061141457611414611e38565b60200260200101516020015161148a8c868151811061143557611435611e38565b60200260200101518051604091820151805160209081029181019190912083517f6ec4dff745ec96dbde88c5d41f8aa5ac13aa1664afb47b8406b44fa945a650c8815291820192909252918201526060902090565b60405161190160f01b8152600281019290925260228201526042902090565b8a84815181106114bb576114bb611e38565b6020026020010151606001516115e8565b6114ec57604051630a57f30960e31b815260048101829052602401610297565b8781815181106114fe576114fe611e38565b60200260200101515f01516001600160a01b03165f1b86828151811061152657611526611e38565b60200260200101818152505087818151811061154457611544611e38565b60200260200101516020015185828151811061156257611562611e38565b602002602001018181525050818060010192505087818151811061158857611588611e38565b6020026020010151604001518383815181106115a6576115a6611e38565b60209081029190910101526001016113d6565b505b509695505050505050565b5f6115e15f84126115d757836115db565b835f035b83611659565b9392505050565b5f836001600160a01b03163b5f03611646575f8061160685856116f7565b5090925090505f81600381111561161f5761161f6125f1565b14801561163d5750856001600160a01b0316826001600160a01b0316145b925050506115e1565b61165184848461173d565b949350505050565b5f637ffffff5821361166c57505f6100ed565b637ffffffe19820160438113156116875750508115156100ed565b5f81126116c75780600a0a7b80000000000000000000000000000000000000000000000000000001816116bc576116bc612390565b0484119150506100ed565b805f03600a0a7b800000000000000000000000000000000000000000000000000000020284101591505092915050565b5f805f835160410361172e576020840151604085015160608601515f1a611720888285856117a2565b955095509550505050610f83565b505081515f9150600290610f83565b805160408051630b135d3f60e11b8082526004820186905260248201929092525f92906020820185604483015e5f82606483010152601f820160051c60051b915060205f60648401838a5afa9050825f5114601f3d1116811693505050509392505050565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411156117db57505f91506003905082611860565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa15801561182c573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b03811661185757505f925060019150829050611860565b92505f91508190505b9450945094915050565b5f6020828403121561187a575f80fd5b81356001600160e01b0319811681146115e1575f80fd5b6001600160a01b0381168114610222575f80fd5b5f805f805f8060a087890312156118ba575f80fd5b86356118c581611891565b955060208701356118d581611891565b94506040870135935060608701359250608087013567ffffffffffffffff808211156118ff575f80fd5b818901915089601f830112611912575f80fd5b813581811115611920575f80fd5b8a6020828501011115611931575f80fd5b6020830194508093505050509295509295509295565b5f805f60608486031215611959575f80fd5b833561196481611891565b9250602084013567ffffffffffffffff80821115611980575f80fd5b9085019060c08288031215611993575f80fd5b909250604085013590808211156119a8575f80fd5b508401604081870312156119ba575f80fd5b809150509250925092565b634e487b7160e01b5f52604160045260245ffd5b6040516080810167ffffffffffffffff811182821017156119fc576119fc6119c5565b60405290565b6040805190810167ffffffffffffffff811182821017156119fc576119fc6119c5565b6040516060810167ffffffffffffffff811182821017156119fc576119fc6119c5565b604051601f8201601f1916810167ffffffffffffffff81118282101715611a7157611a716119c5565b604052919050565b5f82601f830112611a88575f80fd5b813567ffffffffffffffff811115611aa257611aa26119c5565b611ab5601f8201601f1916602001611a48565b818152846020838601011115611ac9575f80fd5b816020850160208301375f918101602001919091529392505050565b5f60208284031215611af5575f80fd5b813567ffffffffffffffff811115611b0b575f80fd5b61165184828501611a79565b5f60018201611b3457634e487b7160e01b5f52601160045260245ffd5b5060010190565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f6001600160a01b038089168352876020840152808716604084015285606084015280851660808401525060c060a0830152611ba860c0830184611b3b565b98975050505050505050565b5f60208284031215611bc4575f80fd5b5051919050565b5f67ffffffffffffffff821115611be457611be46119c5565b5060051b60200190565b5f82601f830112611bfd575f80fd5b81356020611c12611c0d83611bcb565b611a48565b82815260059290921b84018101918181019086841115611c30575f80fd5b8286015b848110156115bb57803567ffffffffffffffff80821115611c53575f80fd5b908801906080828b03601f19011215611c6a575f80fd5b611c726119d9565b86830135611c7f81611891565b815260408381013588830152606084013583811115611c9c575f80fd5b8401603f81018d13611cac575f80fd5b88810135611cbc611c0d82611bcb565b81815260059190911b82018301908a8101908f831115611cda575f80fd5b928401925b82841015611cf85783358252928b0192908b0190611cdf565b80858701525050505050608083013582811115611d13575f80fd5b611d218c8983870101611a79565b60608301525085525050918301918301611c34565b5f60408236031215611d46575f80fd5b611d4e611a02565b823567ffffffffffffffff80821115611d65575f80fd5b818501915060608236031215611d79575f80fd5b611d81611a25565b8235611d8c81611891565b81526020830135611d9c81611891565b6020820152604083013582811115611db2575f80fd5b611dbe36828601611a79565b60408301525083526020850135915080821115611dd9575f80fd5b50611de636828601611bee565b60208301525092915050565b5f808335601e19843603018112611e07575f80fd5b83018035915067ffffffffffffffff821115611e21575f80fd5b6020019150600581901b3603821315610661575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235607e19833603018112611e60575f80fd5b9190910192915050565b5f8235609e19833603018112611e60575f80fd5b5f808335601e19843603018112611e93575f80fd5b83018035915067ffffffffffffffff821115611ead575f80fd5b6020019150600681901b3603821315610661575f80fd5b5f60208284031215611ed4575f80fd5b81356115e181611891565b5f808335601e19843603018112611ef4575f80fd5b830160208101925035905067ffffffffffffffff811115611f13575f80fd5b8060051b3603821315610661575f80fd5b5f808335601e19843603018112611f39575f80fd5b830160208101925035905067ffffffffffffffff811115611f58575f80fd5b803603821315610661575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f8135611f9a81611891565b6001600160a01b039081168452602083013590611fb682611891565b166020840152611fc96040830183611f24565b60606040860152611fde606086018284611f66565b95945050505050565b5f808335601e19843603018112611ffc575f80fd5b830160208101925035905067ffffffffffffffff81111561201b575f80fd5b8060061b3603821315610661575f80fd5b8183525f60208085019450825f5b8581101561207257813561204d81611891565b6001600160a01b0316875281830135838801526040968701969091019060010161203a565b509495945050505050565b5f8235607e19833603018112612091575f80fd5b90910192915050565b8183526020808401935f91600585811b8301820185855b8881101561217e57858303601f19018a526120cc828961207d565b608081356120d981611891565b6001600160a01b03168552818701358786015260406120fa81840184611edf565b8383890152808489015260a093507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811115612134575f80fd5b881b9150818188850137508501606061214f84820185611f24565b94508388840301828901526121678484018683611f66565b9e8a019e97505050938701935050506001016120b1565b509098975050505050505050565b5f602080835260e0830184358285015281850135604085015260606040860135606086015260608601358015158082146121c4575f80fd5b60809150806080880152506121dc6080880188611edf565b60c060a08901529384905261010093848801600582901b89018601835f5b84811015612315578b830360ff19018452612215828761207d565b8035609e19823603018112612228575f80fd5b8885528101803561223881611891565b6001600160a01b0316858a0152808c013536829003605e1901811261225b575f80fd5b60a0808701526122716101208701838301611f8e565b90506122806040830183611fe7565b607f19808985030160c08a015261229884838561202c565b93506122a68e860186611fe7565b93509150808985030160e08a0152506122c083838361202c565b92505050898201358c8701528c8301358d870152604083013560408701526122ea8b840184611edf565b935091508581038b87015261230081848461209a565b968d019695505050918a0191506001016121fa565b505061232460a08c018c611f24565b8b8303601f190160c08d01529850965061233f818989611f66565b9b9a5050505050505050505050565b5f806040838503121561235f575f80fd5b505080516020909101519092909150565b5f60208284031215612380575f80fd5b815160ff811681146115e1575f80fd5b634e487b7160e01b5f52601260045260245ffd5b5f815180845260208085019450602084015f5b83811015612072578151875295820195908201906001016123b7565b5f8282518085526020808601955060208260051b840101602086015f5b8481101561241e57601f1986840301895261240c8383516123a4565b988401989250908301906001016123f0565b5090979650505050505050565b602081526001600160a01b038251166020820152602082015160408201525f604083015160e06060840152612464610100840182611b3b565b9050606084015160808401526080840151601f19808584030160a086015261248c83836123d3565b925060a08601519150808584030160c08601526124a983836123a4565b925060c08601519150808584030160e086015250611fde82826123a4565b5f82601f8301126124d6575f80fd5b815160206124e6611c0d83611bcb565b8083825260208201915060208460051b870101935086841115612507575f80fd5b602086015b848110156115bb578051835291830191830161250c565b5f8060408385031215612534575f80fd5b825167ffffffffffffffff8082111561254b575f80fd5b818501915085601f83011261255e575f80fd5b8151602061256e611c0d83611bcb565b82815260059290921b8401810191818101908984111561258c575f80fd5b948201945b838610156125aa57855182529482019490820190612591565b918801519196509093505050808211156125c2575f80fd5b506125cf858286016124c7565b9150509250929050565b828152604060208201525f61165160408301846123a4565b634e487b7160e01b5f52602160045260245ffd"; + hex"608060405260043610610034575f3560e01c806301ffc9a71461003d578063691f9ed714610070578063ea37cc511461008f57005b3661003b57005b005b348015610048575f80fd5b5061005c61005736600461186a565b6100a2565b604051901515815260200160405180910390f35b34801561007b575f80fd5b5061003b61008a3660046118a5565b6100f3565b61003b61009d366004611947565b61020e565b5f6001600160e01b0319821663691f9ed760e01b14806100d257506001600160e01b0319821663ea37cc5160e01b145b806100ed57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6101018686868686866104d0565b736e2d0e71d900474b262e545bc4c98b71ab368d2161012b6001600160a01b038816825f1961053d565b5f61013883850185611ae5565b90505f61014d876101488b6105b7565b61063b565b5090505f8061015f886101488c6105b7565b9150915080610176578161017281611b17565b9250505b604051632646478b60e01b81526001600160a01b03861690632646478b906101ac908e9087908f90889030908c90600401611b69565b6020604051808303815f875af11580156101c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101ec9190611bb4565b506102016001600160a01b038c16865f61053d565b5050505050505050505050565b610216610668565b61022561022282611d36565b50565b6102326080830183611df2565b90505f0361025357604051639c95219f60e01b815260040160405180910390fd5b6001600160a01b03831673531167691b4f37f0266e226d03412c77fb2977ce146102a05760405163516e822d60e01b81526001600160a01b03841660048201526024015b60405180910390fd5b5f6102ae6080840184611df2565b5f8181106102be576102be611e38565b90506020028101906102d09190611e4c565b6102da9080611e6a565b6102e8906040810190611e7e565b6102f56080860186611df2565b5f81811061030557610305611e38565b90506020028101906103179190611e4c565b6020013581811061032a5761032a611e38565b6103409260206040909202019081019150611ec4565b90505f6103506080850185611df2565b5f81811061036057610360611e38565b90506020028101906103729190611e4c565b61037c9080611e6a565b61038a906060810190611e7e565b6103976080870187611df2565b5f8181106103a7576103a7611e38565b90506020028101906103b99190611e4c565b604001358181106103cc576103cc611e38565b6103e29260206040909202019081019150611ec4565b90506103f96001600160a01b038316865f1961053d565b60405163b0460f0760e01b81526001600160a01b0386169063b0460f079061042590879060040161218c565b60408051808303815f875af1158015610440573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610464919061234e565b5061047b90506001600160a01b038316865f61053d565b6104a061048784611d36565b83610491856105b7565b8461049b866105b7565b610696565b50506104cb60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054600214801561051557503373531167691b4f37f0266e226d03412c77fb2977ce14155b156105355760405163f6688adf60e01b8152336004820152602401610297565b505050505050565b6105498383835f610935565b6104cb5761055a83835f6001610935565b61058257604051635274afe760e01b81526001600160a01b0384166004820152602401610297565b61058f8383836001610935565b6104cb57604051635274afe760e01b81526001600160a01b0384166004820152602401610297565b5f6105c0610997565b6040516354636d2b60e01b81526001600160a01b038316600482015273200e12d10bb0c5e4a17e7018f0f1161919bb9389906354636d2b906024016020604051808303815f875af1158015610617573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100ed9190612370565b5f806001600160e01b038416601b0b60e085901d61065a828287610a24565b9350935050505b9250929050565b610670610b96565b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b6040805160018082528183019092525f91816020015b60608152602001906001900390816106ac575050604080516003808252608082019092529192505f919060208201606080368337019050506040516370a0823160e01b81523060048201529091505f906001600160a01b038816906370a0823190602401602060405180830381865afa15801561072b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061074f9190611bb4565b9050801561076b5761076b6001600160a01b0388163383610bd8565b5f6107768288610be5565b50905080835f8151811061078c5761078c611e38565b602090810291909101015250506040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa1580156107dd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108019190611bb4565b9050801561081d5761081d6001600160a01b0386163383610bd8565b5f6108288286610be5565b509050808360018151811061083f5761083f611e38565b602090810291909101015250479050801561085e5761085e3382610c25565b5f61086a826012610be5565b509050808360028151811061088157610881611e38565b602002602001018181525050505080825f815181106108a2576108a2611e38565b60209081029190910101526040805160018082528183019092525f91816020015b6040805160a0810182525f91810182815260608083019390935260808201839052815260208101919091528152602001906001900390816108c357905050905087815f8151811061091657610916611e38565b602002602001018190525061092b8382610c9c565b5050505050505050565b60405163095ea7b360e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f5114831661098b57838315161561097f573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b73200e12d10bb0c5e4a17e7018f0f1161919bb93893b15806109ee575073200e12d10bb0c5e4a17e7018f0f1161919bb93893f7f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d4114155b15610a22576040516373e6d7b360e01b815273200e12d10bb0c5e4a17e7018f0f1161919bb93896004820152602401610297565b565b5f805f851215610a5157604051634a7d166b60e01b81526004810186905260248101859052604401610297565b845f03610a6357505f90506001610b8e565b8460ff8416850185811215610a9e5760405163c849483b60e01b8152600481018890526024810187905260ff86166044820152606401610297565b5f805f831215610aea57604c19831215610ac1575f809550955050505050610b8e565b825f03600a0a9150818481610ad857610ad8612390565b0495505084029091149150610b8e9050565b5f831315610b8357604d831315610b275760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610297565b82600a0a9150815f1981610b3d57610b3d612390565b04841115610b715760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610297565b5091909102925060019150610b8e9050565b509193506001925050505b935093915050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054600203610a2257604051633ee5aeb560e01b815260040160405180910390fd5b61058f8383836001610ee4565b5f805f805f610bf48787610f2e565b9250925092505f80610c068585610f8a565b9150915081838015610c155750815b9650965050505050509250929050565b80471015610c4f5760405163cf47918160e01b815247600482015260248101829052604401610297565b610c68828260405180602001604052805f8152506111d3565b15610c71575050565b3d15610c8357610c7f6111e8565b5050565b60405163d6bda27560e01b815260040160405180910390fd5b60408051600480825260a082019092525f91816020015b6060815260200190600190039081610cb35790505090505f5b8351811015610d1457838181518110610ce757610ce7611e38565b6020026020010151828281518110610d0157610d01611e38565b6020908102919091010152600101610ccc565b50335f8181523060209081526040808320815160a0810183528083018581526060808301879052608083018190529082528185015282518581529384018581528484019093529093909291905b8751811015610ed957878181518110610d7c57610d7c611e38565b602002602001015193505f845f015160400151511115610ed1575f845f01515f01516001600160a01b031663d04dfe236040518060e00160405280885f0151602001516001600160a01b03168152602001898152602001885f01516040015181526020015f8152602001610df48c8a602001516111f3565b8152602001878152602001868152506040518263ffffffff1660e01b8152600401610e1f919061242b565b5f60405180830381865afa158015610e39573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610e609190810190612523565b9150505f81511115610ecf5784516020015160405163012c676d60e21b81526001600160a01b03909116906304b19db490610ea1908a9085906004016125d9565b5f604051808303815f87803b158015610eb8575f80fd5b505af1158015610eca573d5f803e3d5ffd5b505050505b505b600101610d61565b505050505050505050565b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f5114831661098b57838315161561097f573d5f823e3d81fd5b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff861115610f7957600a860460018201600a88065f1493509350935050610f83565b8593509150600190505b9250925092565b5f808383601b82900b8214806110c0577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e100000000000000000087051561100b577f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000870515610ffc576305f5e1008705965060088601955061100b565b620186a0870596506005860195505b8687601b0b1461102657600a8705965085600101955061100b565b7b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc7b19999999999999999999999999999999999999999999999999999998888201116110ba575f600188039050808160030b036110b85760e01b6001600160e01b037b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff60ff8b901d18161795505f94506106619350505050565b505b506110d7565b865f036110d757505f935060019250610661915050565b858660030b1461118e575f821315611136576110f383836115c6565b1561111b5760405163d556b11160e01b81526004810184905260248101839052604401610297565b637ffffffe19909501600a0a82029550637fffffff9461118e565b637fffffff19869003604381131561115857505f945084935061066192505050565b80600a0a888161116a5761116a612390565b059750875f0361118457505f945084935061066192505050565b50637fffffff1995505b81861361119e57600193506111b7565b818603600a0a83816111b2576111b2612390565b071593505b5050506001600160e01b03841660e084901b1791509250929050565b5f805f83516020850186885af1949350505050565b6040513d5f823e3d81fd5b60605f825167ffffffffffffffff811115611210576112106119c5565b604051908082528060200260200182016040528015611239578160200160208202803683370190505b5090505f835167ffffffffffffffff811115611257576112576119c5565b604051908082528060200260200182016040528015611280578160200160208202803683370190505b5090505f80855111611292575f611298565b84516002015b86516001010190505f8167ffffffffffffffff8111156112ba576112ba6119c5565b6040519080825280602002602001820160405280156112ed57816020015b60608152602001906001900390816112d85790505b5090505f611311604080516002815233602082015230818301526060810190915290565b82828151811061132357611323611e38565b60200260200101819052505f5b885181101561138057818060010192505088818151811061135357611353611e38565b602002602001015183838151811061136d5761136d611e38565b6020908102919091010152600101611330565b508651156115bb578080600101915050848282815181106113a3576113a3611e38565b60200260200101819052508080600101915050838282815181106113c9576113c9611e38565b60200260200101819052505f5b87518110156115b9576114cc8882815181106113f4576113f4611e38565b60200260200101515f01516114a98a848151811061141457611414611e38565b60200260200101516020015161148a8c868151811061143557611435611e38565b60200260200101518051604091820151805160209081029181019190912083517f6ec4dff745ec96dbde88c5d41f8aa5ac13aa1664afb47b8406b44fa945a650c8815291820192909252918201526060902090565b60405161190160f01b8152600281019290925260228201526042902090565b8a84815181106114bb576114bb611e38565b6020026020010151606001516115e8565b6114ec57604051630a57f30960e31b815260048101829052602401610297565b8781815181106114fe576114fe611e38565b60200260200101515f01516001600160a01b03165f1b86828151811061152657611526611e38565b60200260200101818152505087818151811061154457611544611e38565b60200260200101516020015185828151811061156257611562611e38565b602002602001018181525050818060010192505087818151811061158857611588611e38565b6020026020010151604001518383815181106115a6576115a6611e38565b60209081029190910101526001016113d6565b505b509695505050505050565b5f6115e15f84126115d757836115db565b835f035b83611659565b9392505050565b5f836001600160a01b03163b5f03611646575f8061160685856116f7565b5090925090505f81600381111561161f5761161f6125f1565b14801561163d5750856001600160a01b0316826001600160a01b0316145b925050506115e1565b61165184848461173d565b949350505050565b5f637ffffff5821361166c57505f6100ed565b637ffffffe19820160438113156116875750508115156100ed565b5f81126116c75780600a0a7b80000000000000000000000000000000000000000000000000000001816116bc576116bc612390565b0484119150506100ed565b805f03600a0a7b800000000000000000000000000000000000000000000000000000020284101591505092915050565b5f805f835160410361172e576020840151604085015160608601515f1a611720888285856117a2565b955095509550505050610f83565b505081515f9150600290610f83565b805160408051630b135d3f60e11b8082526004820186905260248201929092525f92906020820185604483015e5f82606483010152601f820160051c60051b915060205f60648401838a5afa9050825f5114601f3d1116811693505050509392505050565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411156117db57505f91506003905082611860565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa15801561182c573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b03811661185757505f925060019150829050611860565b92505f91508190505b9450945094915050565b5f6020828403121561187a575f80fd5b81356001600160e01b0319811681146115e1575f80fd5b6001600160a01b0381168114610222575f80fd5b5f805f805f8060a087890312156118ba575f80fd5b86356118c581611891565b955060208701356118d581611891565b94506040870135935060608701359250608087013567ffffffffffffffff808211156118ff575f80fd5b818901915089601f830112611912575f80fd5b813581811115611920575f80fd5b8a6020828501011115611931575f80fd5b6020830194508093505050509295509295509295565b5f805f60608486031215611959575f80fd5b833561196481611891565b9250602084013567ffffffffffffffff80821115611980575f80fd5b9085019060c08288031215611993575f80fd5b909250604085013590808211156119a8575f80fd5b508401604081870312156119ba575f80fd5b809150509250925092565b634e487b7160e01b5f52604160045260245ffd5b6040516080810167ffffffffffffffff811182821017156119fc576119fc6119c5565b60405290565b6040805190810167ffffffffffffffff811182821017156119fc576119fc6119c5565b6040516060810167ffffffffffffffff811182821017156119fc576119fc6119c5565b604051601f8201601f1916810167ffffffffffffffff81118282101715611a7157611a716119c5565b604052919050565b5f82601f830112611a88575f80fd5b813567ffffffffffffffff811115611aa257611aa26119c5565b611ab5601f8201601f1916602001611a48565b818152846020838601011115611ac9575f80fd5b816020850160208301375f918101602001919091529392505050565b5f60208284031215611af5575f80fd5b813567ffffffffffffffff811115611b0b575f80fd5b61165184828501611a79565b5f60018201611b3457634e487b7160e01b5f52601160045260245ffd5b5060010190565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f6001600160a01b038089168352876020840152808716604084015285606084015280851660808401525060c060a0830152611ba860c0830184611b3b565b98975050505050505050565b5f60208284031215611bc4575f80fd5b5051919050565b5f67ffffffffffffffff821115611be457611be46119c5565b5060051b60200190565b5f82601f830112611bfd575f80fd5b81356020611c12611c0d83611bcb565b611a48565b82815260059290921b84018101918181019086841115611c30575f80fd5b8286015b848110156115bb57803567ffffffffffffffff80821115611c53575f80fd5b908801906080828b03601f19011215611c6a575f80fd5b611c726119d9565b86830135611c7f81611891565b815260408381013588830152606084013583811115611c9c575f80fd5b8401603f81018d13611cac575f80fd5b88810135611cbc611c0d82611bcb565b81815260059190911b82018301908a8101908f831115611cda575f80fd5b928401925b82841015611cf85783358252928b0192908b0190611cdf565b80858701525050505050608083013582811115611d13575f80fd5b611d218c8983870101611a79565b60608301525085525050918301918301611c34565b5f60408236031215611d46575f80fd5b611d4e611a02565b823567ffffffffffffffff80821115611d65575f80fd5b818501915060608236031215611d79575f80fd5b611d81611a25565b8235611d8c81611891565b81526020830135611d9c81611891565b6020820152604083013582811115611db2575f80fd5b611dbe36828601611a79565b60408301525083526020850135915080821115611dd9575f80fd5b50611de636828601611bee565b60208301525092915050565b5f808335601e19843603018112611e07575f80fd5b83018035915067ffffffffffffffff821115611e21575f80fd5b6020019150600581901b3603821315610661575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235607e19833603018112611e60575f80fd5b9190910192915050565b5f8235609e19833603018112611e60575f80fd5b5f808335601e19843603018112611e93575f80fd5b83018035915067ffffffffffffffff821115611ead575f80fd5b6020019150600681901b3603821315610661575f80fd5b5f60208284031215611ed4575f80fd5b81356115e181611891565b5f808335601e19843603018112611ef4575f80fd5b830160208101925035905067ffffffffffffffff811115611f13575f80fd5b8060051b3603821315610661575f80fd5b5f808335601e19843603018112611f39575f80fd5b830160208101925035905067ffffffffffffffff811115611f58575f80fd5b803603821315610661575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f8135611f9a81611891565b6001600160a01b039081168452602083013590611fb682611891565b166020840152611fc96040830183611f24565b60606040860152611fde606086018284611f66565b95945050505050565b5f808335601e19843603018112611ffc575f80fd5b830160208101925035905067ffffffffffffffff81111561201b575f80fd5b8060061b3603821315610661575f80fd5b8183525f60208085019450825f5b8581101561207257813561204d81611891565b6001600160a01b0316875281830135838801526040968701969091019060010161203a565b509495945050505050565b5f8235607e19833603018112612091575f80fd5b90910192915050565b8183526020808401935f91600585811b8301820185855b8881101561217e57858303601f19018a526120cc828961207d565b608081356120d981611891565b6001600160a01b03168552818701358786015260406120fa81840184611edf565b8383890152808489015260a093507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811115612134575f80fd5b881b9150818188850137508501606061214f84820185611f24565b94508388840301828901526121678484018683611f66565b9e8a019e97505050938701935050506001016120b1565b509098975050505050505050565b5f602080835260e0830184358285015281850135604085015260606040860135606086015260608601358015158082146121c4575f80fd5b60809150806080880152506121dc6080880188611edf565b60c060a08901529384905261010093848801600582901b89018601835f5b84811015612315578b830360ff19018452612215828761207d565b8035609e19823603018112612228575f80fd5b8885528101803561223881611891565b6001600160a01b0316858a0152808c013536829003605e1901811261225b575f80fd5b60a0808701526122716101208701838301611f8e565b90506122806040830183611fe7565b607f19808985030160c08a015261229884838561202c565b93506122a68e860186611fe7565b93509150808985030160e08a0152506122c083838361202c565b92505050898201358c8701528c8301358d870152604083013560408701526122ea8b840184611edf565b935091508581038b87015261230081848461209a565b968d019695505050918a0191506001016121fa565b505061232460a08c018c611f24565b8b8303601f190160c08d01529850965061233f818989611f66565b9b9a5050505050505050505050565b5f806040838503121561235f575f80fd5b505080516020909101519092909150565b5f60208284031215612380575f80fd5b815160ff811681146115e1575f80fd5b634e487b7160e01b5f52601260045260245ffd5b5f815180845260208085019450602084015f5b83811015612072578151875295820195908201906001016123b7565b5f8282518085526020808601955060208260051b840101602086015f5b8481101561241e57601f1986840301895261240c8383516123a4565b988401989250908301906001016123f0565b5090979650505050505050565b602081526001600160a01b038251166020820152602082015160408201525f604083015160e06060840152612464610100840182611b3b565b9050606084015160808401526080840151601f19808584030160a086015261248c83836123d3565b925060a08601519150808584030160c08601526124a983836123a4565b925060c08601519150808584030160e086015250611fde82826123a4565b5f82601f8301126124d6575f80fd5b815160206124e6611c0d83611bcb565b8083825260208201915060208460051b870101935086841115612507575f80fd5b602086015b848110156115bb578051835291830191830161250c565b5f8060408385031215612534575f80fd5b825167ffffffffffffffff8082111561254b575f80fd5b818501915085601f83011261255e575f80fd5b8151602061256e611c0d83611bcb565b82815260059290921b8401810191818101908984111561258c575f80fd5b948201945b838610156125aa57855182529482019490820190612591565b918801519196509093505050808211156125c2575f80fd5b506125cf858286016124c7565b9150509250929050565b828152604060208201525f61165160408301846123a4565b634e487b7160e01b5f52602160045260245ffd"; /// @dev What MUST already be on a network before this release can be /// broadcast there: an address, and the runtime code that belongs at it. /// `abi.encode`d as a `DeployDependency[]` because Solidity has no /// file-scope constant of dynamic array type. bytes constant DEPENDENCIES = - hex"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000059600000000000000000000000000000000000000000000000000000000000005e20000000000000000000000000f78c2c56f95e28f73f4b8b695b07ee574da5c7830000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000588f6080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a71461180e575080632cb77e9f146117e257806341d1514f146117ab5780635343c1b7146117105780635cffe9de146115b45780635d003c4414611430578063613255ab146113ad578063687cf02a14611096578063ac9650d814610f48578063b0460f07146105f3578063b845b83e1461059b578063ca9109ba1461044c578063d9d98ce41461039b578063ddebc96f146103475763df6db3c2146100c1575f80fd5b34610321576003196040368201126103215767ffffffffffffffff9060043582811161032157806004019160a0823603918201126103215760243584811161032157610111903690600401611cd0565b909361011b612bf1565b5f946001600160a01b039485610130846125d8565b163303610325576101496101443685611b02565b612c33565b805f525f60205260405f20966001885414610190575b60208960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556040519015158152f35b9091929394959697505f600198556040519633885282602089015260606040890152816101bc8761188d565b166060890152602484013590606219018112156103215783019060a06080890152806101ea6004840161188d565b166101008901526101fd6024830161188d565b16610120880152604481013560221982360301811215610321570190602460048301359201988211610321578136038913610321577f09d18501db0080ca2d6cd7c17fa7255daff4b2d503ea93b76ff68b6752ea8e6387806103069560846102c561030e9a60209f610284906103149f9a60606101406102ef9d0152610160880191612389565b6102b66102ab61029760448801856129dc565b605f198a8603810160a08c01529491612a11565b9260648701906129dc565b918784030160c0880152612a11565b91013560e08301520390a13390919060405192600284526020840152604083015260608201604052565b906040519160018352602083015260408201604052565b9236916123a9565b90613c66565b5f8080808080808061015f565b5f80fd5b602486610331856125d8565b6040516335252be360e01b815291166004820152fd5b3461032157600319602036820112610321576004359067ffffffffffffffff82116103215760809082360301126103215761038660609160040161262c565b90604051921515835260208301526040820152f35b34610321576040366003190112610321576001600160a01b036103bc611861565b166040516370a0823160e01b8152306004820152602081602481855afa908115610441575f9161040f575b50156103f75760206040515f8152f35b60249060405190633c5bf76960e21b82526004820152fd5b90506020813d602011610439575b8161042a60209383611971565b810103126103215751826103e7565b3d915061041d565b6040513d5f823e3d90fd5b346103215761045a36611d01565b92809492610466612bf1565b610471828533613b62565b61047a816134d7565b15610567578061048e6104dd9286336140a8565b9790957f7f9dfa19cf1cc2f806f2f860fbc9c056b601fb1afc0e9b843dfe5c63616268e660806040513381526001600160a01b038416998a60208301528560408301526060820152a1336137be565b9390918561050c575b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b61055b9661030e956103069460ff93604051956005875260208701526040860152606085015260808401521660a082015260c08101604052906040519160018352602083015260408201604052565b808080808080806104e6565b506040516306dde9c360e41b81523360048201526001600160a01b03841660248201526044810191909152606490fd5b0390fd5b346103215760203660031901126103215760043567ffffffffffffffff81116103215761030e6105d26104e6923690600401611cd0565b91906105dc612bf1565b604051926105e984611955565b5f845236916123a9565b34610321576003196020368201126103215767ffffffffffffffff600435116103215760c090600435360301126103215761062c612bf1565b5f808061064160048035608481019101612511565b905015610f36576024600435013592610659846134d7565b15610f245760608060405161066d81611909565b610675612566565b81525f60208201525f6040820152015261068d612566565b506106ed6106e86106c76106bd6106b76106b1608460043501600435600401612511565b90612598565b806125b3565b60408101906124a3565b60206106e06106b1608460043501600435600401612511565b0135916125c8565b6125d8565b936001600160a01b0361073c6106e86107236107196106b76106b1608460043501600435600401612511565b60608101906124a3565b60406106e06106b1608460043501600435600401612511565b816040519761074a896118d1565b168752166020860152604085015261076c608460043501600435600401612511565b9490506001604051955f87520160051b85016040525f905f5b610799608460043501600435600401612511565b9050811080610f11575b15610d5e576107bc608460043501600435600401612511565b821015610d4a578160051b810135607e198236030181121561032157608081830136031261032157604051916107f183611909565b8181013567ffffffffffffffff81116103215761081390369084840101611b02565b835280820160208181013590850152604080820135908501526060013567ffffffffffffffff81116103215761084c9236920101611cb5565b606082015280516001600160a01b0361086e6040830151602085015190611dbe565b5151166001600160a01b0385511614801590610d16575b610d045761089d602083015160408401519083613fa5565b6108a681612c33565b91825f525f60205260405f2054155f1461090a575051604080513381526001600160a01b039092166020830152810191909152600191907fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f390606090a15b01610785565b919061093b60208497959701516040850151906060860151906040519261093084611955565b5f8452339186613235565b5f94916109a457505051604080513381526001600160a01b03909216602083015281019190915260019291907f1e6fa9678edf81f9f25bbf308bde03ad3e110db1f429394b0915ba021532941490606090a15b811561099c575b5092610904565b905088610995565b6109b9606082015160446004350135906134fa565b15610a1357505051604080513381526001600160a01b03909216602083015281019190915260019291907fe3151dc8cb7a54ffc4baabd28c1f241c94d510b5e5b502491ac3cad6c16316d59080606081015b0390a161098e565b610a2060408201516134d7565b158015610cf1575b15610a7e57505051604080513381526001600160a01b03909216602083015281019190915260019291907f500b713857325f9e6dcb52ae832eca9109d107ed1aae9cb4928b4c1e13f051aa908060608101610a0b565b9250925050600196959691610a976064600435016125ec565b15610c5e5796610b0797610b1760408401516040880151610ab88183613544565b15610c565750925b610b11848592610afa610af460608a01516001600160e01b03601b918660e01d92828816810b928260e01d9216900b6145f5565b9061456a565b9d8e9260408d015161356b565b60408c015261407e565b9961407e565b98610b228484613595565b610b2c84826135f3565b60405192338452608060208501526060610b528451608080880152610100870190611e19565b93602081015160a0870152604081015160c0870152015192607f198582030160e0860152835180825260208201906020808260051b8501019601925f5b828110610bee57505050505092806001979695937fbae4dbf76931c547f765e9def16d693d86daaa596f491de979008831789185ae93610be996604084015260608301520390a180858c5101808d5260051b8c01526138aa565b61098e565b9091929396602080610c49600193601f198782030189528b51906001600160a01b03825116815283820151848201526060610c3860408401516080604085015260808401906125f9565b920151906060818403910152611d4d565b9901950193929101610b8f565b905092610ac0565b610b0790610b176060840151610b11610c9c610af460408801516001600160e01b0394601b90868360e01d9316820b91878260e01d9216900b6145f5565b60408a0151610cab8183613544565b15610ce95750915b829c8d916060890151908116155f14610cda575060408801515b96879460408d015161356b565b610ce49085613fda565b610ccd565b905091610cb3565b50610cff6060820151613521565b610a28565b60405163936bb5ad60e01b8152600490fd5b506001600160a01b03610d326060830151604085015190611dbe565b5151166001600160a01b036020860151161415610885565b634e487b7160e01b5f52603260045260245ffd5b50919390610d706064600435016125ec565b15610f0b57835b6004356004013590610d898282613544565b610eed5750508490610da9856001600160a01b0360208701511633613bf4565b505060a46004350190610dc182600435600401612470565b905015159081610ee5575b50610e44575b506001600160a01b03610de892935116336140a8565b50505b8351811015610e105780610e0a610e0460019387611dbe565b5161371e565b01610deb565b5060409160017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005582519182526020820152f35b90506001600160a01b03602084015116610e6e6001600160a01b0385511692600435600401612470565b929091333b1561032157610eb65f93604051958694859463691f9ed760e01b8652600486015260248501528960448501528a606485015260a0608485015260a4840191612389565b038183335af190811561044157859115610dd2579050610ed69150611925565b5f836001600160a01b03610dd2565b905088610dcc565b604492506040519163573b6f4160e01b835260048301526024820152fd5b84610d77565b50610f1f60408301516134d7565b6107a3565b60405163315f9e2360e21b8152600490fd5b604051639c95219f60e01b8152600490fd5b34610321576020806003193601126103215760043567ffffffffffffffff811161032157610f7a903690600401611cd0565b919060405192610f8984611955565b5f8452828401610f9882611a55565b94610fa66040519687611971565b828652610fb283611a55565b93610fc486880195601f1901866124f5565b5f5b84811061102857604080518881528951818a018190525f92600582901b83018101918a918c9085015b828710610ffc5785850386f35b909192938280611018600193603f198a82030186528851611d4d565b9601920196019592919092610fef565b806110778861107161104460019560059d9c9d1b870187612470565b929089846040519586938585013782018381015f81528b519283915e015f83820152038084520182611971565b30613f14565b611081828a611dbe565b5261108c8189611dbe565b5001969596610fc6565b34610321576003196040368201126103215760043567ffffffffffffffff8082116103215760c08260040193833603011261032157602435908111610321576110e3903690600401611cd0565b906110ec612bf1565b61111d61111861111361110c611102888061245b565b6040810190612470565b3691611993565b613e96565b613eff565b801561139b5760011015611389576024830161113981866124a3565b90501561137757604484019461114f86826124a3565b905015611365576111b561117d966111a961117461116d858061245b565b95856124a3565b999092856124a3565b91909261119a60405197611190896118a1565b33895236906119f7565b9a60209b8c8901523691611a6d565b60408601523691611a6d565b6060830152606485013560808301526111cd82612c33565b91825f525f875260405f20958654159687611211575b888860017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055604051908152f35b6001905560a46001600160a01b03917f87491344dfbcf91f6cbbc610cbbeedc85313d37a02df0c93527f7ea5f8db717f83855116604051908152878c82015260606040820152806112656060820188611e19565b0390a101916112748385612470565b90506112b9575b505050506112ad92916103066102ef61030e933390919060405192600284526020840152604083015260608201604052565b828080808080806111e3565b6112c661110c8486612470565b6112cf816145d1565b156113425750937fd46c2c56b35c8210e9e712ec3f02242d5fc90187c0ac8ed80cc33626846ec369896112ad989795611335611318610306976102ef9761030e9b511693612470565b866040519586958652850152606060408501526060840191612389565b0390a1938395965061127b565b89610597604051928392630c89984b60e31b845260048401526024830190611d4d565b60405163540e5f0b60e01b8152600490fd5b604051636c44ef8f60e01b8152600490fd5b604051633c8270bd60e21b8152600490fd5b604051632cff108b60e21b8152600490fd5b3461032157602080600319360112610321576024816001600160a01b036113d2611861565b16604051928380926370a0823160e01b82523060048301525afa908115610441575f91611403575b50604051908152f35b90508181813d8311611429575b61141a8183611971565b810103126103215751826113fa565b503d611410565b346103215761143e36611d01565b929161144b949194612bf1565b611456838333613b62565b61145f816134d7565b15611583578160ff916114778561153a969533612a61565b6114818183613544565b1561157d575080935b61149685828533613b96565b917f8045c25080b0868951141ed0a91720bcad09a8364a2b3109ee1fd49c1f0bc8b860c06114c5898833613bf4565b97906001600160a01b0360405192338452169a8b6020840152856040840152886060840152608083015260a0820152a16040519660068852602088015260408701526060860152608085015260a08401521660c082015260e08101604052906040519160018352602083015260408201604052565b90806115665760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b6115759261030e9136916123a9565b8080806104e6565b9361148a565b50604051623a3a4d60e21b81523360048201526001600160a01b039190911660248201526044810191909152606490fd5b34610321576080366003190112610321576004356001600160a01b0390818116809103610321576115e3611877565b6044359167ffffffffffffffff91606435838111610321573660238201121561032157806004013593841161032157366024858301011161032157611670956020921693611632868587613a83565b60405196879283926323e30c8b60e01b84523360048501528760248501528860448501525f606485015260a06084850152602460a485019201612389565b03815f855af1938415610441575f946116dc575b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd984036116c3576116b893503091613afc565b602060405160018152f35b604051630b6c58a960e31b815260048101859052602490fd5b9093506020813d602011611708575b816116f860209383611971565b8101031261032157519284611684565b3d91506116eb565b34610321576101403660031901126103215767ffffffffffffffff60043581811161032157611743903690600401611b02565b6024358281116103215761175b903690600401611b02565b60c0366043190112610321576101043583811161032157611780903690600401611cb5565b90610124359384116103215761179d6104e6943690600401611cb5565b926117a6612bf1565b611eca565b346103215760603660031901126103215760206117da6117c9611861565b6117d1611877565b60443591612a61565b604051908152f35b34610321576020366003190112610321576004355f525f6020526020600160405f205414604051908152f35b34610321576020366003190112610321576004359063ffffffff60e01b82168092036103215760209163e414309160e01b8114908115611850575b5015158152f35b6301ffc9a760e01b14905083611849565b600435906001600160a01b038216820361032157565b602435906001600160a01b038216820361032157565b35906001600160a01b038216820361032157565b60a0810190811067ffffffffffffffff8211176118bd57604052565b634e487b7160e01b5f52604160045260245ffd5b6060810190811067ffffffffffffffff8211176118bd57604052565b6040810190811067ffffffffffffffff8211176118bd57604052565b6080810190811067ffffffffffffffff8211176118bd57604052565b67ffffffffffffffff81116118bd57604052565b60e0810190811067ffffffffffffffff8211176118bd57604052565b6020810190811067ffffffffffffffff8211176118bd57604052565b90601f8019910116810190811067ffffffffffffffff8211176118bd57604052565b92919267ffffffffffffffff82116118bd57604051916119bd601f8201601f191660200184611971565b829481845281830111610321578281602093845f960137010152565b9080601f83011215610321578160206119f493359101611993565b90565b91906060838203126103215760405190611a10826118d1565b8193611a1b8161188d565b8352611a296020820161188d565b602084015260408101359167ffffffffffffffff831161032157604092611a5092016119d9565b910152565b67ffffffffffffffff81116118bd5760051b60200190565b929192611a7982611a55565b604092611a896040519283611971565b819581835260208093019160061b84019381851161032157915b848310611ab257505050505050565b8583830312610321578386918251611ac9816118ed565b611ad28661188d565b81528286013583820152815201920191611aa3565b9080601f83011215610321578160206119f493359101611a6d565b91909160a0818403126103215760405190611b1c826118a1565b8193611b278261188d565b835267ffffffffffffffff9160208101358381116103215782611b4b9183016119f7565b602085015260408101358381116103215782611b68918301611ae7565b6040850152606081013592831161032157611b896080939284938301611ae7565b60608501520135910152565b90929192611ba281611a55565b91604094611bb36040519485611971565b839583855260208095019160059460051b8401948186116103215784935b868510611be2575050505050505050565b67ffffffffffffffff90853582811161032157870190608082860312610321578551611c0d81611909565b611c168361188d565b81528a8301358b8201528683013584811161032157830186601f8201121561032157803590611c4482611a55565b91611c518a519384611971565b8083528d80840191891b83010191898311610321578e809101915b838310611ca557505050508782015260608084013594851161032157611c96878d968796016119d9565b90820152815201940193611bd1565b82358152918101918f9101611c6c565b9080601f83011215610321578160206119f493359101611b95565b9181601f840112156103215782359167ffffffffffffffff8311610321576020808501948460051b01011161032157565b906080600319830112610321576004356001600160a01b0381168103610321579160243591604435916064359067ffffffffffffffff821161032157611d4991600401611cd0565b9091565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b805115610d4a5760200190565b805160011015610d4a5760400190565b805160021015610d4a5760600190565b805160031015610d4a5760800190565b805160041015610d4a5760a00190565b8051821015610d4a5760209160051b010190565b9081518082526020808093019301915f5b828110611df1575050505090565b835180516001600160a01b031686528201518583015260409094019392810192600101611de3565b90608080611e8f611e7d611e6b60406001600160a01b0380895116885260208901519060a060208a01528082511660a08a015260208201511660c08901520151606060e0880152610100870190611d4d565b60408701518682036040880152611dd2565b60608601518582036060870152611dd2565b93015191015290565b90611ea282611a55565b611eaf6040519182611971565b8281528092611ec0601f1991611a55565b0190602036910137565b92916001600160a01b038451166001600160a01b0383511614612377576001600160a01b03611f00606086015160643590611dbe565b515116906040830151916001600160a01b03611f1f6084358095611dbe565b51511614801590612337575b610d04576040850151906001600160a01b03611f4a6044358094611dbe565b5151166001600160a01b03611f6560643560608a0151611dbe565b5151161461232557611f7686612c33565b805f525f60205260405f2054156122d25750611f9184612c33565b805f525f60205260405f20541561227e5750612076929161204e917f6fa7f4c28634b0a9d6831401c45ae468195fb63aed07308935c35374ff5d9e3960405180611ff9611feb61012033845280602085015283018d611e19565b82810360408401528a611e19565b85606083015260643560808301528760a083015260a43560c083015260c43560e083015260e4356101008301520390a16001600160a01b038651166040519261204184611955565b5f8452606435908a612e9d565b9490506001600160a01b038651166040519261206984611955565b5f845260a4359086612e9d565b92905061208660408201516134d7565b15801561226a575b8015612257575b8015612244575b61223257604051916120ad83611909565b5f83525f60208401525f60408401525f60608401526120cc84836144e2565b845260408401526120f26120e083866144e2565b6020860152806060860152845161356b565b94612106602085015160408601519061356b565b9361211087613521565b8015612223575b612211576121d861220a957fd9fa84dd790c969daa5c33d8050dc06b4a9b59d5b42e2be5f5e8ae20447f618d946121ba61220f9a60a0966121598a8851613595565b6121678c6020890151613595565b6121758a60408901516135f3565b6121838c60608901516135f3565b61218c8a61371e565b6121958c61371e565b6001600160a01b036121b160c435926060606435910151611dbe565b515116336137be565b50506001600160a01b036121b160e43592606060a435910151611dbe565b5050606060405191338352805160208401526020810151604084015260408101518284015201516080820152a16138aa565b6138aa565b565b604051630d86822160e01b8152600490fd5b5061222d85613521565b612117565b6040516321badf1f60e01b8152600490fd5b506122526060840151613521565b61209c565b506122656060820151613521565b612095565b5061227860408401516134d7565b1561208e565b9351604080513381526001600160a01b039092166020830152810194909452507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f3945091925082915050606081015b0390a1565b9551604080513381526001600160a01b039092166020830152810196909652507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f3949350839250506060820190506122cd565b604051631cd2f1c760e21b8152600490fd5b506001600160a01b03612351606085015160a43590611dbe565b5151166001600160a01b0361236d604088015160443590611dbe565b5151161415611f2b565b604051630a98f1f360e21b8152600490fd5b908060209392818452848401375f828201840152601f01601f1916010190565b909291926123b681611a55565b916040916123c76040519485611971565b839581855260208095019160051b8301938185116103215783925b8584106123f25750505050505050565b67ffffffffffffffff90843582811161032157860190838286031261032157835161241c816118ed565b823584811161032157866124319185016119f7565b8152898301359384116103215761244c868b95869501611cb5565b838201528152019301926123e2565b903590605e1981360301821215610321570190565b903590601e1981360301821215610321570180359067ffffffffffffffff82116103215760200191813603831361032157565b903590601e1981360301821215610321570180359067ffffffffffffffff821161032157602001918160061b3603831361032157565b5f5b608081106124e7575050565b6060828201526020016124db565b5f5b82811061250357505050565b6060828201526020016124f7565b903590601e1981360301821215610321570180359067ffffffffffffffff821161032157602001918160051b3603831361032157565b60405190612554826118d1565b60606040835f81525f60208201520152565b60405190612573826118a1565b5f608083828152612582612547565b6020820152606060408201526060808201520152565b9015610d4a57803590607e1981360301821215610321570190565b903590609e1981360301821215610321570190565b9190811015610d4a5760061b0190565b356001600160a01b03811681036103215790565b3580151581036103215790565b9081518082526020808093019301915f5b828110612618575050505090565b83518552938101939281019260010161260a565b9061264461014461263d84806125b3565b3690611b02565b5f5260205f81526040926001845f2054036129d157916128c6916126cb85855f61284b6126748361268b9a6125b3565b612690878501359182878701359c8d923690611b02565b613fa5565b6126a861269d85806125b3565b946060810190612511565b96906126c38751966126b988611955565b8688523690611b02565b973691611b95565b906126d4612c64565b506127fb8651916126e4836118a1565b600483526126f38a84016124d9565b886126fd81612c33565b988b6001600160a01b039a8b84511690835192600384528301528282015233606082015260808101825261273086611d71565b5261273a85611d71565b508051612746816118d1565b6002815281368e83013761275986611d7e565b5261276385611d7e565b50810160ff8c6127c66127af8d80612788816127808b8a51611dbe565b515116614173565b97511690612797898851611dbe565b515116846127a68a8951611dbe565b51015191612a61565b958d6127bc828751611dbe565b5151169451611dbe565b51015192169093929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b61280482611d8e565b5261280e81611d8e565b506128328b886060810160ff8c6127c66127af8d80612788816127808b8a51611dbe565b61283b82611d9e565b5261284581611d9e565b50614251565b918385511693868601918b83519289818551169401511693878652308a5281808720915101519082519261287e84611955565b878452519561288c87611939565b86528a8601528d85015284606085015285608085015260a084015260c08301528a5180809a819463d04dfe2360e01b835260048301612de5565b03915afa95865f915f986129ab575b506128e45788513d5f823e3d90fd5b95938651600281106129945750888798998260c0979899015199015161291261290c85611dae565b51611d9e565b5161291d8183613544565b1561298a5750998a925b6129498b85919060405192600284526020840152604083015260608201604052565b61295286611d8e565b5261295c85611d8e565b5082519661296988611939565b8752860152840152866060840152608083015260a082015201526001929190565b9050998a92612927565b6024908a5190630fbb8e5560e21b82526004820152fd5b9097506129ca91503d805f833e6129c28183611971565b810190612ca1565b965f6128d5565b505f92508291829150565b9035601e198236030181121561032157016020813591019167ffffffffffffffff8211610321578160061b3603831361032157565b9190808252602080920192915f905b828210612a2e575050505090565b909192936001906001600160a01b03612a468761188d565b16815285830135838201526040908101950193920190612a20565b8215612a96576001600160a01b038091165f52600160205260405f2091165f5260205260405f20905f5260205260405f205490565b909150612aa282614173565b6001600160a01b03809316906040918251946370a0823160e01b86528416938460048701526020928387602481865afa968715612bb8575f97612bc2575b5083612af9612af283612b299a614f37565b50906149f9565b508651636eb1769f60e11b81526001600160a01b0390941660048501523060248501529297889081906044820190565b0381865afa968715612bb8575f97612b87575b50612af2612b4d916119f498614f37565b50612b588183613544565b15612b7f5750935b5f5260018252825f20905f528152815f20905f8052525f20549061407e565b905093612b60565b96508387813d8311612bb1575b612b9e8183611971565b8101031261032157955195612af2612b3c565b503d612b94565b85513d5f823e3d90fd5b96508387813d8311612bea575b612bd98183611971565b810103126103215795519583612ae0565b503d612bcf565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f006002815414612c215760029055565b604051633ee5aeb560e01b8152600490fd5b604051612c5e81612c506020820194602086526040830190611e19565b03601f198101835282611971565b51902090565b60405190612c7182611939565b606060c083612c7e612566565b81525f60208201525f60408201525f838201528260808201525f60a08201520152565b919060408382031261032157825167ffffffffffffffff908181116103215784019082601f83011215610321578151602092612cdc82611a55565b91612cea6040519384611971565b808352848084019160051b830101918683116103215785809101915b838310612d795750505050948281015191821161032157019180601f84011215610321578251612d3581611a55565b93612d436040519586611971565b818552838086019260051b820101928311610321578301905b828210612d6a575050505090565b81518152908301908301612d5c565b8251815291810191869101612d06565b90808251908181526020809101926020808460051b8301019501935f915b848310612db75750505050505090565b9091929394958480612dd5600193601f198682030187528a516125f9565b9801930193019194939290612da7565b91906020928381526001600160a01b0382511684820152838201516040820152612e1f604083015160e06060840152610100830190611d4d565b9060608301516080820152612e46608084015192601f1993848483030160a0850152612d89565b9260a081015193838382030160c08401528680865192838152019501905f5b818110612e89575050506119f494955060c060e091015192828503019101526125f9565b825187529588019591880191600101612e65565b94959395929192612eac612c64565b50604096875190612ebc826118a1565b60048252602093612ece8584016124d9565b612ed789612c33565b6001600160a01b038097818c51168d519360038552898501528d840152166060820152608081018b52612f0984611d71565b52612f1383611d71565b508951612f1f816118d1565b600281528a3687830137612f3284611d7e565b52612f3c83611d7e565b50898901908681835190612f4f91611dbe565b515116612f5b90614173565b86888c51168984865190612f6e91611dbe565b5151168285875190612f7f91611dbe565b51015190612f8c92612a61565b928981865190612f9b91611dbe565b515116945190612faa91611dbe565b5101519060ff16612fe2929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b612feb83611d8e565b52612ff582611d8e565b5060608801858782519061300891611dbe565b51511661301490614173565b868a5116878984519061302691611dbe565b515116878a85519061303791611dbe565b5101519061304492612a61565b908689898186519061305591611dbe565b51511694519061306491611dbe565b5101519060ff1661309c929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b6130a583611d9e565b526130af82611d9e565b506130b991614251565b9183875116938188019283519183818451169301511693865f523084528a805f20915101518b51916130ea83611955565b5f83528c51966130f988611939565b8752858701528b8601525f60608601526080850186905260a085015260c0840152885163d04dfe2360e01b815292839081906131389060048301612de5565b03815a935f94fa91825f915f94613217575b506131595788513d5f823e3d90fd5b979495969791948251966002881097886132005750818385015194015161318261290c87611dae565b5161318d8183613544565b156131f85750925b6131b78585919060405192600284526020840152604083015260608201604052565b6131c087611d8e565b526131ca86611d8e565b5082519a6131d78c611939565b8b528a01528801526060870152608086015260a085015260c0840152159190565b905092613195565b602490835190630fbb8e5560e21b82526004820152fd5b90935061322e91503d805f833e6129c28183611971565b925f61314a565b95949193908693613244612c64565b505f92604061335f815192613258846118a1565b6004845260209361326a8582016124d9565b6133286132768b612c33565b8b6001600160a01b03998a9283835116895191600383528b830152898201528360609b168b8201526080810189526132ad86611d71565b526132b785611d71565b5087516132c3816118d1565b6002815288368b8301376132d686611d7e565b526132e085611d7e565b5060ff896127c68a85019361331c876132fe81612780858a51611dbe565b9751168861330d848951611dbe565b515116856127a6858a51611dbe565b966127bc828751611dbe565b61333182611d8e565b5261333b81611d8e565b50612832878b8d60ff896127c68c85019361331c876132fe81612780858a51611dbe565b946133df5f868a511698869786889c0191825191888184511693015116928c8552308952878086209151015188519161339783611955565b8683528951956133a687611939565b86528a86015288850152848a8501528b608085015260a084015260c08301528551808095819463d04dfe2360e01b835260048301612de5565b03915afa90815f915f936134b9575b506134ac575050505f975b6002855110988915996134995782848701519601519061341b61290c89611dae565b51906134278284613544565b1590506134915750925b6134538685919060405192600284526020840152604083015260608201604052565b61345c88611d8e565b5261346687611d8e565b5082519b6134738d611939565b8c528b0152890152870152608086015260a085015260c08401529190565b905092613431565b50505050505050505091506119f4612c64565b91999850945093966133f9565b9092506134d091503d805f833e6129c28183611971565b915f6133ee565b6134f6905f60e01d906001600160e01b038160e01d9116601b0b614fee565b1290565b906134f6916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b61506f565b613540905f60e01d906001600160e01b038160e01d9116601b0b614fee565b1390565b90613540916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b61506f565b6119f491610af4916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614545565b6135ef9160808101826135b16135ab8351611dae565b51611dae565b526135e86135e26001600160a01b038094515116936135d96135d38551611dae565b51611d71565b51169251611dae565b51611d8e565b5191613b96565b5050565b906080810191806136076135ab8551611d9e565b526001600160a01b038092515116916136236135d38551611d9e565b51166136326135e28551611d9e565b5190816136e65761364283613521565b6136cd579183917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a95936122cd955f5260209060018252613698604094855f20835f528452855f20855f528452855f205461407e565b945f5260018252835f20905f528152825f20915f52525f20555b51604051918291338352604060208401526040830190612d89565b60405163793a8f5560e01b815260048101849052602490fd5b91613717917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a95936122cd956137be565b50506136b2565b6080810161372f6135e28251611d9e565b5191821561373c57505050565b6137566135d36001600160a01b0380935151169351611d9e565b5116815f5260209160018352604092835f20835f528152835f20855f528152835f2054936001600160e01b038516613791575b505050505050565b6137b5955f9284845260018152828420868552815282842091845252812055613bf4565b5f808080613789565b939291936137cb83613521565b6136cd57846137e7576137df939450613bf4565b50505f905f90565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f528152613824835f2054948561407e565b9561382e87613521565b613851575f97885260018252838820908852815282872091875252909320829055565b835163c5e12af560e01b815260048101889052602490fd5b90604082019082526020606081936040838201528551809452019301915f5b828110613896575050505090565b835185529381019392810192600101613888565b60c0810151908151915f92613a1e575b5061395f6020918281510151926001600160a01b039081818187511696015116928660a082019485518252308452604097888320898686510151015160808601518b519161390783611955565b8683528c519361391685611955565b8785528d519661392588611939565b8752898701528c86015260016060860152608085015260a084015260c08301528851808099819463d04dfe2360e01b835260048301612de5565b03915afa948515613a145787956139f6575b508451613982575b50505050505050565b81905101510151169051813b156139f2579184918493836139b7965180978195829463012c676d60e21b845260048401613869565b03925af19081156139e957506139d2575b8080808080613979565b6139dc8291611925565b6139e657806139c8565b80fd5b513d84823e3d90fd5b8480fd5b613a0b9195503d8089833e6129c28183611971565b9050935f613971565b86513d89823e3d90fd5b6001600160a01b03602080845101510151169060a083015190823b1561032157613a61925f928360405180968195829463012c676d60e21b845260048401613869565b03925af1801561044157156138ba57613a7b919250611925565b5f905f6138ba565b6040519263a9059cbb60e01b5f526001600160a01b0380931660045260245260205f60448180855af160015f5114811615613add575b8360405215613ac757505050565b635274afe760e01b835216600482015260249150fd5b6001811516613af357813b15153d151616613ab9565b833d5f823e3d90fd5b9092604051936323b872dd60e01b5f526001600160a01b0393848092166004521660245260445260205f60648180855af160015f5114811615613b4c575b836040525f60605215613ac757505050565b6001811516613af357813b15153d151616613b3a565b909115613b6d575050565b6040516305dbdfd960e41b81526001600160a01b03918216600482015291166024820152604490fd5b93929193613ba383613521565b6136cd5784613bb7576137df9394506140a8565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f528152613824835f2054948561356b565b90929192613c0181614574565b93613c0b81613521565b613c545784816001600160e01b03613c2a9360e01d9116601b0b615199565b50809281613c3a575b5050509190565b6001600160a01b03613c4c9316613a83565b5f8181613c33565b604051632d1671a360e11b8152600490fd5b916040805191613c75836118a1565b60048084526020613c878186016124d9565b5f5b8751811015613cbc5780613c9f6001928a611dbe565b51613caa8289611dbe565b52613cb58188611dbe565b5001613c89565b5092955092939093335f52308352855f2091865190613cda826118ed565b613ce2612547565b8252606085819301528751613cf681611955565b5f8152885191613d0583611955565b5f83525f3681375f5b8151811015613e6b57613d218183611dbe565b5190888c8b84519189818401518d8d8251613d49575b50505050505050506001915001613d0e565b5f613db897948197948c9794613d768c956001600160a01b039d8e81818d51169c0151169b015190614251565b94865199613d838b611939565b8a528901528488015286015260808501528a60a08501528b60c08501525180958194829363d04dfe2360e01b84528301612de5565b03915afa938415613e61578b915f95613e43575b508451613de1575b50908b8e89838d8d613d37565b51015116803b1561032157613e10925f918c8f84905180978195829463012c676d60e21b845233908401613869565b03925af1918215613e3957600192613e2a575b8981613dd4565b613e3390611925565b5f613e23565b8c513d5f823e3d90fd5b613e589195503d805f833e6129c28183611971565b9050935f613dcc565b8e513d5f823e3d90fd5b5050505050505050509050565b8115613e82570490565b634e487b7160e01b5f52601260045260245ffd5b6040815110613ef2576020810151908051603f198101908111613ede5760051c8211613eca5760016020920160051b010190565b5050604051613ed881611955565b5f815290565b634e487b7160e01b5f52601160045260245ffd5b50604051613ed881611955565b805115613f0f57602001515f1a90565b505f90565b905f8091602081519101845af48080613f92575b15613f485750506040513d81523d5f602083013e60203d82010160405290565b15613f6f57604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b3d15613f80576040513d5f823e3d90fd5b60405163d6bda27560e01b8152600490fd5b503d151580613f285750813b1515613f28565b91613fd0906060613fc5936001600160a01b039485916040880151611dbe565b515116940151611dbe565b5151161461232557565b6140016001600160e01b0392838316601b0b9260e01d938160e01d9116601b0b84846147b0565b90637ffffff58213614051575b90614018916149f9565b9290921580614049575b61402b57505090565b6044925060405191638eba4d0760e01b835260048301526024820152fd5b508215614022565b61405b82826156c2565b1561400e57604483856040519163d556b11160e01b835260048301526024820152fd5b6119f491610af4916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614d9e565b9291926140b482614574565b936140be81613521565b61411f5784816001600160e01b036140dd9360e01d9116601b0b615199565b929080931561410a575b508290816140f6575050509190565b613c4c926001600160a01b03309216613afc565b9092505f198114613ede57600101915f6140e7565b604051632eaefac360e21b8152600490fd5b6004111561413b57565b634e487b7160e01b5f52602160045260245ffd5b602090939291936001600160a01b03604082019516815261416f83614131565b0152565b61417b6156db565b60408051630782d7e160e01b81526001600160a01b03831660048201529091828260248173200e12d10bb0c5e4a17e7018f0f1161919bb93895afa928315614248575f925f94614213575b506141d083614131565b600183141580614201575b6141e55750505090565b5163ee07877f60e01b815291829161059791906004840161414f565b5061420b83614131565b8215156141db565b908094506142379293503d8511614241575b61422f8183611971565b810190614f0d565b919091925f6141c6565b503d614225565b513d5f823e3d90fd5b61425b8251611e98565b6142658351611e98565b9282519281518015155f146144da57600201935b6001940184019061428982611a55565b956142a460409361429c8551998a611971565b808952611a55565b6142b6602091601f1901828a016124f5565b5f9584519389896002926002885233868901523089890152606097606081018a526142e084611d71565b526142ea83611d71565b505f825b61449a575b50505050865161430a575b50505050505050505090565b9091929360028861432d8c866143268e809c9d9e018093611dbe565b528d611dbe565b50018561433a828d611dbe565b52614345818c611dbe565b505f965b614354575b506142fe565b8851871015614495576001600160a01b03614400898b856143f78c60428c8861437d8488611dbe565b51511696858261438d868a611dbe565b5101519261439b868a611dbe565b51838d82511691015182815160051b910120908451927f6ec4dff745ec96dbde88c5d41f8aa5ac13aa1664afb47b8406b44fa945a650c88452830152838201522090519161190160f01b83528d83015260228201522093611dbe565b51015191614f65565b1561447d578761446c8b8e8c8f9e9d9c9b9a999897968f614459918d61444f898f8f61443b83889f614432828f611dbe565b51511692611dbe565b52614446828b611dbe565b51015192611dbe565b52019c8d94611dbe565b5101516144668383611dbe565b52611dbe565b500196979895909192939495614349565b8851630a57f30960e31b815260048101899052602490fd5b61434e565b9091929a82518210156144d257906144c684809301809d6144bb8487611dbe565b516144668383611dbe565b50019082918d936142ee565b9a92916142f3565b505f93614279565b916040830192604061451c610af4606087519401938451906001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6145f5565b9451930161452b8151866134fa565b614533575050565b9093506119f491925051925183613fda565b919291600160ff1b840161455d57611d4993506150c4565b90611d49935f0391614d9e565b61401882826149f9565b61457c6156db565b6040805163b7bad1b160e01b81526001600160a01b0383166004820152909182826024815f73200e12d10bb0c5e4a17e7018f0f1161919bb93895af1928315614248575f925f9461421357506141d083614131565b6008815110613f0f576008015167ffffffffffffffff1667ff0a89c674ee78741490565b9091939284158215175f1461460f5750505090505f905f90565b82810192600160fd1b8082019083011760fe1c614746575b505061463281615387565b9361463c81615387565b9461464786826153a7565b90918215614737575f9083986f0785ee10d5da46d900f436a000000000808611614729575b50670de0b6b3a7640000808b1161471a575b50633b9aca00808b1161470b575b50612710808b116146fd575b5098805b6146ec57508190611d49989982600a0a9109960195817fcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccd0a93838211900382610100031b9203901c1702916153ba565b60019290920191600a90048061469c565b60049a04998a930192614698565b600991939a049901915f61468c565b601291939a049901915f61467e565b85049950602592505f61466c565b50929050611d499495506153ba565b5f82121561479a5780841361478c575b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb284131561462757909250611d499394916152c5565b909250611d4993949161532c565b8084121561475657909250611d499394916152c5565b929091806147d6576044848460405191637a97930f60e01b835260048301526024820152fd5b90919280155f146147eb57505050505f905f90565b614804936147f891615474565b92919490938492615474565b909391928461481288615387565b9161481c86615387565b947f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000094604c918688106149c3575b030191600160ff1b98838a018112155f14614990575050035b5f955f821280614987575b614969575b5f811280614957575b6149395786820103966001600160ff1b038814908161492f575b5080614926575b8061491d575b6148ff5750906148b39291615620565b915f81136148c6575b50611d49936153ba565b9091604c82136148f4576148dd91600a0a90613e78565b9081156148ea575f6148bc565b505050505f905f90565b50505050505f905f90565b876044916040519163d556b11160e01b835260048301526024820152fd5b505f85126148a3565b5082841461489d565b905088145f614896565b604489836040519163d556b11160e01b835260048301526024820152fd5b50806001600160ff1b0301821361487c565b95508087018613156149815786818703015b95614873565b5f61497b565b505f811361486e565b89985090920390506001600160ff1b03819003870182136149b45701860194614863565b5050505050505050505f905f90565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009650604b925061484a565b8115613e82570590565b8082601b82810b8314614bee577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000008405614b9a575b8380820b03614b8957507b199999999999999999999999999999999999999999999999999999987b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc84011115614b3a575b838060030b03614abe575b808413614aa25750506001600160e01b036001925b60e01b91161791565b8303600a0a8015613e82576001600160e01b0391071592614a99565b92915f841315614b0e575090614ad483836156c2565b614af057637ffffffe1901600a0a810290637fffffff92614a84565b506044916040519163d556b11160e01b835260048301526024820152fd5b637fffffff1992830390604382136148f457614b2d91600a0a906149ef565b9182156148ea5792614a84565b5f198401808060030b14614b4e5750614a79565b90506001600160e01b039293507b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff915060e01b9260ff1d181617905f90565b600190940193600a90930592614a2c565b937f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000840515614bdb576305f5e100600894058094819201955b915050614a2c565b620186a060059405809481920195614bd3565b5082614a7957505050505f90600190565b919291600160ff1b9190801580614d8c575090614c1b91615474565b9490929091905f868585858282138015614d83575b614d66575b505050508682841860ff1c94860391039081604c038111614d4b5701600a0a808205919084614d31575b505081019182821860ff1c1115614d2957826001600160ff1b0314614d0b57905f600192135f14614cdc57600a9004915b01925b81158117614ca057509190565b80614cb9575b508015614cb1579190565b505f91508190565b9192614ccf9203600160ff1b01600a0a906149ef565b600160ff1b91905f614ca6565b600a60037fe6666666666666666666666666666666666666666666666666666666666666679201040191614c90565b604490836040519163d556b11160e01b835260048301526024820152fd5b509092614c93565b8107614d3e575b80614c5f565b60ff1d600117015f614d38565b505050919350614d59579190565b60018160ff1d1790039190565b5f9a50909750909550600160ff1b94509250905086808080614c35565b50835f12614c30565b15614d975750509190565b9350919050565b9392919384158115818117614eef57505090614db991615474565b9194908295614dca82958294615474565b8096929491969387868482138015614ee6575b614ecd575b5050505050508682841860ff1c94860391039081604c038111614d4b5701600a0a808205919084614eb3575b505081019182821860ff1c1115614eab57826001600160ff1b0314614d0b57905f600192135f14614e7c57600a9004915b01925b81158117614e4f57509190565b80614e5f57508015614cb1579190565b600160ff1b93614e769291038401600a0a906149ef565b5f614ca6565b600a60037fe6666666666666666666666666666666666666666666666666666666666666679201040191614e3f565b509092614e42565b8107614ec0575b80614e0e565b60ff1d600117015f614eba565b929b5098509196509450925090505f8080808080614de2565b50858412614ddd565b9395939092919015614f05575050614cb1579190565b945092915050565b919082604091031261032157815160048110156103215760209092015160ff811681036103215790565b9060ff165f03916001600160ff1b0382115f14614f5d57600a6001818404940192061590565b909190600190565b9091813b614fa057614f779192615744565b50614f8181614131565b159182614f8d57505090565b6001600160a01b03918216911614919050565b6020918160645f935160405192630b135d3f60e11b9788855260048501526040602485015286820190604485015e8281018201859052601f01601f191601915afa905f5114601f3d11161690565b92915f9060018184145f87128715171717615068575f9280821361505a575b03604c81135f82121761504e57600a0a908461502c83820293846149ef565b146150415750501561503d575f9190565b5f90565b90935090156119f4579190565b50501561503d575f9190565b5f956001945092509061500d565b5050505f90565b93929190918083145f83125f871218831587151717176150be575f928082136150b15703604c81135f82121761504e57600a0a908461502c83820293846149ef565b919460019350919061500d565b50919050565b909291600160ff1b91828101615156575080841461514c57808413918215615144578185035b604c8111156151335750505f915b1561512457507f8000000000000000000000000000000000000000000000000000000000000001019190565b92506001600160ff1b03039190565b600a0a908115613e825704916150f8565b8482036150ea565b505090505f905f90565b9361516392945f03614bff565b80939180928114615177575b50505f039190565b915092506001600160ff1b038314614d0b57600a600191059201915f8061516f565b91925f8312156151c1576044838360405191634a7d166b60e01b835260048301526024820152fd5b9192836151d357505090505f90600190565b60ff811682019180831261529b575f83121561520b575050604c198112614cb1575f03600a0a916152048382613e78565b9283021490565b909293915f81135f1461529157604d811361526657600a0a928315613e8257835f1904831161523d5750500290600190565b60405163c849483b60e01b815260048101849052602481019290925260ff166044820152606490fd5b5060405163c849483b60e01b81526004810192909252602482015260ff919091166044820152606490fd5b5050905090600190565b60405163c849483b60e01b815260048101869052602481019190915260ff82166044820152606490fd5b909392915f6152d59181846145f5565b9490945f8483019182019412159081615322575b8115615318575b506152fa57505090565b604492506040519163d556b11160e01b835260048301526024820152fd5b905083125f6152f0565b82811291506152e9565b61534193600160fe1b908101939201906145f5565b9081815f821215615378575050604b1982126137df57615366915f03600a0a906149ef565b9081615370575f90565b600160ff1b90565b93600160ff1b90910192509050565b5f8112156119f457600160ff1b908082036153a0575090565b90505f0390565b905f198183099102908180821091030391565b92939291905f818418121561544f576001600160ff1b03928383111561543957600160ff1b938385036153ef57505050509190565b90919293508514615409575050600a600191045f03920190565b604051630ed8062160e21b8152600481019190915260248101919091526044810182905260648101849052608490fd5b5090915050600160ff1b8114613ede575f039190565b90916001600160ff1b0380841115613c33578514615409575050600a60019104920190565b919091801561561657827f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000080830515615524575b507f19999999999999999999999999999999999999999999999999999999999999997f0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc830110615515575b83136154ff5791905f90565b919060018060ff1b926001600160ff1b03030190565b9290600a02905f1901926154f3565b6f4b3b4ca85a86c47a098a22400000000080840515615604575b507728c87cb5c89a2571ebfdcb54864ada834a000000000000008305156155ed575b7b097edd871cfda3a5697758bf0e3cbb5ac5741c6400000000000000008305156155d9575b7e3899162693736ac531a5a58f1fbb4b746504382ca7e40000000000000000008305156155c9578205156155ba575b5f6154a8565b9290600a02905f1901926155b4565b9391606402916001190193615585565b93916402540be40002916009190193615585565b9391678ac7230489e8000002916012190193615560565b6025198301955092909202915f61553e565b505f915081908190565b90915f19838309928083029283808610950394808603958487101561569e5714615696579082910960018219018216809204600280826003021880830282030280830282030280830282030280830282030280830282030280920290030293600183805f03040190848311900302920304170290565b505091500490565b60648386866040519263362ced0960e11b8452600484015260248301526044820152fd5b6119f491905f8112156156d6575f0361577e565b61577e565b73200e12d10bb0c5e4a17e7018f0f1161919bb9389803b158015615719575b6157015750565b602490604051906373e6d7b360e01b82526004820152fd5b507f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d41813f14156156fa565b81519190604183036157745761576d9250602082015190606060408401519301515f1a9061580d565b9192909190565b50505f9160029190565b90637ffffff581131561580757637ffffffe1981019060438213615800575f8212156157d457637fffffff91505f0301600a0a7b8000000000000000000000000000000000000000000000000000000202111590565b50600a0a8015613e82577b80000000000000000000000000000000000000000000000000000001041090565b5050151590565b50505f90565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411615884579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa15610441575f516001600160a01b0381161561587a57905f905f90565b505f906001905f90565b5050505f9160039190560000000000000000000000000000000000000000000000000000000000200e12d10bb0c5e4a17e7018f0f1161919bb93890000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000044b608060405234801561000f575f80fd5b506004361061004a575f3560e01c80630782d7e11461004e57806354636d2b14610078578063b7bad1b11461009d578063f5c36eaf146100b0575b5f80fd5b61006161005c366004610363565b6100c3565b60405161006f929190610403565b60405180910390f35b61008b610086366004610363565b6100d8565b60405160ff909116815260200161006f565b6100616100ab366004610363565b6100e9565b61008b6100be366004610363565b6100f5565b5f806100cf5f84610100565b91509150915091565b5f6100e35f836101f0565b92915050565b5f806100cf5f84610281565b5f6100e35f83610356565b73ffffffffffffffffffffffffffffffffffffffff81165f9081526020838152604080832081518083019092525460ff8082161515835261010090910416818301527f313ce56700000000000000000000000000000000000000000000000000000000808452839283908190816004818a5afa915060203d1015610182575f91505b811561019857505f5160ff811115610198575f91505b816101af57505050602001516003925090506101e9565b83516101c3575f955093506101e992505050565b836020015160ff1681146101d85760026101db565b60015b846020015195509550505050505b9250929050565b5f805f6101fd8585610281565b909250905060018260038111156102165761021661039d565b1415801561023557505f8260038111156102325761023261039d565b14155b156102795783826040517fee07877f000000000000000000000000000000000000000000000000000000008152600401610270929190610421565b60405180910390fd5b949350505050565b5f805f8061028f8686610100565b90925090505f8260038111156102a7576102a761039d565b0361034b576040805180820182526001815260ff838116602080840191825273ffffffffffffffffffffffffffffffffffffffff8a165f908152908b9052939093209151825493517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009094169015157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff161761010093909116929092029190911790555b909590945092505050565b5f805f6101fd8585610100565b5f60208284031215610373575f80fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114610396575f80fd5b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b600481106103ff577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b9052565b6040810161041182856103ca565b60ff831660208301529392505050565b73ffffffffffffffffffffffffffffffffffffffff831681526040810161039660208301846103ca560000000000000000000000000000000000000000000000000000000000000000006e2d0e71d900474b262e545bc4c98b71ab368d2100000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000003d486080604052600436106100d65760003560e01c80638456cb591161007f5780639a1f3406116100595780639a1f340614610200578063cd0fb7a714610220578063f2fde38b14610260578063fa461e331461028057600080fd5b80638456cb59146101ad5780638da5cb5b146101c257806393b3774c146101ed57600080fd5b80632c8958f6116100b05780632c8958f6146100f95780636b2ace871461013f578063715018a61461019857600080fd5b8063046f7da2146100e257806323a69e75146100f95780632646478b1461011957600080fd5b366100dd57005b600080fd5b3480156100ee57600080fd5b506100f76102a0565b005b34801561010557600080fd5b506100f7610114366004613579565b6103a8565b61012c6101273660046136f5565b6103ba565b6040519081526020015b60405180910390f35b34801561014b57600080fd5b506101737f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610136565b3480156101a457600080fd5b506100f7610564565b3480156101b957600080fd5b506100f7610578565b3480156101ce57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff16610173565b61012c6101fb36600461377c565b61067b565b34801561020c57600080fd5b506100f761021b36600461382f565b61089a565b34801561022c57600080fd5b5061025061023b366004613868565b60016020526000908152604090205460ff1681565b6040519015158152602001610136565b34801561026c57600080fd5b506100f761027b366004613868565b6108f8565b34801561028c57600080fd5b506100f761029b366004613579565b6109af565b60005473ffffffffffffffffffffffffffffffffffffffff163314806102d557503360009081526001602052604090205460ff165b610366576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f52503a2063616c6c6572206973206e6f7420746865206f776e6572206f72206160448201527f2070726976696c6567656420757365720000000000000000000000000000000060648201526084015b60405180910390fd5b600280547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff167501000000000000000000000000000000000000000000179055565b6103b4848484846109af565b50505050565b60025460009074010000000000000000000000000000000000000000900460ff16600114610444576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f526f75746550726f636573736f72206973206c6f636b65640000000000000000604482015260640161035d565b6002547501000000000000000000000000000000000000000000900460ff166001146104cc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f526f75746550726f636573736f72206973207061757365640000000000000000604482015260640161035d565b600280547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1674020000000000000000000000000000000000000000179055610519878787878787610b5d565b9050600280547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790559695505050505050565b61056c6111a3565b6105766000611224565b565b60005473ffffffffffffffffffffffffffffffffffffffff163314806105ad57503360009081526001602052604090205460ff165b610639576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f52503a2063616c6c6572206973206e6f7420746865206f776e6572206f72206160448201527f2070726976696c65676564207573657200000000000000000000000000000000606482015260840161035d565b600280547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff167502000000000000000000000000000000000000000000179055565b60025460009074010000000000000000000000000000000000000000900460ff16600114610705576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f526f75746550726f636573736f72206973206c6f636b65640000000000000000604482015260640161035d565b6002547501000000000000000000000000000000000000000000900460ff1660011461078d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f526f75746550726f636573736f72206973207061757365640000000000000000604482015260640161035d565b600280547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1674020000000000000000000000000000000000000000179055604051600090819073ffffffffffffffffffffffffffffffffffffffff8c16908b908381818185875af1925050503d8060008114610826576040519150601f19603f3d011682016040523d82523d6000602084013e61082b565b606091505b50915091508161083d57805181602001fd5b61084b898989898989610b5d565b92505050600280547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000017905598975050505050505050565b6108a26111a3565b73ffffffffffffffffffffffffffffffffffffffff91909116600090815260016020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b6109006111a3565b73ffffffffffffffffffffffffffffffffffffffff81166109a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161035d565b6109ac81611224565b50565b60025473ffffffffffffffffffffffffffffffffffffffff163314610a56576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f526f75746550726f636573736f722e756e697377617056335377617043616c6c60448201527f6261636b3a2063616c6c2066726f6d20756e6b6e6f776e20736f757263650000606482015260840161035d565b6000808513610a655783610a67565b845b905060008113610af9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f526f75746550726f636573736f722e756e697377617056335377617043616c6c60448201527f6261636b3a206e6f7420706f73697469766520616d6f756e7400000000000000606482015260840161035d565b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001660011790556000610b3283850185613868565b9050610b5573ffffffffffffffffffffffffffffffffffffffff82163384611299565b505050505050565b60008073ffffffffffffffffffffffffffffffffffffffff881673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14610c24576040517f70a0823100000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff8916906370a0823190602401602060405180830381865afa158015610bfb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c1f919061388c565b610c27565b60005b9050600073ffffffffffffffffffffffffffffffffffffffff871673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14610cf1576040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301528816906370a0823190602401602060405180830381865afa158015610cc8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cec919061388c565b610d0a565b8473ffffffffffffffffffffffffffffffffffffffff16315b905087600080610d2e87604080518082019091528181528151909101602082015290565b90505b805160208201511115610e84576000610d508280516001018051915290565b90508060ff1660011415610d7a576000610d6983611372565b905083610d74578094505b50610e73565b8060ff1660021415610d9557610d90828d611437565b610e73565b8060ff1660031415610dac576000610d6983611457565b8060ff1660041415610dc157610d908261147d565b8060ff1660051415610dd657610d90826114a3565b8060ff1660061415610dec57610d908d836115a8565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f526f75746550726f636573736f723a20556e6b6e6f776e20636f6d6d616e642060448201527f636f646500000000000000000000000000000000000000000000000000000000606482015260840161035d565b610e7c836138d4565b925050610d31565b506000905073ffffffffffffffffffffffffffffffffffffffff8b1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14610f4d576040517f70a0823100000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff8c16906370a0823190602401602060405180830381865afa158015610f24573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f48919061388c565b610f50565b60005b905083610f5d8b8361390d565b1015610feb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f526f75746550726f636573736f723a204d696e696d616c20696e70757420626160448201527f6c616e63652076696f6c6174696f6e0000000000000000000000000000000000606482015260840161035d565b600073ffffffffffffffffffffffffffffffffffffffff8a1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee146110b3576040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff89811660048301528b16906370a0823190602401602060405180830381865afa15801561108a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110ae919061388c565b6110cc565b8773ffffffffffffffffffffffffffffffffffffffff16315b90506110d8898561390d565b81101561111e576110e98482613925565b6040517f963b34a500000000000000000000000000000000000000000000000000000000815260040161035d91815260200190565b6111288482613925565b6040805173ffffffffffffffffffffffffffffffffffffffff8b81168252602082018790529181018c905260608101839052919750808c1691908e169033907f2db5ddd0b42bdbca0d69ea16f234a870a485854ae0d91f16643d6f317d8b89949060800160405180910390a450505050509695505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610576576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161035d565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905261136d9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915261163b565b505050565b6000806113858380516014018051915290565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290915073ffffffffffffffffffffffffffffffffffffffff8216906370a0823190602401602060405180830381865afa1580156113f2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611416919061388c565b91508115611425576001820391505b61143183308385611747565b50919050565b60006114498380516014018051915290565b905061136d83338385611747565b47611478823073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee84611747565b919050565b600061148f8280516014018051915290565b905061149f8260008360006117a2565b5050565b60006114b58280516014018051915290565b6040517ff7888aec00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff80831660048301523060248301529192506000917f0000000000000000000000000000000000000000000000000000000000000000169063f7888aec90604401602060405180830381865afa15801561154d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611571919061388c565b9050801561159c577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff015b61136d83308484611747565b60006115ba8280516020018051915290565b905060006115ce8380516020018051915290565b905060006115e28480516001018051915290565b905060006115f68580516020018051915290565b9050600061160a8680516020018051915290565b905061163273ffffffffffffffffffffffffffffffffffffffff8816333088888888886118d6565b50505050505050565b600061169d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16611b569092919063ffffffff16565b80519091501561136d57808060200190518101906116bb919061393c565b61136d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840161035d565b60006117598580516001018051915290565b905060005b8160ff16811015610b5557600061177b8780516002018051915290565b61ffff8082168602049485900394909150611798888888846117a2565b505060010161175e565b60006117b48580516001018051915290565b905060ff81166117cf576117ca85858585611b6d565b6118cf565b8060ff16600114156117e7576117ca85858585611f22565b8060ff16600214156117ff576117ca85858585612162565b8060ff1660031415611817576117ca85858585612410565b8060ff166004141561182f576117ca85858585612a98565b8060ff1660051415611847576117ca85858585612c26565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f526f75746550726f636573736f723a20556e6b6e6f776e20706f6f6c2074797060448201527f6500000000000000000000000000000000000000000000000000000000000000606482015260840161035d565b5050505050565b6040517f7ecebe0000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8881166004830152600091908a1690637ecebe0090602401602060405180830381865afa158015611946573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061196a919061388c565b6040517fd505accf00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a811660048301528981166024830152604482018990526064820188905260ff8716608483015260a4820186905260c48201859052919250908a169063d505accf9060e401600060405180830381600087803b158015611a0457600080fd5b505af1158015611a18573d6000803e3d6000fd5b50506040517f7ecebe0000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8b81166004830152600093508c169150637ecebe0090602401602060405180830381865afa158015611a8b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aaf919061388c565b9050611abc82600161390d565b8114611b4a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f5361666545524332303a207065726d697420646964206e6f742073756363656560448201527f6400000000000000000000000000000000000000000000000000000000000000606482015260840161035d565b50505050505050505050565b6060611b6584846000856131e1565b949350505050565b6000611b7f8580516014018051915290565b90506000611b938680516001018051915290565b90506000611ba78780516014018051915290565b90506000611bbb8880516003018051915290565b905073ffffffffffffffffffffffffffffffffffffffff8716301415611c0157611bfc73ffffffffffffffffffffffffffffffffffffffff87168587611299565b611c41565b73ffffffffffffffffffffffffffffffffffffffff8716331415611c4157611c4173ffffffffffffffffffffffffffffffffffffffff87163386886132fa565b6000808573ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015611c8f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cb39190613977565b506dffffffffffffffffffffffffffff1691506dffffffffffffffffffffffffffff169150600082118015611ce85750600081115b611d4e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f57726f6e6720706f6f6c20726573657276657300000000000000000000000000604482015260640161035d565b6000808660ff16600114611d63578284611d66565b83835b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8b8116600483015292945090925083918c16906370a0823190602401602060405180830381865afa158015611dda573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dfe919061388c565b611e089190613925565b98506000611e1986620f42406139c7565b611e289062ffffff168b6139eb565b9050600081611e3a85620f42406139eb565b611e44919061390d565b611e4e84846139eb565b611e589190613a28565b90506000808a60ff16600114611e7057826000611e74565b6000835b604080516000815260208101918290527f022c0d9f00000000000000000000000000000000000000000000000000000000909152919350915073ffffffffffffffffffffffffffffffffffffffff8d169063022c0d9f90611ede90859085908f9060248101613ad9565b600060405180830381600087803b158015611ef857600080fd5b505af1158015611f0c573d6000803e3d6000fd5b5050505050505050505050505050505050505050565b6000611f348580516014018051915290565b9050600080611f498780516001018051915290565b60ff161190506000611f618780516014018051915290565b905073ffffffffffffffffffffffffffffffffffffffff8616331415611fa357611fa373ffffffffffffffffffffffffffffffffffffffff86163330876132fa565b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff851690811790915563128acb088284878161201757612012600173fffd8963efd1fc6a506488495d951d5263988d26613b14565b612027565b6120276401000276a36001613b41565b6040805173ffffffffffffffffffffffffffffffffffffffff8d166020820152016040516020818303038152906040526040518663ffffffff1660e01b8152600401612077959493929190613b79565b60408051808303816000875af1158015612095573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120b99190613bc0565b505060025473ffffffffffffffffffffffffffffffffffffffff16600114611632576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f526f75746550726f636573736f722e73776170556e6956333a20756e6578706560448201527f6374656400000000000000000000000000000000000000000000000000000000606482015260840161035d565b60006121748580516001018051915290565b905060006121888680516014018051915290565b9050600180831614156122575760006121a78780516014018051915290565b905060028316612213578073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b1580156121f957600080fd5b505af115801561220d573d6000803e3d6000fd5b50505050505b73ffffffffffffffffffffffffffffffffffffffff821630146122515761225173ffffffffffffffffffffffffffffffffffffffff82168386611299565b50610b55565b600282166123205773ffffffffffffffffffffffffffffffffffffffff851633141561229f5761229f73ffffffffffffffffffffffffffffffffffffffff85163330866132fa565b6040517f2e1a7d4d0000000000000000000000000000000000000000000000000000000081526004810184905273ffffffffffffffffffffffffffffffffffffffff851690632e1a7d4d90602401600060405180830381600087803b15801561230757600080fd5b505af115801561231b573d6000803e3d6000fd5b505050505b60008173ffffffffffffffffffffffffffffffffffffffff168460405160006040518083038185875af1925050503d806000811461237a576040519150601f19603f3d011682016040523d82523d6000602084013e61237f565b606091505b5050905080611632576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f526f75746550726f636573736f722e777261704e61746976653a204e6174697660448201527f6520746f6b656e207472616e73666572206661696c6564000000000000000000606482015260840161035d565b60006124228580516001018051915290565b905060006124368680516014018051915290565b905060ff8216156128315773ffffffffffffffffffffffffffffffffffffffff85163014156124a5576124a073ffffffffffffffffffffffffffffffffffffffff85167f000000000000000000000000000000000000000000000000000000000000000085611299565b61275b565b73ffffffffffffffffffffffffffffffffffffffff8516331415612505576124a073ffffffffffffffffffffffffffffffffffffffff8516337f0000000000000000000000000000000000000000000000000000000000000000866132fa565b6040517f4ffe34db00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85811660048301527f00000000000000000000000000000000000000000000000000000000000000001690634ffe34db906024016040805180830381865afa158015612590573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125b49190613c04565b516040517fdf23b45b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301526fffffffffffffffffffffffffffffffff909216917f0000000000000000000000000000000000000000000000000000000000000000169063df23b45b90602401606060405180830381865afa158015612656573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061267a9190613c77565b60409081015190517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811660048301526fffffffffffffffffffffffffffffffff909216918716906370a0823190602401602060405180830381865afa158015612720573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612744919061388c565b61274e919061390d565b6127589190613925565b92505b6040517f02b9446c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85811660048301527f000000000000000000000000000000000000000000000000000000000000000081166024830181905290831660448301526064820185905260006084830152906302b9446c9060a40160408051808303816000875af1158015612806573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061282a9190613bc0565b5050610b55565b73ffffffffffffffffffffffffffffffffffffffff851615612908576040517ff18d03cc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85811660048301528681166024830152306044830152606482018590527f0000000000000000000000000000000000000000000000000000000000000000169063f18d03cc90608401600060405180830381600087803b1580156128eb57600080fd5b505af11580156128ff573d6000803e3d6000fd5b505050506129c1565b6040517ff7888aec00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85811660048301523060248301527f0000000000000000000000000000000000000000000000000000000000000000169063f7888aec90604401602060405180830381865afa15801561299a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129be919061388c565b92505b6040517f97da6d3000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152306024830152828116604483015260006064830152608482018590527f000000000000000000000000000000000000000000000000000000000000000016906397da6d309060a40160408051808303816000875af1158015612a6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a8e9190613bc0565b5050505050505050565b6000612aaa8580516014018051915290565b85516020808201805190920101875290915073ffffffffffffffffffffffffffffffffffffffff851615612b91576040517ff18d03cc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff858116600483015286811660248301528381166044830152606482018590527f0000000000000000000000000000000000000000000000000000000000000000169063f18d03cc90608401600060405180830381600087803b158015612b7857600080fd5b505af1158015612b8c573d6000803e3d6000fd5b505050505b6040517f627dd56a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83169063627dd56a90612be3908490600401613ce3565b6020604051808303816000875af1158015612c02573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611632919061388c565b6000612c388580516014018051915290565b90506000612c4c8680516001018051915290565b90506000612c608780516001018051915290565b60000b90506000612c778880516001018051915290565b60000b90506000612c8e8980516014018051915290565b90506000612ca28a80516014018051915290565b9050600073ffffffffffffffffffffffffffffffffffffffff891673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1415612d8b576040517f3df02124000000000000000000000000000000000000000000000000000000008152600f86810b600483015285900b6024820152604481018990526000606482015273ffffffffffffffffffffffffffffffffffffffff881690633df02124908a9060840160206040518083038185885af1158015612d5f573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612d84919061388c565b905061306e565b73ffffffffffffffffffffffffffffffffffffffff8a16331415612dcb57612dcb73ffffffffffffffffffffffffffffffffffffffff8a1633308b6132fa565b612dec73ffffffffffffffffffffffffffffffffffffffff8a16888a613358565b5060ff8616612e9f576040517f3df02124000000000000000000000000000000000000000000000000000000008152600f86810b600483015285900b6024820152604481018990526000606482015273ffffffffffffffffffffffffffffffffffffffff881690633df02124906084016020604051808303816000875af1158015612e7b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d84919061388c565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8416906370a0823190602401602060405180830381865afa158015612f0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f30919061388c565b6040517f3df02124000000000000000000000000000000000000000000000000000000008152600f88810b600483015287900b6024820152604481018b90526000606482015290915073ffffffffffffffffffffffffffffffffffffffff891690633df0212490608401600060405180830381600087803b158015612fb457600080fd5b505af1158015612fc8573d6000803e3d6000fd5b50506040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000925073ffffffffffffffffffffffffffffffffffffffff861691506370a0823190602401602060405180830381865afa158015613039573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061305d919061388c565b90506130698282613925565b925050505b73ffffffffffffffffffffffffffffffffffffffff831630146131d45773ffffffffffffffffffffffffffffffffffffffff821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14156131b35760008373ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114613117576040519150601f19603f3d011682016040523d82523d6000602084013e61311c565b606091505b50509050806131ad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f526f75746550726f636573736f722e7377617043757276653a204e617469766560448201527f20746f6b656e207472616e73666572206661696c656400000000000000000000606482015260840161035d565b506131d4565b6131d473ffffffffffffffffffffffffffffffffffffffff83168483611299565b5050505050505050505050565b606082471015613273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c0000000000000000000000000000000000000000000000000000606482015260840161035d565b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161329c9190613cf6565b60006040518083038185875af1925050503d80600081146132d9576040519150601f19603f3d011682016040523d82523d6000602084013e6132de565b606091505b50915091506132ef87838387613389565b979650505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526103b49085907f23b872dd00000000000000000000000000000000000000000000000000000000906084016112eb565b6000613365848484613426565b80611b65575061337784846000613426565b8015611b655750611b65848484613426565b6060831561341c5782516134155773ffffffffffffffffffffffffffffffffffffffff85163b613415576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161035d565b5081611b65565b611b658383613535565b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f095ea7b300000000000000000000000000000000000000000000000000000000179052915160009283928392918816916134bf9190613cf6565b6000604051808303816000865af19150503d80600081146134fc576040519150601f19603f3d011682016040523d82523d6000602084013e613501565b606091505b509150915081801561352b57508051158061352b57508080602001905181019061352b919061393c565b9695505050505050565b8151156135455781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161035d9190613ce3565b6000806000806060858703121561358f57600080fd5b8435935060208501359250604085013567ffffffffffffffff808211156135b557600080fd5b818701915087601f8301126135c957600080fd5b8135818111156135d857600080fd5b8860208285010111156135ea57600080fd5b95989497505060200194505050565b73ffffffffffffffffffffffffffffffffffffffff811681146109ac57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f83011261365b57600080fd5b813567ffffffffffffffff808211156136765761367661361b565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156136bc576136bc61361b565b816040528381528660208588010111156136d557600080fd5b836020870160208301376000602085830101528094505050505092915050565b60008060008060008060c0878903121561370e57600080fd5b8635613719816135f9565b9550602087013594506040870135613730816135f9565b9350606087013592506080870135613747816135f9565b915060a087013567ffffffffffffffff81111561376357600080fd5b61376f89828a0161364a565b9150509295509295509295565b600080600080600080600080610100898b03121561379957600080fd5b88356137a4816135f9565b97506020890135965060408901356137bb816135f9565b95506060890135945060808901356137d2816135f9565b935060a0890135925060c08901356137e9816135f9565b915060e089013567ffffffffffffffff81111561380557600080fd5b6138118b828c0161364a565b9150509295985092959890939650565b80151581146109ac57600080fd5b6000806040838503121561384257600080fd5b823561384d816135f9565b9150602083013561385d81613821565b809150509250929050565b60006020828403121561387a57600080fd5b8135613885816135f9565b9392505050565b60006020828403121561389e57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613906576139066138a5565b5060010190565b60008219821115613920576139206138a5565b500190565b600082821015613937576139376138a5565b500390565b60006020828403121561394e57600080fd5b815161388581613821565b80516dffffffffffffffffffffffffffff8116811461147857600080fd5b60008060006060848603121561398c57600080fd5b61399584613959565b92506139a360208501613959565b9150604084015163ffffffff811681146139bc57600080fd5b809150509250925092565b600062ffffff838116908316818110156139e3576139e36138a5565b039392505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613a2357613a236138a5565b500290565b600082613a5e577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60005b83811015613a7e578181015183820152602001613a66565b838111156103b45750506000910152565b60008151808452613aa7816020860160208601613a63565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b84815283602082015273ffffffffffffffffffffffffffffffffffffffff8316604082015260806060820152600061352b6080830184613a8f565b600073ffffffffffffffffffffffffffffffffffffffff838116908316818110156139e3576139e36138a5565b600073ffffffffffffffffffffffffffffffffffffffff808316818516808303821115613b7057613b706138a5565b01949350505050565b600073ffffffffffffffffffffffffffffffffffffffff8088168352861515602084015285604084015280851660608401525060a060808301526132ef60a0830184613a8f565b60008060408385031215613bd357600080fd5b505080516020909101519092909150565b80516fffffffffffffffffffffffffffffffff8116811461147857600080fd5b600060408284031215613c1657600080fd5b6040516040810181811067ffffffffffffffff82111715613c3957613c3961361b565b604052613c4583613be4565b8152613c5360208401613be4565b60208201529392505050565b805167ffffffffffffffff8116811461147857600080fd5b600060608284031215613c8957600080fd5b6040516060810181811067ffffffffffffffff82111715613cac57613cac61361b565b604052613cb883613c5f565b8152613cc660208401613c5f565b6020820152613cd760408401613be4565b60408201529392505050565b6020815260006138856020830184613a8f565b60008251613d08818460208701613a63565b919091019291505056fea26469706673582212201ff294929b57776d43429e47ba13e7bb550e4a27be6afbadf8c8a0d6ad6324b364736f6c634300080a0033000000000000000000000000000000000000000000000000"; + hex"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000059600000000000000000000000000000000000000000000000000000000000005e20000000000000000000000000531167691b4f37f0266e226d03412c77fb2977ce0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000588e6080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a71461180e575080632cb77e9f146117e257806341d1514f146117ab5780635343c1b7146117105780635cffe9de146115b45780635d003c4414611430578063613255ab146113ad578063687cf02a14611096578063ac9650d814610f48578063b0460f07146105f3578063b845b83e1461059b578063ca9109ba1461044c578063d9d98ce41461039b578063ddebc96f146103475763df6db3c2146100c1575f80fd5b34610321576003196040368201126103215767ffffffffffffffff9060043582811161032157806004019160a0823603918201126103215760243584811161032157610111903690600401611cd0565b909361011b612bf0565b5f946001600160a01b039485610130846125d7565b163303610325576101496101443685611b02565b612c32565b805f525f60205260405f20966001885414610190575b60208960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556040519015158152f35b9091929394959697505f600198556040519633885282602089015260606040890152816101bc8761188d565b166060890152602484013590606219018112156103215783019060a06080890152806101ea6004840161188d565b166101008901526101fd6024830161188d565b16610120880152604481013560221982360301811215610321570190602460048301359201988211610321578136038913610321577f09d18501db0080ca2d6cd7c17fa7255daff4b2d503ea93b76ff68b6752ea8e6387806103069560846102c561030e9a60209f610284906103149f9a60606101406102ef9d0152610160880191612388565b6102b66102ab61029760448801856129db565b605f198a8603810160a08c01529491612a10565b9260648701906129db565b918784030160c0880152612a10565b91013560e08301520390a13390919060405192600284526020840152604083015260608201604052565b906040519160018352602083015260408201604052565b9236916123a8565b90613c65565b5f8080808080808061015f565b5f80fd5b602486610331856125d7565b6040516335252be360e01b815291166004820152fd5b3461032157600319602036820112610321576004359067ffffffffffffffff82116103215760809082360301126103215761038660609160040161262b565b90604051921515835260208301526040820152f35b34610321576040366003190112610321576001600160a01b036103bc611861565b166040516370a0823160e01b8152306004820152602081602481855afa908115610441575f9161040f575b50156103f75760206040515f8152f35b60249060405190633c5bf76960e21b82526004820152fd5b90506020813d602011610439575b8161042a60209383611971565b810103126103215751826103e7565b3d915061041d565b6040513d5f823e3d90fd5b346103215761045a36611d01565b92809492610466612bf0565b610471828533613b61565b61047a816134d6565b15610567578061048e6104dd9286336140a7565b9790957f7f9dfa19cf1cc2f806f2f860fbc9c056b601fb1afc0e9b843dfe5c63616268e660806040513381526001600160a01b038416998a60208301528560408301526060820152a1336137bd565b9390918561050c575b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b61055b9661030e956103069460ff93604051956005875260208701526040860152606085015260808401521660a082015260c08101604052906040519160018352602083015260408201604052565b808080808080806104e6565b506040516306dde9c360e41b81523360048201526001600160a01b03841660248201526044810191909152606490fd5b0390fd5b346103215760203660031901126103215760043567ffffffffffffffff81116103215761030e6105d26104e6923690600401611cd0565b91906105dc612bf0565b604051926105e984611955565b5f845236916123a8565b34610321576003196020368201126103215767ffffffffffffffff600435116103215760c090600435360301126103215761062c612bf0565b5f808061064160048035608481019101612510565b905015610f36576024600435013592610659846134d6565b15610f245760608060405161066d81611909565b610675612565565b81525f60208201525f6040820152015261068d612565565b506106ed6106e86106c76106bd6106b76106b1608460043501600435600401612510565b90612597565b806125b2565b60408101906124a2565b60206106e06106b1608460043501600435600401612510565b0135916125c7565b6125d7565b936001600160a01b0361073c6106e86107236107196106b76106b1608460043501600435600401612510565b60608101906124a2565b60406106e06106b1608460043501600435600401612510565b816040519761074a896118d1565b168752166020860152604085015261076c608460043501600435600401612510565b9490506001604051955f87520160051b85016040525f905f5b610799608460043501600435600401612510565b9050811080610f11575b15610d5e576107bc608460043501600435600401612510565b821015610d4a578160051b810135607e198236030181121561032157608081830136031261032157604051916107f183611909565b8181013567ffffffffffffffff81116103215761081390369084840101611b02565b835280820160208181013590850152604080820135908501526060013567ffffffffffffffff81116103215761084c9236920101611cb5565b606082015280516001600160a01b0361086e6040830151602085015190611dbe565b5151166001600160a01b0385511614801590610d16575b610d045761089d602083015160408401519083613fa4565b6108a681612c32565b91825f525f60205260405f2054155f1461090a575051604080513381526001600160a01b039092166020830152810191909152600191907fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f390606090a15b01610785565b919061093b60208497959701516040850151906060860151906040519261093084611955565b5f8452339186613234565b5f94916109a457505051604080513381526001600160a01b03909216602083015281019190915260019291907f1e6fa9678edf81f9f25bbf308bde03ad3e110db1f429394b0915ba021532941490606090a15b811561099c575b5092610904565b905088610995565b6109b9606082015160446004350135906134f9565b15610a1357505051604080513381526001600160a01b03909216602083015281019190915260019291907fe3151dc8cb7a54ffc4baabd28c1f241c94d510b5e5b502491ac3cad6c16316d59080606081015b0390a161098e565b610a2060408201516134d6565b158015610cf1575b15610a7e57505051604080513381526001600160a01b03909216602083015281019190915260019291907f500b713857325f9e6dcb52ae832eca9109d107ed1aae9cb4928b4c1e13f051aa908060608101610a0b565b9250925050600196959691610a976064600435016125eb565b15610c5e5796610b0797610b1760408401516040880151610ab88183613543565b15610c565750925b610b11848592610afa610af460608a01516001600160e01b03601b918660e01d92828816810b928260e01d9216900b6145f4565b90614569565b9d8e9260408d015161356a565b60408c015261407d565b9961407d565b98610b228484613594565b610b2c84826135f2565b60405192338452608060208501526060610b528451608080880152610100870190611e19565b93602081015160a0870152604081015160c0870152015192607f198582030160e0860152835180825260208201906020808260051b8501019601925f5b828110610bee57505050505092806001979695937fbae4dbf76931c547f765e9def16d693d86daaa596f491de979008831789185ae93610be996604084015260608301520390a180858c5101808d5260051b8c01526138a9565b61098e565b9091929396602080610c49600193601f198782030189528b51906001600160a01b03825116815283820151848201526060610c3860408401516080604085015260808401906125f8565b920151906060818403910152611d4d565b9901950193929101610b8f565b905092610ac0565b610b0790610b176060840151610b11610c9c610af460408801516001600160e01b0394601b90868360e01d9316820b91878260e01d9216900b6145f4565b60408a0151610cab8183613543565b15610ce95750915b829c8d916060890151908116155f14610cda575060408801515b96879460408d015161356a565b610ce49085613fd9565b610ccd565b905091610cb3565b50610cff6060820151613520565b610a28565b60405163936bb5ad60e01b8152600490fd5b506001600160a01b03610d326060830151604085015190611dbe565b5151166001600160a01b036020860151161415610885565b634e487b7160e01b5f52603260045260245ffd5b50919390610d706064600435016125eb565b15610f0b57835b6004356004013590610d898282613543565b610eed5750508490610da9856001600160a01b0360208701511633613bf3565b505060a46004350190610dc18260043560040161246f565b905015159081610ee5575b50610e44575b506001600160a01b03610de892935116336140a7565b50505b8351811015610e105780610e0a610e0460019387611dbe565b5161371d565b01610deb565b5060409160017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005582519182526020820152f35b90506001600160a01b03602084015116610e6e6001600160a01b038551169260043560040161246f565b929091333b1561032157610eb65f93604051958694859463691f9ed760e01b8652600486015260248501528960448501528a606485015260a0608485015260a4840191612388565b038183335af190811561044157859115610dd2579050610ed69150611925565b5f836001600160a01b03610dd2565b905088610dcc565b604492506040519163573b6f4160e01b835260048301526024820152fd5b84610d77565b50610f1f60408301516134d6565b6107a3565b60405163315f9e2360e21b8152600490fd5b604051639c95219f60e01b8152600490fd5b34610321576020806003193601126103215760043567ffffffffffffffff811161032157610f7a903690600401611cd0565b919060405192610f8984611955565b5f8452828401610f9882611a55565b94610fa66040519687611971565b828652610fb283611a55565b93610fc486880195601f1901866124f4565b5f5b84811061102857604080518881528951818a018190525f92600582901b83018101918a918c9085015b828710610ffc5785850386f35b909192938280611018600193603f198a82030186528851611d4d565b9601920196019592919092610fef565b806110778861107161104460019560059d9c9d1b87018761246f565b929089846040519586938585013782018381015f81528b519283915e015f83820152038084520182611971565b30613f13565b611081828a611dbe565b5261108c8189611dbe565b5001969596610fc6565b34610321576003196040368201126103215760043567ffffffffffffffff8082116103215760c08260040193833603011261032157602435908111610321576110e3903690600401611cd0565b906110ec612bf0565b61111d61111861111361110c611102888061245a565b604081019061246f565b3691611993565b613e95565b613efe565b801561139b5760011015611389576024830161113981866124a2565b90501561137757604484019461114f86826124a2565b905015611365576111b561117d966111a961117461116d858061245a565b95856124a2565b999092856124a2565b91909261119a60405197611190896118a1565b33895236906119f7565b9a60209b8c8901523691611a6d565b60408601523691611a6d565b6060830152606485013560808301526111cd82612c32565b91825f525f875260405f20958654159687611211575b888860017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055604051908152f35b6001905560a46001600160a01b03917f87491344dfbcf91f6cbbc610cbbeedc85313d37a02df0c93527f7ea5f8db717f83855116604051908152878c82015260606040820152806112656060820188611e19565b0390a10191611274838561246f565b90506112b9575b505050506112ad92916103066102ef61030e933390919060405192600284526020840152604083015260608201604052565b828080808080806111e3565b6112c661110c848661246f565b6112cf816145d0565b156113425750937fd46c2c56b35c8210e9e712ec3f02242d5fc90187c0ac8ed80cc33626846ec369896112ad989795611335611318610306976102ef9761030e9b51169361246f565b866040519586958652850152606060408501526060840191612388565b0390a1938395965061127b565b89610597604051928392630c89984b60e31b845260048401526024830190611d4d565b60405163540e5f0b60e01b8152600490fd5b604051636c44ef8f60e01b8152600490fd5b604051633c8270bd60e21b8152600490fd5b604051632cff108b60e21b8152600490fd5b3461032157602080600319360112610321576024816001600160a01b036113d2611861565b16604051928380926370a0823160e01b82523060048301525afa908115610441575f91611403575b50604051908152f35b90508181813d8311611429575b61141a8183611971565b810103126103215751826113fa565b503d611410565b346103215761143e36611d01565b929161144b949194612bf0565b611456838333613b61565b61145f816134d6565b15611583578160ff916114778561153a969533612a60565b6114818183613543565b1561157d575080935b61149685828533613b95565b917f8045c25080b0868951141ed0a91720bcad09a8364a2b3109ee1fd49c1f0bc8b860c06114c5898833613bf3565b97906001600160a01b0360405192338452169a8b6020840152856040840152886060840152608083015260a0820152a16040519660068852602088015260408701526060860152608085015260a08401521660c082015260e08101604052906040519160018352602083015260408201604052565b90806115665760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b6115759261030e9136916123a8565b8080806104e6565b9361148a565b50604051623a3a4d60e21b81523360048201526001600160a01b039190911660248201526044810191909152606490fd5b34610321576080366003190112610321576004356001600160a01b0390818116809103610321576115e3611877565b6044359167ffffffffffffffff91606435838111610321573660238201121561032157806004013593841161032157366024858301011161032157611670956020921693611632868587613a82565b60405196879283926323e30c8b60e01b84523360048501528760248501528860448501525f606485015260a06084850152602460a485019201612388565b03815f855af1938415610441575f946116dc575b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd984036116c3576116b893503091613afb565b602060405160018152f35b604051630b6c58a960e31b815260048101859052602490fd5b9093506020813d602011611708575b816116f860209383611971565b8101031261032157519284611684565b3d91506116eb565b34610321576101403660031901126103215767ffffffffffffffff60043581811161032157611743903690600401611b02565b6024358281116103215761175b903690600401611b02565b60c0366043190112610321576101043583811161032157611780903690600401611cb5565b90610124359384116103215761179d6104e6943690600401611cb5565b926117a6612bf0565b611eca565b346103215760603660031901126103215760206117da6117c9611861565b6117d1611877565b60443591612a60565b604051908152f35b34610321576020366003190112610321576004355f525f6020526020600160405f205414604051908152f35b34610321576020366003190112610321576004359063ffffffff60e01b82168092036103215760209163e414309160e01b8114908115611850575b5015158152f35b6301ffc9a760e01b14905083611849565b600435906001600160a01b038216820361032157565b602435906001600160a01b038216820361032157565b35906001600160a01b038216820361032157565b60a0810190811067ffffffffffffffff8211176118bd57604052565b634e487b7160e01b5f52604160045260245ffd5b6060810190811067ffffffffffffffff8211176118bd57604052565b6040810190811067ffffffffffffffff8211176118bd57604052565b6080810190811067ffffffffffffffff8211176118bd57604052565b67ffffffffffffffff81116118bd57604052565b60e0810190811067ffffffffffffffff8211176118bd57604052565b6020810190811067ffffffffffffffff8211176118bd57604052565b90601f8019910116810190811067ffffffffffffffff8211176118bd57604052565b92919267ffffffffffffffff82116118bd57604051916119bd601f8201601f191660200184611971565b829481845281830111610321578281602093845f960137010152565b9080601f83011215610321578160206119f493359101611993565b90565b91906060838203126103215760405190611a10826118d1565b8193611a1b8161188d565b8352611a296020820161188d565b602084015260408101359167ffffffffffffffff831161032157604092611a5092016119d9565b910152565b67ffffffffffffffff81116118bd5760051b60200190565b929192611a7982611a55565b604092611a896040519283611971565b819581835260208093019160061b84019381851161032157915b848310611ab257505050505050565b8583830312610321578386918251611ac9816118ed565b611ad28661188d565b81528286013583820152815201920191611aa3565b9080601f83011215610321578160206119f493359101611a6d565b91909160a0818403126103215760405190611b1c826118a1565b8193611b278261188d565b835267ffffffffffffffff9160208101358381116103215782611b4b9183016119f7565b602085015260408101358381116103215782611b68918301611ae7565b6040850152606081013592831161032157611b896080939284938301611ae7565b60608501520135910152565b90929192611ba281611a55565b91604094611bb36040519485611971565b839583855260208095019160059460051b8401948186116103215784935b868510611be2575050505050505050565b67ffffffffffffffff90853582811161032157870190608082860312610321578551611c0d81611909565b611c168361188d565b81528a8301358b8201528683013584811161032157830186601f8201121561032157803590611c4482611a55565b91611c518a519384611971565b8083528d80840191891b83010191898311610321578e809101915b838310611ca557505050508782015260608084013594851161032157611c96878d968796016119d9565b90820152815201940193611bd1565b82358152918101918f9101611c6c565b9080601f83011215610321578160206119f493359101611b95565b9181601f840112156103215782359167ffffffffffffffff8311610321576020808501948460051b01011161032157565b906080600319830112610321576004356001600160a01b0381168103610321579160243591604435916064359067ffffffffffffffff821161032157611d4991600401611cd0565b9091565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b805115610d4a5760200190565b805160011015610d4a5760400190565b805160021015610d4a5760600190565b805160031015610d4a5760800190565b805160041015610d4a5760a00190565b8051821015610d4a5760209160051b010190565b9081518082526020808093019301915f5b828110611df1575050505090565b835180516001600160a01b031686528201518583015260409094019392810192600101611de3565b90608080611e8f611e7d611e6b60406001600160a01b0380895116885260208901519060a060208a01528082511660a08a015260208201511660c08901520151606060e0880152610100870190611d4d565b60408701518682036040880152611dd2565b60608601518582036060870152611dd2565b93015191015290565b90611ea282611a55565b611eaf6040519182611971565b8281528092611ec0601f1991611a55565b0190602036910137565b926001600160a01b038451166001600160a01b0383511614612376576001600160a01b03611eff606086015160643590611dbe565b515116906040830151916001600160a01b03611f1e6084358095611dbe565b51511614801590612336575b610d04576040850151906001600160a01b03611f496044358094611dbe565b5151166001600160a01b03611f6460643560608a0151611dbe565b5151161461232457611f7586612c32565b805f525f60205260405f2054156122d15750611f9084612c32565b805f525f60205260405f20541561227d5750612075929161204d917f6fa7f4c28634b0a9d6831401c45ae468195fb63aed07308935c35374ff5d9e3960405180611ff8611fea61012033845280602085015283018d611e19565b82810360408401528a611e19565b85606083015260643560808301528760a083015260a43560c083015260c43560e083015260e4356101008301520390a16001600160a01b038651166040519261204084611955565b5f8452606435908a612e9c565b9490506001600160a01b038651166040519261206884611955565b5f845260a4359086612e9c565b92905061208560408201516134d6565b158015612269575b8015612256575b8015612243575b61223157604051916120ac83611909565b5f83525f60208401525f60408401525f60608401526120cb84836144e1565b845260408401526120f16120df83866144e1565b6020860152806060860152845161356a565b94612105602085015160408601519061356a565b9361210f87613520565b8015612222575b612210576121d7612209957fd9fa84dd790c969daa5c33d8050dc06b4a9b59d5b42e2be5f5e8ae20447f618d946121b961220e9a60a0966121588a8851613594565b6121668c6020890151613594565b6121748a60408901516135f2565b6121828c60608901516135f2565b61218b8a61371d565b6121948c61371d565b6001600160a01b036121b060c435926060606435910151611dbe565b515116336137bd565b50506001600160a01b036121b060e43592606060a435910151611dbe565b5050606060405191338352805160208401526020810151604084015260408101518284015201516080820152a16138a9565b6138a9565b565b604051630d86822160e01b8152600490fd5b5061222c85613520565b612116565b6040516321badf1f60e01b8152600490fd5b506122516060840151613520565b61209b565b506122646060820151613520565b612094565b5061227760408401516134d6565b1561208d565b9351604080513381526001600160a01b039092166020830152810194909452507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f3945091925082915050606081015b0390a1565b9551604080513381526001600160a01b039092166020830152810196909652507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f3949350839250506060820190506122cc565b604051631cd2f1c760e21b8152600490fd5b506001600160a01b03612350606085015160a43590611dbe565b5151166001600160a01b0361236c604088015160443590611dbe565b5151161415611f2a565b604051630a98f1f360e21b8152600490fd5b908060209392818452848401375f828201840152601f01601f1916010190565b909291926123b581611a55565b916040916123c66040519485611971565b839581855260208095019160051b8301938185116103215783925b8584106123f15750505050505050565b67ffffffffffffffff90843582811161032157860190838286031261032157835161241b816118ed565b823584811161032157866124309185016119f7565b8152898301359384116103215761244b868b95869501611cb5565b838201528152019301926123e1565b903590605e1981360301821215610321570190565b903590601e1981360301821215610321570180359067ffffffffffffffff82116103215760200191813603831361032157565b903590601e1981360301821215610321570180359067ffffffffffffffff821161032157602001918160061b3603831361032157565b5f5b608081106124e6575050565b6060828201526020016124da565b5f5b82811061250257505050565b6060828201526020016124f6565b903590601e1981360301821215610321570180359067ffffffffffffffff821161032157602001918160051b3603831361032157565b60405190612553826118d1565b60606040835f81525f60208201520152565b60405190612572826118a1565b5f608083828152612581612546565b6020820152606060408201526060808201520152565b9015610d4a57803590607e1981360301821215610321570190565b903590609e1981360301821215610321570190565b9190811015610d4a5760061b0190565b356001600160a01b03811681036103215790565b3580151581036103215790565b9081518082526020808093019301915f5b828110612617575050505090565b835185529381019392810192600101612609565b9061264361014461263c84806125b2565b3690611b02565b5f5260205f81526040926001845f2054036129d057916128c5916126ca85855f61284a6126738361268a9a6125b2565b61268f878501359182878701359c8d923690611b02565b613fa4565b6126a761269c85806125b2565b946060810190612510565b96906126c28751966126b888611955565b8688523690611b02565b973691611b95565b906126d3612c63565b506127fa8651916126e3836118a1565b600483526126f28a84016124d8565b886126fc81612c32565b988b6001600160a01b039a8b84511690835192600384528301528282015233606082015260808101825261272f86611d71565b5261273985611d71565b508051612745816118d1565b6002815281368e83013761275886611d7e565b5261276285611d7e565b50810160ff8c6127c56127ae8d806127878161277f8b8a51611dbe565b515116614172565b97511690612796898851611dbe565b515116846127a58a8951611dbe565b51015191612a60565b958d6127bb828751611dbe565b5151169451611dbe565b51015192169093929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b61280382611d8e565b5261280d81611d8e565b506128318b886060810160ff8c6127c56127ae8d806127878161277f8b8a51611dbe565b61283a82611d9e565b5261284481611d9e565b50614250565b918385511693868601918b83519289818551169401511693878652308a5281808720915101519082519261287d84611955565b878452519561288b87611939565b86528a8601528d85015284606085015285608085015260a084015260c08301528a5180809a819463d04dfe2360e01b835260048301612de4565b03915afa95865f915f986129aa575b506128e35788513d5f823e3d90fd5b95938651600281106129935750888798998260c0979899015199015161291161290b85611dae565b51611d9e565b5161291c8183613543565b156129895750998a925b6129488b85919060405192600284526020840152604083015260608201604052565b61295186611d8e565b5261295b85611d8e565b5082519661296888611939565b8752860152840152866060840152608083015260a082015201526001929190565b9050998a92612926565b6024908a5190630fbb8e5560e21b82526004820152fd5b9097506129c991503d805f833e6129c18183611971565b810190612ca0565b965f6128d4565b505f92508291829150565b9035601e198236030181121561032157016020813591019167ffffffffffffffff8211610321578160061b3603831361032157565b9190808252602080920192915f905b828210612a2d575050505090565b909192936001906001600160a01b03612a458761188d565b16815285830135838201526040908101950193920190612a1f565b8215612a95576001600160a01b038091165f52600160205260405f2091165f5260205260405f20905f5260205260405f205490565b909150612aa182614172565b6001600160a01b03809316906040918251946370a0823160e01b86528416938460048701526020928387602481865afa968715612bb7575f97612bc1575b5083612af8612af183612b289a614f36565b50906149f8565b508651636eb1769f60e11b81526001600160a01b0390941660048501523060248501529297889081906044820190565b0381865afa968715612bb7575f97612b86575b50612af1612b4c916119f498614f36565b50612b578183613543565b15612b7e5750935b5f5260018252825f20905f528152815f20905f8052525f20549061407d565b905093612b5f565b96508387813d8311612bb0575b612b9d8183611971565b8101031261032157955195612af1612b3b565b503d612b93565b85513d5f823e3d90fd5b96508387813d8311612be9575b612bd88183611971565b810103126103215795519583612adf565b503d612bce565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f006002815414612c205760029055565b604051633ee5aeb560e01b8152600490fd5b604051612c5d81612c4f6020820194602086526040830190611e19565b03601f198101835282611971565b51902090565b60405190612c7082611939565b606060c083612c7d612565565b81525f60208201525f60408201525f838201528260808201525f60a08201520152565b919060408382031261032157825167ffffffffffffffff908181116103215784019082601f83011215610321578151602092612cdb82611a55565b91612ce96040519384611971565b808352848084019160051b830101918683116103215785809101915b838310612d785750505050948281015191821161032157019180601f84011215610321578251612d3481611a55565b93612d426040519586611971565b818552838086019260051b820101928311610321578301905b828210612d69575050505090565b81518152908301908301612d5b565b8251815291810191869101612d05565b90808251908181526020809101926020808460051b8301019501935f915b848310612db65750505050505090565b9091929394958480612dd4600193601f198682030187528a516125f8565b9801930193019194939290612da6565b91906020928381526001600160a01b0382511684820152838201516040820152612e1e604083015160e06060840152610100830190611d4d565b9060608301516080820152612e45608084015192601f1993848483030160a0850152612d88565b9260a081015193838382030160c08401528680865192838152019501905f5b818110612e88575050506119f494955060c060e091015192828503019101526125f8565b825187529588019591880191600101612e64565b94959395929192612eab612c63565b50604096875190612ebb826118a1565b60048252602093612ecd8584016124d8565b612ed689612c32565b6001600160a01b038097818c51168d519360038552898501528d840152166060820152608081018b52612f0884611d71565b52612f1283611d71565b508951612f1e816118d1565b600281528a3687830137612f3184611d7e565b52612f3b83611d7e565b50898901908681835190612f4e91611dbe565b515116612f5a90614172565b86888c51168984865190612f6d91611dbe565b5151168285875190612f7e91611dbe565b51015190612f8b92612a60565b928981865190612f9a91611dbe565b515116945190612fa991611dbe565b5101519060ff16612fe1929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b612fea83611d8e565b52612ff482611d8e565b5060608801858782519061300791611dbe565b51511661301390614172565b868a5116878984519061302591611dbe565b515116878a85519061303691611dbe565b5101519061304392612a60565b908689898186519061305491611dbe565b51511694519061306391611dbe565b5101519060ff1661309b929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b6130a483611d9e565b526130ae82611d9e565b506130b891614250565b9183875116938188019283519183818451169301511693865f523084528a805f20915101518b51916130e983611955565b5f83528c51966130f888611939565b8752858701528b8601525f60608601526080850186905260a085015260c0840152885163d04dfe2360e01b815292839081906131379060048301612de4565b03815a935f94fa91825f915f94613216575b506131585788513d5f823e3d90fd5b979495969791948251966002881097886131ff5750818385015194015161318161290b87611dae565b5161318c8183613543565b156131f75750925b6131b68585919060405192600284526020840152604083015260608201604052565b6131bf87611d8e565b526131c986611d8e565b5082519a6131d68c611939565b8b528a01528801526060870152608086015260a085015260c0840152159190565b905092613194565b602490835190630fbb8e5560e21b82526004820152fd5b90935061322d91503d805f833e6129c18183611971565b925f613149565b95949193908693613243612c63565b505f92604061335e815192613257846118a1565b600484526020936132698582016124d8565b6133276132758b612c32565b8b6001600160a01b03998a9283835116895191600383528b830152898201528360609b168b8201526080810189526132ac86611d71565b526132b685611d71565b5087516132c2816118d1565b6002815288368b8301376132d586611d7e565b526132df85611d7e565b5060ff896127c58a85019361331b876132fd8161277f858a51611dbe565b9751168861330c848951611dbe565b515116856127a5858a51611dbe565b966127bb828751611dbe565b61333082611d8e565b5261333a81611d8e565b50612831878b8d60ff896127c58c85019361331b876132fd8161277f858a51611dbe565b946133de5f868a511698869786889c0191825191888184511693015116928c8552308952878086209151015188519161339683611955565b8683528951956133a587611939565b86528a86015288850152848a8501528b608085015260a084015260c08301528551808095819463d04dfe2360e01b835260048301612de4565b03915afa90815f915f936134b8575b506134ab575050505f975b6002855110988915996134985782848701519601519061341a61290b89611dae565b51906134268284613543565b1590506134905750925b6134528685919060405192600284526020840152604083015260608201604052565b61345b88611d8e565b5261346587611d8e565b5082519b6134728d611939565b8c528b0152890152870152608086015260a085015260c08401529190565b905092613430565b50505050505050505091506119f4612c63565b91999850945093966133f8565b9092506134cf91503d805f833e6129c18183611971565b915f6133ed565b6134f5905f60e01d906001600160e01b038160e01d9116601b0b614fed565b1290565b906134f5916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b61506e565b61353f905f60e01d906001600160e01b038160e01d9116601b0b614fed565b1390565b9061353f916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b61506e565b6119f491610af4916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614544565b6135ee9160808101826135b06135aa8351611dae565b51611dae565b526135e76135e16001600160a01b038094515116936135d86135d28551611dae565b51611d71565b51169251611dae565b51611d8e565b5191613b95565b5050565b906080810191806136066135aa8551611d9e565b526001600160a01b038092515116916136226135d28551611d9e565b51166136316135e18551611d9e565b5190816136e55761364183613520565b6136cc579183917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a95936122cc955f5260209060018252613697604094855f20835f528452855f20855f528452855f205461407d565b945f5260018252835f20905f528152825f20915f52525f20555b51604051918291338352604060208401526040830190612d88565b60405163793a8f5560e01b815260048101849052602490fd5b91613716917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a95936122cc956137bd565b50506136b1565b6080810161372e6135e18251611d9e565b5191821561373b57505050565b6137556135d26001600160a01b0380935151169351611d9e565b5116815f5260209160018352604092835f20835f528152835f20855f528152835f2054936001600160e01b038516613790575b505050505050565b6137b4955f9284845260018152828420868552815282842091845252812055613bf3565b5f808080613788565b939291936137ca83613520565b6136cc57846137e6576137de939450613bf3565b50505f905f90565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f528152613823835f2054948561407d565b9561382d87613520565b613850575f97885260018252838820908852815282872091875252909320829055565b835163c5e12af560e01b815260048101889052602490fd5b90604082019082526020606081936040838201528551809452019301915f5b828110613895575050505090565b835185529381019392810192600101613887565b60c0810151908151915f92613a1d575b5061395e6020918281510151926001600160a01b039081818187511696015116928660a082019485518252308452604097888320898686510151015160808601518b519161390683611955565b8683528c519361391585611955565b8785528d519661392488611939565b8752898701528c86015260016060860152608085015260a084015260c08301528851808099819463d04dfe2360e01b835260048301612de4565b03915afa948515613a135787956139f5575b508451613981575b50505050505050565b81905101510151169051813b156139f1579184918493836139b6965180978195829463012c676d60e21b845260048401613868565b03925af19081156139e857506139d1575b8080808080613978565b6139db8291611925565b6139e557806139c7565b80fd5b513d84823e3d90fd5b8480fd5b613a0a9195503d8089833e6129c18183611971565b9050935f613970565b86513d89823e3d90fd5b6001600160a01b03602080845101510151169060a083015190823b1561032157613a60925f928360405180968195829463012c676d60e21b845260048401613868565b03925af1801561044157156138b957613a7a919250611925565b5f905f6138b9565b6040519263a9059cbb60e01b5f526001600160a01b0380931660045260245260205f60448180855af160015f5114811615613adc575b8360405215613ac657505050565b635274afe760e01b835216600482015260249150fd5b6001811516613af257813b15153d151616613ab8565b833d5f823e3d90fd5b9092604051936323b872dd60e01b5f526001600160a01b0393848092166004521660245260445260205f60648180855af160015f5114811615613b4b575b836040525f60605215613ac657505050565b6001811516613af257813b15153d151616613b39565b909115613b6c575050565b6040516305dbdfd960e41b81526001600160a01b03918216600482015291166024820152604490fd5b93929193613ba283613520565b6136cc5784613bb6576137de9394506140a7565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f528152613823835f2054948561356a565b90929192613c0081614573565b93613c0a81613520565b613c535784816001600160e01b03613c299360e01d9116601b0b615198565b50809281613c39575b5050509190565b6001600160a01b03613c4b9316613a82565b5f8181613c32565b604051632d1671a360e11b8152600490fd5b916040805191613c74836118a1565b60048084526020613c868186016124d8565b5f5b8751811015613cbb5780613c9e6001928a611dbe565b51613ca98289611dbe565b52613cb48188611dbe565b5001613c88565b5092955092939093335f52308352855f2091865190613cd9826118ed565b613ce1612546565b8252606085819301528751613cf581611955565b5f8152885191613d0483611955565b5f83525f3681375f5b8151811015613e6a57613d208183611dbe565b5190888c8b84519189818401518d8d8251613d48575b50505050505050506001915001613d0d565b5f613db797948197948c9794613d758c956001600160a01b039d8e81818d51169c0151169b015190614250565b94865199613d828b611939565b8a528901528488015286015260808501528a60a08501528b60c08501525180958194829363d04dfe2360e01b84528301612de4565b03915afa938415613e60578b915f95613e42575b508451613de0575b50908b8e89838d8d613d36565b51015116803b1561032157613e0f925f918c8f84905180978195829463012c676d60e21b845233908401613868565b03925af1918215613e3857600192613e29575b8981613dd3565b613e3290611925565b5f613e22565b8c513d5f823e3d90fd5b613e579195503d805f833e6129c18183611971565b9050935f613dcb565b8e513d5f823e3d90fd5b5050505050505050509050565b8115613e81570490565b634e487b7160e01b5f52601260045260245ffd5b6040815110613ef1576020810151908051603f198101908111613edd5760051c8211613ec95760016020920160051b010190565b5050604051613ed781611955565b5f815290565b634e487b7160e01b5f52601160045260245ffd5b50604051613ed781611955565b805115613f0e57602001515f1a90565b505f90565b905f8091602081519101845af48080613f91575b15613f475750506040513d81523d5f602083013e60203d82010160405290565b15613f6e57604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b3d15613f7f576040513d5f823e3d90fd5b60405163d6bda27560e01b8152600490fd5b503d151580613f275750813b1515613f27565b91613fcf906060613fc4936001600160a01b039485916040880151611dbe565b515116940151611dbe565b5151161461232457565b6140006001600160e01b0392838316601b0b9260e01d938160e01d9116601b0b84846147af565b90637ffffff58213614050575b90614017916149f8565b9290921580614048575b61402a57505090565b6044925060405191638eba4d0760e01b835260048301526024820152fd5b508215614021565b61405a82826156c1565b1561400d57604483856040519163d556b11160e01b835260048301526024820152fd5b6119f491610af4916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614d9d565b9291926140b382614573565b936140bd81613520565b61411e5784816001600160e01b036140dc9360e01d9116601b0b615198565b9290809315614109575b508290816140f5575050509190565b613c4b926001600160a01b03309216613afb565b9092505f198114613edd57600101915f6140e6565b604051632eaefac360e21b8152600490fd5b6004111561413a57565b634e487b7160e01b5f52602160045260245ffd5b602090939291936001600160a01b03604082019516815261416e83614130565b0152565b61417a6156da565b60408051630782d7e160e01b81526001600160a01b03831660048201529091828260248173200e12d10bb0c5e4a17e7018f0f1161919bb93895afa928315614247575f925f94614212575b506141cf83614130565b600183141580614200575b6141e45750505090565b5163ee07877f60e01b815291829161059791906004840161414e565b5061420a83614130565b8215156141da565b908094506142369293503d8511614240575b61422e8183611971565b810190614f0c565b919091925f6141c5565b503d614224565b513d5f823e3d90fd5b61425a8251611e98565b6142648351611e98565b9282519281518015155f146144d957600201935b6001940184019061428882611a55565b956142a360409361429b8551998a611971565b808952611a55565b6142b5602091601f1901828a016124f4565b5f9584519389896002926002885233868901523089890152606097606081018a526142df84611d71565b526142e983611d71565b505f825b614499575b505050508651614309575b50505050505050505090565b9091929360028861432c8c866143258e809c9d9e018093611dbe565b528d611dbe565b500185614339828d611dbe565b52614344818c611dbe565b505f965b614353575b506142fd565b8851871015614494576001600160a01b036143ff898b856143f68c60428c8861437c8488611dbe565b51511696858261438c868a611dbe565b5101519261439a868a611dbe565b51838d82511691015182815160051b910120908451927f6ec4dff745ec96dbde88c5d41f8aa5ac13aa1664afb47b8406b44fa945a650c88452830152838201522090519161190160f01b83528d83015260228201522093611dbe565b51015191614f64565b1561447c578761446b8b8e8c8f9e9d9c9b9a999897968f614458918d61444e898f8f61443a83889f614431828f611dbe565b51511692611dbe565b52614445828b611dbe565b51015192611dbe565b52019c8d94611dbe565b5101516144658383611dbe565b52611dbe565b500196979895909192939495614348565b8851630a57f30960e31b815260048101899052602490fd5b61434d565b9091929a82518210156144d157906144c584809301809d6144ba8487611dbe565b516144658383611dbe565b50019082918d936142ed565b9a92916142f2565b505f93614278565b916040830192604061451b610af4606087519401938451906001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6145f4565b9451930161452a8151866134f9565b614532575050565b9093506119f491925051925183613fd9565b919291600160ff1b840161455c57611d4993506150c3565b90611d49935f0391614d9d565b61401782826149f8565b61457b6156da565b6040805163b7bad1b160e01b81526001600160a01b0383166004820152909182826024815f73200e12d10bb0c5e4a17e7018f0f1161919bb93895af1928315614247575f925f9461421257506141cf83614130565b6008815110613f0e576008015167ffffffffffffffff1667ff0a89c674ee78741490565b9091939284158215175f1461460e5750505090505f905f90565b82810192600160fd1b8082019083011760fe1c614745575b505061463181615386565b9361463b81615386565b9461464686826153a6565b90918215614736575f9083986f0785ee10d5da46d900f436a000000000808611614728575b50670de0b6b3a7640000808b11614719575b50633b9aca00808b1161470a575b50612710808b116146fc575b5098805b6146eb57508190611d49989982600a0a9109960195817fcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccd0a93838211900382610100031b9203901c1702916153b9565b60019290920191600a90048061469b565b60049a04998a930192614697565b600991939a049901915f61468b565b601291939a049901915f61467d565b85049950602592505f61466b565b50929050611d499495506153b9565b5f8212156147995780841361478b575b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb284131561462657909250611d499394916152c4565b909250611d4993949161532b565b8084121561475557909250611d499394916152c4565b929091806147d5576044848460405191637a97930f60e01b835260048301526024820152fd5b90919280155f146147ea57505050505f905f90565b614803936147f791615473565b92919490938492615473565b909391928461481188615386565b9161481b86615386565b947f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000094604c918688106149c2575b030191600160ff1b98838a018112155f1461498f575050035b5f955f821280614986575b614968575b5f811280614956575b6149385786820103966001600160ff1b038814908161492e575b5080614925575b8061491c575b6148fe5750906148b2929161561f565b915f81136148c5575b50611d49936153b9565b9091604c82136148f3576148dc91600a0a90613e77565b9081156148e9575f6148bb565b505050505f905f90565b50505050505f905f90565b876044916040519163d556b11160e01b835260048301526024820152fd5b505f85126148a2565b5082841461489c565b905088145f614895565b604489836040519163d556b11160e01b835260048301526024820152fd5b50806001600160ff1b0301821361487b565b95508087018613156149805786818703015b95614872565b5f61497a565b505f811361486d565b89985090920390506001600160ff1b03819003870182136149b35701860194614862565b5050505050505050505f905f90565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009650604b9250614849565b8115613e81570590565b8082601b82810b8314614bed577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000008405614b99575b8380820b03614b8857507b199999999999999999999999999999999999999999999999999999987b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc84011115614b39575b838060030b03614abd575b808413614aa15750506001600160e01b036001925b60e01b91161791565b8303600a0a8015613e81576001600160e01b0391071592614a98565b92915f841315614b0d575090614ad383836156c1565b614aef57637ffffffe1901600a0a810290637fffffff92614a83565b506044916040519163d556b11160e01b835260048301526024820152fd5b637fffffff1992830390604382136148f357614b2c91600a0a906149ee565b9182156148e95792614a83565b5f198401808060030b14614b4d5750614a78565b90506001600160e01b039293507b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff915060e01b9260ff1d181617905f90565b600190940193600a90930592614a2b565b937f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000840515614bda576305f5e100600894058094819201955b915050614a2b565b620186a060059405809481920195614bd2565b5082614a7857505050505f90600190565b919291600160ff1b9190801580614d8b575090614c1a91615473565b9490929091905f868585858282138015614d82575b614d65575b505050508682841860ff1c94860391039081604c038111614d4a5701600a0a808205919084614d30575b505081019182821860ff1c1115614d2857826001600160ff1b0314614d0a57905f600192135f14614cdb57600a9004915b01925b81158117614c9f57509190565b80614cb8575b508015614cb0579190565b505f91508190565b9192614cce9203600160ff1b01600a0a906149ee565b600160ff1b91905f614ca5565b600a60037fe6666666666666666666666666666666666666666666666666666666666666679201040191614c8f565b604490836040519163d556b11160e01b835260048301526024820152fd5b509092614c92565b8107614d3d575b80614c5e565b60ff1d600117015f614d37565b505050919350614d58579190565b60018160ff1d1790039190565b5f9a50909750909550600160ff1b94509250905086808080614c34565b50835f12614c2f565b15614d965750509190565b9350919050565b9392919384158115818117614eee57505090614db891615473565b9194908295614dc982958294615473565b8096929491969387868482138015614ee5575b614ecc575b5050505050508682841860ff1c94860391039081604c038111614d4a5701600a0a808205919084614eb2575b505081019182821860ff1c1115614eaa57826001600160ff1b0314614d0a57905f600192135f14614e7b57600a9004915b01925b81158117614e4e57509190565b80614e5e57508015614cb0579190565b600160ff1b93614e759291038401600a0a906149ee565b5f614ca5565b600a60037fe6666666666666666666666666666666666666666666666666666666666666679201040191614e3e565b509092614e41565b8107614ebf575b80614e0d565b60ff1d600117015f614eb9565b929b5098509196509450925090505f8080808080614de1565b50858412614ddc565b9395939092919015614f04575050614cb0579190565b945092915050565b919082604091031261032157815160048110156103215760209092015160ff811681036103215790565b9060ff165f03916001600160ff1b0382115f14614f5c57600a6001818404940192061590565b909190600190565b9091813b614f9f57614f769192615743565b50614f8081614130565b159182614f8c57505090565b6001600160a01b03918216911614919050565b6020918160645f935160405192630b135d3f60e11b9788855260048501526040602485015286820190604485015e8281018201859052601f01601f191601915afa905f5114601f3d11161690565b92915f9060018184145f87128715171717615067575f92808213615059575b03604c81135f82121761504d57600a0a908461502b83820293846149ee565b146150405750501561503c575f9190565b5f90565b90935090156119f4579190565b50501561503c575f9190565b5f956001945092509061500c565b5050505f90565b93929190918083145f83125f871218831587151717176150bd575f928082136150b05703604c81135f82121761504d57600a0a908461502b83820293846149ee565b919460019350919061500c565b50919050565b909291600160ff1b91828101615155575080841461514b57808413918215615143578185035b604c8111156151325750505f915b1561512357507f8000000000000000000000000000000000000000000000000000000000000001019190565b92506001600160ff1b03039190565b600a0a908115613e815704916150f7565b8482036150e9565b505090505f905f90565b9361516292945f03614bfe565b80939180928114615176575b50505f039190565b915092506001600160ff1b038314614d0a57600a600191059201915f8061516e565b91925f8312156151c0576044838360405191634a7d166b60e01b835260048301526024820152fd5b9192836151d257505090505f90600190565b60ff811682019180831261529a575f83121561520a575050604c198112614cb0575f03600a0a916152038382613e77565b9283021490565b909293915f81135f1461529057604d811361526557600a0a928315613e8157835f1904831161523c5750500290600190565b60405163c849483b60e01b815260048101849052602481019290925260ff166044820152606490fd5b5060405163c849483b60e01b81526004810192909252602482015260ff919091166044820152606490fd5b5050905090600190565b60405163c849483b60e01b815260048101869052602481019190915260ff82166044820152606490fd5b909392915f6152d49181846145f4565b9490945f8483019182019412159081615321575b8115615317575b506152f957505090565b604492506040519163d556b11160e01b835260048301526024820152fd5b905083125f6152ef565b82811291506152e8565b61534093600160fe1b908101939201906145f4565b9081815f821215615377575050604b1982126137de57615365915f03600a0a906149ee565b908161536f575f90565b600160ff1b90565b93600160ff1b90910192509050565b5f8112156119f457600160ff1b9080820361539f575090565b90505f0390565b905f198183099102908180821091030391565b92939291905f818418121561544e576001600160ff1b03928383111561543857600160ff1b938385036153ee57505050509190565b90919293508514615408575050600a600191045f03920190565b604051630ed8062160e21b8152600481019190915260248101919091526044810182905260648101849052608490fd5b5090915050600160ff1b8114613edd575f039190565b90916001600160ff1b0380841115613c32578514615408575050600a60019104920190565b919091801561561557827f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000080830515615523575b507f19999999999999999999999999999999999999999999999999999999999999997f0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc830110615514575b83136154fe5791905f90565b919060018060ff1b926001600160ff1b03030190565b9290600a02905f1901926154f2565b6f4b3b4ca85a86c47a098a22400000000080840515615603575b507728c87cb5c89a2571ebfdcb54864ada834a000000000000008305156155ec575b7b097edd871cfda3a5697758bf0e3cbb5ac5741c6400000000000000008305156155d8575b7e3899162693736ac531a5a58f1fbb4b746504382ca7e40000000000000000008305156155c8578205156155b9575b5f6154a7565b9290600a02905f1901926155b3565b9391606402916001190193615584565b93916402540be40002916009190193615584565b9391678ac7230489e800000291601219019361555f565b6025198301955092909202915f61553d565b505f915081908190565b90915f19838309928083029283808610950394808603958487101561569d5714615695579082910960018219018216809204600280826003021880830282030280830282030280830282030280830282030280830282030280920290030293600183805f03040190848311900302920304170290565b505091500490565b60648386866040519263362ced0960e11b8452600484015260248301526044820152fd5b6119f491905f8112156156d5575f0361577d565b61577d565b73200e12d10bb0c5e4a17e7018f0f1161919bb9389803b158015615718575b6157005750565b602490604051906373e6d7b360e01b82526004820152fd5b507f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d41813f14156156f9565b81519190604183036157735761576c9250602082015190606060408401519301515f1a9061580c565b9192909190565b50505f9160029190565b90637ffffff581131561580657637ffffffe19810190604382136157ff575f8212156157d357637fffffff91505f0301600a0a7b8000000000000000000000000000000000000000000000000000000202111590565b50600a0a8015613e81577b80000000000000000000000000000000000000000000000000000001041090565b5050151590565b50505f90565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411615883579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa15610441575f516001600160a01b0381161561587957905f905f90565b505f906001905f90565b5050505f916003919056000000000000000000000000000000000000000000000000000000000000200e12d10bb0c5e4a17e7018f0f1161919bb93890000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000044b608060405234801561000f575f80fd5b506004361061004a575f3560e01c80630782d7e11461004e57806354636d2b14610078578063b7bad1b11461009d578063f5c36eaf146100b0575b5f80fd5b61006161005c366004610363565b6100c3565b60405161006f929190610403565b60405180910390f35b61008b610086366004610363565b6100d8565b60405160ff909116815260200161006f565b6100616100ab366004610363565b6100e9565b61008b6100be366004610363565b6100f5565b5f806100cf5f84610100565b91509150915091565b5f6100e35f836101f0565b92915050565b5f806100cf5f84610281565b5f6100e35f83610356565b73ffffffffffffffffffffffffffffffffffffffff81165f9081526020838152604080832081518083019092525460ff8082161515835261010090910416818301527f313ce56700000000000000000000000000000000000000000000000000000000808452839283908190816004818a5afa915060203d1015610182575f91505b811561019857505f5160ff811115610198575f91505b816101af57505050602001516003925090506101e9565b83516101c3575f955093506101e992505050565b836020015160ff1681146101d85760026101db565b60015b846020015195509550505050505b9250929050565b5f805f6101fd8585610281565b909250905060018260038111156102165761021661039d565b1415801561023557505f8260038111156102325761023261039d565b14155b156102795783826040517fee07877f000000000000000000000000000000000000000000000000000000008152600401610270929190610421565b60405180910390fd5b949350505050565b5f805f8061028f8686610100565b90925090505f8260038111156102a7576102a761039d565b0361034b576040805180820182526001815260ff838116602080840191825273ffffffffffffffffffffffffffffffffffffffff8a165f908152908b9052939093209151825493517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009094169015157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff161761010093909116929092029190911790555b909590945092505050565b5f805f6101fd8585610100565b5f60208284031215610373575f80fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114610396575f80fd5b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b600481106103ff577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b9052565b6040810161041182856103ca565b60ff831660208301529392505050565b73ffffffffffffffffffffffffffffffffffffffff831681526040810161039660208301846103ca560000000000000000000000000000000000000000000000000000000000000000006e2d0e71d900474b262e545bc4c98b71ab368d2100000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000003d486080604052600436106100d65760003560e01c80638456cb591161007f5780639a1f3406116100595780639a1f340614610200578063cd0fb7a714610220578063f2fde38b14610260578063fa461e331461028057600080fd5b80638456cb59146101ad5780638da5cb5b146101c257806393b3774c146101ed57600080fd5b80632c8958f6116100b05780632c8958f6146100f95780636b2ace871461013f578063715018a61461019857600080fd5b8063046f7da2146100e257806323a69e75146100f95780632646478b1461011957600080fd5b366100dd57005b600080fd5b3480156100ee57600080fd5b506100f76102a0565b005b34801561010557600080fd5b506100f7610114366004613579565b6103a8565b61012c6101273660046136f5565b6103ba565b6040519081526020015b60405180910390f35b34801561014b57600080fd5b506101737f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610136565b3480156101a457600080fd5b506100f7610564565b3480156101b957600080fd5b506100f7610578565b3480156101ce57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff16610173565b61012c6101fb36600461377c565b61067b565b34801561020c57600080fd5b506100f761021b36600461382f565b61089a565b34801561022c57600080fd5b5061025061023b366004613868565b60016020526000908152604090205460ff1681565b6040519015158152602001610136565b34801561026c57600080fd5b506100f761027b366004613868565b6108f8565b34801561028c57600080fd5b506100f761029b366004613579565b6109af565b60005473ffffffffffffffffffffffffffffffffffffffff163314806102d557503360009081526001602052604090205460ff165b610366576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f52503a2063616c6c6572206973206e6f7420746865206f776e6572206f72206160448201527f2070726976696c6567656420757365720000000000000000000000000000000060648201526084015b60405180910390fd5b600280547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff167501000000000000000000000000000000000000000000179055565b6103b4848484846109af565b50505050565b60025460009074010000000000000000000000000000000000000000900460ff16600114610444576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f526f75746550726f636573736f72206973206c6f636b65640000000000000000604482015260640161035d565b6002547501000000000000000000000000000000000000000000900460ff166001146104cc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f526f75746550726f636573736f72206973207061757365640000000000000000604482015260640161035d565b600280547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1674020000000000000000000000000000000000000000179055610519878787878787610b5d565b9050600280547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790559695505050505050565b61056c6111a3565b6105766000611224565b565b60005473ffffffffffffffffffffffffffffffffffffffff163314806105ad57503360009081526001602052604090205460ff165b610639576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f52503a2063616c6c6572206973206e6f7420746865206f776e6572206f72206160448201527f2070726976696c65676564207573657200000000000000000000000000000000606482015260840161035d565b600280547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff167502000000000000000000000000000000000000000000179055565b60025460009074010000000000000000000000000000000000000000900460ff16600114610705576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f526f75746550726f636573736f72206973206c6f636b65640000000000000000604482015260640161035d565b6002547501000000000000000000000000000000000000000000900460ff1660011461078d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f526f75746550726f636573736f72206973207061757365640000000000000000604482015260640161035d565b600280547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1674020000000000000000000000000000000000000000179055604051600090819073ffffffffffffffffffffffffffffffffffffffff8c16908b908381818185875af1925050503d8060008114610826576040519150601f19603f3d011682016040523d82523d6000602084013e61082b565b606091505b50915091508161083d57805181602001fd5b61084b898989898989610b5d565b92505050600280547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000017905598975050505050505050565b6108a26111a3565b73ffffffffffffffffffffffffffffffffffffffff91909116600090815260016020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b6109006111a3565b73ffffffffffffffffffffffffffffffffffffffff81166109a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161035d565b6109ac81611224565b50565b60025473ffffffffffffffffffffffffffffffffffffffff163314610a56576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f526f75746550726f636573736f722e756e697377617056335377617043616c6c60448201527f6261636b3a2063616c6c2066726f6d20756e6b6e6f776e20736f757263650000606482015260840161035d565b6000808513610a655783610a67565b845b905060008113610af9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f526f75746550726f636573736f722e756e697377617056335377617043616c6c60448201527f6261636b3a206e6f7420706f73697469766520616d6f756e7400000000000000606482015260840161035d565b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001660011790556000610b3283850185613868565b9050610b5573ffffffffffffffffffffffffffffffffffffffff82163384611299565b505050505050565b60008073ffffffffffffffffffffffffffffffffffffffff881673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14610c24576040517f70a0823100000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff8916906370a0823190602401602060405180830381865afa158015610bfb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c1f919061388c565b610c27565b60005b9050600073ffffffffffffffffffffffffffffffffffffffff871673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14610cf1576040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301528816906370a0823190602401602060405180830381865afa158015610cc8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cec919061388c565b610d0a565b8473ffffffffffffffffffffffffffffffffffffffff16315b905087600080610d2e87604080518082019091528181528151909101602082015290565b90505b805160208201511115610e84576000610d508280516001018051915290565b90508060ff1660011415610d7a576000610d6983611372565b905083610d74578094505b50610e73565b8060ff1660021415610d9557610d90828d611437565b610e73565b8060ff1660031415610dac576000610d6983611457565b8060ff1660041415610dc157610d908261147d565b8060ff1660051415610dd657610d90826114a3565b8060ff1660061415610dec57610d908d836115a8565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f526f75746550726f636573736f723a20556e6b6e6f776e20636f6d6d616e642060448201527f636f646500000000000000000000000000000000000000000000000000000000606482015260840161035d565b610e7c836138d4565b925050610d31565b506000905073ffffffffffffffffffffffffffffffffffffffff8b1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14610f4d576040517f70a0823100000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff8c16906370a0823190602401602060405180830381865afa158015610f24573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f48919061388c565b610f50565b60005b905083610f5d8b8361390d565b1015610feb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f526f75746550726f636573736f723a204d696e696d616c20696e70757420626160448201527f6c616e63652076696f6c6174696f6e0000000000000000000000000000000000606482015260840161035d565b600073ffffffffffffffffffffffffffffffffffffffff8a1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee146110b3576040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff89811660048301528b16906370a0823190602401602060405180830381865afa15801561108a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110ae919061388c565b6110cc565b8773ffffffffffffffffffffffffffffffffffffffff16315b90506110d8898561390d565b81101561111e576110e98482613925565b6040517f963b34a500000000000000000000000000000000000000000000000000000000815260040161035d91815260200190565b6111288482613925565b6040805173ffffffffffffffffffffffffffffffffffffffff8b81168252602082018790529181018c905260608101839052919750808c1691908e169033907f2db5ddd0b42bdbca0d69ea16f234a870a485854ae0d91f16643d6f317d8b89949060800160405180910390a450505050509695505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610576576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161035d565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905261136d9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915261163b565b505050565b6000806113858380516014018051915290565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290915073ffffffffffffffffffffffffffffffffffffffff8216906370a0823190602401602060405180830381865afa1580156113f2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611416919061388c565b91508115611425576001820391505b61143183308385611747565b50919050565b60006114498380516014018051915290565b905061136d83338385611747565b47611478823073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee84611747565b919050565b600061148f8280516014018051915290565b905061149f8260008360006117a2565b5050565b60006114b58280516014018051915290565b6040517ff7888aec00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff80831660048301523060248301529192506000917f0000000000000000000000000000000000000000000000000000000000000000169063f7888aec90604401602060405180830381865afa15801561154d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611571919061388c565b9050801561159c577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff015b61136d83308484611747565b60006115ba8280516020018051915290565b905060006115ce8380516020018051915290565b905060006115e28480516001018051915290565b905060006115f68580516020018051915290565b9050600061160a8680516020018051915290565b905061163273ffffffffffffffffffffffffffffffffffffffff8816333088888888886118d6565b50505050505050565b600061169d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16611b569092919063ffffffff16565b80519091501561136d57808060200190518101906116bb919061393c565b61136d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840161035d565b60006117598580516001018051915290565b905060005b8160ff16811015610b5557600061177b8780516002018051915290565b61ffff8082168602049485900394909150611798888888846117a2565b505060010161175e565b60006117b48580516001018051915290565b905060ff81166117cf576117ca85858585611b6d565b6118cf565b8060ff16600114156117e7576117ca85858585611f22565b8060ff16600214156117ff576117ca85858585612162565b8060ff1660031415611817576117ca85858585612410565b8060ff166004141561182f576117ca85858585612a98565b8060ff1660051415611847576117ca85858585612c26565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f526f75746550726f636573736f723a20556e6b6e6f776e20706f6f6c2074797060448201527f6500000000000000000000000000000000000000000000000000000000000000606482015260840161035d565b5050505050565b6040517f7ecebe0000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8881166004830152600091908a1690637ecebe0090602401602060405180830381865afa158015611946573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061196a919061388c565b6040517fd505accf00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a811660048301528981166024830152604482018990526064820188905260ff8716608483015260a4820186905260c48201859052919250908a169063d505accf9060e401600060405180830381600087803b158015611a0457600080fd5b505af1158015611a18573d6000803e3d6000fd5b50506040517f7ecebe0000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8b81166004830152600093508c169150637ecebe0090602401602060405180830381865afa158015611a8b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aaf919061388c565b9050611abc82600161390d565b8114611b4a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f5361666545524332303a207065726d697420646964206e6f742073756363656560448201527f6400000000000000000000000000000000000000000000000000000000000000606482015260840161035d565b50505050505050505050565b6060611b6584846000856131e1565b949350505050565b6000611b7f8580516014018051915290565b90506000611b938680516001018051915290565b90506000611ba78780516014018051915290565b90506000611bbb8880516003018051915290565b905073ffffffffffffffffffffffffffffffffffffffff8716301415611c0157611bfc73ffffffffffffffffffffffffffffffffffffffff87168587611299565b611c41565b73ffffffffffffffffffffffffffffffffffffffff8716331415611c4157611c4173ffffffffffffffffffffffffffffffffffffffff87163386886132fa565b6000808573ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015611c8f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cb39190613977565b506dffffffffffffffffffffffffffff1691506dffffffffffffffffffffffffffff169150600082118015611ce85750600081115b611d4e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f57726f6e6720706f6f6c20726573657276657300000000000000000000000000604482015260640161035d565b6000808660ff16600114611d63578284611d66565b83835b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8b8116600483015292945090925083918c16906370a0823190602401602060405180830381865afa158015611dda573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dfe919061388c565b611e089190613925565b98506000611e1986620f42406139c7565b611e289062ffffff168b6139eb565b9050600081611e3a85620f42406139eb565b611e44919061390d565b611e4e84846139eb565b611e589190613a28565b90506000808a60ff16600114611e7057826000611e74565b6000835b604080516000815260208101918290527f022c0d9f00000000000000000000000000000000000000000000000000000000909152919350915073ffffffffffffffffffffffffffffffffffffffff8d169063022c0d9f90611ede90859085908f9060248101613ad9565b600060405180830381600087803b158015611ef857600080fd5b505af1158015611f0c573d6000803e3d6000fd5b5050505050505050505050505050505050505050565b6000611f348580516014018051915290565b9050600080611f498780516001018051915290565b60ff161190506000611f618780516014018051915290565b905073ffffffffffffffffffffffffffffffffffffffff8616331415611fa357611fa373ffffffffffffffffffffffffffffffffffffffff86163330876132fa565b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff851690811790915563128acb088284878161201757612012600173fffd8963efd1fc6a506488495d951d5263988d26613b14565b612027565b6120276401000276a36001613b41565b6040805173ffffffffffffffffffffffffffffffffffffffff8d166020820152016040516020818303038152906040526040518663ffffffff1660e01b8152600401612077959493929190613b79565b60408051808303816000875af1158015612095573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120b99190613bc0565b505060025473ffffffffffffffffffffffffffffffffffffffff16600114611632576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f526f75746550726f636573736f722e73776170556e6956333a20756e6578706560448201527f6374656400000000000000000000000000000000000000000000000000000000606482015260840161035d565b60006121748580516001018051915290565b905060006121888680516014018051915290565b9050600180831614156122575760006121a78780516014018051915290565b905060028316612213578073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b1580156121f957600080fd5b505af115801561220d573d6000803e3d6000fd5b50505050505b73ffffffffffffffffffffffffffffffffffffffff821630146122515761225173ffffffffffffffffffffffffffffffffffffffff82168386611299565b50610b55565b600282166123205773ffffffffffffffffffffffffffffffffffffffff851633141561229f5761229f73ffffffffffffffffffffffffffffffffffffffff85163330866132fa565b6040517f2e1a7d4d0000000000000000000000000000000000000000000000000000000081526004810184905273ffffffffffffffffffffffffffffffffffffffff851690632e1a7d4d90602401600060405180830381600087803b15801561230757600080fd5b505af115801561231b573d6000803e3d6000fd5b505050505b60008173ffffffffffffffffffffffffffffffffffffffff168460405160006040518083038185875af1925050503d806000811461237a576040519150601f19603f3d011682016040523d82523d6000602084013e61237f565b606091505b5050905080611632576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f526f75746550726f636573736f722e777261704e61746976653a204e6174697660448201527f6520746f6b656e207472616e73666572206661696c6564000000000000000000606482015260840161035d565b60006124228580516001018051915290565b905060006124368680516014018051915290565b905060ff8216156128315773ffffffffffffffffffffffffffffffffffffffff85163014156124a5576124a073ffffffffffffffffffffffffffffffffffffffff85167f000000000000000000000000000000000000000000000000000000000000000085611299565b61275b565b73ffffffffffffffffffffffffffffffffffffffff8516331415612505576124a073ffffffffffffffffffffffffffffffffffffffff8516337f0000000000000000000000000000000000000000000000000000000000000000866132fa565b6040517f4ffe34db00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85811660048301527f00000000000000000000000000000000000000000000000000000000000000001690634ffe34db906024016040805180830381865afa158015612590573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125b49190613c04565b516040517fdf23b45b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301526fffffffffffffffffffffffffffffffff909216917f0000000000000000000000000000000000000000000000000000000000000000169063df23b45b90602401606060405180830381865afa158015612656573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061267a9190613c77565b60409081015190517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811660048301526fffffffffffffffffffffffffffffffff909216918716906370a0823190602401602060405180830381865afa158015612720573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612744919061388c565b61274e919061390d565b6127589190613925565b92505b6040517f02b9446c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85811660048301527f000000000000000000000000000000000000000000000000000000000000000081166024830181905290831660448301526064820185905260006084830152906302b9446c9060a40160408051808303816000875af1158015612806573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061282a9190613bc0565b5050610b55565b73ffffffffffffffffffffffffffffffffffffffff851615612908576040517ff18d03cc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85811660048301528681166024830152306044830152606482018590527f0000000000000000000000000000000000000000000000000000000000000000169063f18d03cc90608401600060405180830381600087803b1580156128eb57600080fd5b505af11580156128ff573d6000803e3d6000fd5b505050506129c1565b6040517ff7888aec00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85811660048301523060248301527f0000000000000000000000000000000000000000000000000000000000000000169063f7888aec90604401602060405180830381865afa15801561299a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129be919061388c565b92505b6040517f97da6d3000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152306024830152828116604483015260006064830152608482018590527f000000000000000000000000000000000000000000000000000000000000000016906397da6d309060a40160408051808303816000875af1158015612a6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a8e9190613bc0565b5050505050505050565b6000612aaa8580516014018051915290565b85516020808201805190920101875290915073ffffffffffffffffffffffffffffffffffffffff851615612b91576040517ff18d03cc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff858116600483015286811660248301528381166044830152606482018590527f0000000000000000000000000000000000000000000000000000000000000000169063f18d03cc90608401600060405180830381600087803b158015612b7857600080fd5b505af1158015612b8c573d6000803e3d6000fd5b505050505b6040517f627dd56a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83169063627dd56a90612be3908490600401613ce3565b6020604051808303816000875af1158015612c02573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611632919061388c565b6000612c388580516014018051915290565b90506000612c4c8680516001018051915290565b90506000612c608780516001018051915290565b60000b90506000612c778880516001018051915290565b60000b90506000612c8e8980516014018051915290565b90506000612ca28a80516014018051915290565b9050600073ffffffffffffffffffffffffffffffffffffffff891673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1415612d8b576040517f3df02124000000000000000000000000000000000000000000000000000000008152600f86810b600483015285900b6024820152604481018990526000606482015273ffffffffffffffffffffffffffffffffffffffff881690633df02124908a9060840160206040518083038185885af1158015612d5f573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612d84919061388c565b905061306e565b73ffffffffffffffffffffffffffffffffffffffff8a16331415612dcb57612dcb73ffffffffffffffffffffffffffffffffffffffff8a1633308b6132fa565b612dec73ffffffffffffffffffffffffffffffffffffffff8a16888a613358565b5060ff8616612e9f576040517f3df02124000000000000000000000000000000000000000000000000000000008152600f86810b600483015285900b6024820152604481018990526000606482015273ffffffffffffffffffffffffffffffffffffffff881690633df02124906084016020604051808303816000875af1158015612e7b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d84919061388c565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8416906370a0823190602401602060405180830381865afa158015612f0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f30919061388c565b6040517f3df02124000000000000000000000000000000000000000000000000000000008152600f88810b600483015287900b6024820152604481018b90526000606482015290915073ffffffffffffffffffffffffffffffffffffffff891690633df0212490608401600060405180830381600087803b158015612fb457600080fd5b505af1158015612fc8573d6000803e3d6000fd5b50506040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000925073ffffffffffffffffffffffffffffffffffffffff861691506370a0823190602401602060405180830381865afa158015613039573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061305d919061388c565b90506130698282613925565b925050505b73ffffffffffffffffffffffffffffffffffffffff831630146131d45773ffffffffffffffffffffffffffffffffffffffff821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14156131b35760008373ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114613117576040519150601f19603f3d011682016040523d82523d6000602084013e61311c565b606091505b50509050806131ad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f526f75746550726f636573736f722e7377617043757276653a204e617469766560448201527f20746f6b656e207472616e73666572206661696c656400000000000000000000606482015260840161035d565b506131d4565b6131d473ffffffffffffffffffffffffffffffffffffffff83168483611299565b5050505050505050505050565b606082471015613273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c0000000000000000000000000000000000000000000000000000606482015260840161035d565b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161329c9190613cf6565b60006040518083038185875af1925050503d80600081146132d9576040519150601f19603f3d011682016040523d82523d6000602084013e6132de565b606091505b50915091506132ef87838387613389565b979650505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526103b49085907f23b872dd00000000000000000000000000000000000000000000000000000000906084016112eb565b6000613365848484613426565b80611b65575061337784846000613426565b8015611b655750611b65848484613426565b6060831561341c5782516134155773ffffffffffffffffffffffffffffffffffffffff85163b613415576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161035d565b5081611b65565b611b658383613535565b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f095ea7b300000000000000000000000000000000000000000000000000000000179052915160009283928392918816916134bf9190613cf6565b6000604051808303816000865af19150503d80600081146134fc576040519150601f19603f3d011682016040523d82523d6000602084013e613501565b606091505b509150915081801561352b57508051158061352b57508080602001905181019061352b919061393c565b9695505050505050565b8151156135455781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161035d9190613ce3565b6000806000806060858703121561358f57600080fd5b8435935060208501359250604085013567ffffffffffffffff808211156135b557600080fd5b818701915087601f8301126135c957600080fd5b8135818111156135d857600080fd5b8860208285010111156135ea57600080fd5b95989497505060200194505050565b73ffffffffffffffffffffffffffffffffffffffff811681146109ac57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f83011261365b57600080fd5b813567ffffffffffffffff808211156136765761367661361b565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156136bc576136bc61361b565b816040528381528660208588010111156136d557600080fd5b836020870160208301376000602085830101528094505050505092915050565b60008060008060008060c0878903121561370e57600080fd5b8635613719816135f9565b9550602087013594506040870135613730816135f9565b9350606087013592506080870135613747816135f9565b915060a087013567ffffffffffffffff81111561376357600080fd5b61376f89828a0161364a565b9150509295509295509295565b600080600080600080600080610100898b03121561379957600080fd5b88356137a4816135f9565b97506020890135965060408901356137bb816135f9565b95506060890135945060808901356137d2816135f9565b935060a0890135925060c08901356137e9816135f9565b915060e089013567ffffffffffffffff81111561380557600080fd5b6138118b828c0161364a565b9150509295985092959890939650565b80151581146109ac57600080fd5b6000806040838503121561384257600080fd5b823561384d816135f9565b9150602083013561385d81613821565b809150509250929050565b60006020828403121561387a57600080fd5b8135613885816135f9565b9392505050565b60006020828403121561389e57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613906576139066138a5565b5060010190565b60008219821115613920576139206138a5565b500190565b600082821015613937576139376138a5565b500390565b60006020828403121561394e57600080fd5b815161388581613821565b80516dffffffffffffffffffffffffffff8116811461147857600080fd5b60008060006060848603121561398c57600080fd5b61399584613959565b92506139a360208501613959565b9150604084015163ffffffff811681146139bc57600080fd5b809150509250925092565b600062ffffff838116908316818110156139e3576139e36138a5565b039392505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613a2357613a236138a5565b500290565b600082613a5e577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60005b83811015613a7e578181015183820152602001613a66565b838111156103b45750506000910152565b60008151808452613aa7816020860160208601613a63565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b84815283602082015273ffffffffffffffffffffffffffffffffffffffff8316604082015260806060820152600061352b6080830184613a8f565b600073ffffffffffffffffffffffffffffffffffffffff838116908316818110156139e3576139e36138a5565b600073ffffffffffffffffffffffffffffffffffffffff808316818516808303821115613b7057613b706138a5565b01949350505050565b600073ffffffffffffffffffffffffffffffffffffffff8088168352861515602084015285604084015280851660608401525060a060808301526132ef60a0830184613a8f565b60008060408385031215613bd357600080fd5b505080516020909101519092909150565b80516fffffffffffffffffffffffffffffffff8116811461147857600080fd5b600060408284031215613c1657600080fd5b6040516040810181811067ffffffffffffffff82111715613c3957613c3961361b565b604052613c4583613be4565b8152613c5360208401613be4565b60208201529392505050565b805167ffffffffffffffff8116811461147857600080fd5b600060608284031215613c8957600080fd5b6040516060810181811067ffffffffffffffff82111715613cac57613cac61361b565b604052613cb883613c5f565b8152613cc660208401613c5f565b6020820152613cd760408401613be4565b60408201529392505050565b6020815260006138856020830184613a8f565b60008251613d08818460208701613a63565b919091019291505056fea26469706673582212201ff294929b57776d43429e47ba13e7bb550e4a27be6afbadf8c8a0d6ad6324b364736f6c634300080a0033000000000000000000000000000000000000000000000000"; From 5784bb3959b6be6133debdb450953552c9770bfd Mon Sep 17 00:00:00 2001 From: David Meister Date: Mon, 26 Oct 2026 21:41:42 +0000 Subject: [PATCH 14/15] Regenerate pointers, pins and meta Co-Authored-By: Claude Opus 5.5 --- crates/test_fixtures/abis/RaindexV6.json | 2 +- .../abis/RaindexV6SubParser.json | 2 +- meta/RaindexV6SubParser.rain.meta | Bin 1466 -> 1473 bytes .../RaindexV6SubParserAuthoringMeta.rain.meta | Bin 7936 -> 7936 bytes src/generated/RaindexV6SubParserPointers.sol | 10 +++++----- .../GenericPoolRaindexV6ArbOrderTaker.sol | 10 +++++----- .../GenericPoolRaindexV6FlashBorrower.sol | 10 +++++----- src/generated/candidate/RaindexV6.sol | 8 ++++---- .../candidate/RaindexV6SubParser.sol | 8 ++++---- .../RouteProcessorRaindexV6ArbOrderTaker.sol | 10 +++++----- 10 files changed, 30 insertions(+), 30 deletions(-) diff --git a/crates/test_fixtures/abis/RaindexV6.json b/crates/test_fixtures/abis/RaindexV6.json index dbf45f003c..4a241f267a 100644 --- a/crates/test_fixtures/abis/RaindexV6.json +++ b/crates/test_fixtures/abis/RaindexV6.json @@ -2437,7 +2437,7 @@ } ], "bytecode": { - "object": "0x6080806040523460395760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005561588e908161003e8239f35b5f80fdfe6080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a71461180e575080632cb77e9f146117e257806341d1514f146117ab5780635343c1b7146117105780635cffe9de146115b45780635d003c4414611430578063613255ab146113ad578063687cf02a14611096578063ac9650d814610f48578063b0460f07146105f3578063b845b83e1461059b578063ca9109ba1461044c578063d9d98ce41461039b578063ddebc96f146103475763df6db3c2146100c1575f80fd5b34610321576003196040368201126103215767ffffffffffffffff9060043582811161032157806004019160a0823603918201126103215760243584811161032157610111903690600401611cd0565b909361011b612bf0565b5f946001600160a01b039485610130846125d7565b163303610325576101496101443685611b02565b612c32565b805f525f60205260405f20966001885414610190575b60208960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556040519015158152f35b9091929394959697505f600198556040519633885282602089015260606040890152816101bc8761188d565b166060890152602484013590606219018112156103215783019060a06080890152806101ea6004840161188d565b166101008901526101fd6024830161188d565b16610120880152604481013560221982360301811215610321570190602460048301359201988211610321578136038913610321577f09d18501db0080ca2d6cd7c17fa7255daff4b2d503ea93b76ff68b6752ea8e6387806103069560846102c561030e9a60209f610284906103149f9a60606101406102ef9d0152610160880191612388565b6102b66102ab61029760448801856129db565b605f198a8603810160a08c01529491612a10565b9260648701906129db565b918784030160c0880152612a10565b91013560e08301520390a13390919060405192600284526020840152604083015260608201604052565b906040519160018352602083015260408201604052565b9236916123a8565b90613c65565b5f8080808080808061015f565b5f80fd5b602486610331856125d7565b6040516335252be360e01b815291166004820152fd5b3461032157600319602036820112610321576004359067ffffffffffffffff82116103215760809082360301126103215761038660609160040161262b565b90604051921515835260208301526040820152f35b34610321576040366003190112610321576001600160a01b036103bc611861565b166040516370a0823160e01b8152306004820152602081602481855afa908115610441575f9161040f575b50156103f75760206040515f8152f35b60249060405190633c5bf76960e21b82526004820152fd5b90506020813d602011610439575b8161042a60209383611971565b810103126103215751826103e7565b3d915061041d565b6040513d5f823e3d90fd5b346103215761045a36611d01565b92809492610466612bf0565b610471828533613b61565b61047a816134d6565b15610567578061048e6104dd9286336140a7565b9790957f7f9dfa19cf1cc2f806f2f860fbc9c056b601fb1afc0e9b843dfe5c63616268e660806040513381526001600160a01b038416998a60208301528560408301526060820152a1336137bd565b9390918561050c575b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b61055b9661030e956103069460ff93604051956005875260208701526040860152606085015260808401521660a082015260c08101604052906040519160018352602083015260408201604052565b808080808080806104e6565b506040516306dde9c360e41b81523360048201526001600160a01b03841660248201526044810191909152606490fd5b0390fd5b346103215760203660031901126103215760043567ffffffffffffffff81116103215761030e6105d26104e6923690600401611cd0565b91906105dc612bf0565b604051926105e984611955565b5f845236916123a8565b34610321576003196020368201126103215767ffffffffffffffff600435116103215760c090600435360301126103215761062c612bf0565b5f808061064160048035608481019101612510565b905015610f36576024600435013592610659846134d6565b15610f245760608060405161066d81611909565b610675612565565b81525f60208201525f6040820152015261068d612565565b506106ed6106e86106c76106bd6106b76106b1608460043501600435600401612510565b90612597565b806125b2565b60408101906124a2565b60206106e06106b1608460043501600435600401612510565b0135916125c7565b6125d7565b936001600160a01b0361073c6106e86107236107196106b76106b1608460043501600435600401612510565b60608101906124a2565b60406106e06106b1608460043501600435600401612510565b816040519761074a896118d1565b168752166020860152604085015261076c608460043501600435600401612510565b9490506001604051955f87520160051b85016040525f905f5b610799608460043501600435600401612510565b9050811080610f11575b15610d5e576107bc608460043501600435600401612510565b821015610d4a578160051b810135607e198236030181121561032157608081830136031261032157604051916107f183611909565b8181013567ffffffffffffffff81116103215761081390369084840101611b02565b835280820160208181013590850152604080820135908501526060013567ffffffffffffffff81116103215761084c9236920101611cb5565b606082015280516001600160a01b0361086e6040830151602085015190611dbe565b5151166001600160a01b0385511614801590610d16575b610d045761089d602083015160408401519083613fa4565b6108a681612c32565b91825f525f60205260405f2054155f1461090a575051604080513381526001600160a01b039092166020830152810191909152600191907fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f390606090a15b01610785565b919061093b60208497959701516040850151906060860151906040519261093084611955565b5f8452339186613234565b5f94916109a457505051604080513381526001600160a01b03909216602083015281019190915260019291907f1e6fa9678edf81f9f25bbf308bde03ad3e110db1f429394b0915ba021532941490606090a15b811561099c575b5092610904565b905088610995565b6109b9606082015160446004350135906134f9565b15610a1357505051604080513381526001600160a01b03909216602083015281019190915260019291907fe3151dc8cb7a54ffc4baabd28c1f241c94d510b5e5b502491ac3cad6c16316d59080606081015b0390a161098e565b610a2060408201516134d6565b158015610cf1575b15610a7e57505051604080513381526001600160a01b03909216602083015281019190915260019291907f500b713857325f9e6dcb52ae832eca9109d107ed1aae9cb4928b4c1e13f051aa908060608101610a0b565b9250925050600196959691610a976064600435016125eb565b15610c5e5796610b0797610b1760408401516040880151610ab88183613543565b15610c565750925b610b11848592610afa610af460608a01516001600160e01b03601b918660e01d92828816810b928260e01d9216900b6145f4565b90614569565b9d8e9260408d015161356a565b60408c015261407d565b9961407d565b98610b228484613594565b610b2c84826135f2565b60405192338452608060208501526060610b528451608080880152610100870190611e19565b93602081015160a0870152604081015160c0870152015192607f198582030160e0860152835180825260208201906020808260051b8501019601925f5b828110610bee57505050505092806001979695937fbae4dbf76931c547f765e9def16d693d86daaa596f491de979008831789185ae93610be996604084015260608301520390a180858c5101808d5260051b8c01526138a9565b61098e565b9091929396602080610c49600193601f198782030189528b51906001600160a01b03825116815283820151848201526060610c3860408401516080604085015260808401906125f8565b920151906060818403910152611d4d565b9901950193929101610b8f565b905092610ac0565b610b0790610b176060840151610b11610c9c610af460408801516001600160e01b0394601b90868360e01d9316820b91878260e01d9216900b6145f4565b60408a0151610cab8183613543565b15610ce95750915b829c8d916060890151908116155f14610cda575060408801515b96879460408d015161356a565b610ce49085613fd9565b610ccd565b905091610cb3565b50610cff6060820151613520565b610a28565b60405163936bb5ad60e01b8152600490fd5b506001600160a01b03610d326060830151604085015190611dbe565b5151166001600160a01b036020860151161415610885565b634e487b7160e01b5f52603260045260245ffd5b50919390610d706064600435016125eb565b15610f0b57835b6004356004013590610d898282613543565b610eed5750508490610da9856001600160a01b0360208701511633613bf3565b505060a46004350190610dc18260043560040161246f565b905015159081610ee5575b50610e44575b506001600160a01b03610de892935116336140a7565b50505b8351811015610e105780610e0a610e0460019387611dbe565b5161371d565b01610deb565b5060409160017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005582519182526020820152f35b90506001600160a01b03602084015116610e6e6001600160a01b038551169260043560040161246f565b929091333b1561032157610eb65f93604051958694859463691f9ed760e01b8652600486015260248501528960448501528a606485015260a0608485015260a4840191612388565b038183335af190811561044157859115610dd2579050610ed69150611925565b5f836001600160a01b03610dd2565b905088610dcc565b604492506040519163573b6f4160e01b835260048301526024820152fd5b84610d77565b50610f1f60408301516134d6565b6107a3565b60405163315f9e2360e21b8152600490fd5b604051639c95219f60e01b8152600490fd5b34610321576020806003193601126103215760043567ffffffffffffffff811161032157610f7a903690600401611cd0565b919060405192610f8984611955565b5f8452828401610f9882611a55565b94610fa66040519687611971565b828652610fb283611a55565b93610fc486880195601f1901866124f4565b5f5b84811061102857604080518881528951818a018190525f92600582901b83018101918a918c9085015b828710610ffc5785850386f35b909192938280611018600193603f198a82030186528851611d4d565b9601920196019592919092610fef565b806110778861107161104460019560059d9c9d1b87018761246f565b929089846040519586938585013782018381015f81528b519283915e015f83820152038084520182611971565b30613f13565b611081828a611dbe565b5261108c8189611dbe565b5001969596610fc6565b34610321576003196040368201126103215760043567ffffffffffffffff8082116103215760c08260040193833603011261032157602435908111610321576110e3903690600401611cd0565b906110ec612bf0565b61111d61111861111361110c611102888061245a565b604081019061246f565b3691611993565b613e95565b613efe565b801561139b5760011015611389576024830161113981866124a2565b90501561137757604484019461114f86826124a2565b905015611365576111b561117d966111a961117461116d858061245a565b95856124a2565b999092856124a2565b91909261119a60405197611190896118a1565b33895236906119f7565b9a60209b8c8901523691611a6d565b60408601523691611a6d565b6060830152606485013560808301526111cd82612c32565b91825f525f875260405f20958654159687611211575b888860017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055604051908152f35b6001905560a46001600160a01b03917f87491344dfbcf91f6cbbc610cbbeedc85313d37a02df0c93527f7ea5f8db717f83855116604051908152878c82015260606040820152806112656060820188611e19565b0390a10191611274838561246f565b90506112b9575b505050506112ad92916103066102ef61030e933390919060405192600284526020840152604083015260608201604052565b828080808080806111e3565b6112c661110c848661246f565b6112cf816145d0565b156113425750937fd46c2c56b35c8210e9e712ec3f02242d5fc90187c0ac8ed80cc33626846ec369896112ad989795611335611318610306976102ef9761030e9b51169361246f565b866040519586958652850152606060408501526060840191612388565b0390a1938395965061127b565b89610597604051928392630c89984b60e31b845260048401526024830190611d4d565b60405163540e5f0b60e01b8152600490fd5b604051636c44ef8f60e01b8152600490fd5b604051633c8270bd60e21b8152600490fd5b604051632cff108b60e21b8152600490fd5b3461032157602080600319360112610321576024816001600160a01b036113d2611861565b16604051928380926370a0823160e01b82523060048301525afa908115610441575f91611403575b50604051908152f35b90508181813d8311611429575b61141a8183611971565b810103126103215751826113fa565b503d611410565b346103215761143e36611d01565b929161144b949194612bf0565b611456838333613b61565b61145f816134d6565b15611583578160ff916114778561153a969533612a60565b6114818183613543565b1561157d575080935b61149685828533613b95565b917f8045c25080b0868951141ed0a91720bcad09a8364a2b3109ee1fd49c1f0bc8b860c06114c5898833613bf3565b97906001600160a01b0360405192338452169a8b6020840152856040840152886060840152608083015260a0820152a16040519660068852602088015260408701526060860152608085015260a08401521660c082015260e08101604052906040519160018352602083015260408201604052565b90806115665760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b6115759261030e9136916123a8565b8080806104e6565b9361148a565b50604051623a3a4d60e21b81523360048201526001600160a01b039190911660248201526044810191909152606490fd5b34610321576080366003190112610321576004356001600160a01b0390818116809103610321576115e3611877565b6044359167ffffffffffffffff91606435838111610321573660238201121561032157806004013593841161032157366024858301011161032157611670956020921693611632868587613a82565b60405196879283926323e30c8b60e01b84523360048501528760248501528860448501525f606485015260a06084850152602460a485019201612388565b03815f855af1938415610441575f946116dc575b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd984036116c3576116b893503091613afb565b602060405160018152f35b604051630b6c58a960e31b815260048101859052602490fd5b9093506020813d602011611708575b816116f860209383611971565b8101031261032157519284611684565b3d91506116eb565b34610321576101403660031901126103215767ffffffffffffffff60043581811161032157611743903690600401611b02565b6024358281116103215761175b903690600401611b02565b60c0366043190112610321576101043583811161032157611780903690600401611cb5565b90610124359384116103215761179d6104e6943690600401611cb5565b926117a6612bf0565b611eca565b346103215760603660031901126103215760206117da6117c9611861565b6117d1611877565b60443591612a60565b604051908152f35b34610321576020366003190112610321576004355f525f6020526020600160405f205414604051908152f35b34610321576020366003190112610321576004359063ffffffff60e01b82168092036103215760209163e414309160e01b8114908115611850575b5015158152f35b6301ffc9a760e01b14905083611849565b600435906001600160a01b038216820361032157565b602435906001600160a01b038216820361032157565b35906001600160a01b038216820361032157565b60a0810190811067ffffffffffffffff8211176118bd57604052565b634e487b7160e01b5f52604160045260245ffd5b6060810190811067ffffffffffffffff8211176118bd57604052565b6040810190811067ffffffffffffffff8211176118bd57604052565b6080810190811067ffffffffffffffff8211176118bd57604052565b67ffffffffffffffff81116118bd57604052565b60e0810190811067ffffffffffffffff8211176118bd57604052565b6020810190811067ffffffffffffffff8211176118bd57604052565b90601f8019910116810190811067ffffffffffffffff8211176118bd57604052565b92919267ffffffffffffffff82116118bd57604051916119bd601f8201601f191660200184611971565b829481845281830111610321578281602093845f960137010152565b9080601f83011215610321578160206119f493359101611993565b90565b91906060838203126103215760405190611a10826118d1565b8193611a1b8161188d565b8352611a296020820161188d565b602084015260408101359167ffffffffffffffff831161032157604092611a5092016119d9565b910152565b67ffffffffffffffff81116118bd5760051b60200190565b929192611a7982611a55565b604092611a896040519283611971565b819581835260208093019160061b84019381851161032157915b848310611ab257505050505050565b8583830312610321578386918251611ac9816118ed565b611ad28661188d565b81528286013583820152815201920191611aa3565b9080601f83011215610321578160206119f493359101611a6d565b91909160a0818403126103215760405190611b1c826118a1565b8193611b278261188d565b835267ffffffffffffffff9160208101358381116103215782611b4b9183016119f7565b602085015260408101358381116103215782611b68918301611ae7565b6040850152606081013592831161032157611b896080939284938301611ae7565b60608501520135910152565b90929192611ba281611a55565b91604094611bb36040519485611971565b839583855260208095019160059460051b8401948186116103215784935b868510611be2575050505050505050565b67ffffffffffffffff90853582811161032157870190608082860312610321578551611c0d81611909565b611c168361188d565b81528a8301358b8201528683013584811161032157830186601f8201121561032157803590611c4482611a55565b91611c518a519384611971565b8083528d80840191891b83010191898311610321578e809101915b838310611ca557505050508782015260608084013594851161032157611c96878d968796016119d9565b90820152815201940193611bd1565b82358152918101918f9101611c6c565b9080601f83011215610321578160206119f493359101611b95565b9181601f840112156103215782359167ffffffffffffffff8311610321576020808501948460051b01011161032157565b906080600319830112610321576004356001600160a01b0381168103610321579160243591604435916064359067ffffffffffffffff821161032157611d4991600401611cd0565b9091565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b805115610d4a5760200190565b805160011015610d4a5760400190565b805160021015610d4a5760600190565b805160031015610d4a5760800190565b805160041015610d4a5760a00190565b8051821015610d4a5760209160051b010190565b9081518082526020808093019301915f5b828110611df1575050505090565b835180516001600160a01b031686528201518583015260409094019392810192600101611de3565b90608080611e8f611e7d611e6b60406001600160a01b0380895116885260208901519060a060208a01528082511660a08a015260208201511660c08901520151606060e0880152610100870190611d4d565b60408701518682036040880152611dd2565b60608601518582036060870152611dd2565b93015191015290565b90611ea282611a55565b611eaf6040519182611971565b8281528092611ec0601f1991611a55565b0190602036910137565b926001600160a01b038451166001600160a01b0383511614612376576001600160a01b03611eff606086015160643590611dbe565b515116906040830151916001600160a01b03611f1e6084358095611dbe565b51511614801590612336575b610d04576040850151906001600160a01b03611f496044358094611dbe565b5151166001600160a01b03611f6460643560608a0151611dbe565b5151161461232457611f7586612c32565b805f525f60205260405f2054156122d15750611f9084612c32565b805f525f60205260405f20541561227d5750612075929161204d917f6fa7f4c28634b0a9d6831401c45ae468195fb63aed07308935c35374ff5d9e3960405180611ff8611fea61012033845280602085015283018d611e19565b82810360408401528a611e19565b85606083015260643560808301528760a083015260a43560c083015260c43560e083015260e4356101008301520390a16001600160a01b038651166040519261204084611955565b5f8452606435908a612e9c565b9490506001600160a01b038651166040519261206884611955565b5f845260a4359086612e9c565b92905061208560408201516134d6565b158015612269575b8015612256575b8015612243575b61223157604051916120ac83611909565b5f83525f60208401525f60408401525f60608401526120cb84836144e1565b845260408401526120f16120df83866144e1565b6020860152806060860152845161356a565b94612105602085015160408601519061356a565b9361210f87613520565b8015612222575b612210576121d7612209957fd9fa84dd790c969daa5c33d8050dc06b4a9b59d5b42e2be5f5e8ae20447f618d946121b961220e9a60a0966121588a8851613594565b6121668c6020890151613594565b6121748a60408901516135f2565b6121828c60608901516135f2565b61218b8a61371d565b6121948c61371d565b6001600160a01b036121b060c435926060606435910151611dbe565b515116336137bd565b50506001600160a01b036121b060e43592606060a435910151611dbe565b5050606060405191338352805160208401526020810151604084015260408101518284015201516080820152a16138a9565b6138a9565b565b604051630d86822160e01b8152600490fd5b5061222c85613520565b612116565b6040516321badf1f60e01b8152600490fd5b506122516060840151613520565b61209b565b506122646060820151613520565b612094565b5061227760408401516134d6565b1561208d565b9351604080513381526001600160a01b039092166020830152810194909452507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f3945091925082915050606081015b0390a1565b9551604080513381526001600160a01b039092166020830152810196909652507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f3949350839250506060820190506122cc565b604051631cd2f1c760e21b8152600490fd5b506001600160a01b03612350606085015160a43590611dbe565b5151166001600160a01b0361236c604088015160443590611dbe565b5151161415611f2a565b604051630a98f1f360e21b8152600490fd5b908060209392818452848401375f828201840152601f01601f1916010190565b909291926123b581611a55565b916040916123c66040519485611971565b839581855260208095019160051b8301938185116103215783925b8584106123f15750505050505050565b67ffffffffffffffff90843582811161032157860190838286031261032157835161241b816118ed565b823584811161032157866124309185016119f7565b8152898301359384116103215761244b868b95869501611cb5565b838201528152019301926123e1565b903590605e1981360301821215610321570190565b903590601e1981360301821215610321570180359067ffffffffffffffff82116103215760200191813603831361032157565b903590601e1981360301821215610321570180359067ffffffffffffffff821161032157602001918160061b3603831361032157565b5f5b608081106124e6575050565b6060828201526020016124da565b5f5b82811061250257505050565b6060828201526020016124f6565b903590601e1981360301821215610321570180359067ffffffffffffffff821161032157602001918160051b3603831361032157565b60405190612553826118d1565b60606040835f81525f60208201520152565b60405190612572826118a1565b5f608083828152612581612546565b6020820152606060408201526060808201520152565b9015610d4a57803590607e1981360301821215610321570190565b903590609e1981360301821215610321570190565b9190811015610d4a5760061b0190565b356001600160a01b03811681036103215790565b3580151581036103215790565b9081518082526020808093019301915f5b828110612617575050505090565b835185529381019392810192600101612609565b9061264361014461263c84806125b2565b3690611b02565b5f5260205f81526040926001845f2054036129d057916128c5916126ca85855f61284a6126738361268a9a6125b2565b61268f878501359182878701359c8d923690611b02565b613fa4565b6126a761269c85806125b2565b946060810190612510565b96906126c28751966126b888611955565b8688523690611b02565b973691611b95565b906126d3612c63565b506127fa8651916126e3836118a1565b600483526126f28a84016124d8565b886126fc81612c32565b988b6001600160a01b039a8b84511690835192600384528301528282015233606082015260808101825261272f86611d71565b5261273985611d71565b508051612745816118d1565b6002815281368e83013761275886611d7e565b5261276285611d7e565b50810160ff8c6127c56127ae8d806127878161277f8b8a51611dbe565b515116614172565b97511690612796898851611dbe565b515116846127a58a8951611dbe565b51015191612a60565b958d6127bb828751611dbe565b5151169451611dbe565b51015192169093929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b61280382611d8e565b5261280d81611d8e565b506128318b886060810160ff8c6127c56127ae8d806127878161277f8b8a51611dbe565b61283a82611d9e565b5261284481611d9e565b50614250565b918385511693868601918b83519289818551169401511693878652308a5281808720915101519082519261287d84611955565b878452519561288b87611939565b86528a8601528d85015284606085015285608085015260a084015260c08301528a5180809a819463d04dfe2360e01b835260048301612de4565b03915afa95865f915f986129aa575b506128e35788513d5f823e3d90fd5b95938651600281106129935750888798998260c0979899015199015161291161290b85611dae565b51611d9e565b5161291c8183613543565b156129895750998a925b6129488b85919060405192600284526020840152604083015260608201604052565b61295186611d8e565b5261295b85611d8e565b5082519661296888611939565b8752860152840152866060840152608083015260a082015201526001929190565b9050998a92612926565b6024908a5190630fbb8e5560e21b82526004820152fd5b9097506129c991503d805f833e6129c18183611971565b810190612ca0565b965f6128d4565b505f92508291829150565b9035601e198236030181121561032157016020813591019167ffffffffffffffff8211610321578160061b3603831361032157565b9190808252602080920192915f905b828210612a2d575050505090565b909192936001906001600160a01b03612a458761188d565b16815285830135838201526040908101950193920190612a1f565b8215612a95576001600160a01b038091165f52600160205260405f2091165f5260205260405f20905f5260205260405f205490565b909150612aa182614172565b6001600160a01b03809316906040918251946370a0823160e01b86528416938460048701526020928387602481865afa968715612bb7575f97612bc1575b5083612af8612af183612b289a614f36565b50906149f8565b508651636eb1769f60e11b81526001600160a01b0390941660048501523060248501529297889081906044820190565b0381865afa968715612bb7575f97612b86575b50612af1612b4c916119f498614f36565b50612b578183613543565b15612b7e5750935b5f5260018252825f20905f528152815f20905f8052525f20549061407d565b905093612b5f565b96508387813d8311612bb0575b612b9d8183611971565b8101031261032157955195612af1612b3b565b503d612b93565b85513d5f823e3d90fd5b96508387813d8311612be9575b612bd88183611971565b810103126103215795519583612adf565b503d612bce565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f006002815414612c205760029055565b604051633ee5aeb560e01b8152600490fd5b604051612c5d81612c4f6020820194602086526040830190611e19565b03601f198101835282611971565b51902090565b60405190612c7082611939565b606060c083612c7d612565565b81525f60208201525f60408201525f838201528260808201525f60a08201520152565b919060408382031261032157825167ffffffffffffffff908181116103215784019082601f83011215610321578151602092612cdb82611a55565b91612ce96040519384611971565b808352848084019160051b830101918683116103215785809101915b838310612d785750505050948281015191821161032157019180601f84011215610321578251612d3481611a55565b93612d426040519586611971565b818552838086019260051b820101928311610321578301905b828210612d69575050505090565b81518152908301908301612d5b565b8251815291810191869101612d05565b90808251908181526020809101926020808460051b8301019501935f915b848310612db65750505050505090565b9091929394958480612dd4600193601f198682030187528a516125f8565b9801930193019194939290612da6565b91906020928381526001600160a01b0382511684820152838201516040820152612e1e604083015160e06060840152610100830190611d4d565b9060608301516080820152612e45608084015192601f1993848483030160a0850152612d88565b9260a081015193838382030160c08401528680865192838152019501905f5b818110612e88575050506119f494955060c060e091015192828503019101526125f8565b825187529588019591880191600101612e64565b94959395929192612eab612c63565b50604096875190612ebb826118a1565b60048252602093612ecd8584016124d8565b612ed689612c32565b6001600160a01b038097818c51168d519360038552898501528d840152166060820152608081018b52612f0884611d71565b52612f1283611d71565b508951612f1e816118d1565b600281528a3687830137612f3184611d7e565b52612f3b83611d7e565b50898901908681835190612f4e91611dbe565b515116612f5a90614172565b86888c51168984865190612f6d91611dbe565b5151168285875190612f7e91611dbe565b51015190612f8b92612a60565b928981865190612f9a91611dbe565b515116945190612fa991611dbe565b5101519060ff16612fe1929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b612fea83611d8e565b52612ff482611d8e565b5060608801858782519061300791611dbe565b51511661301390614172565b868a5116878984519061302591611dbe565b515116878a85519061303691611dbe565b5101519061304392612a60565b908689898186519061305491611dbe565b51511694519061306391611dbe565b5101519060ff1661309b929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b6130a483611d9e565b526130ae82611d9e565b506130b891614250565b9183875116938188019283519183818451169301511693865f523084528a805f20915101518b51916130e983611955565b5f83528c51966130f888611939565b8752858701528b8601525f60608601526080850186905260a085015260c0840152885163d04dfe2360e01b815292839081906131379060048301612de4565b03815a935f94fa91825f915f94613216575b506131585788513d5f823e3d90fd5b979495969791948251966002881097886131ff5750818385015194015161318161290b87611dae565b5161318c8183613543565b156131f75750925b6131b68585919060405192600284526020840152604083015260608201604052565b6131bf87611d8e565b526131c986611d8e565b5082519a6131d68c611939565b8b528a01528801526060870152608086015260a085015260c0840152159190565b905092613194565b602490835190630fbb8e5560e21b82526004820152fd5b90935061322d91503d805f833e6129c18183611971565b925f613149565b95949193908693613243612c63565b505f92604061335e815192613257846118a1565b600484526020936132698582016124d8565b6133276132758b612c32565b8b6001600160a01b03998a9283835116895191600383528b830152898201528360609b168b8201526080810189526132ac86611d71565b526132b685611d71565b5087516132c2816118d1565b6002815288368b8301376132d586611d7e565b526132df85611d7e565b5060ff896127c58a85019361331b876132fd8161277f858a51611dbe565b9751168861330c848951611dbe565b515116856127a5858a51611dbe565b966127bb828751611dbe565b61333082611d8e565b5261333a81611d8e565b50612831878b8d60ff896127c58c85019361331b876132fd8161277f858a51611dbe565b946133de5f868a511698869786889c0191825191888184511693015116928c8552308952878086209151015188519161339683611955565b8683528951956133a587611939565b86528a86015288850152848a8501528b608085015260a084015260c08301528551808095819463d04dfe2360e01b835260048301612de4565b03915afa90815f915f936134b8575b506134ab575050505f975b6002855110988915996134985782848701519601519061341a61290b89611dae565b51906134268284613543565b1590506134905750925b6134528685919060405192600284526020840152604083015260608201604052565b61345b88611d8e565b5261346587611d8e565b5082519b6134728d611939565b8c528b0152890152870152608086015260a085015260c08401529190565b905092613430565b50505050505050505091506119f4612c63565b91999850945093966133f8565b9092506134cf91503d805f833e6129c18183611971565b915f6133ed565b6134f5905f60e01d906001600160e01b038160e01d9116601b0b614fed565b1290565b906134f5916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b61506e565b61353f905f60e01d906001600160e01b038160e01d9116601b0b614fed565b1390565b9061353f916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b61506e565b6119f491610af4916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614544565b6135ee9160808101826135b06135aa8351611dae565b51611dae565b526135e76135e16001600160a01b038094515116936135d86135d28551611dae565b51611d71565b51169251611dae565b51611d8e565b5191613b95565b5050565b906080810191806136066135aa8551611d9e565b526001600160a01b038092515116916136226135d28551611d9e565b51166136316135e18551611d9e565b5190816136e55761364183613520565b6136cc579183917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a95936122cc955f5260209060018252613697604094855f20835f528452855f20855f528452855f205461407d565b945f5260018252835f20905f528152825f20915f52525f20555b51604051918291338352604060208401526040830190612d88565b60405163793a8f5560e01b815260048101849052602490fd5b91613716917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a95936122cc956137bd565b50506136b1565b6080810161372e6135e18251611d9e565b5191821561373b57505050565b6137556135d26001600160a01b0380935151169351611d9e565b5116815f5260209160018352604092835f20835f528152835f20855f528152835f2054936001600160e01b038516613790575b505050505050565b6137b4955f9284845260018152828420868552815282842091845252812055613bf3565b5f808080613788565b939291936137ca83613520565b6136cc57846137e6576137de939450613bf3565b50505f905f90565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f528152613823835f2054948561407d565b9561382d87613520565b613850575f97885260018252838820908852815282872091875252909320829055565b835163c5e12af560e01b815260048101889052602490fd5b90604082019082526020606081936040838201528551809452019301915f5b828110613895575050505090565b835185529381019392810192600101613887565b60c0810151908151915f92613a1d575b5061395e6020918281510151926001600160a01b039081818187511696015116928660a082019485518252308452604097888320898686510151015160808601518b519161390683611955565b8683528c519361391585611955565b8785528d519661392488611939565b8752898701528c86015260016060860152608085015260a084015260c08301528851808099819463d04dfe2360e01b835260048301612de4565b03915afa948515613a135787956139f5575b508451613981575b50505050505050565b81905101510151169051813b156139f1579184918493836139b6965180978195829463012c676d60e21b845260048401613868565b03925af19081156139e857506139d1575b8080808080613978565b6139db8291611925565b6139e557806139c7565b80fd5b513d84823e3d90fd5b8480fd5b613a0a9195503d8089833e6129c18183611971565b9050935f613970565b86513d89823e3d90fd5b6001600160a01b03602080845101510151169060a083015190823b1561032157613a60925f928360405180968195829463012c676d60e21b845260048401613868565b03925af1801561044157156138b957613a7a919250611925565b5f905f6138b9565b6040519263a9059cbb60e01b5f526001600160a01b0380931660045260245260205f60448180855af160015f5114811615613adc575b8360405215613ac657505050565b635274afe760e01b835216600482015260249150fd5b6001811516613af257813b15153d151616613ab8565b833d5f823e3d90fd5b9092604051936323b872dd60e01b5f526001600160a01b0393848092166004521660245260445260205f60648180855af160015f5114811615613b4b575b836040525f60605215613ac657505050565b6001811516613af257813b15153d151616613b39565b909115613b6c575050565b6040516305dbdfd960e41b81526001600160a01b03918216600482015291166024820152604490fd5b93929193613ba283613520565b6136cc5784613bb6576137de9394506140a7565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f528152613823835f2054948561356a565b90929192613c0081614573565b93613c0a81613520565b613c535784816001600160e01b03613c299360e01d9116601b0b615198565b50809281613c39575b5050509190565b6001600160a01b03613c4b9316613a82565b5f8181613c32565b604051632d1671a360e11b8152600490fd5b916040805191613c74836118a1565b60048084526020613c868186016124d8565b5f5b8751811015613cbb5780613c9e6001928a611dbe565b51613ca98289611dbe565b52613cb48188611dbe565b5001613c88565b5092955092939093335f52308352855f2091865190613cd9826118ed565b613ce1612546565b8252606085819301528751613cf581611955565b5f8152885191613d0483611955565b5f83525f3681375f5b8151811015613e6a57613d208183611dbe565b5190888c8b84519189818401518d8d8251613d48575b50505050505050506001915001613d0d565b5f613db797948197948c9794613d758c956001600160a01b039d8e81818d51169c0151169b015190614250565b94865199613d828b611939565b8a528901528488015286015260808501528a60a08501528b60c08501525180958194829363d04dfe2360e01b84528301612de4565b03915afa938415613e60578b915f95613e42575b508451613de0575b50908b8e89838d8d613d36565b51015116803b1561032157613e0f925f918c8f84905180978195829463012c676d60e21b845233908401613868565b03925af1918215613e3857600192613e29575b8981613dd3565b613e3290611925565b5f613e22565b8c513d5f823e3d90fd5b613e579195503d805f833e6129c18183611971565b9050935f613dcb565b8e513d5f823e3d90fd5b5050505050505050509050565b8115613e81570490565b634e487b7160e01b5f52601260045260245ffd5b6040815110613ef1576020810151908051603f198101908111613edd5760051c8211613ec95760016020920160051b010190565b5050604051613ed781611955565b5f815290565b634e487b7160e01b5f52601160045260245ffd5b50604051613ed781611955565b805115613f0e57602001515f1a90565b505f90565b905f8091602081519101845af48080613f91575b15613f475750506040513d81523d5f602083013e60203d82010160405290565b15613f6e57604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b3d15613f7f576040513d5f823e3d90fd5b60405163d6bda27560e01b8152600490fd5b503d151580613f275750813b1515613f27565b91613fcf906060613fc4936001600160a01b039485916040880151611dbe565b515116940151611dbe565b5151161461232457565b6140006001600160e01b0392838316601b0b9260e01d938160e01d9116601b0b84846147af565b90637ffffff58213614050575b90614017916149f8565b9290921580614048575b61402a57505090565b6044925060405191638eba4d0760e01b835260048301526024820152fd5b508215614021565b61405a82826156c1565b1561400d57604483856040519163d556b11160e01b835260048301526024820152fd5b6119f491610af4916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614d9d565b9291926140b382614573565b936140bd81613520565b61411e5784816001600160e01b036140dc9360e01d9116601b0b615198565b9290809315614109575b508290816140f5575050509190565b613c4b926001600160a01b03309216613afb565b9092505f198114613edd57600101915f6140e6565b604051632eaefac360e21b8152600490fd5b6004111561413a57565b634e487b7160e01b5f52602160045260245ffd5b602090939291936001600160a01b03604082019516815261416e83614130565b0152565b61417a6156da565b60408051630782d7e160e01b81526001600160a01b03831660048201529091828260248173200e12d10bb0c5e4a17e7018f0f1161919bb93895afa928315614247575f925f94614212575b506141cf83614130565b600183141580614200575b6141e45750505090565b5163ee07877f60e01b815291829161059791906004840161414e565b5061420a83614130565b8215156141da565b908094506142369293503d8511614240575b61422e8183611971565b810190614f0c565b919091925f6141c5565b503d614224565b513d5f823e3d90fd5b61425a8251611e98565b6142648351611e98565b9282519281518015155f146144d957600201935b6001940184019061428882611a55565b956142a360409361429b8551998a611971565b808952611a55565b6142b5602091601f1901828a016124f4565b5f9584519389896002926002885233868901523089890152606097606081018a526142df84611d71565b526142e983611d71565b505f825b614499575b505050508651614309575b50505050505050505090565b9091929360028861432c8c866143258e809c9d9e018093611dbe565b528d611dbe565b500185614339828d611dbe565b52614344818c611dbe565b505f965b614353575b506142fd565b8851871015614494576001600160a01b036143ff898b856143f68c60428c8861437c8488611dbe565b51511696858261438c868a611dbe565b5101519261439a868a611dbe565b51838d82511691015182815160051b910120908451927f6ec4dff745ec96dbde88c5d41f8aa5ac13aa1664afb47b8406b44fa945a650c88452830152838201522090519161190160f01b83528d83015260228201522093611dbe565b51015191614f64565b1561447c578761446b8b8e8c8f9e9d9c9b9a999897968f614458918d61444e898f8f61443a83889f614431828f611dbe565b51511692611dbe565b52614445828b611dbe565b51015192611dbe565b52019c8d94611dbe565b5101516144658383611dbe565b52611dbe565b500196979895909192939495614348565b8851630a57f30960e31b815260048101899052602490fd5b61434d565b9091929a82518210156144d157906144c584809301809d6144ba8487611dbe565b516144658383611dbe565b50019082918d936142ed565b9a92916142f2565b505f93614278565b916040830192604061451b610af4606087519401938451906001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6145f4565b9451930161452a8151866134f9565b614532575050565b9093506119f491925051925183613fd9565b919291600160ff1b840161455c57611d4993506150c3565b90611d49935f0391614d9d565b61401782826149f8565b61457b6156da565b6040805163b7bad1b160e01b81526001600160a01b0383166004820152909182826024815f73200e12d10bb0c5e4a17e7018f0f1161919bb93895af1928315614247575f925f9461421257506141cf83614130565b6008815110613f0e576008015167ffffffffffffffff1667ff0a89c674ee78741490565b9091939284158215175f1461460e5750505090505f905f90565b82810192600160fd1b8082019083011760fe1c614745575b505061463181615386565b9361463b81615386565b9461464686826153a6565b90918215614736575f9083986f0785ee10d5da46d900f436a000000000808611614728575b50670de0b6b3a7640000808b11614719575b50633b9aca00808b1161470a575b50612710808b116146fc575b5098805b6146eb57508190611d49989982600a0a9109960195817fcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccd0a93838211900382610100031b9203901c1702916153b9565b60019290920191600a90048061469b565b60049a04998a930192614697565b600991939a049901915f61468b565b601291939a049901915f61467d565b85049950602592505f61466b565b50929050611d499495506153b9565b5f8212156147995780841361478b575b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb284131561462657909250611d499394916152c4565b909250611d4993949161532b565b8084121561475557909250611d499394916152c4565b929091806147d5576044848460405191637a97930f60e01b835260048301526024820152fd5b90919280155f146147ea57505050505f905f90565b614803936147f791615473565b92919490938492615473565b909391928461481188615386565b9161481b86615386565b947f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000094604c918688106149c2575b030191600160ff1b98838a018112155f1461498f575050035b5f955f821280614986575b614968575b5f811280614956575b6149385786820103966001600160ff1b038814908161492e575b5080614925575b8061491c575b6148fe5750906148b2929161561f565b915f81136148c5575b50611d49936153b9565b9091604c82136148f3576148dc91600a0a90613e77565b9081156148e9575f6148bb565b505050505f905f90565b50505050505f905f90565b876044916040519163d556b11160e01b835260048301526024820152fd5b505f85126148a2565b5082841461489c565b905088145f614895565b604489836040519163d556b11160e01b835260048301526024820152fd5b50806001600160ff1b0301821361487b565b95508087018613156149805786818703015b95614872565b5f61497a565b505f811361486d565b89985090920390506001600160ff1b03819003870182136149b35701860194614862565b5050505050505050505f905f90565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009650604b9250614849565b8115613e81570590565b8082601b82810b8314614bed577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000008405614b99575b8380820b03614b8857507b199999999999999999999999999999999999999999999999999999987b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc84011115614b39575b838060030b03614abd575b808413614aa15750506001600160e01b036001925b60e01b91161791565b8303600a0a8015613e81576001600160e01b0391071592614a98565b92915f841315614b0d575090614ad383836156c1565b614aef57637ffffffe1901600a0a810290637fffffff92614a83565b506044916040519163d556b11160e01b835260048301526024820152fd5b637fffffff1992830390604382136148f357614b2c91600a0a906149ee565b9182156148e95792614a83565b5f198401808060030b14614b4d5750614a78565b90506001600160e01b039293507b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff915060e01b9260ff1d181617905f90565b600190940193600a90930592614a2b565b937f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000840515614bda576305f5e100600894058094819201955b915050614a2b565b620186a060059405809481920195614bd2565b5082614a7857505050505f90600190565b919291600160ff1b9190801580614d8b575090614c1a91615473565b9490929091905f868585858282138015614d82575b614d65575b505050508682841860ff1c94860391039081604c038111614d4a5701600a0a808205919084614d30575b505081019182821860ff1c1115614d2857826001600160ff1b0314614d0a57905f600192135f14614cdb57600a9004915b01925b81158117614c9f57509190565b80614cb8575b508015614cb0579190565b505f91508190565b9192614cce9203600160ff1b01600a0a906149ee565b600160ff1b91905f614ca5565b600a60037fe6666666666666666666666666666666666666666666666666666666666666679201040191614c8f565b604490836040519163d556b11160e01b835260048301526024820152fd5b509092614c92565b8107614d3d575b80614c5e565b60ff1d600117015f614d37565b505050919350614d58579190565b60018160ff1d1790039190565b5f9a50909750909550600160ff1b94509250905086808080614c34565b50835f12614c2f565b15614d965750509190565b9350919050565b9392919384158115818117614eee57505090614db891615473565b9194908295614dc982958294615473565b8096929491969387868482138015614ee5575b614ecc575b5050505050508682841860ff1c94860391039081604c038111614d4a5701600a0a808205919084614eb2575b505081019182821860ff1c1115614eaa57826001600160ff1b0314614d0a57905f600192135f14614e7b57600a9004915b01925b81158117614e4e57509190565b80614e5e57508015614cb0579190565b600160ff1b93614e759291038401600a0a906149ee565b5f614ca5565b600a60037fe6666666666666666666666666666666666666666666666666666666666666679201040191614e3e565b509092614e41565b8107614ebf575b80614e0d565b60ff1d600117015f614eb9565b929b5098509196509450925090505f8080808080614de1565b50858412614ddc565b9395939092919015614f04575050614cb0579190565b945092915050565b919082604091031261032157815160048110156103215760209092015160ff811681036103215790565b9060ff165f03916001600160ff1b0382115f14614f5c57600a6001818404940192061590565b909190600190565b9091813b614f9f57614f769192615743565b50614f8081614130565b159182614f8c57505090565b6001600160a01b03918216911614919050565b6020918160645f935160405192630b135d3f60e11b9788855260048501526040602485015286820190604485015e8281018201859052601f01601f191601915afa905f5114601f3d11161690565b92915f9060018184145f87128715171717615067575f92808213615059575b03604c81135f82121761504d57600a0a908461502b83820293846149ee565b146150405750501561503c575f9190565b5f90565b90935090156119f4579190565b50501561503c575f9190565b5f956001945092509061500c565b5050505f90565b93929190918083145f83125f871218831587151717176150bd575f928082136150b05703604c81135f82121761504d57600a0a908461502b83820293846149ee565b919460019350919061500c565b50919050565b909291600160ff1b91828101615155575080841461514b57808413918215615143578185035b604c8111156151325750505f915b1561512357507f8000000000000000000000000000000000000000000000000000000000000001019190565b92506001600160ff1b03039190565b600a0a908115613e815704916150f7565b8482036150e9565b505090505f905f90565b9361516292945f03614bfe565b80939180928114615176575b50505f039190565b915092506001600160ff1b038314614d0a57600a600191059201915f8061516e565b91925f8312156151c0576044838360405191634a7d166b60e01b835260048301526024820152fd5b9192836151d257505090505f90600190565b60ff811682019180831261529a575f83121561520a575050604c198112614cb0575f03600a0a916152038382613e77565b9283021490565b909293915f81135f1461529057604d811361526557600a0a928315613e8157835f1904831161523c5750500290600190565b60405163c849483b60e01b815260048101849052602481019290925260ff166044820152606490fd5b5060405163c849483b60e01b81526004810192909252602482015260ff919091166044820152606490fd5b5050905090600190565b60405163c849483b60e01b815260048101869052602481019190915260ff82166044820152606490fd5b909392915f6152d49181846145f4565b9490945f8483019182019412159081615321575b8115615317575b506152f957505090565b604492506040519163d556b11160e01b835260048301526024820152fd5b905083125f6152ef565b82811291506152e8565b61534093600160fe1b908101939201906145f4565b9081815f821215615377575050604b1982126137de57615365915f03600a0a906149ee565b908161536f575f90565b600160ff1b90565b93600160ff1b90910192509050565b5f8112156119f457600160ff1b9080820361539f575090565b90505f0390565b905f198183099102908180821091030391565b92939291905f818418121561544e576001600160ff1b03928383111561543857600160ff1b938385036153ee57505050509190565b90919293508514615408575050600a600191045f03920190565b604051630ed8062160e21b8152600481019190915260248101919091526044810182905260648101849052608490fd5b5090915050600160ff1b8114613edd575f039190565b90916001600160ff1b0380841115613c32578514615408575050600a60019104920190565b919091801561561557827f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000080830515615523575b507f19999999999999999999999999999999999999999999999999999999999999997f0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc830110615514575b83136154fe5791905f90565b919060018060ff1b926001600160ff1b03030190565b9290600a02905f1901926154f2565b6f4b3b4ca85a86c47a098a22400000000080840515615603575b507728c87cb5c89a2571ebfdcb54864ada834a000000000000008305156155ec575b7b097edd871cfda3a5697758bf0e3cbb5ac5741c6400000000000000008305156155d8575b7e3899162693736ac531a5a58f1fbb4b746504382ca7e40000000000000000008305156155c8578205156155b9575b5f6154a7565b9290600a02905f1901926155b3565b9391606402916001190193615584565b93916402540be40002916009190193615584565b9391678ac7230489e800000291601219019361555f565b6025198301955092909202915f61553d565b505f915081908190565b90915f19838309928083029283808610950394808603958487101561569d5714615695579082910960018219018216809204600280826003021880830282030280830282030280830282030280830282030280830282030280920290030293600183805f03040190848311900302920304170290565b505091500490565b60648386866040519263362ced0960e11b8452600484015260248301526044820152fd5b6119f491905f8112156156d5575f0361577d565b61577d565b73200e12d10bb0c5e4a17e7018f0f1161919bb9389803b158015615718575b6157005750565b602490604051906373e6d7b360e01b82526004820152fd5b507f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d41813f14156156f9565b81519190604183036157735761576c9250602082015190606060408401519301515f1a9061580c565b9192909190565b50505f9160029190565b90637ffffff581131561580657637ffffffe19810190604382136157ff575f8212156157d357637fffffff91505f0301600a0a7b8000000000000000000000000000000000000000000000000000000202111590565b50600a0a8015613e81577b80000000000000000000000000000000000000000000000000000001041090565b5050151590565b50505f90565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411615883579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa15610441575f516001600160a01b0381161561587957905f905f90565b505f906001905f90565b5050505f916003919056", + "object": "0x6080806040523460395760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055615b84908161003e8239f35b5f80fdfe6080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a7146117d1575080632cb77e9f146117a557806341d1514f1461176e5780635343c1b7146116d35780635cffe9de146115775780635d003c44146113e3578063613255ab14611360578063687cf02a14611070578063ac9650d814610f22578063b0460f07146105cd578063b845b83e14610575578063ca9109ba14610400578063d9d98ce41461034f578063ddebc96f146102fb5763df6db3c2146100c1575f80fd5b346102d5576003196040368201126102d5576004359067ffffffffffffffff8083116102d5578260040160a0843603938401126102d5576024358281116102d557610110903690600401611c93565b90610119613236565b5f946001600160a01b03948561012e86612c8a565b1633036102d9576101476101423687611ac5565b613278565b91825f525f60205260405f2096600188541461018f575b60208960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556040519015158152f35b9091929394959697505f600198556040519133835284602084015260606040840152816101bb89611850565b16606084015260248a013590606219018112156102d55789019060a06080840152806101e960048401611850565b166101008401526101fc60248301611850565b166101208301526044810135602219823603018112156102d55701956024600488013597019287116102d55786360383136102d55760209860846102b884936102777f09d18501db0080ca2d6cd7c17fa7255daff4b2d503ea93b76ff68b6752ea8e63976102c89c6060610140890152610160880191612a3b565b6102a961029e61028a6044880185613021565b605f198a8603810160a08c01529491613056565b926064870190613021565b918784030160c0880152613056565b91013560e08301520390a16141c2565b5f8080808080808061015e565b5f80fd5b6024866102e587612c8a565b6040516335252be360e01b815291166004820152fd5b346102d5576003196020368201126102d5576004359067ffffffffffffffff82116102d55760809082360301126102d55761033a606091600401612cde565b90604051921515835260208301526040820152f35b346102d55760403660031901126102d5576001600160a01b03610370611824565b166040516370a0823160e01b8152306004820152602081602481855afa9081156103f5575f916103c3575b50156103ab5760206040515f8152f35b60249060405190633c5bf76960e21b82526004820152fd5b90506020813d6020116103ed575b816103de60209383611934565b810103126102d557518261039b565b3d91506103d1565b6040513d5f823e3d90fd5b346102d55761040e36611cc4565b8394939261041a613236565b610425848633613e0f565b61042e81613784565b15610543578061044261049192873361439d565b9590967f7f9dfa19cf1cc2f806f2f860fbc9c056b601fb1afc0e9b843dfe5c63616268e660806040513381526001600160a01b0384169a8b60208301528560408301526060820152a133613a6b565b959093826104c0575b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b610537966105319560ff936040519860068a5260208a01526040890152606088015260808701521660a08501523360c085015260e084019384604052610505856118fc565b600685526105166101008201612b8b565b61051f85611d71565b5261052984611d71565b503691612a5b565b90613f13565b8080808080808061049a565b6040516306dde9c360e41b81523360048201526001600160a01b038616602482015260448101859052606490fd5b0390fd5b346102d55760203660031901126102d55760043567ffffffffffffffff81116102d5576105316105ac61049a923690600401611c93565b91906105b6613236565b604051926105c384611918565b5f84523691612a5b565b346102d5576003196020368201126102d55767ffffffffffffffff600435116102d55760c090600435360301126102d557610606613236565b5f808061061b60048035608481019101612bc3565b905015610f1057602460043501359261063384613784565b15610efe57606080604051610647816118cc565b61064f612c18565b81525f60208201525f60408201520152610667612c18565b506106c76106c26106a161069761069161068b608460043501600435600401612bc3565b90612c4a565b80612c65565b6040810190612b55565b60206106ba61068b608460043501600435600401612bc3565b013591612c7a565b612c8a565b936001600160a01b036107166106c26106fd6106f361069161068b608460043501600435600401612bc3565b6060810190612b55565b60406106ba61068b608460043501600435600401612bc3565b816040519761072489611894565b1687521660208601526040850152610746608460043501600435600401612bc3565b9490506001604051955f87520160051b85016040525f905f5b610773608460043501600435600401612bc3565b9050811080610eeb575b15610d3857610796608460043501600435600401612bc3565b821015610d24578160051b810135607e19823603018112156102d55760808183013603126102d557604051916107cb836118cc565b8181013567ffffffffffffffff81116102d5576107ed90369084840101611ac5565b835280820160208181013590850152604080820135908501526060013567ffffffffffffffff81116102d5576108269236920101611c78565b606082015280516001600160a01b036108486040830151602085015190611d91565b5151166001600160a01b0385511614801590610cf0575b610cde5761087760208301516040840151908361429a565b61088081613278565b91825f525f60205260405f2054155f146108e4575051604080513381526001600160a01b039092166020830152810191909152600191907fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f390606090a15b0161075f565b919061091560208497959701516040850151906060860151906040519261090a84611918565b5f84523391866134e2565b5f949161097e57505051604080513381526001600160a01b03909216602083015281019190915260019291907f1e6fa9678edf81f9f25bbf308bde03ad3e110db1f429394b0915ba021532941490606090a15b8115610976575b50926108de565b90508861096f565b610993606082015160446004350135906137a7565b156109ed57505051604080513381526001600160a01b03909216602083015281019190915260019291907fe3151dc8cb7a54ffc4baabd28c1f241c94d510b5e5b502491ac3cad6c16316d59080606081015b0390a1610968565b6109fa6040820151613784565b158015610ccb575b15610a5857505051604080513381526001600160a01b03909216602083015281019190915260019291907f500b713857325f9e6dcb52ae832eca9109d107ed1aae9cb4928b4c1e13f051aa9080606081016109e5565b9250925050600196959691610a71606460043501612c9e565b15610c385796610ae197610af160408401516040880151610a9281836137f1565b15610c305750925b610aeb848592610ad4610ace60608a01516001600160e01b03601b918660e01d92828816810b928260e01d9216900b6148ea565b9061485f565b9d8e9260408d0151613818565b60408c0152614373565b99614373565b98610afc8484613842565b610b0684826138a0565b60405192338452608060208501526060610b2c8451608080880152610100870190611dec565b93602081015160a0870152604081015160c0870152015192607f198582030160e0860152835180825260208201906020808260051b8501019601925f5b828110610bc857505050505092806001979695937fbae4dbf76931c547f765e9def16d693d86daaa596f491de979008831789185ae93610bc396604084015260608301520390a180858c5101808d5260051b8c0152613b57565b610968565b9091929396602080610c23600193601f198782030189528b51906001600160a01b03825116815283820151848201526060610c126040840151608060408501526080840190612cab565b920151906060818403910152611d10565b9901950193929101610b69565b905092610a9a565b610ae190610af16060840151610aeb610c76610ace60408801516001600160e01b0394601b90868360e01d9316820b91878260e01d9216900b6148ea565b60408a0151610c8581836137f1565b15610cc35750915b829c8d916060890151908116155f14610cb4575060408801515b96879460408d0151613818565b610cbe90856142cf565b610ca7565b905091610c8d565b50610cd960608201516137ce565b610a02565b60405163936bb5ad60e01b8152600490fd5b506001600160a01b03610d0c6060830151604085015190611d91565b5151166001600160a01b03602086015116141561085f565b634e487b7160e01b5f52603260045260245ffd5b50919390610d4a606460043501612c9e565b15610ee557835b6004356004013590610d6382826137f1565b610ec75750508490610d83856001600160a01b0360208701511633613ea1565b505060a46004350190610d9b82600435600401612b22565b905015159081610ebf575b50610e1e575b506001600160a01b03610dc2929351163361439d565b50505b8351811015610dea5780610de4610dde60019387611d91565b516139cb565b01610dc5565b5060409160017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005582519182526020820152f35b90506001600160a01b03602084015116610e486001600160a01b0385511692600435600401612b22565b929091333b156102d557610e905f93604051958694859463691f9ed760e01b8652600486015260248501528960448501528a606485015260a0608485015260a4840191612a3b565b038183335af19081156103f557859115610dac579050610eb091506118e8565b5f836001600160a01b03610dac565b905088610da6565b604492506040519163573b6f4160e01b835260048301526024820152fd5b84610d51565b50610ef96040830151613784565b61077d565b60405163315f9e2360e21b8152600490fd5b604051639c95219f60e01b8152600490fd5b346102d5576020806003193601126102d55760043567ffffffffffffffff81116102d557610f54903690600401611c93565b919060405192610f6384611918565b5f8452828401610f7282611a18565b94610f806040519687611934565b828652610f8c83611a18565b93610f9e86880195601f190186612ba7565b5f5b84811061100257604080518881528951818a018190525f92600582901b83018101918a918c9085015b828710610fd65785850386f35b909192938280610ff2600193603f198a82030186528851611d10565b9601920196019592919092610fc9565b806110518861104b61101e60019560059d9c9d1b870187612b22565b929089846040519586938585013782018381015f81528b519283915e015f83820152038084520182611934565b30614209565b61105b828a611d91565b526110668189611d91565b5001969596610fa0565b346102d5576003196040368201126102d55760043567ffffffffffffffff8082116102d55760c0826004019383360301126102d5576024359081116102d5576110bd903690600401611c93565b6110c8929192613236565b6110f96110f46110ef6110e86110de8880612b0d565b6040810190612b22565b3691611956565b614144565b6141ad565b801561134e576001101561133c5760248201926111168486612b55565b90501561132a57604483019361112c8587612b55565b9050156113185761119261115a9561118661115161114a8a80612b0d565b948a612b55565b9890928a612b55565b9190926111776040519661116d88611864565b33885236906119ba565b9960209a8b8801523691611a30565b60408501523691611a30565b6060820152606484013560808201526111aa81613278565b90815f525f865260405f209485541595866111ee575b878760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055604051908152f35b6001905560a46001600160a01b03917f87491344dfbcf91f6cbbc610cbbeedc85313d37a02df0c93527f7ea5f8db717f83855116604051908152868b82015260606040820152806112426060820188611dec565b0390a10191611251838a612b22565b9050611274575b505050611267939495506141c2565b81908380808080806111c0565b6112816110e8848b612b22565b61128a816148c6565b156112f55750976112c87fd46c2c56b35c8210e9e712ec3f02242d5fc90187c0ac8ed80cc33626846ec369936112e893611267999a9b511692612b22565b92906040519384938452868c850152606060408501526060840191612a3b565b0390a18594938780611258565b88610571604051928392630c89984b60e31b845260048401526024830190611d10565b60405163540e5f0b60e01b8152600490fd5b604051636c44ef8f60e01b8152600490fd5b604051633c8270bd60e21b8152600490fd5b604051632cff108b60e21b8152600490fd5b346102d5576020806003193601126102d5576024816001600160a01b03611385611824565b16604051928380926370a0823160e01b82523060048301525afa9081156103f5575f916113b6575b50604051908152f35b90508181813d83116113dc575b6113cd8183611934565b810103126102d55751826113ad565b503d6113c3565b346102d5576113f136611cc4565b6113f9613236565b611404848633613e0f565b61140d83613784565b1561154a5761141d8486336130a6565b61142781856137f1565b15611544575082935b61143c85828833613e43565b9690947f8045c25080b0868951141ed0a91720bcad09a8364a2b3109ee1fd49c1f0bc8b860c061146d898533613ea1565b94906001600160a01b0360405192338452169a8b6020840152876040840152856060840152608083015260a0820152a1836114c85760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b611537976105319660ff946040519960078b5260208b015260408a01526060890152608088015260a08701521660c08501523360e085015261010084019384604052611513856118fc565b600685526115246101208201612b8b565b61152d85611d81565b5261052984611d81565b808080808080808061049a565b93611430565b604051623a3a4d60e21b81523360048201526001600160a01b038616602482015260448101859052606490fd5b346102d55760803660031901126102d5576004356001600160a01b03908181168091036102d5576115a661183a565b6044359167ffffffffffffffff916064358381116102d557366023820112156102d55780600401359384116102d55736602485830101116102d5576116339560209216936115f5868587613d30565b60405196879283926323e30c8b60e01b84523360048501528760248501528860448501525f606485015260a06084850152602460a485019201612a3b565b03815f855af19384156103f5575f9461169f575b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd984036116865761167b93503091613da9565b602060405160018152f35b604051630b6c58a960e31b815260048101859052602490fd5b9093506020813d6020116116cb575b816116bb60209383611934565b810103126102d557519284611647565b3d91506116ae565b346102d5576101403660031901126102d55767ffffffffffffffff6004358181116102d557611706903690600401611ac5565b6024358281116102d55761171e903690600401611ac5565b60c03660431901126102d557610104358381116102d557611743903690600401611c78565b90610124359384116102d55761176061049a943690600401611c78565b92611769613236565b611e9d565b346102d55760603660031901126102d557602061179d61178c611824565b61179461183a565b604435916130a6565b604051908152f35b346102d55760203660031901126102d5576004355f525f6020526020600160405f205414604051908152f35b346102d55760203660031901126102d5576004359063ffffffff60e01b82168092036102d55760209163e414309160e01b8114908115611813575b5015158152f35b6301ffc9a760e01b1490508361180c565b600435906001600160a01b03821682036102d557565b602435906001600160a01b03821682036102d557565b35906001600160a01b03821682036102d557565b60a0810190811067ffffffffffffffff82111761188057604052565b634e487b7160e01b5f52604160045260245ffd5b6060810190811067ffffffffffffffff82111761188057604052565b6040810190811067ffffffffffffffff82111761188057604052565b6080810190811067ffffffffffffffff82111761188057604052565b67ffffffffffffffff811161188057604052565b60e0810190811067ffffffffffffffff82111761188057604052565b6020810190811067ffffffffffffffff82111761188057604052565b90601f8019910116810190811067ffffffffffffffff82111761188057604052565b92919267ffffffffffffffff82116118805760405191611980601f8201601f191660200184611934565b8294818452818301116102d5578281602093845f960137010152565b9080601f830112156102d5578160206119b793359101611956565b90565b91906060838203126102d557604051906119d382611894565b81936119de81611850565b83526119ec60208201611850565b602084015260408101359167ffffffffffffffff83116102d557604092611a13920161199c565b910152565b67ffffffffffffffff81116118805760051b60200190565b929192611a3c82611a18565b604092611a4c6040519283611934565b819581835260208093019160061b8401938185116102d557915b848310611a7557505050505050565b85838303126102d5578386918251611a8c816118b0565b611a9586611850565b81528286013583820152815201920191611a66565b9080601f830112156102d5578160206119b793359101611a30565b91909160a0818403126102d55760405190611adf82611864565b8193611aea82611850565b835267ffffffffffffffff9160208101358381116102d55782611b0e9183016119ba565b602085015260408101358381116102d55782611b2b918301611aaa565b604085015260608101359283116102d557611b4c6080939284938301611aaa565b60608501520135910152565b90929192611b6581611a18565b91604094611b766040519485611934565b839583855260208095019160059460051b8401948186116102d55784935b868510611ba5575050505050505050565b67ffffffffffffffff9085358281116102d5578701906080828603126102d5578551611bd0816118cc565b611bd983611850565b81528a8301358b820152868301358481116102d557830186601f820112156102d557803590611c0782611a18565b91611c148a519384611934565b8083528d80840191891b830101918983116102d5578e809101915b838310611c685750505050878201526060808401359485116102d557611c59878d9687960161199c565b90820152815201940193611b94565b82358152918101918f9101611c2f565b9080601f830112156102d5578160206119b793359101611b58565b9181601f840112156102d55782359167ffffffffffffffff83116102d5576020808501948460051b0101116102d557565b9060806003198301126102d5576004356001600160a01b03811681036102d5579160243591604435916064359067ffffffffffffffff82116102d557611d0c91600401611c93565b9091565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b805115610d245760200190565b805160011015610d245760400190565b805160021015610d245760600190565b805160031015610d245760800190565b805160041015610d245760a00190565b805160051015610d245760c00190565b8051821015610d245760209160051b010190565b9081518082526020808093019301915f5b828110611dc4575050505090565b835180516001600160a01b031686528201518583015260409094019392810192600101611db6565b90608080611e62611e50611e3e60406001600160a01b0380895116885260208901519060a060208a01528082511660a08a015260208201511660c08901520151606060e0880152610100870190611d10565b60408701518682036040880152611da5565b60608601518582036060870152611da5565b93015191015290565b90611e7582611a18565b611e826040519182611934565b8281528092611e93601f1991611a18565b0190602036910137565b926001600160a01b038451166001600160a01b0383511614612a29576001600160a01b03611ed2606086015160643590611d91565b5151166001600160a01b03611eee604085015160843590611d91565b515116148015906129e9575b610cde576001600160a01b03611f17604086015160443590611d91565b5151166001600160a01b03611f326064356060880151611d91565b515116146129d757611f4384613278565b805f525f60205260405f2054156129875750611f5e82613278565b805f525f60205260405f20541561293757506122ce907f6fa7f4c28634b0a9d6831401c45ae468195fb63aed07308935c35374ff5d9e3960405180611fc1611fb361012033845280602085015283018a611dec565b828103604084015287611dec565b6044356060830152606435608083015260843560a083015260a43560c083015260c43560e083015260e4356101008301520390a161223a6001600160a01b03845116916040519261201184611918565b5f845261201c6132a9565b506040519061202a826118fc565b6006825261203a60208301612b8b565b61204389613278565b906001600160a01b038a511660405192600384526020840152604083015260608201526080810160405261207682611d34565b5261208081611d34565b5060405161208d81611894565b6002815260403660208301376120a282611d41565b526120ac81611d41565b506121806120d36001600160a01b036120cb60443560408d0151611d91565b515116614468565b6121196001600160a01b038b51168b60206121106001600160a01b036120ff6044356040860151611d91565b515116926040604435910151611d91565b510151916130a6565b908a60ff602061214b6001600160a01b0361213a6044356040870151611d91565b515116936040604435910151611d91565b51015192169093929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b61218982611d51565b5261219381611d51565b506122216121b26001600160a01b036120cb60643560608d0151611d91565b6121ef6001600160a01b038b51168b60206121106001600160a01b036121de6064356060860151611d91565b515116926060606435910151611d91565b908a60ff602061214b6001600160a01b036122106064356060870151611d91565b515116936060606435910151611d91565b61222a82611d61565b5261223481611d61565b50614546565b905f6001600160a01b038751169160208801516001600160a01b0360208183511692015116918484523060205260408420604060208c015101516040519161228183611918565b86835260405195612291876118fc565b86526020860152604085015284606085015286608085015260a084015260c0830152604051808097819463d04dfe2360e01b83526004830161342a565b03915afa92835f915f95612919575b506122ed576040513d5f823e3d90fd5b92918351600281106128d357506040602085015194015161231661231083611d71565b51611d61565b5161232181836137f1565b156129115750935b61234b8186919060405192600284526020840152604083015260608201604052565b61235483611d51565b5261235e82611d51565b506040519461236c866118fc565b888652606435602087015260408601526060850152608084015260a083015260c082015261256e6001600160a01b0385511693604051946123ac86611918565b5f86526123b76132a9565b50604051906123c5826118fc565b600682526123d560208301612b8b565b6123de86613278565b906001600160a01b0387511660405192600384526020840152604083015260608201526080810160405261241182611d34565b5261241b81611d34565b5060405161242881611894565b60028152604036602083013761243d82611d41565b5261244781611d41565b506124d16124666001600160a01b036120cb60843560408a0151611d91565b6124a16001600160a01b038851166001600160a01b0361248c60843560408c0151611d91565b515116602061211060843560408d0151611d91565b906001600160a01b036124ba60843560408b0151611d91565b51511660ff602061214b60843560408d0151611d91565b6124da82611d51565b526124e481611d51565b506122216125036001600160a01b036120cb60a43560608a0151611d91565b61253e6001600160a01b038851166001600160a01b0361252960a43560608c0151611d91565b515116602061211060a43560608d0151611d91565b906001600160a01b0361255760a43560608b0151611d91565b51511660ff602061214b60a43560608d0151611d91565b926126045f6001600160a01b038551169260208601908151906001600160a01b03602081845116930151169286855230602052604080862091510151604051916125b783611918565b868352604051956125c7876118fc565b86526020860152604085015284606085015289608085015260a084015260c0830152604051808095819463d04dfe2360e01b83526004830161342a565b03915afa90815f915f936128eb575b50612623576040513d5f823e3d90fd5b908151600281106128d357506040602083015192015161264561231088611d71565b5161265081836137f1565b156128cb5750925b61267a8385919060405192600284526020840152604083015260608201604052565b61268388611d51565b5261268d87611d51565b506040519661269b886118fc565b86885260a43560208901526040880194855260608801938452608088015260a087015260c08601526126d06040840151613784565b159182156128b7575b5081156128a2575b8115612891575b5061287f57604051916126fa836118cc565b5f83525f60208401525f60408401525f606084015261271984836147d7565b8452604084015261273f61272d83866147d7565b60208601528060608601528451613818565b946127536020850151604086015190613818565b9361275d876137ce565b8015612870575b61285e57612825612857957fd9fa84dd790c969daa5c33d8050dc06b4a9b59d5b42e2be5f5e8ae20447f618d9461280761285c9a60a0966127a68a8851613842565b6127b48c6020890151613842565b6127c28a60408901516138a0565b6127d08c60608901516138a0565b6127d98a6139cb565b6127e28c6139cb565b6001600160a01b036127fe60c435926060606435910151611d91565b51511633613a6b565b50506001600160a01b036127fe60e43592606060a435910151611d91565b5050606060405191338352805160208401526020810151604084015260408101518284015201516080820152a1613b57565b613b57565b565b604051630d86822160e01b8152600490fd5b5061287a856137ce565b612764565b6040516321badf1f60e01b8152600490fd5b61289c9150516137ce565b5f6126e8565b90506128b160608301516137ce565b906126e1565b6128c391925051613784565b15905f6126d9565b905092612658565b60249060405190630fbb8e5560e21b82526004820152fd5b90925061290a91503d805f833e6129028183611934565b8101906132e6565b915f612613565b905093612329565b90945061293091503d805f833e6129028183611934565b935f6122dd565b9151604080513381526001600160a01b039092166020830152810192909252507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f39250905080606081015b0390a1565b9351604080513381526001600160a01b039092166020830152810194909452507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f392915081905060608101612982565b604051631cd2f1c760e21b8152600490fd5b506001600160a01b03612a03606084015160a43590611d91565b5151166001600160a01b03612a1f604087015160443590611d91565b5151161415611efa565b604051630a98f1f360e21b8152600490fd5b908060209392818452848401375f828201840152601f01601f1916010190565b90929192612a6881611a18565b91604091612a796040519485611934565b839581855260208095019160051b8301938185116102d55783925b858410612aa45750505050505050565b67ffffffffffffffff9084358281116102d55786019083828603126102d5578351612ace816118b0565b82358481116102d55786612ae39185016119ba565b8152898301359384116102d557612afe868b95869501611c78565b83820152815201930192612a94565b903590605e19813603018212156102d5570190565b903590601e19813603018212156102d5570180359067ffffffffffffffff82116102d5576020019181360383136102d557565b903590601e19813603018212156102d5570180359067ffffffffffffffff82116102d557602001918160061b360383136102d557565b5f5b60c08110612b99575050565b606082820152602001612b8d565b5f5b828110612bb557505050565b606082820152602001612ba9565b903590601e19813603018212156102d5570180359067ffffffffffffffff82116102d557602001918160051b360383136102d557565b60405190612c0682611894565b60606040835f81525f60208201520152565b60405190612c2582611864565b5f608083828152612c34612bf9565b6020820152606060408201526060808201520152565b9015610d2457803590607e19813603018212156102d5570190565b903590609e19813603018212156102d5570190565b9190811015610d245760061b0190565b356001600160a01b03811681036102d55790565b3580151581036102d55790565b9081518082526020808093019301915f5b828110612cca575050505090565b835185529381019392810192600101612cbc565b90612cf6610142612cef8480612c65565b3690611ac5565b5f5260205f81526040926001845f2054036130165791612f1991612d7d85855f612e9e612d2683612d3d9a612c65565b612d42878501359182878701359c8d923690611ac5565b61429a565b612d5a612d4f8580612c65565b946060810190612bc3565b9690612d75875196612d6b88611918565b8688523690611ac5565b973691611b58565b90612d866132a9565b50612e67865191612d96836118fc565b60068352612da58a8401612b8b565b88612daf81613278565b988b6001600160a01b039a8b845116908351926003845283015282820152336060820152608081018252612de286611d34565b52612dec85611d34565b508051612df881611894565b6002815281368e830137612e0b86611d41565b52612e1585611d41565b50810160ff8c61214b612e508d80612e32816120cb8b8a51611d91565b97511690612e41898851611d91565b515116846121108a8951611d91565b958d612e5d828751611d91565b5151169451611d91565b612e7082611d51565b52612e7a81611d51565b506122218b886060810160ff8c61214b612e508d80612e32816120cb8b8a51611d91565b918385511693868601918b83519289818551169401511693878652308a52818087209151015190825192612ed184611918565b8784525195612edf876118fc565b86528a8601528d85015284606085015285608085015260a084015260c08301528a5180809a819463d04dfe2360e01b83526004830161342a565b03915afa95865f915f98612ff8575b50612f375788513d5f823e3d90fd5b9593865160028110612fe15750888798998260c09798990151990151612f5f61231085611d71565b51612f6a81836137f1565b15612fd75750998a925b612f968b85919060405192600284526020840152604083015260608201604052565b612f9f86611d51565b52612fa985611d51565b50825196612fb6886118fc565b8752860152840152866060840152608083015260a082015201526001929190565b9050998a92612f74565b6024908a5190630fbb8e5560e21b82526004820152fd5b90975061300f91503d805f833e6129028183611934565b965f612f28565b505f92508291829150565b9035601e19823603018112156102d557016020813591019167ffffffffffffffff82116102d5578160061b360383136102d557565b9190808252602080920192915f905b828210613073575050505090565b909192936001906001600160a01b0361308b87611850565b16815285830135838201526040908101950193920190613065565b82156130db576001600160a01b038091165f52600160205260405f2091165f5260205260405f20905f5260205260405f205490565b9091506130e782614468565b6001600160a01b03809316906040918251946370a0823160e01b86528416938460048701526020928387602481865afa9687156131fd575f97613207575b508361313e6131378361316e9a61522c565b5090614cee565b508651636eb1769f60e11b81526001600160a01b0390941660048501523060248501529297889081906044820190565b0381865afa9687156131fd575f976131cc575b50613137613192916119b79861522c565b5061319d81836137f1565b156131c45750935b5f5260018252825f20905f528152815f20905f8052525f205490614373565b9050936131a5565b96508387813d83116131f6575b6131e38183611934565b810103126102d557955195613137613181565b503d6131d9565b85513d5f823e3d90fd5b96508387813d831161322f575b61321e8183611934565b810103126102d55795519583613125565b503d613214565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0060028154146132665760029055565b604051633ee5aeb560e01b8152600490fd5b6040516132a3816132956020820194602086526040830190611dec565b03601f198101835282611934565b51902090565b604051906132b6826118fc565b606060c0836132c3612c18565b81525f60208201525f60408201525f838201528260808201525f60a08201520152565b91906040838203126102d557825167ffffffffffffffff908181116102d55784019082601f830112156102d557815160209261332182611a18565b9161332f6040519384611934565b808352848084019160051b830101918683116102d55785809101915b8383106133be575050505094828101519182116102d557019180601f840112156102d557825161337a81611a18565b936133886040519586611934565b818552838086019260051b8201019283116102d5578301905b8282106133af575050505090565b815181529083019083016133a1565b825181529181019186910161334b565b90808251908181526020809101926020808460051b8301019501935f915b8483106133fc5750505050505090565b909192939495848061341a600193601f198682030187528a51612cab565b98019301930191949392906133ec565b91906020928381526001600160a01b0382511684820152838201516040820152613464604083015160e06060840152610100830190611d10565b906060830151608082015261348b608084015192601f1993848483030160a08501526133ce565b9260a081015193838382030160c08401528680865192838152019501905f5b8181106134ce575050506119b794955060c060e09101519282850301910152612cab565b8251875295880195918801916001016134aa565b959491939086936134f16132a9565b505f92604061360c815192613505846118fc565b60068452602093613517858201612b8b565b6135d56135238b613278565b8b6001600160a01b03998a9283835116895191600383528b830152898201528360609b168b82015260808101895261355a86611d34565b5261356485611d34565b50875161357081611894565b6002815288368b83013761358386611d41565b5261358d85611d41565b5060ff8961214b8a8501936135c9876135ab816120cb858a51611d91565b975116886135ba848951611d91565b51511685612110858a51611d91565b96612e5d828751611d91565b6135de82611d51565b526135e881611d51565b50612221878b8d60ff8961214b8c8501936135c9876135ab816120cb858a51611d91565b9461368c5f868a511698869786889c0191825191888184511693015116928c8552308952878086209151015188519161364483611918565b868352895195613653876118fc565b86528a86015288850152848a8501528b608085015260a084015260c08301528551808095819463d04dfe2360e01b83526004830161342a565b03915afa90815f915f93613766575b50613759575050505f975b600285511098891599613746578284870151960151906136c861231089611d71565b51906136d482846137f1565b15905061373e5750925b6137008685919060405192600284526020840152604083015260608201604052565b61370988611d51565b5261371387611d51565b5082519b6137208d6118fc565b8c528b0152890152870152608086015260a085015260c08401529190565b9050926136de565b50505050505050505091506119b76132a9565b91999850945093966136a6565b90925061377d91503d805f833e6129028183611934565b915f61369b565b6137a3905f60e01d906001600160e01b038160e01d9116601b0b6152e3565b1290565b906137a3916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b615364565b6137ed905f60e01d906001600160e01b038160e01d9116601b0b6152e3565b1390565b906137ed916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b615364565b6119b791610ace916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b61483a565b61389c91608081018261385e6138588351611d71565b51611d71565b5261389561388f6001600160a01b038094515116936138866138808551611d71565b51611d34565b51169251611d71565b51611d51565b5191613e43565b5050565b906080810191806138b46138588551611d61565b526001600160a01b038092515116916138d06138808551611d61565b51166138df61388f8551611d61565b519081613993576138ef836137ce565b61397a579183917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a9593612982955f5260209060018252613945604094855f20835f528452855f20855f528452855f2054614373565b945f5260018252835f20905f528152825f20915f52525f20555b516040519182913383526040602084015260408301906133ce565b60405163793a8f5560e01b815260048101849052602490fd5b916139c4917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a959361298295613a6b565b505061395f565b608081016139dc61388f8251611d61565b519182156139e957505050565b613a036138806001600160a01b0380935151169351611d61565b5116815f5260209160018352604092835f20835f528152835f20855f528152835f2054936001600160e01b038516613a3e575b505050505050565b613a62955f9284845260018152828420868552815282842091845252812055613ea1565b5f808080613a36565b93929193613a78836137ce565b61397a5784613a9457613a8c939450613ea1565b50505f905f90565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f528152613ad1835f20549485614373565b95613adb876137ce565b613afe575f97885260018252838820908852815282872091875252909320829055565b835163c5e12af560e01b815260048101889052602490fd5b90604082019082526020606081936040838201528551809452019301915f5b828110613b43575050505090565b835185529381019392810192600101613b35565b60c0810151908151915f92613ccb575b50613c0c6020918281510151926001600160a01b039081818187511696015116928660a082019485518252308452604097888320898686510151015160808601518b5191613bb483611918565b8683528c5193613bc385611918565b8785528d5196613bd2886118fc565b8752898701528c86015260016060860152608085015260a084015260c08301528851808099819463d04dfe2360e01b83526004830161342a565b03915afa948515613cc1578795613ca3575b508451613c2f575b50505050505050565b81905101510151169051813b15613c9f57918491849383613c64965180978195829463012c676d60e21b845260048401613b16565b03925af1908115613c965750613c7f575b8080808080613c26565b613c8982916118e8565b613c935780613c75565b80fd5b513d84823e3d90fd5b8480fd5b613cb89195503d8089833e6129028183611934565b9050935f613c1e565b86513d89823e3d90fd5b6001600160a01b03602080845101510151169060a083015190823b156102d557613d0e925f928360405180968195829463012c676d60e21b845260048401613b16565b03925af180156103f55715613b6757613d289192506118e8565b5f905f613b67565b6040519263a9059cbb60e01b5f526001600160a01b0380931660045260245260205f60448180855af160015f5114811615613d8a575b8360405215613d7457505050565b635274afe760e01b835216600482015260249150fd5b6001811516613da057813b15153d151616613d66565b833d5f823e3d90fd5b9092604051936323b872dd60e01b5f526001600160a01b0393848092166004521660245260445260205f60648180855af160015f5114811615613df9575b836040525f60605215613d7457505050565b6001811516613da057813b15153d151616613de7565b909115613e1a575050565b6040516305dbdfd960e41b81526001600160a01b03918216600482015291166024820152604490fd5b93929193613e50836137ce565b61397a5784613e6457613a8c93945061439d565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f528152613ad1835f20549485613818565b90929192613eae81614869565b93613eb8816137ce565b613f015784816001600160e01b03613ed79360e01d9116601b0b61548e565b50809281613ee7575b5050509190565b6001600160a01b03613ef99316613d30565b5f8181613ee0565b604051632d1671a360e11b8152600490fd5b919091604092835192613f25846118fc565b60068452602094613f37868601612b8b565b5f5b8451811015613f6c5780613f4f60019287611d91565b51613f5a8289611d91565b52613f658188611d91565b5001613f39565b50925092939093335f52308252825f2091835195613f89876118b0565b613f91612bf9565b875260608281980152845190613fa682611918565b5f8252855190613fb582611918565b5f82525f3681375f5b815181101561411a57898688613fd48486611d91565b51888151948d80870151908151613ff6575b5050505050505050600101613fbe565b905f92916001600160a01b039661401b8887818d51169c015116998789015190614546565b958251996140288b6118fc565b8a5289015287015285015260808401528760a08401528660c08401525f8c51809563d04dfe2360e01b8252818061406360049889830161342a565b03915afa938415614110579089915f956140f2575b50845161408e575b50899250808e8c938e613fe6565b5101511691823b156102d5576140bc925f92838d5180968195829463012c676d60e21b845233908401613b16565b03925af180156140e85790600192916140d9575b81928782614080565b6140e2906118e8565b5f6140d0565b89513d5f823e3d90fd5b6141079195503d805f833e6129028183611934565b9050935f614078565b8c513d5f823e3d90fd5b50505050505050509050565b8115614130570490565b634e487b7160e01b5f52601260045260245ffd5b60408151106141a0576020810151908051603f19810190811161418c5760051c82116141785760016020920160051b010190565b505060405161418681611918565b5f815290565b634e487b7160e01b5f52601160045260245ffd5b5060405161418681611918565b8051156141bd57602001515f1a90565b505f90565b61285c92916141ed610531923390919060405192600284526020840152604083015260608201604052565b9260405193600185526020850152604084016040523691612a5b565b905f8091602081519101845af48080614287575b1561423d5750506040513d81523d5f602083013e60203d82010160405290565b1561426457604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b3d15614275576040513d5f823e3d90fd5b60405163d6bda27560e01b8152600490fd5b503d15158061421d5750813b151561421d565b916142c59060606142ba936001600160a01b039485916040880151611d91565b515116940151611d91565b515116146129d757565b6142f66001600160e01b0392838316601b0b9260e01d938160e01d9116601b0b8484614aa5565b90637ffffff58213614346575b9061430d91614cee565b929092158061433e575b61432057505090565b6044925060405191638eba4d0760e01b835260048301526024820152fd5b508215614317565b61435082826159b7565b1561430357604483856040519163d556b11160e01b835260048301526024820152fd5b6119b791610ace916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b615093565b9291926143a982614869565b936143b3816137ce565b6144145784816001600160e01b036143d29360e01d9116601b0b61548e565b92908093156143ff575b508290816143eb575050509190565b613ef9926001600160a01b03309216613da9565b9092505f19811461418c57600101915f6143dc565b604051632eaefac360e21b8152600490fd5b6004111561443057565b634e487b7160e01b5f52602160045260245ffd5b602090939291936001600160a01b03604082019516815261446483614426565b0152565b6144706159d0565b60408051630782d7e160e01b81526001600160a01b03831660048201529091828260248173200e12d10bb0c5e4a17e7018f0f1161919bb93895afa92831561453d575f925f94614508575b506144c583614426565b6001831415806144f6575b6144da5750505090565b5163ee07877f60e01b8152918291610571919060048401614444565b5061450083614426565b8215156144d0565b9080945061452c9293503d8511614536575b6145248183611934565b810190615202565b919091925f6144bb565b503d61451a565b513d5f823e3d90fd5b6145508251611e6b565b61455a8351611e6b565b9282519281518015155f146147cf57600201935b6001940184019061457e82611a18565b956145996040936145918551998a611934565b808952611a18565b6145ab602091601f1901828a01612ba7565b5f9584519389896002926002885233868901523089890152606097606081018a526145d584611d34565b526145df83611d34565b505f825b61478f575b5050505086516145ff575b50505050505050505090565b909192936002886146228c8661461b8e809c9d9e018093611d91565b528d611d91565b50018561462f828d611d91565b5261463a818c611d91565b505f965b614649575b506145f3565b885187101561478a576001600160a01b036146f5898b856146ec8c60428c886146728488611d91565b515116968582614682868a611d91565b51015192614690868a611d91565b51838d82511691015182815160051b910120908451927f6ec4dff745ec96dbde88c5d41f8aa5ac13aa1664afb47b8406b44fa945a650c88452830152838201522090519161190160f01b83528d83015260228201522093611d91565b5101519161525a565b1561477257876147618b8e8c8f9e9d9c9b9a999897968f61474e918d614744898f8f61473083889f614727828f611d91565b51511692611d91565b5261473b828b611d91565b51015192611d91565b52019c8d94611d91565b51015161475b8383611d91565b52611d91565b50019697989590919293949561463e565b8851630a57f30960e31b815260048101899052602490fd5b614643565b9091929a82518210156147c757906147bb84809301809d6147b08487611d91565b5161475b8383611d91565b50019082918d936145e3565b9a92916145e8565b505f9361456e565b9160408301926040614811610ace606087519401938451906001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6148ea565b945193016148208151866137a7565b614828575050565b9093506119b7919250519251836142cf565b919291600160ff1b840161485257611d0c93506153b9565b90611d0c935f0391615093565b61430d8282614cee565b6148716159d0565b6040805163b7bad1b160e01b81526001600160a01b0383166004820152909182826024815f73200e12d10bb0c5e4a17e7018f0f1161919bb93895af192831561453d575f925f9461450857506144c583614426565b60088151106141bd576008015167ffffffffffffffff1667ff0a89c674ee78741490565b9091939284158215175f146149045750505090505f905f90565b82810192600160fd1b8082019083011760fe1c614a3b575b50506149278161567c565b936149318161567c565b9461493c868261569c565b90918215614a2c575f9083986f0785ee10d5da46d900f436a000000000808611614a1e575b50670de0b6b3a7640000808b11614a0f575b50633b9aca00808b11614a00575b50612710808b116149f2575b5098805b6149e157508190611d0c989982600a0a9109960195817fcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccd0a93838211900382610100031b9203901c1702916156af565b60019290920191600a900480614991565b60049a04998a93019261498d565b600991939a049901915f614981565b601291939a049901915f614973565b85049950602592505f614961565b50929050611d0c9495506156af565b5f821215614a8f57808413614a81575b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb284131561491c57909250611d0c9394916155ba565b909250611d0c939491615621565b80841215614a4b57909250611d0c9394916155ba565b92909180614acb576044848460405191637a97930f60e01b835260048301526024820152fd5b90919280155f14614ae057505050505f905f90565b614af993614aed91615769565b92919490938492615769565b9093919284614b078861567c565b91614b118661567c565b947f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000094604c91868810614cb8575b030191600160ff1b98838a018112155f14614c85575050035b5f955f821280614c7c575b614c5e575b5f811280614c4c575b614c2e5786820103966001600160ff1b0388149081614c24575b5080614c1b575b80614c12575b614bf4575090614ba89291615915565b915f8113614bbb575b50611d0c936156af565b9091604c8213614be957614bd291600a0a90614126565b908115614bdf575f614bb1565b505050505f905f90565b50505050505f905f90565b876044916040519163d556b11160e01b835260048301526024820152fd5b505f8512614b98565b50828414614b92565b905088145f614b8b565b604489836040519163d556b11160e01b835260048301526024820152fd5b50806001600160ff1b03018213614b71565b9550808701861315614c765786818703015b95614b68565b5f614c70565b505f8113614b63565b89985090920390506001600160ff1b0381900387018213614ca95701860194614b58565b5050505050505050505f905f90565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009650604b9250614b3f565b8115614130570590565b8082601b82810b8314614ee3577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000008405614e8f575b8380820b03614e7e57507b199999999999999999999999999999999999999999999999999999987b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc84011115614e2f575b838060030b03614db3575b808413614d975750506001600160e01b036001925b60e01b91161791565b8303600a0a8015614130576001600160e01b0391071592614d8e565b92915f841315614e03575090614dc983836159b7565b614de557637ffffffe1901600a0a810290637fffffff92614d79565b506044916040519163d556b11160e01b835260048301526024820152fd5b637fffffff199283039060438213614be957614e2291600a0a90614ce4565b918215614bdf5792614d79565b5f198401808060030b14614e435750614d6e565b90506001600160e01b039293507b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff915060e01b9260ff1d181617905f90565b600190940193600a90930592614d21565b937f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000840515614ed0576305f5e100600894058094819201955b915050614d21565b620186a060059405809481920195614ec8565b5082614d6e57505050505f90600190565b919291600160ff1b9190801580615081575090614f1091615769565b9490929091905f868585858282138015615078575b61505b575b505050508682841860ff1c94860391039081604c0381116150405701600a0a808205919084615026575b505081019182821860ff1c111561501e57826001600160ff1b031461500057905f600192135f14614fd157600a9004915b01925b81158117614f9557509190565b80614fae575b508015614fa6579190565b505f91508190565b9192614fc49203600160ff1b01600a0a90614ce4565b600160ff1b91905f614f9b565b600a60037fe6666666666666666666666666666666666666666666666666666666666666679201040191614f85565b604490836040519163d556b11160e01b835260048301526024820152fd5b509092614f88565b8107615033575b80614f54565b60ff1d600117015f61502d565b50505091935061504e579190565b60018160ff1d1790039190565b5f9a50909750909550600160ff1b94509250905086808080614f2a565b50835f12614f25565b1561508c5750509190565b9350919050565b93929193841581158181176151e4575050906150ae91615769565b91949082956150bf82958294615769565b80969294919693878684821380156151db575b6151c2575b5050505050508682841860ff1c94860391039081604c0381116150405701600a0a8082059190846151a8575b505081019182821860ff1c11156151a057826001600160ff1b031461500057905f600192135f1461517157600a9004915b01925b8115811761514457509190565b8061515457508015614fa6579190565b600160ff1b9361516b9291038401600a0a90614ce4565b5f614f9b565b600a60037fe6666666666666666666666666666666666666666666666666666666666666679201040191615134565b509092615137565b81076151b5575b80615103565b60ff1d600117015f6151af565b929b5098509196509450925090505f80808080806150d7565b508584126150d2565b93959390929190156151fa575050614fa6579190565b945092915050565b91908260409103126102d557815160048110156102d55760209092015160ff811681036102d55790565b9060ff165f03916001600160ff1b0382115f1461525257600a6001818404940192061590565b909190600190565b9091813b6152955761526c9192615a39565b5061527681614426565b15918261528257505090565b6001600160a01b03918216911614919050565b6020918160645f935160405192630b135d3f60e11b9788855260048501526040602485015286820190604485015e8281018201859052601f01601f191601915afa905f5114601f3d11161690565b92915f9060018184145f8712871517171761535d575f9280821361534f575b03604c81135f82121761534357600a0a90846153218382029384614ce4565b1461533657505015615332575f9190565b5f90565b90935090156119b7579190565b505015615332575f9190565b5f9560019450925090615302565b5050505f90565b93929190918083145f83125f871218831587151717176153b3575f928082136153a65703604c81135f82121761534357600a0a90846153218382029384614ce4565b9194600193509190615302565b50919050565b909291600160ff1b9182810161544b575080841461544157808413918215615439578185035b604c8111156154285750505f915b1561541957507f8000000000000000000000000000000000000000000000000000000000000001019190565b92506001600160ff1b03039190565b600a0a9081156141305704916153ed565b8482036153df565b505090505f905f90565b9361545892945f03614ef4565b8093918092811461546c575b50505f039190565b915092506001600160ff1b03831461500057600a600191059201915f80615464565b91925f8312156154b6576044838360405191634a7d166b60e01b835260048301526024820152fd5b9192836154c857505090505f90600190565b60ff8116820191808312615590575f831215615500575050604c198112614fa6575f03600a0a916154f98382614126565b9283021490565b909293915f81135f1461558657604d811361555b57600a0a92831561413057835f190483116155325750500290600190565b60405163c849483b60e01b815260048101849052602481019290925260ff166044820152606490fd5b5060405163c849483b60e01b81526004810192909252602482015260ff919091166044820152606490fd5b5050905090600190565b60405163c849483b60e01b815260048101869052602481019190915260ff82166044820152606490fd5b909392915f6155ca9181846148ea565b9490945f8483019182019412159081615617575b811561560d575b506155ef57505090565b604492506040519163d556b11160e01b835260048301526024820152fd5b905083125f6155e5565b82811291506155de565b61563693600160fe1b908101939201906148ea565b9081815f82121561566d575050604b198212613a8c5761565b915f03600a0a90614ce4565b9081615665575f90565b600160ff1b90565b93600160ff1b90910192509050565b5f8112156119b757600160ff1b90808203615695575090565b90505f0390565b905f198183099102908180821091030391565b92939291905f8184181215615744576001600160ff1b03928383111561572e57600160ff1b938385036156e457505050509190565b909192935085146156fe575050600a600191045f03920190565b604051630ed8062160e21b8152600481019190915260248101919091526044810182905260648101849052608490fd5b5090915050600160ff1b811461418c575f039190565b90916001600160ff1b0380841115613ee05785146156fe575050600a60019104920190565b919091801561590b57827f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000080830515615819575b507f19999999999999999999999999999999999999999999999999999999999999997f0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc83011061580a575b83136157f45791905f90565b919060018060ff1b926001600160ff1b03030190565b9290600a02905f1901926157e8565b6f4b3b4ca85a86c47a098a224000000000808405156158f9575b507728c87cb5c89a2571ebfdcb54864ada834a000000000000008305156158e2575b7b097edd871cfda3a5697758bf0e3cbb5ac5741c6400000000000000008305156158ce575b7e3899162693736ac531a5a58f1fbb4b746504382ca7e40000000000000000008305156158be578205156158af575b5f61579d565b9290600a02905f1901926158a9565b939160640291600119019361587a565b93916402540be4000291600919019361587a565b9391678ac7230489e8000002916012190193615855565b6025198301955092909202915f615833565b505f915081908190565b90915f198383099280830292838086109503948086039584871015615993571461598b579082910960018219018216809204600280826003021880830282030280830282030280830282030280830282030280830282030280920290030293600183805f03040190848311900302920304170290565b505091500490565b60648386866040519263362ced0960e11b8452600484015260248301526044820152fd5b6119b791905f8112156159cb575f03615a73565b615a73565b73200e12d10bb0c5e4a17e7018f0f1161919bb9389803b158015615a0e575b6159f65750565b602490604051906373e6d7b360e01b82526004820152fd5b507f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d41813f14156159ef565b8151919060418303615a6957615a629250602082015190606060408401519301515f1a90615b02565b9192909190565b50505f9160029190565b90637ffffff5811315615afc57637ffffffe1981019060438213615af5575f821215615ac957637fffffff91505f0301600a0a7b8000000000000000000000000000000000000000000000000000000202111590565b50600a0a8015614130577b80000000000000000000000000000000000000000000000000000001041090565b5050151590565b50505f90565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411615b79579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa156103f5575f516001600160a01b03811615615b6f57905f905f90565b505f906001905f90565b5050505f916003919056", "linkReferences": {} } } diff --git a/crates/test_fixtures/abis/RaindexV6SubParser.json b/crates/test_fixtures/abis/RaindexV6SubParser.json index de21ccb33d..7e2c597f46 100644 --- a/crates/test_fixtures/abis/RaindexV6SubParser.json +++ b/crates/test_fixtures/abis/RaindexV6SubParser.json @@ -242,7 +242,7 @@ } ], "bytecode": { - "object": "0x6080604052348015600e575f80fd5b506127d08061001c5f395ff3fe608060405234801561000f575f80fd5b506004361061007a575f3560e01c80636f5aa28d116100585780636f5aa28d146100dd578063c6c0cbb61461010b578063ccf4477514610135578063d6d8c9a814610148575f80fd5b806301ffc9a71461007e578063336284d4146100a6578063570c7a63146100bb575b5f80fd5b61009161008c366004612483565b610150565b60405190151581526020015b60405180910390f35b6100ae6101d7565b60405161009d91906124df565b6100ce6100c9366004612505565b610c81565b60405161009d939291906125af565b6040517f828494fa15dec168f2372c71a11064dc163f7783fb7f3a9a84df40a87861a368815260200161009d565b61011e610119366004612505565b610dc5565b60408051921515835260208301919091520161009d565b60408051602081019091525f81526100ae565b6100ae610dfd565b5f6001600160e01b031982166391ccb1d560e01b148061018057506001600160e01b03198216636f5aa28d60e01b145b8061019b57506001600160e01b03198216631a2c8edd60e01b145b806101b657506001600160e01b03198216630cd8a13560e21b145b806101d157506301ffc9a760e01b6001600160e01b03198316145b92915050565b60605f6101e660056001612620565b6101f1906001612620565b6101fc906003612620565b6001600160401b03811115610213576102136124f1565b60405190808252806020026020018201604052801561024657816020015b60608152602001906001900390816102315790505b50604080516002808252606082019092529192505f9190816020015b61247981526020019060019003908161026257905050905061182d815f8151811061028f5761028f612633565b60200260200101906001600160401b031690816001600160401b03168152505061184a816001815181106102c5576102c5612633565b6001600160401b039290921660209283029190910190910152604080516003808252608082019092525f91816020015b6124798152602001906001900390816102f5579050509050611859815f8151811061032257610322612633565b60200260200101906001600160401b031690816001600160401b0316815250506118688160018151811061035857610358612633565b60200260200101906001600160401b031690816001600160401b0316815250506118778160028151811061038e5761038e612633565b6001600160401b039290921660209283029190910190910152604080516002808252606082019092525f91816020015b6124798152602001906001900390816103be579050509050611887815f815181106103eb576103eb612633565b60200260200101906001600160401b031690816001600160401b0316815250506118968160018151811061042157610421612633565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b6124798152602001906001900390816104515790505090506118a6815f8151811061047e5761047e612633565b60200260200101906001600160401b031690816001600160401b0316815250506118b5816001815181106104b4576104b4612633565b60200260200101906001600160401b031690816001600160401b0316815250506118c5816002815181106104ea576104ea612633565b60200260200101906001600160401b031690816001600160401b0316815250506118d58160038151811061052057610520612633565b60200260200101906001600160401b031690816001600160401b0316815250506118e48160048151811061055657610556612633565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b6124798152602001906001900390816105865790505090506118f4815f815181106105b3576105b3612633565b60200260200101906001600160401b031690816001600160401b031681525050611903816001815181106105e9576105e9612633565b60200260200101906001600160401b031690816001600160401b0316815250506119138160028151811061061f5761061f612633565b60200260200101906001600160401b031690816001600160401b0316815250506119238160038151811061065557610655612633565b60200260200101906001600160401b031690816001600160401b0316815250506119338160048151811061068b5761068b612633565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6124798152602001906001900390816106ba579050509050611942815f815181106106e7576106e7612633565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b612479815260200190600190039081610716579050509050611951815f8151811061074357610743612633565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b61247981526020019060019003908161077257905050905061196a815f8151811061079f5761079f612633565b60200260200101906001600160401b031690816001600160401b03168152505087895f815181106107d2576107d2612633565b602002602001018190525086896001815181106107f1576107f1612633565b6020026020010181905250858960028151811061081057610810612633565b6020026020010181905250848960038151811061082f5761082f612633565b6020026020010181905250838960048151811061084e5761084e612633565b6020026020010181905250828960058151811061086d5761086d612633565b6020908102919091010152818961088660056001612620565b8151811061089657610896612633565b602090810291909101015280896108af60056001612620565b6108ba906001612620565b815181106108ca576108ca612633565b602090810291909101015260408051600680825260e082019092525f91816020015b6124798152602001906001900390816108ec57905050905061182d815f8151811061091957610919612633565b60200260200101906001600160401b031690816001600160401b0316815250506118598160018151811061094f5761094f612633565b60200260200101906001600160401b031690816001600160401b0316815250506118688160028151811061098557610985612633565b60200260200101906001600160401b031690816001600160401b031681525050611877816003815181106109bb576109bb612633565b60200260200101906001600160401b031690816001600160401b0316815250506119b6816004815181106109f1576109f1612633565b60200260200101906001600160401b031690816001600160401b0316815250506119c681600581518110610a2757610a27612633565b6001600160401b0390921660209283029190910190910152808a610a4d60056001612620565b610a58906001612620565b610a63906001612620565b81518110610a7357610a73612633565b602090810291909101015260408051600780825261010082019092525f91816020015b612479815260200190600190039081610a9657905050905061182d815f81518110610ac357610ac3612633565b60200260200101906001600160401b031690816001600160401b03168152505061185981600181518110610af957610af9612633565b60200260200101906001600160401b031690816001600160401b03168152505061186881600281518110610b2f57610b2f612633565b60200260200101906001600160401b031690816001600160401b03168152505061187781600381518110610b6557610b65612633565b60200260200101906001600160401b031690816001600160401b0316815250506119b681600481518110610b9b57610b9b612633565b60200260200101906001600160401b031690816001600160401b0316815250506119c681600581518110610bd157610bd1612633565b60200260200101906001600160401b031690816001600160401b0316815250506119d681600681518110610c0757610c07612633565b6001600160401b0390921660209283029190910190910152808b610c2d60056001612620565b610c38906001612620565b610c43906002612620565b81518110610c5357610c53612633565b60209081029190910101528a610c70610c6b826119e6565b6119fb565b9c5050505050505050505050505090565b5f6060805f805f610ca187610c94611a8a565b610c9c611aaa565b611aca565b9250925092505f610cb782610220015160200190565b90505f8261022001515182610ccc9190612620565b90505f610cea83836f07fffffe0000000003ff200000000000611bbb565b80925081945050505f80610d0386610240015184611c57565b915091508115610d98575f610d188783611d2e565b90506124795f610d26611d5d565b90505f60028251610d37919061265b565b9050808510610d68576040516303bdd1b160e51b815260048101869052602481018290526044015b60405180910390fd5b6001850160020282015161ffff169250610d818c8c8686565b9e509e509e50505050505050505050505050610dbe565b5050604080515f80825281830190925260208101828152919a5090985096505050505050505b9193909250565b5f805f805f610ded866002810151815160228084019461ffff93909316840101920160200190565b505f988998509650505050505050565b60605f610e0c60056001612620565b610e17906001612620565b610e22906003612620565b6001600160401b03811115610e3957610e396124f1565b604051908082528060200260200182016040528015610e6c57816020015b6060815260200190600190039081610e575790505b50604080516002808252606082019092529192505f9190816020015b612479815260200190600190039081610e88579050509050611d7d815f81518110610eb557610eb5612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d81600181518110610eeb57610eeb612633565b6001600160401b039290921660209283029190910190910152604080516003808252608082019092525f91816020015b612479815260200190600190039081610f1b579050509050611d7d815f81518110610f4857610f48612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d81600181518110610f7e57610f7e612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d81600281518110610fb457610fb4612633565b6001600160401b039290921660209283029190910190910152604080516002808252606082019092525f91816020015b612479815260200190600190039081610fe4579050509050611d7d815f8151811061101157611011612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d8160018151811061104757611047612633565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b612479815260200190600190039081611077579050509050611d7d815f815181106110a4576110a4612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d816001815181106110da576110da612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d8160028151811061111057611110612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d8160038151811061114657611146612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d8160048151811061117c5761117c612633565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b6124798152602001906001900390816111ac579050509050611d7d815f815181106111d9576111d9612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d8160018151811061120f5761120f612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d8160028151811061124557611245612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d8160038151811061127b5761127b612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d816004815181106112b1576112b1612633565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6124798152602001906001900390816112e0579050509050611da6815f8151811061130d5761130d612633565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b61247981526020019060019003908161133c579050509050611da6815f8151811061136957611369612633565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b612479815260200190600190039081611398579050509050611e42815f815181106113c5576113c5612633565b60200260200101906001600160401b031690816001600160401b03168152505087895f815181106113f8576113f8612633565b6020026020010181905250868960018151811061141757611417612633565b6020026020010181905250858960028151811061143657611436612633565b6020026020010181905250848960038151811061145557611455612633565b6020026020010181905250838960048151811061147457611474612633565b6020026020010181905250828960058151811061149357611493612633565b602090810291909101015281896114ac60056001612620565b815181106114bc576114bc612633565b602090810291909101015280896114d560056001612620565b6114e0906001612620565b815181106114f0576114f0612633565b602090810291909101015260408051600680825260e082019092525f91816020015b612479815260200190600190039081611512579050509050611d7d815f8151811061153f5761153f612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d8160018151811061157557611575612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d816002815181106115ab576115ab612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d816003815181106115e1576115e1612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d8160048151811061161757611617612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d8160058151811061164d5761164d612633565b6001600160401b0390921660209283029190910190910152808a61167360056001612620565b61167e906001612620565b611689906001612620565b8151811061169957611699612633565b602090810291909101015260408051600780825261010082019092525f91816020015b6124798152602001906001900390816116bc579050509050611d7d815f815181106116e9576116e9612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d8160018151811061171f5761171f612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d8160028151811061175557611755612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d8160038151811061178b5761178b612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d816004815181106117c1576117c1612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d816005815181106117f7576117f7612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d81600681518110610c0757610c07612633565b5f60608061183b5f80611efa565b92509250925093509350939050565b5f60608061183b5f6001611efa565b5f60608061183b60015f611efa565b5f60608061183b600180611efa565b5f60608061183b60016002611efa565b5f60608061183b60025f611efa565b5f60608061183b60026001611efa565b5f60608061183b60035f611efa565b5f60608061183b60036001611efa565b5f60608061183b60036002611efa565b5f60608061183b600380611efa565b5f60608061183b60036004611efa565b5f60608061183b60045f611efa565b5f60608061183b60046001611efa565b5f60608061183b60046002611efa565b5f60608061183b60046003611efa565b5f60608061183b600480611efa565b5f60608061183b600585611efa565b5f60608061183b61196460056001612620565b85611efa565b5f60608060ff80851690600886901c166119a58261198a60056001612620565b611995906001612620565b61199f9190612620565b82611efa565b945094509450505093509350939050565b5f60608061183b60016003611efa565b5f60608061183b60016004611efa565b5f60608061183b60016005611efa565b6060815f6119f382611f7c565b949350505050565b60605f82516002026001600160401b03811115611a1a57611a1a6124f1565b6040519080825280601f01601f191660200182016040528015611a44576020820181803683370190505b50905061ffff80196020850160208651028101600285015b81831015611a7e57805183518616908516178152602090920191600201611a5c565b50939695505050505050565b60606040518060e0016040528060a681526020016126e860a69139905090565b606060405180608001604052806042815260200161278e60429139905090565b5f80611b596040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020016060815260200160608152602001606081526020015f815260200160608152602001606081525090565b606061ffff600288015116935060ff600388015116925061ffff600588015116600588019750808852602081018801915050611ba587878760405180602001604052805f815250611fea565b915080826101e001819052505093509350939050565b5f808060018187870360208111611bd25780611bd5565b60205b915050875192505b8519600184841a1b16158183101615611bfb57600182019150611bdd565b9681019660208290036008810293841c90931b92611c465760408051602081018590520160408051601f198184030181529082905263e47fe8b760e01b8252610d5f916004016124df565b50869350909150505b935093915050565b600182810180515f928392600560ff93909316602102870192830192909101835b81831015611d1c5760018301516021909301805190935f90819060ff168180611ca1838e61219b565b915091508186165f03611cc3575f809b509b5050505050505050505050611d27565b5f87611cd36001850389166121c6565b016004028b015195505062ffffff9081169350841683039150611d079050575060019750601c1a9550611d27945050505050565b611d10836121c6565b84019350505050611c78565b5f8095509550505050505b9250929050565b6101c08201516002828102820101516101e08401515f9261ffff9092169190611d549083565b95945050505050565b60606040518060800160405280604281526020016126a660429139905090565b5f81515f14611d9f576040516304f8b58160e51b815260040160405180910390fd5b505f919050565b5f8151600103611e03575060208101516001600160e01b038116601b0b60e082901d5f611dd483838361227f565b905061ffff811115611df957604051631e4e01d760e21b815260040160405180910390fd5b9250611e3d915050565b81515f03611e2457604051630f16066b60e41b815260040160405180910390fd5b604051630358cd2160e31b815260040160405180910390fd5b919050565b5f8151600203611ed757602082015160408301516001600160e01b038216601b0b60e083901d5f611e7483838361227f565b6001600160e01b038516601b0b935060e085901d925090505f611e9884848361227f565b905060ff821180611ea9575060ff81115b15611ec757604051631e4e01d760e21b815260040160405180910390fd5b60081b179450611e3d9350505050565b600282511015611e2457604051630f16066b60e41b815260040160405180910390fd5b5f60608060ff851180611f0d575060ff84115b15611f3557604051639b0f326160e01b81526004810186905260248101859052604401610d5f565b6040805160248101909152600386602383015385602283015360106021830153806020830153506004815260408051602081019091525f8152600197919650945092505050565b60605f611f88836122c1565b90505f611f9682602061267a565b9050606060405190508160200181016040528281526020850160208651028101602083015b81831015611fde57602083515102806020855101835e6020939093019201611fbb565b50919695505050505050565b6120776040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020016060815260200160608152602001606081526020015f815260200160608152602001606081525090565b5f6040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f801b81526020015f8152602001600481526020015f81526020015f81526020015f81526020015f801b815260200184815260200185815260200160046001600160401b038111156120fc576120fc6124f1565b604051908082528060200260200182016040528015612125578160200160208202803683370190505b5081525f602080830182905260408084018b905260609384018a90528051601f01601f19168281528083018252835161ffff191681178452855290840182905283018190529082018190526080820181905260a08201819052610120820181905261014082018190526102008201529050611d54565b5f80825f528360205360215f2090506001815f1a1b915062ffffff8116611d27575060019250929050565b5f5f1982036121d85750610100919050565b507f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f7f5555555555555555555555555555555555555555555555555555555555555555600183901c16909103600281901c7f3333333333333333333333333333333333333333333333333333333333333333908116911601600481901c01167f01010101010101010101010101010101010101010101010101010101010101010260f81c90565b5f805f61228d86868661230a565b91509150806122b85760405162bc8ecf60e31b81526004810187905260248101869052604401610d5f565b50949350505050565b5f60208201602083510281015b808210156123035781515192830192808410156122f757634e487b715f5260116020526024601cfd5b506020820191506122ce565b5050919050565b5f805f85121561233757604051634a7d166b60e01b81526004810186905260248101859052604401610d5f565b845f0361234957505f90506001611c4f565b8460ff84168501858112156123845760405163c849483b60e01b8152600481018890526024810187905260ff86166044820152606401610d5f565b5f805f8312156123d057604c198312156123a7575f809550955050505050611c4f565b825f03600a0a91508184816123be576123be612647565b0495505084029091149150611c4f9050565b5f83131561246957604d83131561240d5760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610d5f565b82600a0a9150815f198161242357612423612647565b048411156124575760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610d5f565b5091909102925060019150611c4f9050565b8360019550955050505050611c4f565b612481612691565b565b5f60208284031215612493575f80fd5b81356001600160e01b0319811681146124aa575f80fd5b9392505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6124aa60208301846124b1565b634e487b7160e01b5f52604160045260245ffd5b5f60208284031215612515575f80fd5b81356001600160401b038082111561252b575f80fd5b818401915084601f83011261253e575f80fd5b813581811115612550576125506124f1565b604051601f8201601f19908116603f01168101908382118183101715612578576125786124f1565b81604052828152876020848701011115612590575f80fd5b826020860160208301375f928101602001929092525095945050505050565b83151581525f6020606060208401526125cb60608401866124b1565b8381036040850152845180825260208087019201905f5b818110156125fe578351835292840192918401916001016125e2565b509098975050505050505050565b634e487b7160e01b5f52601160045260245ffd5b808201808211156101d1576101d161260c565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601260045260245ffd5b5f8261267557634e487b7160e01b5f52601260045260245ffd5b500490565b80820281158282048414176101d1576101d161260c565b634e487b7160e01b5f52605160045260245ffdfe182d184a1859186818771887189618a618b518c518d518e418f4190319131923193319421951196a182d18591868187719b619c6182d18591868187719b619c619d60101180010800082000100010480300038412a001810000010020004200005002038038ff54900cc66c620f3dcab0616592212c9ec8109895f0b17fec9301c02e0920c5bfe561e21609201e959460b1974270f844db208bcd3bf1f989376111049db14b934301b0ae9a00af82a7805c138f40d28083f0742ef2104d561fd1515a13318716a611ad260cc107b9bfc0eec7ade16cba2891d6b14a513792bdb02e0f147195655891d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1da61da61e421d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d", + "object": "0x6080604052348015600e575f80fd5b506128948061001c5f395ff3fe608060405234801561000f575f80fd5b506004361061007a575f3560e01c80636f5aa28d116100585780636f5aa28d146100dd578063c6c0cbb61461010b578063ccf4477514610135578063d6d8c9a814610148575f80fd5b806301ffc9a71461007e578063336284d4146100a6578063570c7a63146100bb575b5f80fd5b61009161008c366004612547565b610150565b60405190151581526020015b60405180910390f35b6100ae6101d7565b60405161009d91906125a3565b6100ce6100c93660046125c9565b610c7c565b60405161009d93929190612673565b6040517fe5f5c8b20782dd193ccec19353560b4bba9e69c36c2e6dbf45ef331a38d96dc9815260200161009d565b61011e6101193660046125c9565b610dc0565b60408051921515835260208301919091520161009d565b60408051602081019091525f81526100ae565b6100ae610df8565b5f6001600160e01b031982166391ccb1d560e01b148061018057506001600160e01b03198216636f5aa28d60e01b145b8061019b57506001600160e01b03198216631a2c8edd60e01b145b806101b657506001600160e01b03198216630cd8a13560e21b145b806101d157506301ffc9a760e01b6001600160e01b03198316145b92915050565b60605f6101e6600660016126e4565b6101f19060016126e4565b6101fc9060016126e4565b6102079060016126e4565b6001600160401b0381111561021e5761021e6125b5565b60405190808252806020026020018201604052801561025157816020015b606081526020019060019003908161023c5790505b50604080516002808252606082019092529192505f9190816020015b61253d81526020019060019003908161026d57905050905061183b815f8151811061029a5761029a6126f7565b60200260200101906001600160401b031690816001600160401b031681525050611858816001815181106102d0576102d06126f7565b6001600160401b039290921660209283029190910190910152604080516003808252608082019092525f91816020015b61253d815260200190600190039081610300579050509050611867815f8151811061032d5761032d6126f7565b60200260200101906001600160401b031690816001600160401b03168152505061187681600181518110610363576103636126f7565b60200260200101906001600160401b031690816001600160401b03168152505061188581600281518110610399576103996126f7565b6001600160401b039290921660209283029190910190910152604080516002808252606082019092525f91816020015b61253d8152602001906001900390816103c9579050509050611895815f815181106103f6576103f66126f7565b60200260200101906001600160401b031690816001600160401b0316815250506118a48160018151811061042c5761042c6126f7565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b61253d81526020019060019003908161045c5790505090506118b4815f81518110610489576104896126f7565b60200260200101906001600160401b031690816001600160401b0316815250506118c3816001815181106104bf576104bf6126f7565b60200260200101906001600160401b031690816001600160401b0316815250506118d3816002815181106104f5576104f56126f7565b60200260200101906001600160401b031690816001600160401b0316815250506118e38160038151811061052b5761052b6126f7565b60200260200101906001600160401b031690816001600160401b0316815250506118f281600481518110610561576105616126f7565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b61253d815260200190600190039081610591579050509050611902815f815181106105be576105be6126f7565b60200260200101906001600160401b031690816001600160401b031681525050611911816001815181106105f4576105f46126f7565b60200260200101906001600160401b031690816001600160401b0316815250506119218160028151811061062a5761062a6126f7565b60200260200101906001600160401b031690816001600160401b03168152505061193181600381518110610660576106606126f7565b60200260200101906001600160401b031690816001600160401b03168152505061194181600481518110610696576106966126f7565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b61253d8152602001906001900390816106c5579050509050611950815f815181106106f2576106f26126f7565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b61253d815260200190600190039081610721579050509050611969815f8151811061074e5761074e6126f7565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b61253d81526020019060019003908161077d579050509050611987815f815181106107aa576107aa6126f7565b60200260200101906001600160401b031690816001600160401b03168152505087895f815181106107dd576107dd6126f7565b602002602001018190525086896001815181106107fc576107fc6126f7565b6020026020010181905250858960028151811061081b5761081b6126f7565b6020026020010181905250848960038151811061083a5761083a6126f7565b60200260200101819052508389600481518110610859576108596126f7565b60209081029190910101528289610872600660016126e4565b81518110610882576108826126f7565b6020908102919091010152818961089b600660016126e4565b6108a69060016126e4565b815181106108b6576108b66126f7565b602090810291909101015280896108cf600660016126e4565b6108da9060016126e4565b6108e59060016126e4565b815181106108f5576108f56126f7565b602090810291909101015260408051600680825260e082019092525f91816020015b61253d8152602001906001900390816109175790505090506119de815f81518110610944576109446126f7565b60200260200101906001600160401b031690816001600160401b0316815250506119ed8160018151811061097a5761097a6126f7565b60200260200101906001600160401b031690816001600160401b0316815250506119fc816002815181106109b0576109b06126f7565b60200260200101906001600160401b031690816001600160401b031681525050611a0c816003815181106109e6576109e66126f7565b60200260200101906001600160401b031690816001600160401b031681525050611a1c81600481518110610a1c57610a1c6126f7565b60200260200101906001600160401b031690816001600160401b031681525050611a2c81600581518110610a5257610a526126f7565b60200260200101906001600160401b031690816001600160401b031681525050808a600581518110610a8657610a866126f7565b602090810291909101015260408051600780825261010082019092525f91816020015b61253d815260200190600190039081610aa9579050509050611a3c815f81518110610ad657610ad66126f7565b60200260200101906001600160401b031690816001600160401b031681525050611a4b81600181518110610b0c57610b0c6126f7565b60200260200101906001600160401b031690816001600160401b031681525050611a5a81600281518110610b4257610b426126f7565b60200260200101906001600160401b031690816001600160401b031681525050611a6a81600381518110610b7857610b786126f7565b60200260200101906001600160401b031690816001600160401b031681525050611a7a81600481518110610bae57610bae6126f7565b60200260200101906001600160401b031690816001600160401b031681525050611a8a81600581518110610be457610be46126f7565b60200260200101906001600160401b031690816001600160401b031681525050611a9a81600681518110610c1a57610c1a6126f7565b60200260200101906001600160401b031690816001600160401b031681525050808b600681518110610c4e57610c4e6126f7565b60209081029190910101528a610c6b610c6682611aaa565b611abf565b9c5050505050505050505050505090565b5f6060805f805f610c9c87610c8f611b4e565b610c97611b6e565b611b8e565b9250925092505f610cb282610220015160200190565b90505f8261022001515182610cc791906126e4565b90505f610ce583836f07fffffe0000000003ff200000000000611c7f565b80925081945050505f80610cfe86610240015184611d1b565b915091508115610d93575f610d138783611df2565b905061253d5f610d21611e21565b90505f60028251610d32919061271f565b9050808510610d63576040516303bdd1b160e51b815260048101869052602481018290526044015b60405180910390fd5b6001850160020282015161ffff169250610d7c8c8c8686565b9e509e509e50505050505050505050505050610db9565b5050604080515f80825281830190925260208101828152919a5090985096505050505050505b9193909250565b5f805f805f610de8866002810151815160228084019461ffff93909316840101920160200190565b505f988998509650505050505050565b60605f610e07600660016126e4565b610e129060016126e4565b610e1d9060016126e4565b610e289060016126e4565b6001600160401b03811115610e3f57610e3f6125b5565b604051908082528060200260200182016040528015610e7257816020015b6060815260200190600190039081610e5d5790505b50604080516002808252606082019092529192505f9190816020015b61253d815260200190600190039081610e8e579050509050611e41815f81518110610ebb57610ebb6126f7565b60200260200101906001600160401b031690816001600160401b031681525050611e4181600181518110610ef157610ef16126f7565b6001600160401b039290921660209283029190910190910152604080516003808252608082019092525f91816020015b61253d815260200190600190039081610f21579050509050611e41815f81518110610f4e57610f4e6126f7565b60200260200101906001600160401b031690816001600160401b031681525050611e4181600181518110610f8457610f846126f7565b60200260200101906001600160401b031690816001600160401b031681525050611e4181600281518110610fba57610fba6126f7565b6001600160401b039290921660209283029190910190910152604080516002808252606082019092525f91816020015b61253d815260200190600190039081610fea579050509050611e41815f81518110611017576110176126f7565b60200260200101906001600160401b031690816001600160401b031681525050611e418160018151811061104d5761104d6126f7565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b61253d81526020019060019003908161107d579050509050611e41815f815181106110aa576110aa6126f7565b60200260200101906001600160401b031690816001600160401b031681525050611e41816001815181106110e0576110e06126f7565b60200260200101906001600160401b031690816001600160401b031681525050611e4181600281518110611116576111166126f7565b60200260200101906001600160401b031690816001600160401b031681525050611e418160038151811061114c5761114c6126f7565b60200260200101906001600160401b031690816001600160401b031681525050611e4181600481518110611182576111826126f7565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b61253d8152602001906001900390816111b2579050509050611e41815f815181106111df576111df6126f7565b60200260200101906001600160401b031690816001600160401b031681525050611e4181600181518110611215576112156126f7565b60200260200101906001600160401b031690816001600160401b031681525050611e418160028151811061124b5761124b6126f7565b60200260200101906001600160401b031690816001600160401b031681525050611e4181600381518110611281576112816126f7565b60200260200101906001600160401b031690816001600160401b031681525050611e41816004815181106112b7576112b76126f7565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b61253d8152602001906001900390816112e6579050509050611e6a815f81518110611313576113136126f7565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b61253d815260200190600190039081611342579050509050611e6a815f8151811061136f5761136f6126f7565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b61253d81526020019060019003908161139e579050509050611f06815f815181106113cb576113cb6126f7565b60200260200101906001600160401b031690816001600160401b03168152505087895f815181106113fe576113fe6126f7565b6020026020010181905250868960018151811061141d5761141d6126f7565b6020026020010181905250858960028151811061143c5761143c6126f7565b6020026020010181905250848960038151811061145b5761145b6126f7565b6020026020010181905250838960048151811061147a5761147a6126f7565b60209081029190910101528289611493600660016126e4565b815181106114a3576114a36126f7565b602090810291909101015281896114bc600660016126e4565b6114c79060016126e4565b815181106114d7576114d76126f7565b602090810291909101015280896114f0600660016126e4565b6114fb9060016126e4565b6115069060016126e4565b81518110611516576115166126f7565b602090810291909101015260408051600680825260e082019092525f91816020015b61253d815260200190600190039081611538579050509050611e41815f81518110611565576115656126f7565b60200260200101906001600160401b031690816001600160401b031681525050611e418160018151811061159b5761159b6126f7565b60200260200101906001600160401b031690816001600160401b031681525050611e41816002815181106115d1576115d16126f7565b60200260200101906001600160401b031690816001600160401b031681525050611e4181600381518110611607576116076126f7565b60200260200101906001600160401b031690816001600160401b031681525050611e418160048151811061163d5761163d6126f7565b60200260200101906001600160401b031690816001600160401b031681525050611e4181600581518110611673576116736126f7565b60200260200101906001600160401b031690816001600160401b031681525050808a6005815181106116a7576116a76126f7565b602090810291909101015260408051600780825261010082019092525f91816020015b61253d8152602001906001900390816116ca579050509050611e41815f815181106116f7576116f76126f7565b60200260200101906001600160401b031690816001600160401b031681525050611e418160018151811061172d5761172d6126f7565b60200260200101906001600160401b031690816001600160401b031681525050611e4181600281518110611763576117636126f7565b60200260200101906001600160401b031690816001600160401b031681525050611e4181600381518110611799576117996126f7565b60200260200101906001600160401b031690816001600160401b031681525050611e41816004815181106117cf576117cf6126f7565b60200260200101906001600160401b031690816001600160401b031681525050611e4181600581518110611805576118056126f7565b60200260200101906001600160401b031690816001600160401b031681525050611e4181600681518110610c1a57610c1a6126f7565b5f6060806118495f80611fbe565b92509250925093509350939050565b5f6060806118495f6001611fbe565b5f60608061184960015f611fbe565b5f606080611849600180611fbe565b5f60608061184960016002611fbe565b5f60608061184960025f611fbe565b5f60608061184960026001611fbe565b5f60608061184960035f611fbe565b5f60608061184960036001611fbe565b5f60608061184960036002611fbe565b5f606080611849600380611fbe565b5f60608061184960036004611fbe565b5f60608061184960045f611fbe565b5f60608061184960046001611fbe565b5f60608061184960046002611fbe565b5f60608061184960046003611fbe565b5f606080611849600480611fbe565b5f606080611849611963600660016126e4565b85611fbe565b5f60608061184961197c600660016126e4565b6119639060016126e4565b5f60608060ff80851690600886901c166119cd826119a7600660016126e4565b6119b29060016126e4565b6119bd9060016126e4565b6119c791906126e4565b82611fbe565b945094509450505093509350939050565b5f606080611849600580611fbe565b5f60608061184960055f611fbe565b5f60608061184960056001611fbe565b5f60608061184960056002611fbe565b5f60608061184960056003611fbe565b5f60608061184960056004611fbe565b5f606080611849600680611fbe565b5f60608061184960065f611fbe565b5f60608061184960066001611fbe565b5f60608061184960066002611fbe565b5f60608061184960066003611fbe565b5f60608061184960066004611fbe565b5f60608061184960066005611fbe565b6060815f611ab782612040565b949350505050565b60605f82516002026001600160401b03811115611ade57611ade6125b5565b6040519080825280601f01601f191660200182016040528015611b08576020820181803683370190505b50905061ffff80196020850160208651028101600285015b81831015611b4257805183518616908516178152602090920191600201611b20565b50939695505050505050565b60606040518060e0016040528060a681526020016127ac60a69139905090565b606060405180608001604052806042815260200161276a60429139905090565b5f80611c1d6040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020016060815260200160608152602001606081526020015f815260200160608152602001606081525090565b606061ffff600288015116935060ff600388015116925061ffff600588015116600588019750808852602081018801915050611c6987878760405180602001604052805f8152506120ae565b915080826101e001819052505093509350939050565b5f808060018187870360208111611c965780611c99565b60205b915050875192505b8519600184841a1b16158183101615611cbf57600182019150611ca1565b9681019660208290036008810293841c90931b92611d0a5760408051602081018590520160408051601f198184030181529082905263e47fe8b760e01b8252610d5a916004016125a3565b50869350909150505b935093915050565b600182810180515f928392600560ff93909316602102870192830192909101835b81831015611de05760018301516021909301805190935f90819060ff168180611d65838e61225f565b915091508186165f03611d87575f809b509b5050505050505050505050611deb565b5f87611d9760018503891661228a565b016004028b015195505062ffffff9081169350841683039150611dcb9050575060019750601c1a9550611deb945050505050565b611dd48361228a565b84019350505050611d3c565b5f8095509550505050505b9250929050565b6101c08201516002828102820101516101e08401515f9261ffff9092169190611e189083565b95945050505050565b606060405180608001604052806042815260200161285260429139905090565b5f81515f14611e63576040516304f8b58160e51b815260040160405180910390fd5b505f919050565b5f8151600103611ec7575060208101516001600160e01b038116601b0b60e082901d5f611e98838383612343565b905061ffff811115611ebd57604051631e4e01d760e21b815260040160405180910390fd5b9250611f01915050565b81515f03611ee857604051630f16066b60e41b815260040160405180910390fd5b604051630358cd2160e31b815260040160405180910390fd5b919050565b5f8151600203611f9b57602082015160408301516001600160e01b038216601b0b60e083901d5f611f38838383612343565b6001600160e01b038516601b0b935060e085901d925090505f611f5c848483612343565b905060ff821180611f6d575060ff81115b15611f8b57604051631e4e01d760e21b815260040160405180910390fd5b60081b179450611f019350505050565b600282511015611ee857604051630f16066b60e41b815260040160405180910390fd5b5f60608060ff851180611fd1575060ff84115b15611ff957604051639b0f326160e01b81526004810186905260248101859052604401610d5a565b6040805160248101909152600386602383015385602283015360106021830153806020830153506004815260408051602081019091525f8152600197919650945092505050565b60605f61204c83612385565b90505f61205a82602061273e565b9050606060405190508160200181016040528281526020850160208651028101602083015b818310156120a257602083515102806020855101835e602093909301920161207f565b50919695505050505050565b61213b6040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020016060815260200160608152602001606081526020015f815260200160608152602001606081525090565b5f6040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f801b81526020015f8152602001600481526020015f81526020015f81526020015f81526020015f801b815260200184815260200185815260200160046001600160401b038111156121c0576121c06125b5565b6040519080825280602002602001820160405280156121e9578160200160208202803683370190505b5081525f602080830182905260408084018b905260609384018a90528051601f01601f19168281528083018252835161ffff191681178452855290840182905283018190529082018190526080820181905260a08201819052610120820181905261014082018190526102008201529050611e18565b5f80825f528360205360215f2090506001815f1a1b915062ffffff8116611deb575060019250929050565b5f5f19820361229c5750610100919050565b507f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f7f5555555555555555555555555555555555555555555555555555555555555555600183901c16909103600281901c7f3333333333333333333333333333333333333333333333333333333333333333908116911601600481901c01167f01010101010101010101010101010101010101010101010101010101010101010260f81c90565b5f805f6123518686866123ce565b915091508061237c5760405162bc8ecf60e31b81526004810187905260248101869052604401610d5a565b50949350505050565b5f60208201602083510281015b808210156123c75781515192830192808410156123bb57634e487b715f5260116020526024601cfd5b50602082019150612392565b5050919050565b5f805f8512156123fb57604051634a7d166b60e01b81526004810186905260248101859052604401610d5a565b845f0361240d57505f90506001611d13565b8460ff84168501858112156124485760405163c849483b60e01b8152600481018890526024810187905260ff86166044820152606401610d5a565b5f805f83121561249457604c1983121561246b575f809550955050505050611d13565b825f03600a0a91508184816124825761248261270b565b0495505084029091149150611d139050565b5f83131561252d57604d8313156124d15760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610d5a565b82600a0a9150815f19816124e7576124e761270b565b0484111561251b5760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610d5a565b5091909102925060019150611d139050565b8360019550955050505050611d13565b612545612755565b565b5f60208284031215612557575f80fd5b81356001600160e01b03198116811461256e575f80fd5b9392505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f61256e6020830184612575565b634e487b7160e01b5f52604160045260245ffd5b5f602082840312156125d9575f80fd5b81356001600160401b03808211156125ef575f80fd5b818401915084601f830112612602575f80fd5b813581811115612614576126146125b5565b604051601f8201601f19908116603f0116810190838211818310171561263c5761263c6125b5565b81604052828152876020848701011115612654575f80fd5b826020860160208301375f928101602001929092525095945050505050565b83151581525f60206060602084015261268f6060840186612575565b8381036040850152845180825260208087019201905f5b818110156126c2578351835292840192918401916001016126a6565b509098975050505050505050565b634e487b7160e01b5f52601160045260245ffd5b808201808211156101d1576101d16126d0565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601260045260245ffd5b5f8261273957634e487b7160e01b5f52601260045260245ffd5b500490565b80820281158282048414176101d1576101d16126d0565b634e487b7160e01b5f52605160045260245ffdfe1e411e411e411e411e411e411e411e411e411e411e411e411e411e411e411e411e411e411e411e411e411e411e411e411e411e411e411e411e411e411e6a1e6a1f060101180010800082000100010480300038412a001810000010020004200005002038038ff54900cc66c61df3dcab061659221fc9ec8109895f0b14fec9301902e0920c5bfe561b21609201e959460b1974270f844db208bcd3bf1c9893761e1049db11b93430180ae9a00af82a7805c138f40d28083f0742ef2104d561fd1215a13315716a6117d260cc107b9bfc0eec7ade13cba2891a6b14a520792bdb02e0f14716565589183b1858186718761885189518a418b418c318d318e318f21902191119211931194119de19ed19fc1a0c1a1c1a2c1a3c1a4b1a5a1a6a1a7a1a8a1a9a195019691987", "linkReferences": {} } } diff --git a/meta/RaindexV6SubParser.rain.meta b/meta/RaindexV6SubParser.rain.meta index e278ebcd692bb5e8b918f1f77b7f353f4bfaca80..791adadf44c580214a28baacf6c0ef271f191858 100644 GIT binary patch delta 1456 zcmV;h1yB0A3&9J2{|br5bnbX`qySk3k9eH5S<8;(G!$(l-j5kzct3<$jf6TGreOvN z5bBX&F$-o8l!Vx|D{)m>o!BMY>8fJYTh{zQeFf`YutEGpe*{~kxqc*_RHf`BQ(fvs z$H%@t_vGH|M-Kcy6u>|A!_NlBKezVd&mRZyOF#a?i64J|F<}3t0RHm1AAbb}@C!fw zYQX+$$A0|A+K=B1jK6v5$6r79<8K7)zq$6~w*upDUHb92&i(k?D1cx1@pn%A_`3%I zeC@~II}YHNe*FD&KmNgmAOG;gkAD=vKVEZ@5)maC!Gef`-oIl%{LGEfj36@ya&sUm zk%C5?rh-U+{XbSn7UP^MMN$JPftkdKqMTV6h9tOrPpKe@%AoJKfa#R6_2}`a%^so? zgrSv+6uAazoip|p+)g18o?^#KDY+w-pk9&?hC!{>pdK|KRIUO=>avW&M4-6oLWEGaS!sTt*X z8Sz4Y%?q_Z|Nhkefnk~#IkLtZG9MxuLw>7TFPv-MRWCb6ah=8+5xvklNWxNAAmHzF z&}G6wg3>RjF%kmsi~s-@Aok;3{!<8h^Uuky;LCepe5lwqA>&EYa=J)XXCNs;$1_VoZZq_x;7S=R~1Q$~&fQrX~ z3F`c9B<+>|Bh7z|Gt3gw=7bC0#wzEQ6NJGXRDcsl_wGaYtRS(UKZqd+mVG=3@&C_% z#0Q;Bpe$<_C^K9=9^r{1qO(I)9^-6*R}#&+q)HbA$#t^lh14494AOfqUYo6?P%6mL zl-Tkzp$uoGzP8u!dSPqO-~tiS_g>rjSucCd{IgKJgWrGx5#o2htv>W2==cpS5Fviw zHS2?8Rx1$DGUXcu0+tYkCW7bj2EYD)1t7%laZCO;NIq==Xz+&@)w2ME`2XK2{~I1% zO96lb7@WEieFD=ju0HGa7J`%*Mtsojec1V@nzA}(xR&yKX+qhBf`f(@s1U!qE&S^H zvGNGyXlx&XN`3Mw>Rhs;NOm6j{ z7vy()CqJ9UK57kq0~eqWzoWMGr%wPbsG6k$FNPhzgZ#d2$&afkD~@H;b_SQozyuEQ z>zcnMjjh8{#cx;whxql%--=|pcyIITo4_G{ce>{kDd7aQL8VcB4{UVKBjP=2iJK^rQf99NWvBG_J|y- zWJaXBI?RgP>^E1X3Ag=h8bnh;(_Jf+H5{cphg;?S`~Q#j<%fqqMPJ>2JwkR8I9|Y& zC5HW*Y#|G4fxh8%jRi9oqAh}0TTYO=M7FnmK*@}A>EyB_4)w-aKa%BKzZCtA0vBoq zyGgT`o&!O1(Pk~&mTsI^zcg~}_paYxzcgPZ#PeM6GpdjK<5lex;l9q?u{Xt-!4UXZ zGOm<_&X}z@gB||Q?)!l!xnP87N=_^Nuqp(x#lWMH{h$6$YPy3^^J1LQ1f7yqO{^#5 K%ynmzl?5dj8|U-@ delta 1449 zcmV;a1y=gO3%Uz`{|br5bnbX`qySk3h^vPiqd- ze)fCc`}`K$y%+wVi2U=g`1#2C7tX`-7Y`%yi?IBqhhh1D%MtyrMC7lYh2^iIi2PAl z{(40J8;4=}wezt2dSw0ei?IC7v#|WFi2k?F!}50`@^>%7^7r;4@`(QT4|4E{iRP(8I#+!81 zUh-K}A~dkXJXRMUb1dgqf^Xm8GukU~esBG*J3uaS^0Z5V!^f9wO!UU_eb&LBgJ?~r z-hMMac50t>**BJ}FRjS5U{druEs82~J)aQe!UV2~LSmR@yld$ufD9LzE-<8KQsUEu zYqijSYIpwqZTthpwA3YX%3Cz=Bbq{ftHvx`8r=0Pw?=W3#%mG1G(1Sca$g|e?@Qoi z%7KE)FQ_pR0`P=@05m}Cr`!CeJP~F=fA8b||9fN;60}whQRe(8NrQ#l9~Pa_7J z_+2FJ6#spLe}W6lGScOQ58hUn^X&v-a0h8{;^6ijm|kd-hVcU#f?zqsgBbqDHa_To zbP8qJxImf38t@2D6%oB1s`D5ZOT3b3!6j9uAV_YKz0}fhWHQK{y?Db~1)*Y)qZx7K zWl9+?Dt_Ip@%6&hpwR^)#_#Q}{@E;h?fi41bPK)_1tNy;PFH;x0?^|dTOeZierVSR zkE~H3U}VPE3Iwzeg{Fd+=^DP_1t5lh??FfYw?IB?0chcejT%@0V)&o*%Kw%}S5g4r z0tUCP%-q1t#x<>8Z6T0!HuC7+i{HN*`A_Nub4J@=b2tyfarjgj7tBV$6=`!tiB&cy z(jUDGUE2LxRVw`UwH2b7p!v2w=@ch9FX2|Ud;kA4zWj9Wm*ksU2gn(L^n@dSKUQ4G z4zLm}%?-g1YGyAK9fUYto{%O*Znpb^vN`9{)8$s|o4_+)$?3vuin-%st>#eWY%DGS zpgpKM4L77;7vwKbJo=sU_s?(bt%Sf{2!29MyPT{VS?FIkZn~QmX0QYv8zwcAFd4HI zXOJPk`un#%phGle$2EUgX+hk7BSe5B_dorUG}kIgRGp`jOQa$EXGgQ z`$BE9zQ+5J>ix#HinN7q>;WK#?^XxC=6$DnV(>6F9~mlqBO7cC-*@f)+GwnoNH;+? zPTp;NgBxrN-+o7b-Ds>HLuZP%@!8%r0A3W|jji}xn+!o~;Tw6ti{U$e=sMpG3BV;) z^IYKN$Q~KP_kBlxT$-#gRzsT^TuDYIa13AH{HU^VrVt{crF&)oU+rYj19iq%l8m zh?Tn&)#H~3H5Gj@bBpJmge`J+s5?=rkk#GQ$4?v`3 i1BjG503xLmK%@+qlwGhnfu(_OvxC?Hj?E8*5|{zBp&N_< delta 108 zcmZp$Yp~lepNVn7L`FF#kq1DMQEc)@R(U2du!y(=NL(Bw&Lq(QA|(~Tj6e krNQc@7l1@$9KhrQ5GkjyIf12tZ}S4_1m?{Tgbr{300e{_ng9R* diff --git a/src/generated/RaindexV6SubParserPointers.sol b/src/generated/RaindexV6SubParserPointers.sol index f911f7cac3..f0c24210e1 100644 --- a/src/generated/RaindexV6SubParserPointers.sol +++ b/src/generated/RaindexV6SubParserPointers.sol @@ -5,10 +5,10 @@ pragma solidity ^0.8.25; // THIS FILE IS AUTOGENERATED BY THE BUILD SCRIPT. DO NOT EDIT BY HAND. /// @dev Hash of the known bytecode. -bytes32 constant BYTECODE_HASH = bytes32(0x94c0af1d573bd9d570edd410a30be087c13fd8269e6276721fa124bc160fb0ca); +bytes32 constant BYTECODE_HASH = bytes32(0x2bafaa417c2e9542a78321c186f293f581bb2a075bcdbfb03b2cf22fb4ecdabb); /// @dev The hash of the meta that describes the contract. -bytes32 constant DESCRIBED_BY_META_HASH = bytes32(0x828494fa15dec168f2372c71a11064dc163f7783fb7f3a9a84df40a87861a368); +bytes32 constant DESCRIBED_BY_META_HASH = bytes32(0xe5f5c8b20782dd193ccec19353560b4bba9e69c36c2e6dbf45ef331a38d96dc9); /// @dev The parse meta that is used to lookup word definitions. /// The structure of the parse meta is: @@ -27,7 +27,7 @@ bytes32 constant DESCRIBED_BY_META_HASH = bytes32(0x828494fa15dec168f2372c71a110 /// bit count of the previous bloom filter. If we reach the end of the bloom /// filters then we have a miss. bytes constant PARSE_META = - hex"0101180010800082000100010480300038412a001810000010020004200005002038038ff54900cc66c620f3dcab0616592212c9ec8109895f0b17fec9301c02e0920c5bfe561e21609201e959460b1974270f844db208bcd3bf1f989376111049db14b934301b0ae9a00af82a7805c138f40d28083f0742ef2104d561fd1515a13318716a611ad260cc107b9bfc0eec7ade16cba2891d6b14a513792bdb02e0f14719565589"; + hex"0101180010800082000100010480300038412a001810000010020004200005002038038ff54900cc66c61df3dcab061659221fc9ec8109895f0b14fec9301902e0920c5bfe561b21609201e959460b1974270f844db208bcd3bf1c9893761e1049db11b93430180ae9a00af82a7805c138f40d28083f0742ef2104d561fd1215a13315716a6117d260cc107b9bfc0eec7ade13cba2891a6b14a520792bdb02e0f14716565589"; /// @dev The build depth of the parser meta. @@ -39,13 +39,13 @@ uint8 constant PARSE_META_BUILD_DEPTH = 1; /// to things that happen entirely on the interpreter such as well known /// constants and references to the context grid. bytes constant SUB_PARSER_WORD_PARSERS = - hex"182d184a1859186818771887189618a618b518c518d518e418f4190319131923193319421951196a182d18591868187719b619c6182d18591868187719b619c619d6"; + hex"183b1858186718761885189518a418b418c318d318e318f21902191119211931194119de19ed19fc1a0c1a1c1a2c1a3c1a4b1a5a1a6a1a7a1a8a1a9a195019691987"; /// @dev Every two bytes is a function pointer for an operand handler. /// These positional indexes all map to the same indexes looked up in the parse /// meta. bytes constant OPERAND_HANDLER_FUNCTION_POINTERS = - hex"1d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1da61da61e421d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d"; + hex"1e411e411e411e411e411e411e411e411e411e411e411e411e411e411e411e411e411e411e411e411e411e411e411e411e411e411e411e411e411e411e6a1e6a1f06"; /// @dev Every two bytes is a function pointer for a literal parser. /// Literal dispatches are determined by the first byte(s) of the literal diff --git a/src/generated/candidate/GenericPoolRaindexV6ArbOrderTaker.sol b/src/generated/candidate/GenericPoolRaindexV6ArbOrderTaker.sol index a5cdc900f3..d907868cc1 100644 --- a/src/generated/candidate/GenericPoolRaindexV6ArbOrderTaker.sol +++ b/src/generated/candidate/GenericPoolRaindexV6ArbOrderTaker.sol @@ -5,23 +5,23 @@ pragma solidity ^0.8.25; // THIS FILE IS AUTOGENERATED BY THE BUILD SCRIPT. DO NOT EDIT BY HAND. /// @dev Hash of the known bytecode. -bytes32 constant BYTECODE_HASH = bytes32(0xde8bc9d05f9cd1da3bb12ae489a5ea7e5b533cd15ba9396334df575e9a23e326); +bytes32 constant BYTECODE_HASH = bytes32(0x6a713ed0b5d20dd1882ac95bb3ab6e4b99658f6062059db52f897923bfd7d0e5); /// @dev The deterministic deploy address of the contract when deployed via /// the Zoltu factory. -address constant DEPLOYED_ADDRESS = address(0x02Ce492d12b2AdCea959377568Dd82BB8b6Ca0EE); +address constant DEPLOYED_ADDRESS = address(0x28eb44A4d80458Ec7022d76abCbcC877db75c5b5); /// @dev The creation bytecode of the contract. bytes constant CREATION_CODE = - hex"6080604052348015600e575f80fd5b5060017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055612543806100405f395ff3fe608060405260043610610034575f3560e01c806301ffc9a71461003d578063691f9ed714610070578063ea37cc511461008f57005b3661003b57005b005b348015610048575f80fd5b5061005c61005736600461179e565b6100a2565b604051901515815260200160405180910390f35b34801561007b575f80fd5b5061003b61008a3660046117d9565b6100f3565b61003b61009d36600461187b565b610148565b5f6001600160e01b0319821663691f9ed760e01b14806100d257506001600160e01b0319821663ea37cc5160e01b145b806100ed57506301ffc9a760e01b6001600160e01b03198316145b92915050565b61010186868686868661040a565b6101408683838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061046f92505050565b505050505050565b610150610520565b61015f61015c82611b8c565b50565b61016c6080830183611c48565b90505f0361018d57604051639c95219f60e01b815260040160405180910390fd5b6001600160a01b03831673531167691b4f37f0266e226d03412c77fb2977ce146101da5760405163516e822d60e01b81526001600160a01b03841660048201526024015b60405180910390fd5b5f6101e86080840184611c48565b5f8181106101f8576101f8611c8e565b905060200281019061020a9190611ca2565b6102149080611cc0565b610222906040810190611cd4565b61022f6080860186611c48565b5f81811061023f5761023f611c8e565b90506020028101906102519190611ca2565b6020013581811061026457610264611c8e565b61027a9260206040909202019081019150611d1a565b90505f61028a6080850185611c48565b5f81811061029a5761029a611c8e565b90506020028101906102ac9190611ca2565b6102b69080611cc0565b6102c4906060810190611cd4565b6102d16080870187611c48565b5f8181106102e1576102e1611c8e565b90506020028101906102f39190611ca2565b6040013581811061030657610306611c8e565b61031c9260206040909202019081019150611d1a565b90506103336001600160a01b038316865f1961054e565b60405163b0460f0760e01b81526001600160a01b0386169063b0460f079061035f908790600401611fe2565b60408051808303815f875af115801561037a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061039e91906121a4565b506103b590506001600160a01b038316865f61054e565b6103da6103c184611b8c565b836103cb856105c8565b846103d5866105c8565b61064c565b505061040560017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054600214801561044f57503373531167691b4f37f0266e226d03412c77fb2977ce14155b156101405760405163f6688adf60e01b81523360048201526024016101d1565b5f805f8380602001905181019061048691906121c6565b919450925090506001600160a01b0383166104b4576040516398521dc560e01b815260040160405180910390fd5b6001600160a01b0382166104db5760405163456ac4c360e11b815260040160405180910390fd5b6104f06001600160a01b038616845f1961054e565b6105046001600160a01b03831682476108eb565b506105196001600160a01b038616845f61054e565b5050505050565b6105286109b8565b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b61055a8383835f6109fc565b6104055761056b83835f60016109fc565b61059357604051635274afe760e01b81526001600160a01b03841660048201526024016101d1565b6105a083838360016109fc565b61040557604051635274afe760e01b81526001600160a01b03841660048201526024016101d1565b5f6105d1610a5e565b6040516354636d2b60e01b81526001600160a01b038316600482015273200e12d10bb0c5e4a17e7018f0f1161919bb9389906354636d2b906024016020604051808303815f875af1158015610628573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100ed9190612261565b6040805160018082528183019092525f91816020015b6060815260200190600190039081610662575050604080516003808252608082019092529192505f919060208201606080368337019050506040516370a0823160e01b81523060048201529091505f906001600160a01b038816906370a0823190602401602060405180830381865afa1580156106e1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107059190612281565b90508015610721576107216001600160a01b0388163383610ae9565b5f61072c8288610af6565b50905080835f8151811061074257610742611c8e565b602090810291909101015250506040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015610793573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107b79190612281565b905080156107d3576107d36001600160a01b0386163383610ae9565b5f6107de8286610af6565b50905080836001815181106107f5576107f5611c8e565b6020908102919091010152504790508015610814576108143382610b37565b5f610820826012610af6565b509050808360028151811061083757610837611c8e565b602002602001018181525050505080825f8151811061085857610858611c8e565b60209081029190910101526040805160018082528183019092525f91816020015b6040805160a0810182525f918101828152606080830193909352608082018390528152602081019190915281526020019060019003908161087957905050905087815f815181106108cc576108cc611c8e565b60200260200101819052506108e18382610b95565b5050505050505050565b6060814710156109175760405163cf47918160e01b8152476004820152602481018390526044016101d1565b5f610923858486610ddd565b905080801561094457505f3d118061094457505f856001600160a01b03163b115b1561095957610951610df2565b9150506109b1565b801561098357604051639996b31560e01b81526001600160a01b03861660048201526024016101d1565b3d1561099657610991610e0b565b6109af565b60405163d6bda27560e01b815260040160405180910390fd5b505b9392505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00546002036109fa57604051633ee5aeb560e01b815260040160405180910390fd5b565b60405163095ea7b360e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610a52578383151615610a46573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b73200e12d10bb0c5e4a17e7018f0f1161919bb93893b1580610ab5575073200e12d10bb0c5e4a17e7018f0f1161919bb93893f7f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d4114155b156109fa576040516373e6d7b360e01b815273200e12d10bb0c5e4a17e7018f0f1161919bb938960048201526024016101d1565b6105a08383836001610e16565b5f805f805f610b058787610e60565b9250925092505f80610b178585610ebc565b9150915081838015610b265750815b9650965050505050505b9250929050565b80471015610b615760405163cf47918160e01b8152476004820152602481018290526044016101d1565b610b7a828260405180602001604052805f815250610ddd565b15610b83575050565b3d1561099657610b91610e0b565b5050565b60408051600480825260a082019092525f91816020015b6060815260200190600190039081610bac5790505090505f5b8351811015610c0d57838181518110610be057610be0611c8e565b6020026020010151828281518110610bfa57610bfa611c8e565b6020908102919091010152600101610bc5565b50335f8181523060209081526040808320815160a0810183528083018581526060808301879052608083018190529082528185015282518581529384018581528484019093529093909291905b8751811015610dd257878181518110610c7557610c75611c8e565b602002602001015193505f845f015160400151511115610dca575f845f01515f01516001600160a01b031663d04dfe236040518060e00160405280885f0151602001516001600160a01b03168152602001898152602001885f01516040015181526020015f8152602001610ced8c8a6020015161112f565b8152602001878152602001868152506040518263ffffffff1660e01b8152600401610d18919061234d565b5f60405180830381865afa158015610d32573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610d599190810190612445565b9150505f81511115610dc85784516020015160405163012c676d60e21b81526001600160a01b03909116906304b19db490610d9a908a9085906004016124fb565b5f604051808303815f87803b158015610db1575f80fd5b505af1158015610dc3573d5f803e3d5ffd5b505050505b505b600101610c5a565b505050505050505050565b5f805f83516020850186885af1949350505050565b6040513d81523d5f602083013e3d602001810160405290565b6040513d5f823e3d81fd5b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610a52578383151615610a46573d5f823e3d81fd5b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff861115610eab57600a860460018201600a88065f1493509350935050610eb5565b8593509150600190505b9250925092565b5f808383601b82900b821480611007577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e1000000000000000000870515610f3d577f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000870515610f2e576305f5e10087059650600886019550610f3d565b620186a0870596506005860195505b8687601b0b14610f5857600a87059650856001019550610f3d565b7b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc7b1999999999999999999999999999999999999999999999999999999888820111611001575f600188039050808160030b03610fff5760e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff7b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff60ff8b901d18161795505f9450610b309350505050565b505b5061101e565b865f0361101e57505f935060019250610b30915050565b858660030b146110d5575f82131561107d5761103a8383611502565b156110625760405163d556b11160e01b815260048101849052602481018390526044016101d1565b637ffffffe19909501600a0a82029550637fffffff946110d5565b637fffffff19869003604381131561109f57505f9450849350610b3092505050565b80600a0a88816110b1576110b161251b565b059750875f036110cb57505f9450849350610b3092505050565b50637fffffff1995505b8186136110e557600193506110fe565b818603600a0a83816110f9576110f961251b565b071593505b5050507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff841660e084901b1791509250929050565b60605f825167ffffffffffffffff81111561114c5761114c6118f9565b604051908082528060200260200182016040528015611175578160200160208202803683370190505b5090505f835167ffffffffffffffff811115611193576111936118f9565b6040519080825280602002602001820160405280156111bc578160200160208202803683370190505b5090505f808551116111ce575f6111d4565b84516002015b86516001010190505f8167ffffffffffffffff8111156111f6576111f66118f9565b60405190808252806020026020018201604052801561122957816020015b60608152602001906001900390816112145790505b5090505f61124d604080516002815233602082015230818301526060810190915290565b82828151811061125f5761125f611c8e565b60200260200101819052505f5b88518110156112bc57818060010192505088818151811061128f5761128f611c8e565b60200260200101518383815181106112a9576112a9611c8e565b602090810291909101015260010161126c565b508651156114f7578080600101915050848282815181106112df576112df611c8e565b602002602001018190525080806001019150508382828151811061130557611305611c8e565b60200260200101819052505f5b87518110156114f55761140888828151811061133057611330611c8e565b60200260200101515f01516113e58a848151811061135057611350611c8e565b6020026020010151602001516113c68c868151811061137157611371611c8e565b60200260200101518051604091820151805160209081029181019190912083517f6ec4dff745ec96dbde88c5d41f8aa5ac13aa1664afb47b8406b44fa945a650c8815291820192909252918201526060902090565b60405161190160f01b8152600281019290925260228201526042902090565b8a84815181106113f7576113f7611c8e565b60200260200101516060015161151d565b61142857604051630a57f30960e31b8152600481018290526024016101d1565b87818151811061143a5761143a611c8e565b60200260200101515f01516001600160a01b03165f1b86828151811061146257611462611c8e565b60200260200101818152505087818151811061148057611480611c8e565b60200260200101516020015185828151811061149e5761149e611c8e565b60200260200101818152505081806001019250508781815181106114c4576114c4611c8e565b6020026020010151604001518383815181106114e2576114e2611c8e565b6020908102919091010152600101611312565b505b509695505050505050565b5f6109b15f84126115135783611517565b835f035b8361158d565b5f836001600160a01b03163b5f0361157b575f8061153b858561162b565b5090925090505f8160038111156115545761155461252f565b1480156115725750856001600160a01b0316826001600160a01b0316145b925050506109b1565b611586848484611671565b90506109b1565b5f637ffffff582136115a057505f6100ed565b637ffffffe19820160438113156115bb5750508115156100ed565b5f81126115fb5780600a0a7b80000000000000000000000000000000000000000000000000000001816115f0576115f061251b565b0484119150506100ed565b805f03600a0a7b800000000000000000000000000000000000000000000000000000020284101591505092915050565b5f805f8351604103611662576020840151604085015160608601515f1a611654888285856116d6565b955095509550505050610eb5565b505081515f9150600290610eb5565b805160408051630b135d3f60e11b8082526004820186905260248201929092525f92906020820185604483015e5f82606483010152601f820160051c60051b915060205f60648401838a5afa9050825f5114601f3d1116811693505050509392505050565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084111561170f57505f91506003905082611794565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015611760573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b03811661178b57505f925060019150829050611794565b92505f91508190505b9450945094915050565b5f602082840312156117ae575f80fd5b81356001600160e01b0319811681146109b1575f80fd5b6001600160a01b038116811461015c575f80fd5b5f805f805f8060a087890312156117ee575f80fd5b86356117f9816117c5565b95506020870135611809816117c5565b94506040870135935060608701359250608087013567ffffffffffffffff80821115611833575f80fd5b818901915089601f830112611846575f80fd5b813581811115611854575f80fd5b8a6020828501011115611865575f80fd5b6020830194508093505050509295509295509295565b5f805f6060848603121561188d575f80fd5b8335611898816117c5565b9250602084013567ffffffffffffffff808211156118b4575f80fd5b9085019060c082880312156118c7575f80fd5b909250604085013590808211156118dc575f80fd5b508401604081870312156118ee575f80fd5b809150509250925092565b634e487b7160e01b5f52604160045260245ffd5b6040516080810167ffffffffffffffff81118282101715611930576119306118f9565b60405290565b6040805190810167ffffffffffffffff81118282101715611930576119306118f9565b6040516060810167ffffffffffffffff81118282101715611930576119306118f9565b604051601f8201601f1916810167ffffffffffffffff811182821017156119a5576119a56118f9565b604052919050565b5f67ffffffffffffffff8211156119c6576119c66118f9565b50601f01601f191660200190565b5f82601f8301126119e3575f80fd5b81356119f66119f1826119ad565b61197c565b818152846020838601011115611a0a575f80fd5b816020850160208301375f918101602001919091529392505050565b5f67ffffffffffffffff821115611a3f57611a3f6118f9565b5060051b60200190565b5f82601f830112611a58575f80fd5b81356020611a686119f183611a26565b82815260059290921b84018101918181019086841115611a86575f80fd5b8286015b848110156114f757803567ffffffffffffffff80821115611aa9575f80fd5b908801906080828b03601f19011215611ac0575f80fd5b611ac861190d565b86830135611ad5816117c5565b815260408381013588830152606084013583811115611af2575f80fd5b8401603f81018d13611b02575f80fd5b88810135611b126119f182611a26565b81815260059190911b82018301908a8101908f831115611b30575f80fd5b928401925b82841015611b4e5783358252928b0192908b0190611b35565b80858701525050505050608083013582811115611b69575f80fd5b611b778c89838701016119d4565b60608301525085525050918301918301611a8a565b5f60408236031215611b9c575f80fd5b611ba4611936565b823567ffffffffffffffff80821115611bbb575f80fd5b818501915060608236031215611bcf575f80fd5b611bd7611959565b8235611be2816117c5565b81526020830135611bf2816117c5565b6020820152604083013582811115611c08575f80fd5b611c14368286016119d4565b60408301525083526020850135915080821115611c2f575f80fd5b50611c3c36828601611a49565b60208301525092915050565b5f808335601e19843603018112611c5d575f80fd5b83018035915067ffffffffffffffff821115611c77575f80fd5b6020019150600581901b3603821315610b30575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235607e19833603018112611cb6575f80fd5b9190910192915050565b5f8235609e19833603018112611cb6575f80fd5b5f808335601e19843603018112611ce9575f80fd5b83018035915067ffffffffffffffff821115611d03575f80fd5b6020019150600681901b3603821315610b30575f80fd5b5f60208284031215611d2a575f80fd5b81356109b1816117c5565b5f808335601e19843603018112611d4a575f80fd5b830160208101925035905067ffffffffffffffff811115611d69575f80fd5b8060051b3603821315610b30575f80fd5b5f808335601e19843603018112611d8f575f80fd5b830160208101925035905067ffffffffffffffff811115611dae575f80fd5b803603821315610b30575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f8135611df0816117c5565b6001600160a01b039081168452602083013590611e0c826117c5565b166020840152611e1f6040830183611d7a565b60606040860152611e34606086018284611dbc565b95945050505050565b5f808335601e19843603018112611e52575f80fd5b830160208101925035905067ffffffffffffffff811115611e71575f80fd5b8060061b3603821315610b30575f80fd5b8183525f60208085019450825f5b85811015611ec8578135611ea3816117c5565b6001600160a01b03168752818301358388015260409687019690910190600101611e90565b509495945050505050565b5f8235607e19833603018112611ee7575f80fd5b90910192915050565b8183526020808401935f91600585811b8301820185855b88811015611fd457858303601f19018a52611f228289611ed3565b60808135611f2f816117c5565b6001600160a01b0316855281870135878601526040611f5081840184611d35565b8383890152808489015260a093507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811115611f8a575f80fd5b881b91508181888501375085016060611fa584820185611d7a565b9450838884030182890152611fbd8484018683611dbc565b9e8a019e9750505093870193505050600101611f07565b509098975050505050505050565b5f602080835260e08301843582850152818501356040850152606060408601356060860152606086013580151580821461201a575f80fd5b60809150806080880152506120326080880188611d35565b60c060a08901529384905261010093848801600582901b89018601835f5b8481101561216b578b830360ff1901845261206b8287611ed3565b8035609e1982360301811261207e575f80fd5b8885528101803561208e816117c5565b6001600160a01b0316858a0152808c013536829003605e190181126120b1575f80fd5b60a0808701526120c76101208701838301611de4565b90506120d66040830183611e3d565b607f19808985030160c08a01526120ee848385611e82565b93506120fc8e860186611e3d565b93509150808985030160e08a015250612116838383611e82565b92505050898201358c8701528c8301358d870152604083013560408701526121408b840184611d35565b935091508581038b870152612156818484611ef0565b968d019695505050918a019150600101612050565b505061217a60a08c018c611d7a565b8b8303601f190160c08d015298509650612195818989611dbc565b9b9a5050505050505050505050565b5f80604083850312156121b5575f80fd5b505080516020909101519092909150565b5f805f606084860312156121d8575f80fd5b83516121e3816117c5565b60208501519093506121f4816117c5565b604085015190925067ffffffffffffffff811115612210575f80fd5b8401601f81018613612220575f80fd5b805161222e6119f1826119ad565b818152876020838501011115612242575f80fd5b8160208401602083015e5f602083830101528093505050509250925092565b5f60208284031215612271575f80fd5b815160ff811681146109b1575f80fd5b5f60208284031215612291575f80fd5b5051919050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f815180845260208085019450602084015f5b83811015611ec8578151875295820195908201906001016122d9565b5f8282518085526020808601955060208260051b840101602086015f5b8481101561234057601f1986840301895261232e8383516122c6565b98840198925090830190600101612312565b5090979650505050505050565b602081526001600160a01b038251166020820152602082015160408201525f604083015160e06060840152612386610100840182612298565b9050606084015160808401526080840151601f19808584030160a08601526123ae83836122f5565b925060a08601519150808584030160c08601526123cb83836122c6565b925060c08601519150808584030160e086015250611e3482826122c6565b5f82601f8301126123f8575f80fd5b815160206124086119f183611a26565b8083825260208201915060208460051b870101935086841115612429575f80fd5b602086015b848110156114f7578051835291830191830161242e565b5f8060408385031215612456575f80fd5b825167ffffffffffffffff8082111561246d575f80fd5b818501915085601f830112612480575f80fd5b815160206124906119f183611a26565b82815260059290921b840181019181810190898411156124ae575f80fd5b948201945b838610156124cc578551825294820194908201906124b3565b918801519196509093505050808211156124e4575f80fd5b506124f1858286016123e9565b9150509250929050565b828152604060208201525f61251360408301846122c6565b949350505050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52602160045260245ffd"; + hex"6080604052348015600e575f80fd5b5060017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055612543806100405f395ff3fe608060405260043610610034575f3560e01c806301ffc9a71461003d578063691f9ed714610070578063ea37cc511461008f57005b3661003b57005b005b348015610048575f80fd5b5061005c61005736600461179e565b6100a2565b604051901515815260200160405180910390f35b34801561007b575f80fd5b5061003b61008a3660046117d9565b6100f3565b61003b61009d36600461187b565b610148565b5f6001600160e01b0319821663691f9ed760e01b14806100d257506001600160e01b0319821663ea37cc5160e01b145b806100ed57506301ffc9a760e01b6001600160e01b03198316145b92915050565b61010186868686868661040a565b6101408683838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061046f92505050565b505050505050565b610150610520565b61015f61015c82611b8c565b50565b61016c6080830183611c48565b90505f0361018d57604051639c95219f60e01b815260040160405180910390fd5b6001600160a01b03831673d2cd1d4ad3bf3ecb581e4653c9c02a67ca44305c146101da5760405163516e822d60e01b81526001600160a01b03841660048201526024015b60405180910390fd5b5f6101e86080840184611c48565b5f8181106101f8576101f8611c8e565b905060200281019061020a9190611ca2565b6102149080611cc0565b610222906040810190611cd4565b61022f6080860186611c48565b5f81811061023f5761023f611c8e565b90506020028101906102519190611ca2565b6020013581811061026457610264611c8e565b61027a9260206040909202019081019150611d1a565b90505f61028a6080850185611c48565b5f81811061029a5761029a611c8e565b90506020028101906102ac9190611ca2565b6102b69080611cc0565b6102c4906060810190611cd4565b6102d16080870187611c48565b5f8181106102e1576102e1611c8e565b90506020028101906102f39190611ca2565b6040013581811061030657610306611c8e565b61031c9260206040909202019081019150611d1a565b90506103336001600160a01b038316865f1961054e565b60405163b0460f0760e01b81526001600160a01b0386169063b0460f079061035f908790600401611fe2565b60408051808303815f875af115801561037a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061039e91906121a4565b506103b590506001600160a01b038316865f61054e565b6103da6103c184611b8c565b836103cb856105c8565b846103d5866105c8565b61064c565b505061040560017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054600214801561044f57503373d2cd1d4ad3bf3ecb581e4653c9c02a67ca44305c14155b156101405760405163f6688adf60e01b81523360048201526024016101d1565b5f805f8380602001905181019061048691906121c6565b919450925090506001600160a01b0383166104b4576040516398521dc560e01b815260040160405180910390fd5b6001600160a01b0382166104db5760405163456ac4c360e11b815260040160405180910390fd5b6104f06001600160a01b038616845f1961054e565b6105046001600160a01b03831682476108eb565b506105196001600160a01b038616845f61054e565b5050505050565b6105286109b8565b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b61055a8383835f6109fc565b6104055761056b83835f60016109fc565b61059357604051635274afe760e01b81526001600160a01b03841660048201526024016101d1565b6105a083838360016109fc565b61040557604051635274afe760e01b81526001600160a01b03841660048201526024016101d1565b5f6105d1610a5e565b6040516354636d2b60e01b81526001600160a01b038316600482015273200e12d10bb0c5e4a17e7018f0f1161919bb9389906354636d2b906024016020604051808303815f875af1158015610628573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100ed9190612261565b6040805160018082528183019092525f91816020015b6060815260200190600190039081610662575050604080516003808252608082019092529192505f919060208201606080368337019050506040516370a0823160e01b81523060048201529091505f906001600160a01b038816906370a0823190602401602060405180830381865afa1580156106e1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107059190612281565b90508015610721576107216001600160a01b0388163383610ae9565b5f61072c8288610af6565b50905080835f8151811061074257610742611c8e565b602090810291909101015250506040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015610793573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107b79190612281565b905080156107d3576107d36001600160a01b0386163383610ae9565b5f6107de8286610af6565b50905080836001815181106107f5576107f5611c8e565b6020908102919091010152504790508015610814576108143382610b37565b5f610820826012610af6565b509050808360028151811061083757610837611c8e565b602002602001018181525050505080825f8151811061085857610858611c8e565b60209081029190910101526040805160018082528183019092525f91816020015b6040805160a0810182525f918101828152606080830193909352608082018390528152602081019190915281526020019060019003908161087957905050905087815f815181106108cc576108cc611c8e565b60200260200101819052506108e18382610b95565b5050505050505050565b6060814710156109175760405163cf47918160e01b8152476004820152602481018390526044016101d1565b5f610923858486610ddd565b905080801561094457505f3d118061094457505f856001600160a01b03163b115b1561095957610951610df2565b9150506109b1565b801561098357604051639996b31560e01b81526001600160a01b03861660048201526024016101d1565b3d1561099657610991610e0b565b6109af565b60405163d6bda27560e01b815260040160405180910390fd5b505b9392505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00546002036109fa57604051633ee5aeb560e01b815260040160405180910390fd5b565b60405163095ea7b360e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610a52578383151615610a46573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b73200e12d10bb0c5e4a17e7018f0f1161919bb93893b1580610ab5575073200e12d10bb0c5e4a17e7018f0f1161919bb93893f7f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d4114155b156109fa576040516373e6d7b360e01b815273200e12d10bb0c5e4a17e7018f0f1161919bb938960048201526024016101d1565b6105a08383836001610e16565b5f805f805f610b058787610e60565b9250925092505f80610b178585610ebc565b9150915081838015610b265750815b9650965050505050505b9250929050565b80471015610b615760405163cf47918160e01b8152476004820152602481018290526044016101d1565b610b7a828260405180602001604052805f815250610ddd565b15610b83575050565b3d1561099657610b91610e0b565b5050565b60408051600680825260e082019092525f91816020015b6060815260200190600190039081610bac5790505090505f5b8351811015610c0d57838181518110610be057610be0611c8e565b6020026020010151828281518110610bfa57610bfa611c8e565b6020908102919091010152600101610bc5565b50335f8181523060209081526040808320815160a0810183528083018581526060808301879052608083018190529082528185015282518581529384018581528484019093529093909291905b8751811015610dd257878181518110610c7557610c75611c8e565b602002602001015193505f845f015160400151511115610dca575f845f01515f01516001600160a01b031663d04dfe236040518060e00160405280885f0151602001516001600160a01b03168152602001898152602001885f01516040015181526020015f8152602001610ced8c8a6020015161112f565b8152602001878152602001868152506040518263ffffffff1660e01b8152600401610d18919061234d565b5f60405180830381865afa158015610d32573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610d599190810190612445565b9150505f81511115610dc85784516020015160405163012c676d60e21b81526001600160a01b03909116906304b19db490610d9a908a9085906004016124fb565b5f604051808303815f87803b158015610db1575f80fd5b505af1158015610dc3573d5f803e3d5ffd5b505050505b505b600101610c5a565b505050505050505050565b5f805f83516020850186885af1949350505050565b6040513d81523d5f602083013e3d602001810160405290565b6040513d5f823e3d81fd5b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610a52578383151615610a46573d5f823e3d81fd5b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff861115610eab57600a860460018201600a88065f1493509350935050610eb5565b8593509150600190505b9250925092565b5f808383601b82900b821480611007577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e1000000000000000000870515610f3d577f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000870515610f2e576305f5e10087059650600886019550610f3d565b620186a0870596506005860195505b8687601b0b14610f5857600a87059650856001019550610f3d565b7b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc7b1999999999999999999999999999999999999999999999999999999888820111611001575f600188039050808160030b03610fff5760e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff7b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff60ff8b901d18161795505f9450610b309350505050565b505b5061101e565b865f0361101e57505f935060019250610b30915050565b858660030b146110d5575f82131561107d5761103a8383611502565b156110625760405163d556b11160e01b815260048101849052602481018390526044016101d1565b637ffffffe19909501600a0a82029550637fffffff946110d5565b637fffffff19869003604381131561109f57505f9450849350610b3092505050565b80600a0a88816110b1576110b161251b565b059750875f036110cb57505f9450849350610b3092505050565b50637fffffff1995505b8186136110e557600193506110fe565b818603600a0a83816110f9576110f961251b565b071593505b5050507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff841660e084901b1791509250929050565b60605f825167ffffffffffffffff81111561114c5761114c6118f9565b604051908082528060200260200182016040528015611175578160200160208202803683370190505b5090505f835167ffffffffffffffff811115611193576111936118f9565b6040519080825280602002602001820160405280156111bc578160200160208202803683370190505b5090505f808551116111ce575f6111d4565b84516002015b86516001010190505f8167ffffffffffffffff8111156111f6576111f66118f9565b60405190808252806020026020018201604052801561122957816020015b60608152602001906001900390816112145790505b5090505f61124d604080516002815233602082015230818301526060810190915290565b82828151811061125f5761125f611c8e565b60200260200101819052505f5b88518110156112bc57818060010192505088818151811061128f5761128f611c8e565b60200260200101518383815181106112a9576112a9611c8e565b602090810291909101015260010161126c565b508651156114f7578080600101915050848282815181106112df576112df611c8e565b602002602001018190525080806001019150508382828151811061130557611305611c8e565b60200260200101819052505f5b87518110156114f55761140888828151811061133057611330611c8e565b60200260200101515f01516113e58a848151811061135057611350611c8e565b6020026020010151602001516113c68c868151811061137157611371611c8e565b60200260200101518051604091820151805160209081029181019190912083517f6ec4dff745ec96dbde88c5d41f8aa5ac13aa1664afb47b8406b44fa945a650c8815291820192909252918201526060902090565b60405161190160f01b8152600281019290925260228201526042902090565b8a84815181106113f7576113f7611c8e565b60200260200101516060015161151d565b61142857604051630a57f30960e31b8152600481018290526024016101d1565b87818151811061143a5761143a611c8e565b60200260200101515f01516001600160a01b03165f1b86828151811061146257611462611c8e565b60200260200101818152505087818151811061148057611480611c8e565b60200260200101516020015185828151811061149e5761149e611c8e565b60200260200101818152505081806001019250508781815181106114c4576114c4611c8e565b6020026020010151604001518383815181106114e2576114e2611c8e565b6020908102919091010152600101611312565b505b509695505050505050565b5f6109b15f84126115135783611517565b835f035b8361158d565b5f836001600160a01b03163b5f0361157b575f8061153b858561162b565b5090925090505f8160038111156115545761155461252f565b1480156115725750856001600160a01b0316826001600160a01b0316145b925050506109b1565b611586848484611671565b90506109b1565b5f637ffffff582136115a057505f6100ed565b637ffffffe19820160438113156115bb5750508115156100ed565b5f81126115fb5780600a0a7b80000000000000000000000000000000000000000000000000000001816115f0576115f061251b565b0484119150506100ed565b805f03600a0a7b800000000000000000000000000000000000000000000000000000020284101591505092915050565b5f805f8351604103611662576020840151604085015160608601515f1a611654888285856116d6565b955095509550505050610eb5565b505081515f9150600290610eb5565b805160408051630b135d3f60e11b8082526004820186905260248201929092525f92906020820185604483015e5f82606483010152601f820160051c60051b915060205f60648401838a5afa9050825f5114601f3d1116811693505050509392505050565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084111561170f57505f91506003905082611794565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015611760573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b03811661178b57505f925060019150829050611794565b92505f91508190505b9450945094915050565b5f602082840312156117ae575f80fd5b81356001600160e01b0319811681146109b1575f80fd5b6001600160a01b038116811461015c575f80fd5b5f805f805f8060a087890312156117ee575f80fd5b86356117f9816117c5565b95506020870135611809816117c5565b94506040870135935060608701359250608087013567ffffffffffffffff80821115611833575f80fd5b818901915089601f830112611846575f80fd5b813581811115611854575f80fd5b8a6020828501011115611865575f80fd5b6020830194508093505050509295509295509295565b5f805f6060848603121561188d575f80fd5b8335611898816117c5565b9250602084013567ffffffffffffffff808211156118b4575f80fd5b9085019060c082880312156118c7575f80fd5b909250604085013590808211156118dc575f80fd5b508401604081870312156118ee575f80fd5b809150509250925092565b634e487b7160e01b5f52604160045260245ffd5b6040516080810167ffffffffffffffff81118282101715611930576119306118f9565b60405290565b6040805190810167ffffffffffffffff81118282101715611930576119306118f9565b6040516060810167ffffffffffffffff81118282101715611930576119306118f9565b604051601f8201601f1916810167ffffffffffffffff811182821017156119a5576119a56118f9565b604052919050565b5f67ffffffffffffffff8211156119c6576119c66118f9565b50601f01601f191660200190565b5f82601f8301126119e3575f80fd5b81356119f66119f1826119ad565b61197c565b818152846020838601011115611a0a575f80fd5b816020850160208301375f918101602001919091529392505050565b5f67ffffffffffffffff821115611a3f57611a3f6118f9565b5060051b60200190565b5f82601f830112611a58575f80fd5b81356020611a686119f183611a26565b82815260059290921b84018101918181019086841115611a86575f80fd5b8286015b848110156114f757803567ffffffffffffffff80821115611aa9575f80fd5b908801906080828b03601f19011215611ac0575f80fd5b611ac861190d565b86830135611ad5816117c5565b815260408381013588830152606084013583811115611af2575f80fd5b8401603f81018d13611b02575f80fd5b88810135611b126119f182611a26565b81815260059190911b82018301908a8101908f831115611b30575f80fd5b928401925b82841015611b4e5783358252928b0192908b0190611b35565b80858701525050505050608083013582811115611b69575f80fd5b611b778c89838701016119d4565b60608301525085525050918301918301611a8a565b5f60408236031215611b9c575f80fd5b611ba4611936565b823567ffffffffffffffff80821115611bbb575f80fd5b818501915060608236031215611bcf575f80fd5b611bd7611959565b8235611be2816117c5565b81526020830135611bf2816117c5565b6020820152604083013582811115611c08575f80fd5b611c14368286016119d4565b60408301525083526020850135915080821115611c2f575f80fd5b50611c3c36828601611a49565b60208301525092915050565b5f808335601e19843603018112611c5d575f80fd5b83018035915067ffffffffffffffff821115611c77575f80fd5b6020019150600581901b3603821315610b30575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235607e19833603018112611cb6575f80fd5b9190910192915050565b5f8235609e19833603018112611cb6575f80fd5b5f808335601e19843603018112611ce9575f80fd5b83018035915067ffffffffffffffff821115611d03575f80fd5b6020019150600681901b3603821315610b30575f80fd5b5f60208284031215611d2a575f80fd5b81356109b1816117c5565b5f808335601e19843603018112611d4a575f80fd5b830160208101925035905067ffffffffffffffff811115611d69575f80fd5b8060051b3603821315610b30575f80fd5b5f808335601e19843603018112611d8f575f80fd5b830160208101925035905067ffffffffffffffff811115611dae575f80fd5b803603821315610b30575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f8135611df0816117c5565b6001600160a01b039081168452602083013590611e0c826117c5565b166020840152611e1f6040830183611d7a565b60606040860152611e34606086018284611dbc565b95945050505050565b5f808335601e19843603018112611e52575f80fd5b830160208101925035905067ffffffffffffffff811115611e71575f80fd5b8060061b3603821315610b30575f80fd5b8183525f60208085019450825f5b85811015611ec8578135611ea3816117c5565b6001600160a01b03168752818301358388015260409687019690910190600101611e90565b509495945050505050565b5f8235607e19833603018112611ee7575f80fd5b90910192915050565b8183526020808401935f91600585811b8301820185855b88811015611fd457858303601f19018a52611f228289611ed3565b60808135611f2f816117c5565b6001600160a01b0316855281870135878601526040611f5081840184611d35565b8383890152808489015260a093507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811115611f8a575f80fd5b881b91508181888501375085016060611fa584820185611d7a565b9450838884030182890152611fbd8484018683611dbc565b9e8a019e9750505093870193505050600101611f07565b509098975050505050505050565b5f602080835260e08301843582850152818501356040850152606060408601356060860152606086013580151580821461201a575f80fd5b60809150806080880152506120326080880188611d35565b60c060a08901529384905261010093848801600582901b89018601835f5b8481101561216b578b830360ff1901845261206b8287611ed3565b8035609e1982360301811261207e575f80fd5b8885528101803561208e816117c5565b6001600160a01b0316858a0152808c013536829003605e190181126120b1575f80fd5b60a0808701526120c76101208701838301611de4565b90506120d66040830183611e3d565b607f19808985030160c08a01526120ee848385611e82565b93506120fc8e860186611e3d565b93509150808985030160e08a015250612116838383611e82565b92505050898201358c8701528c8301358d870152604083013560408701526121408b840184611d35565b935091508581038b870152612156818484611ef0565b968d019695505050918a019150600101612050565b505061217a60a08c018c611d7a565b8b8303601f190160c08d015298509650612195818989611dbc565b9b9a5050505050505050505050565b5f80604083850312156121b5575f80fd5b505080516020909101519092909150565b5f805f606084860312156121d8575f80fd5b83516121e3816117c5565b60208501519093506121f4816117c5565b604085015190925067ffffffffffffffff811115612210575f80fd5b8401601f81018613612220575f80fd5b805161222e6119f1826119ad565b818152876020838501011115612242575f80fd5b8160208401602083015e5f602083830101528093505050509250925092565b5f60208284031215612271575f80fd5b815160ff811681146109b1575f80fd5b5f60208284031215612291575f80fd5b5051919050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f815180845260208085019450602084015f5b83811015611ec8578151875295820195908201906001016122d9565b5f8282518085526020808601955060208260051b840101602086015f5b8481101561234057601f1986840301895261232e8383516122c6565b98840198925090830190600101612312565b5090979650505050505050565b602081526001600160a01b038251166020820152602082015160408201525f604083015160e06060840152612386610100840182612298565b9050606084015160808401526080840151601f19808584030160a08601526123ae83836122f5565b925060a08601519150808584030160c08601526123cb83836122c6565b925060c08601519150808584030160e086015250611e3482826122c6565b5f82601f8301126123f8575f80fd5b815160206124086119f183611a26565b8083825260208201915060208460051b870101935086841115612429575f80fd5b602086015b848110156114f7578051835291830191830161242e565b5f8060408385031215612456575f80fd5b825167ffffffffffffffff8082111561246d575f80fd5b818501915085601f830112612480575f80fd5b815160206124906119f183611a26565b82815260059290921b840181019181810190898411156124ae575f80fd5b948201945b838610156124cc578551825294820194908201906124b3565b918801519196509093505050808211156124e4575f80fd5b506124f1858286016123e9565b9150509250929050565b828152604060208201525f61251360408301846122c6565b949350505050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52602160045260245ffd"; /// @dev The runtime bytecode of the contract. bytes constant RUNTIME_CODE = - hex"608060405260043610610034575f3560e01c806301ffc9a71461003d578063691f9ed714610070578063ea37cc511461008f57005b3661003b57005b005b348015610048575f80fd5b5061005c61005736600461179e565b6100a2565b604051901515815260200160405180910390f35b34801561007b575f80fd5b5061003b61008a3660046117d9565b6100f3565b61003b61009d36600461187b565b610148565b5f6001600160e01b0319821663691f9ed760e01b14806100d257506001600160e01b0319821663ea37cc5160e01b145b806100ed57506301ffc9a760e01b6001600160e01b03198316145b92915050565b61010186868686868661040a565b6101408683838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061046f92505050565b505050505050565b610150610520565b61015f61015c82611b8c565b50565b61016c6080830183611c48565b90505f0361018d57604051639c95219f60e01b815260040160405180910390fd5b6001600160a01b03831673531167691b4f37f0266e226d03412c77fb2977ce146101da5760405163516e822d60e01b81526001600160a01b03841660048201526024015b60405180910390fd5b5f6101e86080840184611c48565b5f8181106101f8576101f8611c8e565b905060200281019061020a9190611ca2565b6102149080611cc0565b610222906040810190611cd4565b61022f6080860186611c48565b5f81811061023f5761023f611c8e565b90506020028101906102519190611ca2565b6020013581811061026457610264611c8e565b61027a9260206040909202019081019150611d1a565b90505f61028a6080850185611c48565b5f81811061029a5761029a611c8e565b90506020028101906102ac9190611ca2565b6102b69080611cc0565b6102c4906060810190611cd4565b6102d16080870187611c48565b5f8181106102e1576102e1611c8e565b90506020028101906102f39190611ca2565b6040013581811061030657610306611c8e565b61031c9260206040909202019081019150611d1a565b90506103336001600160a01b038316865f1961054e565b60405163b0460f0760e01b81526001600160a01b0386169063b0460f079061035f908790600401611fe2565b60408051808303815f875af115801561037a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061039e91906121a4565b506103b590506001600160a01b038316865f61054e565b6103da6103c184611b8c565b836103cb856105c8565b846103d5866105c8565b61064c565b505061040560017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054600214801561044f57503373531167691b4f37f0266e226d03412c77fb2977ce14155b156101405760405163f6688adf60e01b81523360048201526024016101d1565b5f805f8380602001905181019061048691906121c6565b919450925090506001600160a01b0383166104b4576040516398521dc560e01b815260040160405180910390fd5b6001600160a01b0382166104db5760405163456ac4c360e11b815260040160405180910390fd5b6104f06001600160a01b038616845f1961054e565b6105046001600160a01b03831682476108eb565b506105196001600160a01b038616845f61054e565b5050505050565b6105286109b8565b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b61055a8383835f6109fc565b6104055761056b83835f60016109fc565b61059357604051635274afe760e01b81526001600160a01b03841660048201526024016101d1565b6105a083838360016109fc565b61040557604051635274afe760e01b81526001600160a01b03841660048201526024016101d1565b5f6105d1610a5e565b6040516354636d2b60e01b81526001600160a01b038316600482015273200e12d10bb0c5e4a17e7018f0f1161919bb9389906354636d2b906024016020604051808303815f875af1158015610628573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100ed9190612261565b6040805160018082528183019092525f91816020015b6060815260200190600190039081610662575050604080516003808252608082019092529192505f919060208201606080368337019050506040516370a0823160e01b81523060048201529091505f906001600160a01b038816906370a0823190602401602060405180830381865afa1580156106e1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107059190612281565b90508015610721576107216001600160a01b0388163383610ae9565b5f61072c8288610af6565b50905080835f8151811061074257610742611c8e565b602090810291909101015250506040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015610793573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107b79190612281565b905080156107d3576107d36001600160a01b0386163383610ae9565b5f6107de8286610af6565b50905080836001815181106107f5576107f5611c8e565b6020908102919091010152504790508015610814576108143382610b37565b5f610820826012610af6565b509050808360028151811061083757610837611c8e565b602002602001018181525050505080825f8151811061085857610858611c8e565b60209081029190910101526040805160018082528183019092525f91816020015b6040805160a0810182525f918101828152606080830193909352608082018390528152602081019190915281526020019060019003908161087957905050905087815f815181106108cc576108cc611c8e565b60200260200101819052506108e18382610b95565b5050505050505050565b6060814710156109175760405163cf47918160e01b8152476004820152602481018390526044016101d1565b5f610923858486610ddd565b905080801561094457505f3d118061094457505f856001600160a01b03163b115b1561095957610951610df2565b9150506109b1565b801561098357604051639996b31560e01b81526001600160a01b03861660048201526024016101d1565b3d1561099657610991610e0b565b6109af565b60405163d6bda27560e01b815260040160405180910390fd5b505b9392505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00546002036109fa57604051633ee5aeb560e01b815260040160405180910390fd5b565b60405163095ea7b360e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610a52578383151615610a46573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b73200e12d10bb0c5e4a17e7018f0f1161919bb93893b1580610ab5575073200e12d10bb0c5e4a17e7018f0f1161919bb93893f7f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d4114155b156109fa576040516373e6d7b360e01b815273200e12d10bb0c5e4a17e7018f0f1161919bb938960048201526024016101d1565b6105a08383836001610e16565b5f805f805f610b058787610e60565b9250925092505f80610b178585610ebc565b9150915081838015610b265750815b9650965050505050505b9250929050565b80471015610b615760405163cf47918160e01b8152476004820152602481018290526044016101d1565b610b7a828260405180602001604052805f815250610ddd565b15610b83575050565b3d1561099657610b91610e0b565b5050565b60408051600480825260a082019092525f91816020015b6060815260200190600190039081610bac5790505090505f5b8351811015610c0d57838181518110610be057610be0611c8e565b6020026020010151828281518110610bfa57610bfa611c8e565b6020908102919091010152600101610bc5565b50335f8181523060209081526040808320815160a0810183528083018581526060808301879052608083018190529082528185015282518581529384018581528484019093529093909291905b8751811015610dd257878181518110610c7557610c75611c8e565b602002602001015193505f845f015160400151511115610dca575f845f01515f01516001600160a01b031663d04dfe236040518060e00160405280885f0151602001516001600160a01b03168152602001898152602001885f01516040015181526020015f8152602001610ced8c8a6020015161112f565b8152602001878152602001868152506040518263ffffffff1660e01b8152600401610d18919061234d565b5f60405180830381865afa158015610d32573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610d599190810190612445565b9150505f81511115610dc85784516020015160405163012c676d60e21b81526001600160a01b03909116906304b19db490610d9a908a9085906004016124fb565b5f604051808303815f87803b158015610db1575f80fd5b505af1158015610dc3573d5f803e3d5ffd5b505050505b505b600101610c5a565b505050505050505050565b5f805f83516020850186885af1949350505050565b6040513d81523d5f602083013e3d602001810160405290565b6040513d5f823e3d81fd5b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610a52578383151615610a46573d5f823e3d81fd5b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff861115610eab57600a860460018201600a88065f1493509350935050610eb5565b8593509150600190505b9250925092565b5f808383601b82900b821480611007577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e1000000000000000000870515610f3d577f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000870515610f2e576305f5e10087059650600886019550610f3d565b620186a0870596506005860195505b8687601b0b14610f5857600a87059650856001019550610f3d565b7b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc7b1999999999999999999999999999999999999999999999999999999888820111611001575f600188039050808160030b03610fff5760e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff7b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff60ff8b901d18161795505f9450610b309350505050565b505b5061101e565b865f0361101e57505f935060019250610b30915050565b858660030b146110d5575f82131561107d5761103a8383611502565b156110625760405163d556b11160e01b815260048101849052602481018390526044016101d1565b637ffffffe19909501600a0a82029550637fffffff946110d5565b637fffffff19869003604381131561109f57505f9450849350610b3092505050565b80600a0a88816110b1576110b161251b565b059750875f036110cb57505f9450849350610b3092505050565b50637fffffff1995505b8186136110e557600193506110fe565b818603600a0a83816110f9576110f961251b565b071593505b5050507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff841660e084901b1791509250929050565b60605f825167ffffffffffffffff81111561114c5761114c6118f9565b604051908082528060200260200182016040528015611175578160200160208202803683370190505b5090505f835167ffffffffffffffff811115611193576111936118f9565b6040519080825280602002602001820160405280156111bc578160200160208202803683370190505b5090505f808551116111ce575f6111d4565b84516002015b86516001010190505f8167ffffffffffffffff8111156111f6576111f66118f9565b60405190808252806020026020018201604052801561122957816020015b60608152602001906001900390816112145790505b5090505f61124d604080516002815233602082015230818301526060810190915290565b82828151811061125f5761125f611c8e565b60200260200101819052505f5b88518110156112bc57818060010192505088818151811061128f5761128f611c8e565b60200260200101518383815181106112a9576112a9611c8e565b602090810291909101015260010161126c565b508651156114f7578080600101915050848282815181106112df576112df611c8e565b602002602001018190525080806001019150508382828151811061130557611305611c8e565b60200260200101819052505f5b87518110156114f55761140888828151811061133057611330611c8e565b60200260200101515f01516113e58a848151811061135057611350611c8e565b6020026020010151602001516113c68c868151811061137157611371611c8e565b60200260200101518051604091820151805160209081029181019190912083517f6ec4dff745ec96dbde88c5d41f8aa5ac13aa1664afb47b8406b44fa945a650c8815291820192909252918201526060902090565b60405161190160f01b8152600281019290925260228201526042902090565b8a84815181106113f7576113f7611c8e565b60200260200101516060015161151d565b61142857604051630a57f30960e31b8152600481018290526024016101d1565b87818151811061143a5761143a611c8e565b60200260200101515f01516001600160a01b03165f1b86828151811061146257611462611c8e565b60200260200101818152505087818151811061148057611480611c8e565b60200260200101516020015185828151811061149e5761149e611c8e565b60200260200101818152505081806001019250508781815181106114c4576114c4611c8e565b6020026020010151604001518383815181106114e2576114e2611c8e565b6020908102919091010152600101611312565b505b509695505050505050565b5f6109b15f84126115135783611517565b835f035b8361158d565b5f836001600160a01b03163b5f0361157b575f8061153b858561162b565b5090925090505f8160038111156115545761155461252f565b1480156115725750856001600160a01b0316826001600160a01b0316145b925050506109b1565b611586848484611671565b90506109b1565b5f637ffffff582136115a057505f6100ed565b637ffffffe19820160438113156115bb5750508115156100ed565b5f81126115fb5780600a0a7b80000000000000000000000000000000000000000000000000000001816115f0576115f061251b565b0484119150506100ed565b805f03600a0a7b800000000000000000000000000000000000000000000000000000020284101591505092915050565b5f805f8351604103611662576020840151604085015160608601515f1a611654888285856116d6565b955095509550505050610eb5565b505081515f9150600290610eb5565b805160408051630b135d3f60e11b8082526004820186905260248201929092525f92906020820185604483015e5f82606483010152601f820160051c60051b915060205f60648401838a5afa9050825f5114601f3d1116811693505050509392505050565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084111561170f57505f91506003905082611794565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015611760573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b03811661178b57505f925060019150829050611794565b92505f91508190505b9450945094915050565b5f602082840312156117ae575f80fd5b81356001600160e01b0319811681146109b1575f80fd5b6001600160a01b038116811461015c575f80fd5b5f805f805f8060a087890312156117ee575f80fd5b86356117f9816117c5565b95506020870135611809816117c5565b94506040870135935060608701359250608087013567ffffffffffffffff80821115611833575f80fd5b818901915089601f830112611846575f80fd5b813581811115611854575f80fd5b8a6020828501011115611865575f80fd5b6020830194508093505050509295509295509295565b5f805f6060848603121561188d575f80fd5b8335611898816117c5565b9250602084013567ffffffffffffffff808211156118b4575f80fd5b9085019060c082880312156118c7575f80fd5b909250604085013590808211156118dc575f80fd5b508401604081870312156118ee575f80fd5b809150509250925092565b634e487b7160e01b5f52604160045260245ffd5b6040516080810167ffffffffffffffff81118282101715611930576119306118f9565b60405290565b6040805190810167ffffffffffffffff81118282101715611930576119306118f9565b6040516060810167ffffffffffffffff81118282101715611930576119306118f9565b604051601f8201601f1916810167ffffffffffffffff811182821017156119a5576119a56118f9565b604052919050565b5f67ffffffffffffffff8211156119c6576119c66118f9565b50601f01601f191660200190565b5f82601f8301126119e3575f80fd5b81356119f66119f1826119ad565b61197c565b818152846020838601011115611a0a575f80fd5b816020850160208301375f918101602001919091529392505050565b5f67ffffffffffffffff821115611a3f57611a3f6118f9565b5060051b60200190565b5f82601f830112611a58575f80fd5b81356020611a686119f183611a26565b82815260059290921b84018101918181019086841115611a86575f80fd5b8286015b848110156114f757803567ffffffffffffffff80821115611aa9575f80fd5b908801906080828b03601f19011215611ac0575f80fd5b611ac861190d565b86830135611ad5816117c5565b815260408381013588830152606084013583811115611af2575f80fd5b8401603f81018d13611b02575f80fd5b88810135611b126119f182611a26565b81815260059190911b82018301908a8101908f831115611b30575f80fd5b928401925b82841015611b4e5783358252928b0192908b0190611b35565b80858701525050505050608083013582811115611b69575f80fd5b611b778c89838701016119d4565b60608301525085525050918301918301611a8a565b5f60408236031215611b9c575f80fd5b611ba4611936565b823567ffffffffffffffff80821115611bbb575f80fd5b818501915060608236031215611bcf575f80fd5b611bd7611959565b8235611be2816117c5565b81526020830135611bf2816117c5565b6020820152604083013582811115611c08575f80fd5b611c14368286016119d4565b60408301525083526020850135915080821115611c2f575f80fd5b50611c3c36828601611a49565b60208301525092915050565b5f808335601e19843603018112611c5d575f80fd5b83018035915067ffffffffffffffff821115611c77575f80fd5b6020019150600581901b3603821315610b30575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235607e19833603018112611cb6575f80fd5b9190910192915050565b5f8235609e19833603018112611cb6575f80fd5b5f808335601e19843603018112611ce9575f80fd5b83018035915067ffffffffffffffff821115611d03575f80fd5b6020019150600681901b3603821315610b30575f80fd5b5f60208284031215611d2a575f80fd5b81356109b1816117c5565b5f808335601e19843603018112611d4a575f80fd5b830160208101925035905067ffffffffffffffff811115611d69575f80fd5b8060051b3603821315610b30575f80fd5b5f808335601e19843603018112611d8f575f80fd5b830160208101925035905067ffffffffffffffff811115611dae575f80fd5b803603821315610b30575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f8135611df0816117c5565b6001600160a01b039081168452602083013590611e0c826117c5565b166020840152611e1f6040830183611d7a565b60606040860152611e34606086018284611dbc565b95945050505050565b5f808335601e19843603018112611e52575f80fd5b830160208101925035905067ffffffffffffffff811115611e71575f80fd5b8060061b3603821315610b30575f80fd5b8183525f60208085019450825f5b85811015611ec8578135611ea3816117c5565b6001600160a01b03168752818301358388015260409687019690910190600101611e90565b509495945050505050565b5f8235607e19833603018112611ee7575f80fd5b90910192915050565b8183526020808401935f91600585811b8301820185855b88811015611fd457858303601f19018a52611f228289611ed3565b60808135611f2f816117c5565b6001600160a01b0316855281870135878601526040611f5081840184611d35565b8383890152808489015260a093507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811115611f8a575f80fd5b881b91508181888501375085016060611fa584820185611d7a565b9450838884030182890152611fbd8484018683611dbc565b9e8a019e9750505093870193505050600101611f07565b509098975050505050505050565b5f602080835260e08301843582850152818501356040850152606060408601356060860152606086013580151580821461201a575f80fd5b60809150806080880152506120326080880188611d35565b60c060a08901529384905261010093848801600582901b89018601835f5b8481101561216b578b830360ff1901845261206b8287611ed3565b8035609e1982360301811261207e575f80fd5b8885528101803561208e816117c5565b6001600160a01b0316858a0152808c013536829003605e190181126120b1575f80fd5b60a0808701526120c76101208701838301611de4565b90506120d66040830183611e3d565b607f19808985030160c08a01526120ee848385611e82565b93506120fc8e860186611e3d565b93509150808985030160e08a015250612116838383611e82565b92505050898201358c8701528c8301358d870152604083013560408701526121408b840184611d35565b935091508581038b870152612156818484611ef0565b968d019695505050918a019150600101612050565b505061217a60a08c018c611d7a565b8b8303601f190160c08d015298509650612195818989611dbc565b9b9a5050505050505050505050565b5f80604083850312156121b5575f80fd5b505080516020909101519092909150565b5f805f606084860312156121d8575f80fd5b83516121e3816117c5565b60208501519093506121f4816117c5565b604085015190925067ffffffffffffffff811115612210575f80fd5b8401601f81018613612220575f80fd5b805161222e6119f1826119ad565b818152876020838501011115612242575f80fd5b8160208401602083015e5f602083830101528093505050509250925092565b5f60208284031215612271575f80fd5b815160ff811681146109b1575f80fd5b5f60208284031215612291575f80fd5b5051919050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f815180845260208085019450602084015f5b83811015611ec8578151875295820195908201906001016122d9565b5f8282518085526020808601955060208260051b840101602086015f5b8481101561234057601f1986840301895261232e8383516122c6565b98840198925090830190600101612312565b5090979650505050505050565b602081526001600160a01b038251166020820152602082015160408201525f604083015160e06060840152612386610100840182612298565b9050606084015160808401526080840151601f19808584030160a08601526123ae83836122f5565b925060a08601519150808584030160c08601526123cb83836122c6565b925060c08601519150808584030160e086015250611e3482826122c6565b5f82601f8301126123f8575f80fd5b815160206124086119f183611a26565b8083825260208201915060208460051b870101935086841115612429575f80fd5b602086015b848110156114f7578051835291830191830161242e565b5f8060408385031215612456575f80fd5b825167ffffffffffffffff8082111561246d575f80fd5b818501915085601f830112612480575f80fd5b815160206124906119f183611a26565b82815260059290921b840181019181810190898411156124ae575f80fd5b948201945b838610156124cc578551825294820194908201906124b3565b918801519196509093505050808211156124e4575f80fd5b506124f1858286016123e9565b9150509250929050565b828152604060208201525f61251360408301846122c6565b949350505050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52602160045260245ffd"; + hex"608060405260043610610034575f3560e01c806301ffc9a71461003d578063691f9ed714610070578063ea37cc511461008f57005b3661003b57005b005b348015610048575f80fd5b5061005c61005736600461179e565b6100a2565b604051901515815260200160405180910390f35b34801561007b575f80fd5b5061003b61008a3660046117d9565b6100f3565b61003b61009d36600461187b565b610148565b5f6001600160e01b0319821663691f9ed760e01b14806100d257506001600160e01b0319821663ea37cc5160e01b145b806100ed57506301ffc9a760e01b6001600160e01b03198316145b92915050565b61010186868686868661040a565b6101408683838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061046f92505050565b505050505050565b610150610520565b61015f61015c82611b8c565b50565b61016c6080830183611c48565b90505f0361018d57604051639c95219f60e01b815260040160405180910390fd5b6001600160a01b03831673d2cd1d4ad3bf3ecb581e4653c9c02a67ca44305c146101da5760405163516e822d60e01b81526001600160a01b03841660048201526024015b60405180910390fd5b5f6101e86080840184611c48565b5f8181106101f8576101f8611c8e565b905060200281019061020a9190611ca2565b6102149080611cc0565b610222906040810190611cd4565b61022f6080860186611c48565b5f81811061023f5761023f611c8e565b90506020028101906102519190611ca2565b6020013581811061026457610264611c8e565b61027a9260206040909202019081019150611d1a565b90505f61028a6080850185611c48565b5f81811061029a5761029a611c8e565b90506020028101906102ac9190611ca2565b6102b69080611cc0565b6102c4906060810190611cd4565b6102d16080870187611c48565b5f8181106102e1576102e1611c8e565b90506020028101906102f39190611ca2565b6040013581811061030657610306611c8e565b61031c9260206040909202019081019150611d1a565b90506103336001600160a01b038316865f1961054e565b60405163b0460f0760e01b81526001600160a01b0386169063b0460f079061035f908790600401611fe2565b60408051808303815f875af115801561037a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061039e91906121a4565b506103b590506001600160a01b038316865f61054e565b6103da6103c184611b8c565b836103cb856105c8565b846103d5866105c8565b61064c565b505061040560017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054600214801561044f57503373d2cd1d4ad3bf3ecb581e4653c9c02a67ca44305c14155b156101405760405163f6688adf60e01b81523360048201526024016101d1565b5f805f8380602001905181019061048691906121c6565b919450925090506001600160a01b0383166104b4576040516398521dc560e01b815260040160405180910390fd5b6001600160a01b0382166104db5760405163456ac4c360e11b815260040160405180910390fd5b6104f06001600160a01b038616845f1961054e565b6105046001600160a01b03831682476108eb565b506105196001600160a01b038616845f61054e565b5050505050565b6105286109b8565b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b61055a8383835f6109fc565b6104055761056b83835f60016109fc565b61059357604051635274afe760e01b81526001600160a01b03841660048201526024016101d1565b6105a083838360016109fc565b61040557604051635274afe760e01b81526001600160a01b03841660048201526024016101d1565b5f6105d1610a5e565b6040516354636d2b60e01b81526001600160a01b038316600482015273200e12d10bb0c5e4a17e7018f0f1161919bb9389906354636d2b906024016020604051808303815f875af1158015610628573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100ed9190612261565b6040805160018082528183019092525f91816020015b6060815260200190600190039081610662575050604080516003808252608082019092529192505f919060208201606080368337019050506040516370a0823160e01b81523060048201529091505f906001600160a01b038816906370a0823190602401602060405180830381865afa1580156106e1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107059190612281565b90508015610721576107216001600160a01b0388163383610ae9565b5f61072c8288610af6565b50905080835f8151811061074257610742611c8e565b602090810291909101015250506040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015610793573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107b79190612281565b905080156107d3576107d36001600160a01b0386163383610ae9565b5f6107de8286610af6565b50905080836001815181106107f5576107f5611c8e565b6020908102919091010152504790508015610814576108143382610b37565b5f610820826012610af6565b509050808360028151811061083757610837611c8e565b602002602001018181525050505080825f8151811061085857610858611c8e565b60209081029190910101526040805160018082528183019092525f91816020015b6040805160a0810182525f918101828152606080830193909352608082018390528152602081019190915281526020019060019003908161087957905050905087815f815181106108cc576108cc611c8e565b60200260200101819052506108e18382610b95565b5050505050505050565b6060814710156109175760405163cf47918160e01b8152476004820152602481018390526044016101d1565b5f610923858486610ddd565b905080801561094457505f3d118061094457505f856001600160a01b03163b115b1561095957610951610df2565b9150506109b1565b801561098357604051639996b31560e01b81526001600160a01b03861660048201526024016101d1565b3d1561099657610991610e0b565b6109af565b60405163d6bda27560e01b815260040160405180910390fd5b505b9392505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00546002036109fa57604051633ee5aeb560e01b815260040160405180910390fd5b565b60405163095ea7b360e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610a52578383151615610a46573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b73200e12d10bb0c5e4a17e7018f0f1161919bb93893b1580610ab5575073200e12d10bb0c5e4a17e7018f0f1161919bb93893f7f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d4114155b156109fa576040516373e6d7b360e01b815273200e12d10bb0c5e4a17e7018f0f1161919bb938960048201526024016101d1565b6105a08383836001610e16565b5f805f805f610b058787610e60565b9250925092505f80610b178585610ebc565b9150915081838015610b265750815b9650965050505050505b9250929050565b80471015610b615760405163cf47918160e01b8152476004820152602481018290526044016101d1565b610b7a828260405180602001604052805f815250610ddd565b15610b83575050565b3d1561099657610b91610e0b565b5050565b60408051600680825260e082019092525f91816020015b6060815260200190600190039081610bac5790505090505f5b8351811015610c0d57838181518110610be057610be0611c8e565b6020026020010151828281518110610bfa57610bfa611c8e565b6020908102919091010152600101610bc5565b50335f8181523060209081526040808320815160a0810183528083018581526060808301879052608083018190529082528185015282518581529384018581528484019093529093909291905b8751811015610dd257878181518110610c7557610c75611c8e565b602002602001015193505f845f015160400151511115610dca575f845f01515f01516001600160a01b031663d04dfe236040518060e00160405280885f0151602001516001600160a01b03168152602001898152602001885f01516040015181526020015f8152602001610ced8c8a6020015161112f565b8152602001878152602001868152506040518263ffffffff1660e01b8152600401610d18919061234d565b5f60405180830381865afa158015610d32573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610d599190810190612445565b9150505f81511115610dc85784516020015160405163012c676d60e21b81526001600160a01b03909116906304b19db490610d9a908a9085906004016124fb565b5f604051808303815f87803b158015610db1575f80fd5b505af1158015610dc3573d5f803e3d5ffd5b505050505b505b600101610c5a565b505050505050505050565b5f805f83516020850186885af1949350505050565b6040513d81523d5f602083013e3d602001810160405290565b6040513d5f823e3d81fd5b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610a52578383151615610a46573d5f823e3d81fd5b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff861115610eab57600a860460018201600a88065f1493509350935050610eb5565b8593509150600190505b9250925092565b5f808383601b82900b821480611007577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e1000000000000000000870515610f3d577f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000870515610f2e576305f5e10087059650600886019550610f3d565b620186a0870596506005860195505b8687601b0b14610f5857600a87059650856001019550610f3d565b7b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc7b1999999999999999999999999999999999999999999999999999999888820111611001575f600188039050808160030b03610fff5760e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff7b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff60ff8b901d18161795505f9450610b309350505050565b505b5061101e565b865f0361101e57505f935060019250610b30915050565b858660030b146110d5575f82131561107d5761103a8383611502565b156110625760405163d556b11160e01b815260048101849052602481018390526044016101d1565b637ffffffe19909501600a0a82029550637fffffff946110d5565b637fffffff19869003604381131561109f57505f9450849350610b3092505050565b80600a0a88816110b1576110b161251b565b059750875f036110cb57505f9450849350610b3092505050565b50637fffffff1995505b8186136110e557600193506110fe565b818603600a0a83816110f9576110f961251b565b071593505b5050507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff841660e084901b1791509250929050565b60605f825167ffffffffffffffff81111561114c5761114c6118f9565b604051908082528060200260200182016040528015611175578160200160208202803683370190505b5090505f835167ffffffffffffffff811115611193576111936118f9565b6040519080825280602002602001820160405280156111bc578160200160208202803683370190505b5090505f808551116111ce575f6111d4565b84516002015b86516001010190505f8167ffffffffffffffff8111156111f6576111f66118f9565b60405190808252806020026020018201604052801561122957816020015b60608152602001906001900390816112145790505b5090505f61124d604080516002815233602082015230818301526060810190915290565b82828151811061125f5761125f611c8e565b60200260200101819052505f5b88518110156112bc57818060010192505088818151811061128f5761128f611c8e565b60200260200101518383815181106112a9576112a9611c8e565b602090810291909101015260010161126c565b508651156114f7578080600101915050848282815181106112df576112df611c8e565b602002602001018190525080806001019150508382828151811061130557611305611c8e565b60200260200101819052505f5b87518110156114f55761140888828151811061133057611330611c8e565b60200260200101515f01516113e58a848151811061135057611350611c8e565b6020026020010151602001516113c68c868151811061137157611371611c8e565b60200260200101518051604091820151805160209081029181019190912083517f6ec4dff745ec96dbde88c5d41f8aa5ac13aa1664afb47b8406b44fa945a650c8815291820192909252918201526060902090565b60405161190160f01b8152600281019290925260228201526042902090565b8a84815181106113f7576113f7611c8e565b60200260200101516060015161151d565b61142857604051630a57f30960e31b8152600481018290526024016101d1565b87818151811061143a5761143a611c8e565b60200260200101515f01516001600160a01b03165f1b86828151811061146257611462611c8e565b60200260200101818152505087818151811061148057611480611c8e565b60200260200101516020015185828151811061149e5761149e611c8e565b60200260200101818152505081806001019250508781815181106114c4576114c4611c8e565b6020026020010151604001518383815181106114e2576114e2611c8e565b6020908102919091010152600101611312565b505b509695505050505050565b5f6109b15f84126115135783611517565b835f035b8361158d565b5f836001600160a01b03163b5f0361157b575f8061153b858561162b565b5090925090505f8160038111156115545761155461252f565b1480156115725750856001600160a01b0316826001600160a01b0316145b925050506109b1565b611586848484611671565b90506109b1565b5f637ffffff582136115a057505f6100ed565b637ffffffe19820160438113156115bb5750508115156100ed565b5f81126115fb5780600a0a7b80000000000000000000000000000000000000000000000000000001816115f0576115f061251b565b0484119150506100ed565b805f03600a0a7b800000000000000000000000000000000000000000000000000000020284101591505092915050565b5f805f8351604103611662576020840151604085015160608601515f1a611654888285856116d6565b955095509550505050610eb5565b505081515f9150600290610eb5565b805160408051630b135d3f60e11b8082526004820186905260248201929092525f92906020820185604483015e5f82606483010152601f820160051c60051b915060205f60648401838a5afa9050825f5114601f3d1116811693505050509392505050565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084111561170f57505f91506003905082611794565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015611760573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b03811661178b57505f925060019150829050611794565b92505f91508190505b9450945094915050565b5f602082840312156117ae575f80fd5b81356001600160e01b0319811681146109b1575f80fd5b6001600160a01b038116811461015c575f80fd5b5f805f805f8060a087890312156117ee575f80fd5b86356117f9816117c5565b95506020870135611809816117c5565b94506040870135935060608701359250608087013567ffffffffffffffff80821115611833575f80fd5b818901915089601f830112611846575f80fd5b813581811115611854575f80fd5b8a6020828501011115611865575f80fd5b6020830194508093505050509295509295509295565b5f805f6060848603121561188d575f80fd5b8335611898816117c5565b9250602084013567ffffffffffffffff808211156118b4575f80fd5b9085019060c082880312156118c7575f80fd5b909250604085013590808211156118dc575f80fd5b508401604081870312156118ee575f80fd5b809150509250925092565b634e487b7160e01b5f52604160045260245ffd5b6040516080810167ffffffffffffffff81118282101715611930576119306118f9565b60405290565b6040805190810167ffffffffffffffff81118282101715611930576119306118f9565b6040516060810167ffffffffffffffff81118282101715611930576119306118f9565b604051601f8201601f1916810167ffffffffffffffff811182821017156119a5576119a56118f9565b604052919050565b5f67ffffffffffffffff8211156119c6576119c66118f9565b50601f01601f191660200190565b5f82601f8301126119e3575f80fd5b81356119f66119f1826119ad565b61197c565b818152846020838601011115611a0a575f80fd5b816020850160208301375f918101602001919091529392505050565b5f67ffffffffffffffff821115611a3f57611a3f6118f9565b5060051b60200190565b5f82601f830112611a58575f80fd5b81356020611a686119f183611a26565b82815260059290921b84018101918181019086841115611a86575f80fd5b8286015b848110156114f757803567ffffffffffffffff80821115611aa9575f80fd5b908801906080828b03601f19011215611ac0575f80fd5b611ac861190d565b86830135611ad5816117c5565b815260408381013588830152606084013583811115611af2575f80fd5b8401603f81018d13611b02575f80fd5b88810135611b126119f182611a26565b81815260059190911b82018301908a8101908f831115611b30575f80fd5b928401925b82841015611b4e5783358252928b0192908b0190611b35565b80858701525050505050608083013582811115611b69575f80fd5b611b778c89838701016119d4565b60608301525085525050918301918301611a8a565b5f60408236031215611b9c575f80fd5b611ba4611936565b823567ffffffffffffffff80821115611bbb575f80fd5b818501915060608236031215611bcf575f80fd5b611bd7611959565b8235611be2816117c5565b81526020830135611bf2816117c5565b6020820152604083013582811115611c08575f80fd5b611c14368286016119d4565b60408301525083526020850135915080821115611c2f575f80fd5b50611c3c36828601611a49565b60208301525092915050565b5f808335601e19843603018112611c5d575f80fd5b83018035915067ffffffffffffffff821115611c77575f80fd5b6020019150600581901b3603821315610b30575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235607e19833603018112611cb6575f80fd5b9190910192915050565b5f8235609e19833603018112611cb6575f80fd5b5f808335601e19843603018112611ce9575f80fd5b83018035915067ffffffffffffffff821115611d03575f80fd5b6020019150600681901b3603821315610b30575f80fd5b5f60208284031215611d2a575f80fd5b81356109b1816117c5565b5f808335601e19843603018112611d4a575f80fd5b830160208101925035905067ffffffffffffffff811115611d69575f80fd5b8060051b3603821315610b30575f80fd5b5f808335601e19843603018112611d8f575f80fd5b830160208101925035905067ffffffffffffffff811115611dae575f80fd5b803603821315610b30575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f8135611df0816117c5565b6001600160a01b039081168452602083013590611e0c826117c5565b166020840152611e1f6040830183611d7a565b60606040860152611e34606086018284611dbc565b95945050505050565b5f808335601e19843603018112611e52575f80fd5b830160208101925035905067ffffffffffffffff811115611e71575f80fd5b8060061b3603821315610b30575f80fd5b8183525f60208085019450825f5b85811015611ec8578135611ea3816117c5565b6001600160a01b03168752818301358388015260409687019690910190600101611e90565b509495945050505050565b5f8235607e19833603018112611ee7575f80fd5b90910192915050565b8183526020808401935f91600585811b8301820185855b88811015611fd457858303601f19018a52611f228289611ed3565b60808135611f2f816117c5565b6001600160a01b0316855281870135878601526040611f5081840184611d35565b8383890152808489015260a093507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811115611f8a575f80fd5b881b91508181888501375085016060611fa584820185611d7a565b9450838884030182890152611fbd8484018683611dbc565b9e8a019e9750505093870193505050600101611f07565b509098975050505050505050565b5f602080835260e08301843582850152818501356040850152606060408601356060860152606086013580151580821461201a575f80fd5b60809150806080880152506120326080880188611d35565b60c060a08901529384905261010093848801600582901b89018601835f5b8481101561216b578b830360ff1901845261206b8287611ed3565b8035609e1982360301811261207e575f80fd5b8885528101803561208e816117c5565b6001600160a01b0316858a0152808c013536829003605e190181126120b1575f80fd5b60a0808701526120c76101208701838301611de4565b90506120d66040830183611e3d565b607f19808985030160c08a01526120ee848385611e82565b93506120fc8e860186611e3d565b93509150808985030160e08a015250612116838383611e82565b92505050898201358c8701528c8301358d870152604083013560408701526121408b840184611d35565b935091508581038b870152612156818484611ef0565b968d019695505050918a019150600101612050565b505061217a60a08c018c611d7a565b8b8303601f190160c08d015298509650612195818989611dbc565b9b9a5050505050505050505050565b5f80604083850312156121b5575f80fd5b505080516020909101519092909150565b5f805f606084860312156121d8575f80fd5b83516121e3816117c5565b60208501519093506121f4816117c5565b604085015190925067ffffffffffffffff811115612210575f80fd5b8401601f81018613612220575f80fd5b805161222e6119f1826119ad565b818152876020838501011115612242575f80fd5b8160208401602083015e5f602083830101528093505050509250925092565b5f60208284031215612271575f80fd5b815160ff811681146109b1575f80fd5b5f60208284031215612291575f80fd5b5051919050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f815180845260208085019450602084015f5b83811015611ec8578151875295820195908201906001016122d9565b5f8282518085526020808601955060208260051b840101602086015f5b8481101561234057601f1986840301895261232e8383516122c6565b98840198925090830190600101612312565b5090979650505050505050565b602081526001600160a01b038251166020820152602082015160408201525f604083015160e06060840152612386610100840182612298565b9050606084015160808401526080840151601f19808584030160a08601526123ae83836122f5565b925060a08601519150808584030160c08601526123cb83836122c6565b925060c08601519150808584030160e086015250611e3482826122c6565b5f82601f8301126123f8575f80fd5b815160206124086119f183611a26565b8083825260208201915060208460051b870101935086841115612429575f80fd5b602086015b848110156114f7578051835291830191830161242e565b5f8060408385031215612456575f80fd5b825167ffffffffffffffff8082111561246d575f80fd5b818501915085601f830112612480575f80fd5b815160206124906119f183611a26565b82815260059290921b840181019181810190898411156124ae575f80fd5b948201945b838610156124cc578551825294820194908201906124b3565b918801519196509093505050808211156124e4575f80fd5b506124f1858286016123e9565b9150509250929050565b828152604060208201525f61251360408301846122c6565b949350505050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52602160045260245ffd"; /// @dev What MUST already be on a network before this release can be /// broadcast there: an address, and the runtime code that belongs at it. /// `abi.encode`d as a `DeployDependency[]` because Solidity has no /// file-scope constant of dynamic array type. bytes constant DEPENDENCIES = - hex"0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000005940000000000000000000000000531167691b4f37f0266e226d03412c77fb2977ce0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000588e6080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a71461180e575080632cb77e9f146117e257806341d1514f146117ab5780635343c1b7146117105780635cffe9de146115b45780635d003c4414611430578063613255ab146113ad578063687cf02a14611096578063ac9650d814610f48578063b0460f07146105f3578063b845b83e1461059b578063ca9109ba1461044c578063d9d98ce41461039b578063ddebc96f146103475763df6db3c2146100c1575f80fd5b34610321576003196040368201126103215767ffffffffffffffff9060043582811161032157806004019160a0823603918201126103215760243584811161032157610111903690600401611cd0565b909361011b612bf0565b5f946001600160a01b039485610130846125d7565b163303610325576101496101443685611b02565b612c32565b805f525f60205260405f20966001885414610190575b60208960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556040519015158152f35b9091929394959697505f600198556040519633885282602089015260606040890152816101bc8761188d565b166060890152602484013590606219018112156103215783019060a06080890152806101ea6004840161188d565b166101008901526101fd6024830161188d565b16610120880152604481013560221982360301811215610321570190602460048301359201988211610321578136038913610321577f09d18501db0080ca2d6cd7c17fa7255daff4b2d503ea93b76ff68b6752ea8e6387806103069560846102c561030e9a60209f610284906103149f9a60606101406102ef9d0152610160880191612388565b6102b66102ab61029760448801856129db565b605f198a8603810160a08c01529491612a10565b9260648701906129db565b918784030160c0880152612a10565b91013560e08301520390a13390919060405192600284526020840152604083015260608201604052565b906040519160018352602083015260408201604052565b9236916123a8565b90613c65565b5f8080808080808061015f565b5f80fd5b602486610331856125d7565b6040516335252be360e01b815291166004820152fd5b3461032157600319602036820112610321576004359067ffffffffffffffff82116103215760809082360301126103215761038660609160040161262b565b90604051921515835260208301526040820152f35b34610321576040366003190112610321576001600160a01b036103bc611861565b166040516370a0823160e01b8152306004820152602081602481855afa908115610441575f9161040f575b50156103f75760206040515f8152f35b60249060405190633c5bf76960e21b82526004820152fd5b90506020813d602011610439575b8161042a60209383611971565b810103126103215751826103e7565b3d915061041d565b6040513d5f823e3d90fd5b346103215761045a36611d01565b92809492610466612bf0565b610471828533613b61565b61047a816134d6565b15610567578061048e6104dd9286336140a7565b9790957f7f9dfa19cf1cc2f806f2f860fbc9c056b601fb1afc0e9b843dfe5c63616268e660806040513381526001600160a01b038416998a60208301528560408301526060820152a1336137bd565b9390918561050c575b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b61055b9661030e956103069460ff93604051956005875260208701526040860152606085015260808401521660a082015260c08101604052906040519160018352602083015260408201604052565b808080808080806104e6565b506040516306dde9c360e41b81523360048201526001600160a01b03841660248201526044810191909152606490fd5b0390fd5b346103215760203660031901126103215760043567ffffffffffffffff81116103215761030e6105d26104e6923690600401611cd0565b91906105dc612bf0565b604051926105e984611955565b5f845236916123a8565b34610321576003196020368201126103215767ffffffffffffffff600435116103215760c090600435360301126103215761062c612bf0565b5f808061064160048035608481019101612510565b905015610f36576024600435013592610659846134d6565b15610f245760608060405161066d81611909565b610675612565565b81525f60208201525f6040820152015261068d612565565b506106ed6106e86106c76106bd6106b76106b1608460043501600435600401612510565b90612597565b806125b2565b60408101906124a2565b60206106e06106b1608460043501600435600401612510565b0135916125c7565b6125d7565b936001600160a01b0361073c6106e86107236107196106b76106b1608460043501600435600401612510565b60608101906124a2565b60406106e06106b1608460043501600435600401612510565b816040519761074a896118d1565b168752166020860152604085015261076c608460043501600435600401612510565b9490506001604051955f87520160051b85016040525f905f5b610799608460043501600435600401612510565b9050811080610f11575b15610d5e576107bc608460043501600435600401612510565b821015610d4a578160051b810135607e198236030181121561032157608081830136031261032157604051916107f183611909565b8181013567ffffffffffffffff81116103215761081390369084840101611b02565b835280820160208181013590850152604080820135908501526060013567ffffffffffffffff81116103215761084c9236920101611cb5565b606082015280516001600160a01b0361086e6040830151602085015190611dbe565b5151166001600160a01b0385511614801590610d16575b610d045761089d602083015160408401519083613fa4565b6108a681612c32565b91825f525f60205260405f2054155f1461090a575051604080513381526001600160a01b039092166020830152810191909152600191907fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f390606090a15b01610785565b919061093b60208497959701516040850151906060860151906040519261093084611955565b5f8452339186613234565b5f94916109a457505051604080513381526001600160a01b03909216602083015281019190915260019291907f1e6fa9678edf81f9f25bbf308bde03ad3e110db1f429394b0915ba021532941490606090a15b811561099c575b5092610904565b905088610995565b6109b9606082015160446004350135906134f9565b15610a1357505051604080513381526001600160a01b03909216602083015281019190915260019291907fe3151dc8cb7a54ffc4baabd28c1f241c94d510b5e5b502491ac3cad6c16316d59080606081015b0390a161098e565b610a2060408201516134d6565b158015610cf1575b15610a7e57505051604080513381526001600160a01b03909216602083015281019190915260019291907f500b713857325f9e6dcb52ae832eca9109d107ed1aae9cb4928b4c1e13f051aa908060608101610a0b565b9250925050600196959691610a976064600435016125eb565b15610c5e5796610b0797610b1760408401516040880151610ab88183613543565b15610c565750925b610b11848592610afa610af460608a01516001600160e01b03601b918660e01d92828816810b928260e01d9216900b6145f4565b90614569565b9d8e9260408d015161356a565b60408c015261407d565b9961407d565b98610b228484613594565b610b2c84826135f2565b60405192338452608060208501526060610b528451608080880152610100870190611e19565b93602081015160a0870152604081015160c0870152015192607f198582030160e0860152835180825260208201906020808260051b8501019601925f5b828110610bee57505050505092806001979695937fbae4dbf76931c547f765e9def16d693d86daaa596f491de979008831789185ae93610be996604084015260608301520390a180858c5101808d5260051b8c01526138a9565b61098e565b9091929396602080610c49600193601f198782030189528b51906001600160a01b03825116815283820151848201526060610c3860408401516080604085015260808401906125f8565b920151906060818403910152611d4d565b9901950193929101610b8f565b905092610ac0565b610b0790610b176060840151610b11610c9c610af460408801516001600160e01b0394601b90868360e01d9316820b91878260e01d9216900b6145f4565b60408a0151610cab8183613543565b15610ce95750915b829c8d916060890151908116155f14610cda575060408801515b96879460408d015161356a565b610ce49085613fd9565b610ccd565b905091610cb3565b50610cff6060820151613520565b610a28565b60405163936bb5ad60e01b8152600490fd5b506001600160a01b03610d326060830151604085015190611dbe565b5151166001600160a01b036020860151161415610885565b634e487b7160e01b5f52603260045260245ffd5b50919390610d706064600435016125eb565b15610f0b57835b6004356004013590610d898282613543565b610eed5750508490610da9856001600160a01b0360208701511633613bf3565b505060a46004350190610dc18260043560040161246f565b905015159081610ee5575b50610e44575b506001600160a01b03610de892935116336140a7565b50505b8351811015610e105780610e0a610e0460019387611dbe565b5161371d565b01610deb565b5060409160017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005582519182526020820152f35b90506001600160a01b03602084015116610e6e6001600160a01b038551169260043560040161246f565b929091333b1561032157610eb65f93604051958694859463691f9ed760e01b8652600486015260248501528960448501528a606485015260a0608485015260a4840191612388565b038183335af190811561044157859115610dd2579050610ed69150611925565b5f836001600160a01b03610dd2565b905088610dcc565b604492506040519163573b6f4160e01b835260048301526024820152fd5b84610d77565b50610f1f60408301516134d6565b6107a3565b60405163315f9e2360e21b8152600490fd5b604051639c95219f60e01b8152600490fd5b34610321576020806003193601126103215760043567ffffffffffffffff811161032157610f7a903690600401611cd0565b919060405192610f8984611955565b5f8452828401610f9882611a55565b94610fa66040519687611971565b828652610fb283611a55565b93610fc486880195601f1901866124f4565b5f5b84811061102857604080518881528951818a018190525f92600582901b83018101918a918c9085015b828710610ffc5785850386f35b909192938280611018600193603f198a82030186528851611d4d565b9601920196019592919092610fef565b806110778861107161104460019560059d9c9d1b87018761246f565b929089846040519586938585013782018381015f81528b519283915e015f83820152038084520182611971565b30613f13565b611081828a611dbe565b5261108c8189611dbe565b5001969596610fc6565b34610321576003196040368201126103215760043567ffffffffffffffff8082116103215760c08260040193833603011261032157602435908111610321576110e3903690600401611cd0565b906110ec612bf0565b61111d61111861111361110c611102888061245a565b604081019061246f565b3691611993565b613e95565b613efe565b801561139b5760011015611389576024830161113981866124a2565b90501561137757604484019461114f86826124a2565b905015611365576111b561117d966111a961117461116d858061245a565b95856124a2565b999092856124a2565b91909261119a60405197611190896118a1565b33895236906119f7565b9a60209b8c8901523691611a6d565b60408601523691611a6d565b6060830152606485013560808301526111cd82612c32565b91825f525f875260405f20958654159687611211575b888860017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055604051908152f35b6001905560a46001600160a01b03917f87491344dfbcf91f6cbbc610cbbeedc85313d37a02df0c93527f7ea5f8db717f83855116604051908152878c82015260606040820152806112656060820188611e19565b0390a10191611274838561246f565b90506112b9575b505050506112ad92916103066102ef61030e933390919060405192600284526020840152604083015260608201604052565b828080808080806111e3565b6112c661110c848661246f565b6112cf816145d0565b156113425750937fd46c2c56b35c8210e9e712ec3f02242d5fc90187c0ac8ed80cc33626846ec369896112ad989795611335611318610306976102ef9761030e9b51169361246f565b866040519586958652850152606060408501526060840191612388565b0390a1938395965061127b565b89610597604051928392630c89984b60e31b845260048401526024830190611d4d565b60405163540e5f0b60e01b8152600490fd5b604051636c44ef8f60e01b8152600490fd5b604051633c8270bd60e21b8152600490fd5b604051632cff108b60e21b8152600490fd5b3461032157602080600319360112610321576024816001600160a01b036113d2611861565b16604051928380926370a0823160e01b82523060048301525afa908115610441575f91611403575b50604051908152f35b90508181813d8311611429575b61141a8183611971565b810103126103215751826113fa565b503d611410565b346103215761143e36611d01565b929161144b949194612bf0565b611456838333613b61565b61145f816134d6565b15611583578160ff916114778561153a969533612a60565b6114818183613543565b1561157d575080935b61149685828533613b95565b917f8045c25080b0868951141ed0a91720bcad09a8364a2b3109ee1fd49c1f0bc8b860c06114c5898833613bf3565b97906001600160a01b0360405192338452169a8b6020840152856040840152886060840152608083015260a0820152a16040519660068852602088015260408701526060860152608085015260a08401521660c082015260e08101604052906040519160018352602083015260408201604052565b90806115665760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b6115759261030e9136916123a8565b8080806104e6565b9361148a565b50604051623a3a4d60e21b81523360048201526001600160a01b039190911660248201526044810191909152606490fd5b34610321576080366003190112610321576004356001600160a01b0390818116809103610321576115e3611877565b6044359167ffffffffffffffff91606435838111610321573660238201121561032157806004013593841161032157366024858301011161032157611670956020921693611632868587613a82565b60405196879283926323e30c8b60e01b84523360048501528760248501528860448501525f606485015260a06084850152602460a485019201612388565b03815f855af1938415610441575f946116dc575b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd984036116c3576116b893503091613afb565b602060405160018152f35b604051630b6c58a960e31b815260048101859052602490fd5b9093506020813d602011611708575b816116f860209383611971565b8101031261032157519284611684565b3d91506116eb565b34610321576101403660031901126103215767ffffffffffffffff60043581811161032157611743903690600401611b02565b6024358281116103215761175b903690600401611b02565b60c0366043190112610321576101043583811161032157611780903690600401611cb5565b90610124359384116103215761179d6104e6943690600401611cb5565b926117a6612bf0565b611eca565b346103215760603660031901126103215760206117da6117c9611861565b6117d1611877565b60443591612a60565b604051908152f35b34610321576020366003190112610321576004355f525f6020526020600160405f205414604051908152f35b34610321576020366003190112610321576004359063ffffffff60e01b82168092036103215760209163e414309160e01b8114908115611850575b5015158152f35b6301ffc9a760e01b14905083611849565b600435906001600160a01b038216820361032157565b602435906001600160a01b038216820361032157565b35906001600160a01b038216820361032157565b60a0810190811067ffffffffffffffff8211176118bd57604052565b634e487b7160e01b5f52604160045260245ffd5b6060810190811067ffffffffffffffff8211176118bd57604052565b6040810190811067ffffffffffffffff8211176118bd57604052565b6080810190811067ffffffffffffffff8211176118bd57604052565b67ffffffffffffffff81116118bd57604052565b60e0810190811067ffffffffffffffff8211176118bd57604052565b6020810190811067ffffffffffffffff8211176118bd57604052565b90601f8019910116810190811067ffffffffffffffff8211176118bd57604052565b92919267ffffffffffffffff82116118bd57604051916119bd601f8201601f191660200184611971565b829481845281830111610321578281602093845f960137010152565b9080601f83011215610321578160206119f493359101611993565b90565b91906060838203126103215760405190611a10826118d1565b8193611a1b8161188d565b8352611a296020820161188d565b602084015260408101359167ffffffffffffffff831161032157604092611a5092016119d9565b910152565b67ffffffffffffffff81116118bd5760051b60200190565b929192611a7982611a55565b604092611a896040519283611971565b819581835260208093019160061b84019381851161032157915b848310611ab257505050505050565b8583830312610321578386918251611ac9816118ed565b611ad28661188d565b81528286013583820152815201920191611aa3565b9080601f83011215610321578160206119f493359101611a6d565b91909160a0818403126103215760405190611b1c826118a1565b8193611b278261188d565b835267ffffffffffffffff9160208101358381116103215782611b4b9183016119f7565b602085015260408101358381116103215782611b68918301611ae7565b6040850152606081013592831161032157611b896080939284938301611ae7565b60608501520135910152565b90929192611ba281611a55565b91604094611bb36040519485611971565b839583855260208095019160059460051b8401948186116103215784935b868510611be2575050505050505050565b67ffffffffffffffff90853582811161032157870190608082860312610321578551611c0d81611909565b611c168361188d565b81528a8301358b8201528683013584811161032157830186601f8201121561032157803590611c4482611a55565b91611c518a519384611971565b8083528d80840191891b83010191898311610321578e809101915b838310611ca557505050508782015260608084013594851161032157611c96878d968796016119d9565b90820152815201940193611bd1565b82358152918101918f9101611c6c565b9080601f83011215610321578160206119f493359101611b95565b9181601f840112156103215782359167ffffffffffffffff8311610321576020808501948460051b01011161032157565b906080600319830112610321576004356001600160a01b0381168103610321579160243591604435916064359067ffffffffffffffff821161032157611d4991600401611cd0565b9091565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b805115610d4a5760200190565b805160011015610d4a5760400190565b805160021015610d4a5760600190565b805160031015610d4a5760800190565b805160041015610d4a5760a00190565b8051821015610d4a5760209160051b010190565b9081518082526020808093019301915f5b828110611df1575050505090565b835180516001600160a01b031686528201518583015260409094019392810192600101611de3565b90608080611e8f611e7d611e6b60406001600160a01b0380895116885260208901519060a060208a01528082511660a08a015260208201511660c08901520151606060e0880152610100870190611d4d565b60408701518682036040880152611dd2565b60608601518582036060870152611dd2565b93015191015290565b90611ea282611a55565b611eaf6040519182611971565b8281528092611ec0601f1991611a55565b0190602036910137565b926001600160a01b038451166001600160a01b0383511614612376576001600160a01b03611eff606086015160643590611dbe565b515116906040830151916001600160a01b03611f1e6084358095611dbe565b51511614801590612336575b610d04576040850151906001600160a01b03611f496044358094611dbe565b5151166001600160a01b03611f6460643560608a0151611dbe565b5151161461232457611f7586612c32565b805f525f60205260405f2054156122d15750611f9084612c32565b805f525f60205260405f20541561227d5750612075929161204d917f6fa7f4c28634b0a9d6831401c45ae468195fb63aed07308935c35374ff5d9e3960405180611ff8611fea61012033845280602085015283018d611e19565b82810360408401528a611e19565b85606083015260643560808301528760a083015260a43560c083015260c43560e083015260e4356101008301520390a16001600160a01b038651166040519261204084611955565b5f8452606435908a612e9c565b9490506001600160a01b038651166040519261206884611955565b5f845260a4359086612e9c565b92905061208560408201516134d6565b158015612269575b8015612256575b8015612243575b61223157604051916120ac83611909565b5f83525f60208401525f60408401525f60608401526120cb84836144e1565b845260408401526120f16120df83866144e1565b6020860152806060860152845161356a565b94612105602085015160408601519061356a565b9361210f87613520565b8015612222575b612210576121d7612209957fd9fa84dd790c969daa5c33d8050dc06b4a9b59d5b42e2be5f5e8ae20447f618d946121b961220e9a60a0966121588a8851613594565b6121668c6020890151613594565b6121748a60408901516135f2565b6121828c60608901516135f2565b61218b8a61371d565b6121948c61371d565b6001600160a01b036121b060c435926060606435910151611dbe565b515116336137bd565b50506001600160a01b036121b060e43592606060a435910151611dbe565b5050606060405191338352805160208401526020810151604084015260408101518284015201516080820152a16138a9565b6138a9565b565b604051630d86822160e01b8152600490fd5b5061222c85613520565b612116565b6040516321badf1f60e01b8152600490fd5b506122516060840151613520565b61209b565b506122646060820151613520565b612094565b5061227760408401516134d6565b1561208d565b9351604080513381526001600160a01b039092166020830152810194909452507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f3945091925082915050606081015b0390a1565b9551604080513381526001600160a01b039092166020830152810196909652507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f3949350839250506060820190506122cc565b604051631cd2f1c760e21b8152600490fd5b506001600160a01b03612350606085015160a43590611dbe565b5151166001600160a01b0361236c604088015160443590611dbe565b5151161415611f2a565b604051630a98f1f360e21b8152600490fd5b908060209392818452848401375f828201840152601f01601f1916010190565b909291926123b581611a55565b916040916123c66040519485611971565b839581855260208095019160051b8301938185116103215783925b8584106123f15750505050505050565b67ffffffffffffffff90843582811161032157860190838286031261032157835161241b816118ed565b823584811161032157866124309185016119f7565b8152898301359384116103215761244b868b95869501611cb5565b838201528152019301926123e1565b903590605e1981360301821215610321570190565b903590601e1981360301821215610321570180359067ffffffffffffffff82116103215760200191813603831361032157565b903590601e1981360301821215610321570180359067ffffffffffffffff821161032157602001918160061b3603831361032157565b5f5b608081106124e6575050565b6060828201526020016124da565b5f5b82811061250257505050565b6060828201526020016124f6565b903590601e1981360301821215610321570180359067ffffffffffffffff821161032157602001918160051b3603831361032157565b60405190612553826118d1565b60606040835f81525f60208201520152565b60405190612572826118a1565b5f608083828152612581612546565b6020820152606060408201526060808201520152565b9015610d4a57803590607e1981360301821215610321570190565b903590609e1981360301821215610321570190565b9190811015610d4a5760061b0190565b356001600160a01b03811681036103215790565b3580151581036103215790565b9081518082526020808093019301915f5b828110612617575050505090565b835185529381019392810192600101612609565b9061264361014461263c84806125b2565b3690611b02565b5f5260205f81526040926001845f2054036129d057916128c5916126ca85855f61284a6126738361268a9a6125b2565b61268f878501359182878701359c8d923690611b02565b613fa4565b6126a761269c85806125b2565b946060810190612510565b96906126c28751966126b888611955565b8688523690611b02565b973691611b95565b906126d3612c63565b506127fa8651916126e3836118a1565b600483526126f28a84016124d8565b886126fc81612c32565b988b6001600160a01b039a8b84511690835192600384528301528282015233606082015260808101825261272f86611d71565b5261273985611d71565b508051612745816118d1565b6002815281368e83013761275886611d7e565b5261276285611d7e565b50810160ff8c6127c56127ae8d806127878161277f8b8a51611dbe565b515116614172565b97511690612796898851611dbe565b515116846127a58a8951611dbe565b51015191612a60565b958d6127bb828751611dbe565b5151169451611dbe565b51015192169093929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b61280382611d8e565b5261280d81611d8e565b506128318b886060810160ff8c6127c56127ae8d806127878161277f8b8a51611dbe565b61283a82611d9e565b5261284481611d9e565b50614250565b918385511693868601918b83519289818551169401511693878652308a5281808720915101519082519261287d84611955565b878452519561288b87611939565b86528a8601528d85015284606085015285608085015260a084015260c08301528a5180809a819463d04dfe2360e01b835260048301612de4565b03915afa95865f915f986129aa575b506128e35788513d5f823e3d90fd5b95938651600281106129935750888798998260c0979899015199015161291161290b85611dae565b51611d9e565b5161291c8183613543565b156129895750998a925b6129488b85919060405192600284526020840152604083015260608201604052565b61295186611d8e565b5261295b85611d8e565b5082519661296888611939565b8752860152840152866060840152608083015260a082015201526001929190565b9050998a92612926565b6024908a5190630fbb8e5560e21b82526004820152fd5b9097506129c991503d805f833e6129c18183611971565b810190612ca0565b965f6128d4565b505f92508291829150565b9035601e198236030181121561032157016020813591019167ffffffffffffffff8211610321578160061b3603831361032157565b9190808252602080920192915f905b828210612a2d575050505090565b909192936001906001600160a01b03612a458761188d565b16815285830135838201526040908101950193920190612a1f565b8215612a95576001600160a01b038091165f52600160205260405f2091165f5260205260405f20905f5260205260405f205490565b909150612aa182614172565b6001600160a01b03809316906040918251946370a0823160e01b86528416938460048701526020928387602481865afa968715612bb7575f97612bc1575b5083612af8612af183612b289a614f36565b50906149f8565b508651636eb1769f60e11b81526001600160a01b0390941660048501523060248501529297889081906044820190565b0381865afa968715612bb7575f97612b86575b50612af1612b4c916119f498614f36565b50612b578183613543565b15612b7e5750935b5f5260018252825f20905f528152815f20905f8052525f20549061407d565b905093612b5f565b96508387813d8311612bb0575b612b9d8183611971565b8101031261032157955195612af1612b3b565b503d612b93565b85513d5f823e3d90fd5b96508387813d8311612be9575b612bd88183611971565b810103126103215795519583612adf565b503d612bce565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f006002815414612c205760029055565b604051633ee5aeb560e01b8152600490fd5b604051612c5d81612c4f6020820194602086526040830190611e19565b03601f198101835282611971565b51902090565b60405190612c7082611939565b606060c083612c7d612565565b81525f60208201525f60408201525f838201528260808201525f60a08201520152565b919060408382031261032157825167ffffffffffffffff908181116103215784019082601f83011215610321578151602092612cdb82611a55565b91612ce96040519384611971565b808352848084019160051b830101918683116103215785809101915b838310612d785750505050948281015191821161032157019180601f84011215610321578251612d3481611a55565b93612d426040519586611971565b818552838086019260051b820101928311610321578301905b828210612d69575050505090565b81518152908301908301612d5b565b8251815291810191869101612d05565b90808251908181526020809101926020808460051b8301019501935f915b848310612db65750505050505090565b9091929394958480612dd4600193601f198682030187528a516125f8565b9801930193019194939290612da6565b91906020928381526001600160a01b0382511684820152838201516040820152612e1e604083015160e06060840152610100830190611d4d565b9060608301516080820152612e45608084015192601f1993848483030160a0850152612d88565b9260a081015193838382030160c08401528680865192838152019501905f5b818110612e88575050506119f494955060c060e091015192828503019101526125f8565b825187529588019591880191600101612e64565b94959395929192612eab612c63565b50604096875190612ebb826118a1565b60048252602093612ecd8584016124d8565b612ed689612c32565b6001600160a01b038097818c51168d519360038552898501528d840152166060820152608081018b52612f0884611d71565b52612f1283611d71565b508951612f1e816118d1565b600281528a3687830137612f3184611d7e565b52612f3b83611d7e565b50898901908681835190612f4e91611dbe565b515116612f5a90614172565b86888c51168984865190612f6d91611dbe565b5151168285875190612f7e91611dbe565b51015190612f8b92612a60565b928981865190612f9a91611dbe565b515116945190612fa991611dbe565b5101519060ff16612fe1929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b612fea83611d8e565b52612ff482611d8e565b5060608801858782519061300791611dbe565b51511661301390614172565b868a5116878984519061302591611dbe565b515116878a85519061303691611dbe565b5101519061304392612a60565b908689898186519061305491611dbe565b51511694519061306391611dbe565b5101519060ff1661309b929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b6130a483611d9e565b526130ae82611d9e565b506130b891614250565b9183875116938188019283519183818451169301511693865f523084528a805f20915101518b51916130e983611955565b5f83528c51966130f888611939565b8752858701528b8601525f60608601526080850186905260a085015260c0840152885163d04dfe2360e01b815292839081906131379060048301612de4565b03815a935f94fa91825f915f94613216575b506131585788513d5f823e3d90fd5b979495969791948251966002881097886131ff5750818385015194015161318161290b87611dae565b5161318c8183613543565b156131f75750925b6131b68585919060405192600284526020840152604083015260608201604052565b6131bf87611d8e565b526131c986611d8e565b5082519a6131d68c611939565b8b528a01528801526060870152608086015260a085015260c0840152159190565b905092613194565b602490835190630fbb8e5560e21b82526004820152fd5b90935061322d91503d805f833e6129c18183611971565b925f613149565b95949193908693613243612c63565b505f92604061335e815192613257846118a1565b600484526020936132698582016124d8565b6133276132758b612c32565b8b6001600160a01b03998a9283835116895191600383528b830152898201528360609b168b8201526080810189526132ac86611d71565b526132b685611d71565b5087516132c2816118d1565b6002815288368b8301376132d586611d7e565b526132df85611d7e565b5060ff896127c58a85019361331b876132fd8161277f858a51611dbe565b9751168861330c848951611dbe565b515116856127a5858a51611dbe565b966127bb828751611dbe565b61333082611d8e565b5261333a81611d8e565b50612831878b8d60ff896127c58c85019361331b876132fd8161277f858a51611dbe565b946133de5f868a511698869786889c0191825191888184511693015116928c8552308952878086209151015188519161339683611955565b8683528951956133a587611939565b86528a86015288850152848a8501528b608085015260a084015260c08301528551808095819463d04dfe2360e01b835260048301612de4565b03915afa90815f915f936134b8575b506134ab575050505f975b6002855110988915996134985782848701519601519061341a61290b89611dae565b51906134268284613543565b1590506134905750925b6134528685919060405192600284526020840152604083015260608201604052565b61345b88611d8e565b5261346587611d8e565b5082519b6134728d611939565b8c528b0152890152870152608086015260a085015260c08401529190565b905092613430565b50505050505050505091506119f4612c63565b91999850945093966133f8565b9092506134cf91503d805f833e6129c18183611971565b915f6133ed565b6134f5905f60e01d906001600160e01b038160e01d9116601b0b614fed565b1290565b906134f5916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b61506e565b61353f905f60e01d906001600160e01b038160e01d9116601b0b614fed565b1390565b9061353f916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b61506e565b6119f491610af4916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614544565b6135ee9160808101826135b06135aa8351611dae565b51611dae565b526135e76135e16001600160a01b038094515116936135d86135d28551611dae565b51611d71565b51169251611dae565b51611d8e565b5191613b95565b5050565b906080810191806136066135aa8551611d9e565b526001600160a01b038092515116916136226135d28551611d9e565b51166136316135e18551611d9e565b5190816136e55761364183613520565b6136cc579183917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a95936122cc955f5260209060018252613697604094855f20835f528452855f20855f528452855f205461407d565b945f5260018252835f20905f528152825f20915f52525f20555b51604051918291338352604060208401526040830190612d88565b60405163793a8f5560e01b815260048101849052602490fd5b91613716917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a95936122cc956137bd565b50506136b1565b6080810161372e6135e18251611d9e565b5191821561373b57505050565b6137556135d26001600160a01b0380935151169351611d9e565b5116815f5260209160018352604092835f20835f528152835f20855f528152835f2054936001600160e01b038516613790575b505050505050565b6137b4955f9284845260018152828420868552815282842091845252812055613bf3565b5f808080613788565b939291936137ca83613520565b6136cc57846137e6576137de939450613bf3565b50505f905f90565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f528152613823835f2054948561407d565b9561382d87613520565b613850575f97885260018252838820908852815282872091875252909320829055565b835163c5e12af560e01b815260048101889052602490fd5b90604082019082526020606081936040838201528551809452019301915f5b828110613895575050505090565b835185529381019392810192600101613887565b60c0810151908151915f92613a1d575b5061395e6020918281510151926001600160a01b039081818187511696015116928660a082019485518252308452604097888320898686510151015160808601518b519161390683611955565b8683528c519361391585611955565b8785528d519661392488611939565b8752898701528c86015260016060860152608085015260a084015260c08301528851808099819463d04dfe2360e01b835260048301612de4565b03915afa948515613a135787956139f5575b508451613981575b50505050505050565b81905101510151169051813b156139f1579184918493836139b6965180978195829463012c676d60e21b845260048401613868565b03925af19081156139e857506139d1575b8080808080613978565b6139db8291611925565b6139e557806139c7565b80fd5b513d84823e3d90fd5b8480fd5b613a0a9195503d8089833e6129c18183611971565b9050935f613970565b86513d89823e3d90fd5b6001600160a01b03602080845101510151169060a083015190823b1561032157613a60925f928360405180968195829463012c676d60e21b845260048401613868565b03925af1801561044157156138b957613a7a919250611925565b5f905f6138b9565b6040519263a9059cbb60e01b5f526001600160a01b0380931660045260245260205f60448180855af160015f5114811615613adc575b8360405215613ac657505050565b635274afe760e01b835216600482015260249150fd5b6001811516613af257813b15153d151616613ab8565b833d5f823e3d90fd5b9092604051936323b872dd60e01b5f526001600160a01b0393848092166004521660245260445260205f60648180855af160015f5114811615613b4b575b836040525f60605215613ac657505050565b6001811516613af257813b15153d151616613b39565b909115613b6c575050565b6040516305dbdfd960e41b81526001600160a01b03918216600482015291166024820152604490fd5b93929193613ba283613520565b6136cc5784613bb6576137de9394506140a7565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f528152613823835f2054948561356a565b90929192613c0081614573565b93613c0a81613520565b613c535784816001600160e01b03613c299360e01d9116601b0b615198565b50809281613c39575b5050509190565b6001600160a01b03613c4b9316613a82565b5f8181613c32565b604051632d1671a360e11b8152600490fd5b916040805191613c74836118a1565b60048084526020613c868186016124d8565b5f5b8751811015613cbb5780613c9e6001928a611dbe565b51613ca98289611dbe565b52613cb48188611dbe565b5001613c88565b5092955092939093335f52308352855f2091865190613cd9826118ed565b613ce1612546565b8252606085819301528751613cf581611955565b5f8152885191613d0483611955565b5f83525f3681375f5b8151811015613e6a57613d208183611dbe565b5190888c8b84519189818401518d8d8251613d48575b50505050505050506001915001613d0d565b5f613db797948197948c9794613d758c956001600160a01b039d8e81818d51169c0151169b015190614250565b94865199613d828b611939565b8a528901528488015286015260808501528a60a08501528b60c08501525180958194829363d04dfe2360e01b84528301612de4565b03915afa938415613e60578b915f95613e42575b508451613de0575b50908b8e89838d8d613d36565b51015116803b1561032157613e0f925f918c8f84905180978195829463012c676d60e21b845233908401613868565b03925af1918215613e3857600192613e29575b8981613dd3565b613e3290611925565b5f613e22565b8c513d5f823e3d90fd5b613e579195503d805f833e6129c18183611971565b9050935f613dcb565b8e513d5f823e3d90fd5b5050505050505050509050565b8115613e81570490565b634e487b7160e01b5f52601260045260245ffd5b6040815110613ef1576020810151908051603f198101908111613edd5760051c8211613ec95760016020920160051b010190565b5050604051613ed781611955565b5f815290565b634e487b7160e01b5f52601160045260245ffd5b50604051613ed781611955565b805115613f0e57602001515f1a90565b505f90565b905f8091602081519101845af48080613f91575b15613f475750506040513d81523d5f602083013e60203d82010160405290565b15613f6e57604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b3d15613f7f576040513d5f823e3d90fd5b60405163d6bda27560e01b8152600490fd5b503d151580613f275750813b1515613f27565b91613fcf906060613fc4936001600160a01b039485916040880151611dbe565b515116940151611dbe565b5151161461232457565b6140006001600160e01b0392838316601b0b9260e01d938160e01d9116601b0b84846147af565b90637ffffff58213614050575b90614017916149f8565b9290921580614048575b61402a57505090565b6044925060405191638eba4d0760e01b835260048301526024820152fd5b508215614021565b61405a82826156c1565b1561400d57604483856040519163d556b11160e01b835260048301526024820152fd5b6119f491610af4916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614d9d565b9291926140b382614573565b936140bd81613520565b61411e5784816001600160e01b036140dc9360e01d9116601b0b615198565b9290809315614109575b508290816140f5575050509190565b613c4b926001600160a01b03309216613afb565b9092505f198114613edd57600101915f6140e6565b604051632eaefac360e21b8152600490fd5b6004111561413a57565b634e487b7160e01b5f52602160045260245ffd5b602090939291936001600160a01b03604082019516815261416e83614130565b0152565b61417a6156da565b60408051630782d7e160e01b81526001600160a01b03831660048201529091828260248173200e12d10bb0c5e4a17e7018f0f1161919bb93895afa928315614247575f925f94614212575b506141cf83614130565b600183141580614200575b6141e45750505090565b5163ee07877f60e01b815291829161059791906004840161414e565b5061420a83614130565b8215156141da565b908094506142369293503d8511614240575b61422e8183611971565b810190614f0c565b919091925f6141c5565b503d614224565b513d5f823e3d90fd5b61425a8251611e98565b6142648351611e98565b9282519281518015155f146144d957600201935b6001940184019061428882611a55565b956142a360409361429b8551998a611971565b808952611a55565b6142b5602091601f1901828a016124f4565b5f9584519389896002926002885233868901523089890152606097606081018a526142df84611d71565b526142e983611d71565b505f825b614499575b505050508651614309575b50505050505050505090565b9091929360028861432c8c866143258e809c9d9e018093611dbe565b528d611dbe565b500185614339828d611dbe565b52614344818c611dbe565b505f965b614353575b506142fd565b8851871015614494576001600160a01b036143ff898b856143f68c60428c8861437c8488611dbe565b51511696858261438c868a611dbe565b5101519261439a868a611dbe565b51838d82511691015182815160051b910120908451927f6ec4dff745ec96dbde88c5d41f8aa5ac13aa1664afb47b8406b44fa945a650c88452830152838201522090519161190160f01b83528d83015260228201522093611dbe565b51015191614f64565b1561447c578761446b8b8e8c8f9e9d9c9b9a999897968f614458918d61444e898f8f61443a83889f614431828f611dbe565b51511692611dbe565b52614445828b611dbe565b51015192611dbe565b52019c8d94611dbe565b5101516144658383611dbe565b52611dbe565b500196979895909192939495614348565b8851630a57f30960e31b815260048101899052602490fd5b61434d565b9091929a82518210156144d157906144c584809301809d6144ba8487611dbe565b516144658383611dbe565b50019082918d936142ed565b9a92916142f2565b505f93614278565b916040830192604061451b610af4606087519401938451906001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6145f4565b9451930161452a8151866134f9565b614532575050565b9093506119f491925051925183613fd9565b919291600160ff1b840161455c57611d4993506150c3565b90611d49935f0391614d9d565b61401782826149f8565b61457b6156da565b6040805163b7bad1b160e01b81526001600160a01b0383166004820152909182826024815f73200e12d10bb0c5e4a17e7018f0f1161919bb93895af1928315614247575f925f9461421257506141cf83614130565b6008815110613f0e576008015167ffffffffffffffff1667ff0a89c674ee78741490565b9091939284158215175f1461460e5750505090505f905f90565b82810192600160fd1b8082019083011760fe1c614745575b505061463181615386565b9361463b81615386565b9461464686826153a6565b90918215614736575f9083986f0785ee10d5da46d900f436a000000000808611614728575b50670de0b6b3a7640000808b11614719575b50633b9aca00808b1161470a575b50612710808b116146fc575b5098805b6146eb57508190611d49989982600a0a9109960195817fcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccd0a93838211900382610100031b9203901c1702916153b9565b60019290920191600a90048061469b565b60049a04998a930192614697565b600991939a049901915f61468b565b601291939a049901915f61467d565b85049950602592505f61466b565b50929050611d499495506153b9565b5f8212156147995780841361478b575b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb284131561462657909250611d499394916152c4565b909250611d4993949161532b565b8084121561475557909250611d499394916152c4565b929091806147d5576044848460405191637a97930f60e01b835260048301526024820152fd5b90919280155f146147ea57505050505f905f90565b614803936147f791615473565b92919490938492615473565b909391928461481188615386565b9161481b86615386565b947f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000094604c918688106149c2575b030191600160ff1b98838a018112155f1461498f575050035b5f955f821280614986575b614968575b5f811280614956575b6149385786820103966001600160ff1b038814908161492e575b5080614925575b8061491c575b6148fe5750906148b2929161561f565b915f81136148c5575b50611d49936153b9565b9091604c82136148f3576148dc91600a0a90613e77565b9081156148e9575f6148bb565b505050505f905f90565b50505050505f905f90565b876044916040519163d556b11160e01b835260048301526024820152fd5b505f85126148a2565b5082841461489c565b905088145f614895565b604489836040519163d556b11160e01b835260048301526024820152fd5b50806001600160ff1b0301821361487b565b95508087018613156149805786818703015b95614872565b5f61497a565b505f811361486d565b89985090920390506001600160ff1b03819003870182136149b35701860194614862565b5050505050505050505f905f90565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009650604b9250614849565b8115613e81570590565b8082601b82810b8314614bed577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000008405614b99575b8380820b03614b8857507b199999999999999999999999999999999999999999999999999999987b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc84011115614b39575b838060030b03614abd575b808413614aa15750506001600160e01b036001925b60e01b91161791565b8303600a0a8015613e81576001600160e01b0391071592614a98565b92915f841315614b0d575090614ad383836156c1565b614aef57637ffffffe1901600a0a810290637fffffff92614a83565b506044916040519163d556b11160e01b835260048301526024820152fd5b637fffffff1992830390604382136148f357614b2c91600a0a906149ee565b9182156148e95792614a83565b5f198401808060030b14614b4d5750614a78565b90506001600160e01b039293507b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff915060e01b9260ff1d181617905f90565b600190940193600a90930592614a2b565b937f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000840515614bda576305f5e100600894058094819201955b915050614a2b565b620186a060059405809481920195614bd2565b5082614a7857505050505f90600190565b919291600160ff1b9190801580614d8b575090614c1a91615473565b9490929091905f868585858282138015614d82575b614d65575b505050508682841860ff1c94860391039081604c038111614d4a5701600a0a808205919084614d30575b505081019182821860ff1c1115614d2857826001600160ff1b0314614d0a57905f600192135f14614cdb57600a9004915b01925b81158117614c9f57509190565b80614cb8575b508015614cb0579190565b505f91508190565b9192614cce9203600160ff1b01600a0a906149ee565b600160ff1b91905f614ca5565b600a60037fe6666666666666666666666666666666666666666666666666666666666666679201040191614c8f565b604490836040519163d556b11160e01b835260048301526024820152fd5b509092614c92565b8107614d3d575b80614c5e565b60ff1d600117015f614d37565b505050919350614d58579190565b60018160ff1d1790039190565b5f9a50909750909550600160ff1b94509250905086808080614c34565b50835f12614c2f565b15614d965750509190565b9350919050565b9392919384158115818117614eee57505090614db891615473565b9194908295614dc982958294615473565b8096929491969387868482138015614ee5575b614ecc575b5050505050508682841860ff1c94860391039081604c038111614d4a5701600a0a808205919084614eb2575b505081019182821860ff1c1115614eaa57826001600160ff1b0314614d0a57905f600192135f14614e7b57600a9004915b01925b81158117614e4e57509190565b80614e5e57508015614cb0579190565b600160ff1b93614e759291038401600a0a906149ee565b5f614ca5565b600a60037fe6666666666666666666666666666666666666666666666666666666666666679201040191614e3e565b509092614e41565b8107614ebf575b80614e0d565b60ff1d600117015f614eb9565b929b5098509196509450925090505f8080808080614de1565b50858412614ddc565b9395939092919015614f04575050614cb0579190565b945092915050565b919082604091031261032157815160048110156103215760209092015160ff811681036103215790565b9060ff165f03916001600160ff1b0382115f14614f5c57600a6001818404940192061590565b909190600190565b9091813b614f9f57614f769192615743565b50614f8081614130565b159182614f8c57505090565b6001600160a01b03918216911614919050565b6020918160645f935160405192630b135d3f60e11b9788855260048501526040602485015286820190604485015e8281018201859052601f01601f191601915afa905f5114601f3d11161690565b92915f9060018184145f87128715171717615067575f92808213615059575b03604c81135f82121761504d57600a0a908461502b83820293846149ee565b146150405750501561503c575f9190565b5f90565b90935090156119f4579190565b50501561503c575f9190565b5f956001945092509061500c565b5050505f90565b93929190918083145f83125f871218831587151717176150bd575f928082136150b05703604c81135f82121761504d57600a0a908461502b83820293846149ee565b919460019350919061500c565b50919050565b909291600160ff1b91828101615155575080841461514b57808413918215615143578185035b604c8111156151325750505f915b1561512357507f8000000000000000000000000000000000000000000000000000000000000001019190565b92506001600160ff1b03039190565b600a0a908115613e815704916150f7565b8482036150e9565b505090505f905f90565b9361516292945f03614bfe565b80939180928114615176575b50505f039190565b915092506001600160ff1b038314614d0a57600a600191059201915f8061516e565b91925f8312156151c0576044838360405191634a7d166b60e01b835260048301526024820152fd5b9192836151d257505090505f90600190565b60ff811682019180831261529a575f83121561520a575050604c198112614cb0575f03600a0a916152038382613e77565b9283021490565b909293915f81135f1461529057604d811361526557600a0a928315613e8157835f1904831161523c5750500290600190565b60405163c849483b60e01b815260048101849052602481019290925260ff166044820152606490fd5b5060405163c849483b60e01b81526004810192909252602482015260ff919091166044820152606490fd5b5050905090600190565b60405163c849483b60e01b815260048101869052602481019190915260ff82166044820152606490fd5b909392915f6152d49181846145f4565b9490945f8483019182019412159081615321575b8115615317575b506152f957505090565b604492506040519163d556b11160e01b835260048301526024820152fd5b905083125f6152ef565b82811291506152e8565b61534093600160fe1b908101939201906145f4565b9081815f821215615377575050604b1982126137de57615365915f03600a0a906149ee565b908161536f575f90565b600160ff1b90565b93600160ff1b90910192509050565b5f8112156119f457600160ff1b9080820361539f575090565b90505f0390565b905f198183099102908180821091030391565b92939291905f818418121561544e576001600160ff1b03928383111561543857600160ff1b938385036153ee57505050509190565b90919293508514615408575050600a600191045f03920190565b604051630ed8062160e21b8152600481019190915260248101919091526044810182905260648101849052608490fd5b5090915050600160ff1b8114613edd575f039190565b90916001600160ff1b0380841115613c32578514615408575050600a60019104920190565b919091801561561557827f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000080830515615523575b507f19999999999999999999999999999999999999999999999999999999999999997f0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc830110615514575b83136154fe5791905f90565b919060018060ff1b926001600160ff1b03030190565b9290600a02905f1901926154f2565b6f4b3b4ca85a86c47a098a22400000000080840515615603575b507728c87cb5c89a2571ebfdcb54864ada834a000000000000008305156155ec575b7b097edd871cfda3a5697758bf0e3cbb5ac5741c6400000000000000008305156155d8575b7e3899162693736ac531a5a58f1fbb4b746504382ca7e40000000000000000008305156155c8578205156155b9575b5f6154a7565b9290600a02905f1901926155b3565b9391606402916001190193615584565b93916402540be40002916009190193615584565b9391678ac7230489e800000291601219019361555f565b6025198301955092909202915f61553d565b505f915081908190565b90915f19838309928083029283808610950394808603958487101561569d5714615695579082910960018219018216809204600280826003021880830282030280830282030280830282030280830282030280830282030280920290030293600183805f03040190848311900302920304170290565b505091500490565b60648386866040519263362ced0960e11b8452600484015260248301526044820152fd5b6119f491905f8112156156d5575f0361577d565b61577d565b73200e12d10bb0c5e4a17e7018f0f1161919bb9389803b158015615718575b6157005750565b602490604051906373e6d7b360e01b82526004820152fd5b507f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d41813f14156156f9565b81519190604183036157735761576c9250602082015190606060408401519301515f1a9061580c565b9192909190565b50505f9160029190565b90637ffffff581131561580657637ffffffe19810190604382136157ff575f8212156157d357637fffffff91505f0301600a0a7b8000000000000000000000000000000000000000000000000000000202111590565b50600a0a8015613e81577b80000000000000000000000000000000000000000000000000000001041090565b5050151590565b50505f90565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411615883579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa15610441575f516001600160a01b0381161561587957905f905f90565b505f906001905f90565b5050505f916003919056000000000000000000000000000000000000000000000000000000000000200e12d10bb0c5e4a17e7018f0f1161919bb93890000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000044b608060405234801561000f575f80fd5b506004361061004a575f3560e01c80630782d7e11461004e57806354636d2b14610078578063b7bad1b11461009d578063f5c36eaf146100b0575b5f80fd5b61006161005c366004610363565b6100c3565b60405161006f929190610403565b60405180910390f35b61008b610086366004610363565b6100d8565b60405160ff909116815260200161006f565b6100616100ab366004610363565b6100e9565b61008b6100be366004610363565b6100f5565b5f806100cf5f84610100565b91509150915091565b5f6100e35f836101f0565b92915050565b5f806100cf5f84610281565b5f6100e35f83610356565b73ffffffffffffffffffffffffffffffffffffffff81165f9081526020838152604080832081518083019092525460ff8082161515835261010090910416818301527f313ce56700000000000000000000000000000000000000000000000000000000808452839283908190816004818a5afa915060203d1015610182575f91505b811561019857505f5160ff811115610198575f91505b816101af57505050602001516003925090506101e9565b83516101c3575f955093506101e992505050565b836020015160ff1681146101d85760026101db565b60015b846020015195509550505050505b9250929050565b5f805f6101fd8585610281565b909250905060018260038111156102165761021661039d565b1415801561023557505f8260038111156102325761023261039d565b14155b156102795783826040517fee07877f000000000000000000000000000000000000000000000000000000008152600401610270929190610421565b60405180910390fd5b949350505050565b5f805f8061028f8686610100565b90925090505f8260038111156102a7576102a761039d565b0361034b576040805180820182526001815260ff838116602080840191825273ffffffffffffffffffffffffffffffffffffffff8a165f908152908b9052939093209151825493517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009094169015157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff161761010093909116929092029190911790555b909590945092505050565b5f805f6101fd8585610100565b5f60208284031215610373575f80fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114610396575f80fd5b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b600481106103ff577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b9052565b6040810161041182856103ca565b60ff831660208301529392505050565b73ffffffffffffffffffffffffffffffffffffffff831681526040810161039660208301846103ca56000000000000000000000000000000000000000000"; + hex"0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000005c40000000000000000000000000d2cd1d4ad3bf3ecb581e4653c9c02a67ca44305c00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000005b846080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a7146117d1575080632cb77e9f146117a557806341d1514f1461176e5780635343c1b7146116d35780635cffe9de146115775780635d003c44146113e3578063613255ab14611360578063687cf02a14611070578063ac9650d814610f22578063b0460f07146105cd578063b845b83e14610575578063ca9109ba14610400578063d9d98ce41461034f578063ddebc96f146102fb5763df6db3c2146100c1575f80fd5b346102d5576003196040368201126102d5576004359067ffffffffffffffff8083116102d5578260040160a0843603938401126102d5576024358281116102d557610110903690600401611c93565b90610119613236565b5f946001600160a01b03948561012e86612c8a565b1633036102d9576101476101423687611ac5565b613278565b91825f525f60205260405f2096600188541461018f575b60208960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556040519015158152f35b9091929394959697505f600198556040519133835284602084015260606040840152816101bb89611850565b16606084015260248a013590606219018112156102d55789019060a06080840152806101e960048401611850565b166101008401526101fc60248301611850565b166101208301526044810135602219823603018112156102d55701956024600488013597019287116102d55786360383136102d55760209860846102b884936102777f09d18501db0080ca2d6cd7c17fa7255daff4b2d503ea93b76ff68b6752ea8e63976102c89c6060610140890152610160880191612a3b565b6102a961029e61028a6044880185613021565b605f198a8603810160a08c01529491613056565b926064870190613021565b918784030160c0880152613056565b91013560e08301520390a16141c2565b5f8080808080808061015e565b5f80fd5b6024866102e587612c8a565b6040516335252be360e01b815291166004820152fd5b346102d5576003196020368201126102d5576004359067ffffffffffffffff82116102d55760809082360301126102d55761033a606091600401612cde565b90604051921515835260208301526040820152f35b346102d55760403660031901126102d5576001600160a01b03610370611824565b166040516370a0823160e01b8152306004820152602081602481855afa9081156103f5575f916103c3575b50156103ab5760206040515f8152f35b60249060405190633c5bf76960e21b82526004820152fd5b90506020813d6020116103ed575b816103de60209383611934565b810103126102d557518261039b565b3d91506103d1565b6040513d5f823e3d90fd5b346102d55761040e36611cc4565b8394939261041a613236565b610425848633613e0f565b61042e81613784565b15610543578061044261049192873361439d565b9590967f7f9dfa19cf1cc2f806f2f860fbc9c056b601fb1afc0e9b843dfe5c63616268e660806040513381526001600160a01b0384169a8b60208301528560408301526060820152a133613a6b565b959093826104c0575b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b610537966105319560ff936040519860068a5260208a01526040890152606088015260808701521660a08501523360c085015260e084019384604052610505856118fc565b600685526105166101008201612b8b565b61051f85611d71565b5261052984611d71565b503691612a5b565b90613f13565b8080808080808061049a565b6040516306dde9c360e41b81523360048201526001600160a01b038616602482015260448101859052606490fd5b0390fd5b346102d55760203660031901126102d55760043567ffffffffffffffff81116102d5576105316105ac61049a923690600401611c93565b91906105b6613236565b604051926105c384611918565b5f84523691612a5b565b346102d5576003196020368201126102d55767ffffffffffffffff600435116102d55760c090600435360301126102d557610606613236565b5f808061061b60048035608481019101612bc3565b905015610f1057602460043501359261063384613784565b15610efe57606080604051610647816118cc565b61064f612c18565b81525f60208201525f60408201520152610667612c18565b506106c76106c26106a161069761069161068b608460043501600435600401612bc3565b90612c4a565b80612c65565b6040810190612b55565b60206106ba61068b608460043501600435600401612bc3565b013591612c7a565b612c8a565b936001600160a01b036107166106c26106fd6106f361069161068b608460043501600435600401612bc3565b6060810190612b55565b60406106ba61068b608460043501600435600401612bc3565b816040519761072489611894565b1687521660208601526040850152610746608460043501600435600401612bc3565b9490506001604051955f87520160051b85016040525f905f5b610773608460043501600435600401612bc3565b9050811080610eeb575b15610d3857610796608460043501600435600401612bc3565b821015610d24578160051b810135607e19823603018112156102d55760808183013603126102d557604051916107cb836118cc565b8181013567ffffffffffffffff81116102d5576107ed90369084840101611ac5565b835280820160208181013590850152604080820135908501526060013567ffffffffffffffff81116102d5576108269236920101611c78565b606082015280516001600160a01b036108486040830151602085015190611d91565b5151166001600160a01b0385511614801590610cf0575b610cde5761087760208301516040840151908361429a565b61088081613278565b91825f525f60205260405f2054155f146108e4575051604080513381526001600160a01b039092166020830152810191909152600191907fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f390606090a15b0161075f565b919061091560208497959701516040850151906060860151906040519261090a84611918565b5f84523391866134e2565b5f949161097e57505051604080513381526001600160a01b03909216602083015281019190915260019291907f1e6fa9678edf81f9f25bbf308bde03ad3e110db1f429394b0915ba021532941490606090a15b8115610976575b50926108de565b90508861096f565b610993606082015160446004350135906137a7565b156109ed57505051604080513381526001600160a01b03909216602083015281019190915260019291907fe3151dc8cb7a54ffc4baabd28c1f241c94d510b5e5b502491ac3cad6c16316d59080606081015b0390a1610968565b6109fa6040820151613784565b158015610ccb575b15610a5857505051604080513381526001600160a01b03909216602083015281019190915260019291907f500b713857325f9e6dcb52ae832eca9109d107ed1aae9cb4928b4c1e13f051aa9080606081016109e5565b9250925050600196959691610a71606460043501612c9e565b15610c385796610ae197610af160408401516040880151610a9281836137f1565b15610c305750925b610aeb848592610ad4610ace60608a01516001600160e01b03601b918660e01d92828816810b928260e01d9216900b6148ea565b9061485f565b9d8e9260408d0151613818565b60408c0152614373565b99614373565b98610afc8484613842565b610b0684826138a0565b60405192338452608060208501526060610b2c8451608080880152610100870190611dec565b93602081015160a0870152604081015160c0870152015192607f198582030160e0860152835180825260208201906020808260051b8501019601925f5b828110610bc857505050505092806001979695937fbae4dbf76931c547f765e9def16d693d86daaa596f491de979008831789185ae93610bc396604084015260608301520390a180858c5101808d5260051b8c0152613b57565b610968565b9091929396602080610c23600193601f198782030189528b51906001600160a01b03825116815283820151848201526060610c126040840151608060408501526080840190612cab565b920151906060818403910152611d10565b9901950193929101610b69565b905092610a9a565b610ae190610af16060840151610aeb610c76610ace60408801516001600160e01b0394601b90868360e01d9316820b91878260e01d9216900b6148ea565b60408a0151610c8581836137f1565b15610cc35750915b829c8d916060890151908116155f14610cb4575060408801515b96879460408d0151613818565b610cbe90856142cf565b610ca7565b905091610c8d565b50610cd960608201516137ce565b610a02565b60405163936bb5ad60e01b8152600490fd5b506001600160a01b03610d0c6060830151604085015190611d91565b5151166001600160a01b03602086015116141561085f565b634e487b7160e01b5f52603260045260245ffd5b50919390610d4a606460043501612c9e565b15610ee557835b6004356004013590610d6382826137f1565b610ec75750508490610d83856001600160a01b0360208701511633613ea1565b505060a46004350190610d9b82600435600401612b22565b905015159081610ebf575b50610e1e575b506001600160a01b03610dc2929351163361439d565b50505b8351811015610dea5780610de4610dde60019387611d91565b516139cb565b01610dc5565b5060409160017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005582519182526020820152f35b90506001600160a01b03602084015116610e486001600160a01b0385511692600435600401612b22565b929091333b156102d557610e905f93604051958694859463691f9ed760e01b8652600486015260248501528960448501528a606485015260a0608485015260a4840191612a3b565b038183335af19081156103f557859115610dac579050610eb091506118e8565b5f836001600160a01b03610dac565b905088610da6565b604492506040519163573b6f4160e01b835260048301526024820152fd5b84610d51565b50610ef96040830151613784565b61077d565b60405163315f9e2360e21b8152600490fd5b604051639c95219f60e01b8152600490fd5b346102d5576020806003193601126102d55760043567ffffffffffffffff81116102d557610f54903690600401611c93565b919060405192610f6384611918565b5f8452828401610f7282611a18565b94610f806040519687611934565b828652610f8c83611a18565b93610f9e86880195601f190186612ba7565b5f5b84811061100257604080518881528951818a018190525f92600582901b83018101918a918c9085015b828710610fd65785850386f35b909192938280610ff2600193603f198a82030186528851611d10565b9601920196019592919092610fc9565b806110518861104b61101e60019560059d9c9d1b870187612b22565b929089846040519586938585013782018381015f81528b519283915e015f83820152038084520182611934565b30614209565b61105b828a611d91565b526110668189611d91565b5001969596610fa0565b346102d5576003196040368201126102d55760043567ffffffffffffffff8082116102d55760c0826004019383360301126102d5576024359081116102d5576110bd903690600401611c93565b6110c8929192613236565b6110f96110f46110ef6110e86110de8880612b0d565b6040810190612b22565b3691611956565b614144565b6141ad565b801561134e576001101561133c5760248201926111168486612b55565b90501561132a57604483019361112c8587612b55565b9050156113185761119261115a9561118661115161114a8a80612b0d565b948a612b55565b9890928a612b55565b9190926111776040519661116d88611864565b33885236906119ba565b9960209a8b8801523691611a30565b60408501523691611a30565b6060820152606484013560808201526111aa81613278565b90815f525f865260405f209485541595866111ee575b878760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055604051908152f35b6001905560a46001600160a01b03917f87491344dfbcf91f6cbbc610cbbeedc85313d37a02df0c93527f7ea5f8db717f83855116604051908152868b82015260606040820152806112426060820188611dec565b0390a10191611251838a612b22565b9050611274575b505050611267939495506141c2565b81908380808080806111c0565b6112816110e8848b612b22565b61128a816148c6565b156112f55750976112c87fd46c2c56b35c8210e9e712ec3f02242d5fc90187c0ac8ed80cc33626846ec369936112e893611267999a9b511692612b22565b92906040519384938452868c850152606060408501526060840191612a3b565b0390a18594938780611258565b88610571604051928392630c89984b60e31b845260048401526024830190611d10565b60405163540e5f0b60e01b8152600490fd5b604051636c44ef8f60e01b8152600490fd5b604051633c8270bd60e21b8152600490fd5b604051632cff108b60e21b8152600490fd5b346102d5576020806003193601126102d5576024816001600160a01b03611385611824565b16604051928380926370a0823160e01b82523060048301525afa9081156103f5575f916113b6575b50604051908152f35b90508181813d83116113dc575b6113cd8183611934565b810103126102d55751826113ad565b503d6113c3565b346102d5576113f136611cc4565b6113f9613236565b611404848633613e0f565b61140d83613784565b1561154a5761141d8486336130a6565b61142781856137f1565b15611544575082935b61143c85828833613e43565b9690947f8045c25080b0868951141ed0a91720bcad09a8364a2b3109ee1fd49c1f0bc8b860c061146d898533613ea1565b94906001600160a01b0360405192338452169a8b6020840152876040840152856060840152608083015260a0820152a1836114c85760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b611537976105319660ff946040519960078b5260208b015260408a01526060890152608088015260a08701521660c08501523360e085015261010084019384604052611513856118fc565b600685526115246101208201612b8b565b61152d85611d81565b5261052984611d81565b808080808080808061049a565b93611430565b604051623a3a4d60e21b81523360048201526001600160a01b038616602482015260448101859052606490fd5b346102d55760803660031901126102d5576004356001600160a01b03908181168091036102d5576115a661183a565b6044359167ffffffffffffffff916064358381116102d557366023820112156102d55780600401359384116102d55736602485830101116102d5576116339560209216936115f5868587613d30565b60405196879283926323e30c8b60e01b84523360048501528760248501528860448501525f606485015260a06084850152602460a485019201612a3b565b03815f855af19384156103f5575f9461169f575b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd984036116865761167b93503091613da9565b602060405160018152f35b604051630b6c58a960e31b815260048101859052602490fd5b9093506020813d6020116116cb575b816116bb60209383611934565b810103126102d557519284611647565b3d91506116ae565b346102d5576101403660031901126102d55767ffffffffffffffff6004358181116102d557611706903690600401611ac5565b6024358281116102d55761171e903690600401611ac5565b60c03660431901126102d557610104358381116102d557611743903690600401611c78565b90610124359384116102d55761176061049a943690600401611c78565b92611769613236565b611e9d565b346102d55760603660031901126102d557602061179d61178c611824565b61179461183a565b604435916130a6565b604051908152f35b346102d55760203660031901126102d5576004355f525f6020526020600160405f205414604051908152f35b346102d55760203660031901126102d5576004359063ffffffff60e01b82168092036102d55760209163e414309160e01b8114908115611813575b5015158152f35b6301ffc9a760e01b1490508361180c565b600435906001600160a01b03821682036102d557565b602435906001600160a01b03821682036102d557565b35906001600160a01b03821682036102d557565b60a0810190811067ffffffffffffffff82111761188057604052565b634e487b7160e01b5f52604160045260245ffd5b6060810190811067ffffffffffffffff82111761188057604052565b6040810190811067ffffffffffffffff82111761188057604052565b6080810190811067ffffffffffffffff82111761188057604052565b67ffffffffffffffff811161188057604052565b60e0810190811067ffffffffffffffff82111761188057604052565b6020810190811067ffffffffffffffff82111761188057604052565b90601f8019910116810190811067ffffffffffffffff82111761188057604052565b92919267ffffffffffffffff82116118805760405191611980601f8201601f191660200184611934565b8294818452818301116102d5578281602093845f960137010152565b9080601f830112156102d5578160206119b793359101611956565b90565b91906060838203126102d557604051906119d382611894565b81936119de81611850565b83526119ec60208201611850565b602084015260408101359167ffffffffffffffff83116102d557604092611a13920161199c565b910152565b67ffffffffffffffff81116118805760051b60200190565b929192611a3c82611a18565b604092611a4c6040519283611934565b819581835260208093019160061b8401938185116102d557915b848310611a7557505050505050565b85838303126102d5578386918251611a8c816118b0565b611a9586611850565b81528286013583820152815201920191611a66565b9080601f830112156102d5578160206119b793359101611a30565b91909160a0818403126102d55760405190611adf82611864565b8193611aea82611850565b835267ffffffffffffffff9160208101358381116102d55782611b0e9183016119ba565b602085015260408101358381116102d55782611b2b918301611aaa565b604085015260608101359283116102d557611b4c6080939284938301611aaa565b60608501520135910152565b90929192611b6581611a18565b91604094611b766040519485611934565b839583855260208095019160059460051b8401948186116102d55784935b868510611ba5575050505050505050565b67ffffffffffffffff9085358281116102d5578701906080828603126102d5578551611bd0816118cc565b611bd983611850565b81528a8301358b820152868301358481116102d557830186601f820112156102d557803590611c0782611a18565b91611c148a519384611934565b8083528d80840191891b830101918983116102d5578e809101915b838310611c685750505050878201526060808401359485116102d557611c59878d9687960161199c565b90820152815201940193611b94565b82358152918101918f9101611c2f565b9080601f830112156102d5578160206119b793359101611b58565b9181601f840112156102d55782359167ffffffffffffffff83116102d5576020808501948460051b0101116102d557565b9060806003198301126102d5576004356001600160a01b03811681036102d5579160243591604435916064359067ffffffffffffffff82116102d557611d0c91600401611c93565b9091565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b805115610d245760200190565b805160011015610d245760400190565b805160021015610d245760600190565b805160031015610d245760800190565b805160041015610d245760a00190565b805160051015610d245760c00190565b8051821015610d245760209160051b010190565b9081518082526020808093019301915f5b828110611dc4575050505090565b835180516001600160a01b031686528201518583015260409094019392810192600101611db6565b90608080611e62611e50611e3e60406001600160a01b0380895116885260208901519060a060208a01528082511660a08a015260208201511660c08901520151606060e0880152610100870190611d10565b60408701518682036040880152611da5565b60608601518582036060870152611da5565b93015191015290565b90611e7582611a18565b611e826040519182611934565b8281528092611e93601f1991611a18565b0190602036910137565b926001600160a01b038451166001600160a01b0383511614612a29576001600160a01b03611ed2606086015160643590611d91565b5151166001600160a01b03611eee604085015160843590611d91565b515116148015906129e9575b610cde576001600160a01b03611f17604086015160443590611d91565b5151166001600160a01b03611f326064356060880151611d91565b515116146129d757611f4384613278565b805f525f60205260405f2054156129875750611f5e82613278565b805f525f60205260405f20541561293757506122ce907f6fa7f4c28634b0a9d6831401c45ae468195fb63aed07308935c35374ff5d9e3960405180611fc1611fb361012033845280602085015283018a611dec565b828103604084015287611dec565b6044356060830152606435608083015260843560a083015260a43560c083015260c43560e083015260e4356101008301520390a161223a6001600160a01b03845116916040519261201184611918565b5f845261201c6132a9565b506040519061202a826118fc565b6006825261203a60208301612b8b565b61204389613278565b906001600160a01b038a511660405192600384526020840152604083015260608201526080810160405261207682611d34565b5261208081611d34565b5060405161208d81611894565b6002815260403660208301376120a282611d41565b526120ac81611d41565b506121806120d36001600160a01b036120cb60443560408d0151611d91565b515116614468565b6121196001600160a01b038b51168b60206121106001600160a01b036120ff6044356040860151611d91565b515116926040604435910151611d91565b510151916130a6565b908a60ff602061214b6001600160a01b0361213a6044356040870151611d91565b515116936040604435910151611d91565b51015192169093929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b61218982611d51565b5261219381611d51565b506122216121b26001600160a01b036120cb60643560608d0151611d91565b6121ef6001600160a01b038b51168b60206121106001600160a01b036121de6064356060860151611d91565b515116926060606435910151611d91565b908a60ff602061214b6001600160a01b036122106064356060870151611d91565b515116936060606435910151611d91565b61222a82611d61565b5261223481611d61565b50614546565b905f6001600160a01b038751169160208801516001600160a01b0360208183511692015116918484523060205260408420604060208c015101516040519161228183611918565b86835260405195612291876118fc565b86526020860152604085015284606085015286608085015260a084015260c0830152604051808097819463d04dfe2360e01b83526004830161342a565b03915afa92835f915f95612919575b506122ed576040513d5f823e3d90fd5b92918351600281106128d357506040602085015194015161231661231083611d71565b51611d61565b5161232181836137f1565b156129115750935b61234b8186919060405192600284526020840152604083015260608201604052565b61235483611d51565b5261235e82611d51565b506040519461236c866118fc565b888652606435602087015260408601526060850152608084015260a083015260c082015261256e6001600160a01b0385511693604051946123ac86611918565b5f86526123b76132a9565b50604051906123c5826118fc565b600682526123d560208301612b8b565b6123de86613278565b906001600160a01b0387511660405192600384526020840152604083015260608201526080810160405261241182611d34565b5261241b81611d34565b5060405161242881611894565b60028152604036602083013761243d82611d41565b5261244781611d41565b506124d16124666001600160a01b036120cb60843560408a0151611d91565b6124a16001600160a01b038851166001600160a01b0361248c60843560408c0151611d91565b515116602061211060843560408d0151611d91565b906001600160a01b036124ba60843560408b0151611d91565b51511660ff602061214b60843560408d0151611d91565b6124da82611d51565b526124e481611d51565b506122216125036001600160a01b036120cb60a43560608a0151611d91565b61253e6001600160a01b038851166001600160a01b0361252960a43560608c0151611d91565b515116602061211060a43560608d0151611d91565b906001600160a01b0361255760a43560608b0151611d91565b51511660ff602061214b60a43560608d0151611d91565b926126045f6001600160a01b038551169260208601908151906001600160a01b03602081845116930151169286855230602052604080862091510151604051916125b783611918565b868352604051956125c7876118fc565b86526020860152604085015284606085015289608085015260a084015260c0830152604051808095819463d04dfe2360e01b83526004830161342a565b03915afa90815f915f936128eb575b50612623576040513d5f823e3d90fd5b908151600281106128d357506040602083015192015161264561231088611d71565b5161265081836137f1565b156128cb5750925b61267a8385919060405192600284526020840152604083015260608201604052565b61268388611d51565b5261268d87611d51565b506040519661269b886118fc565b86885260a43560208901526040880194855260608801938452608088015260a087015260c08601526126d06040840151613784565b159182156128b7575b5081156128a2575b8115612891575b5061287f57604051916126fa836118cc565b5f83525f60208401525f60408401525f606084015261271984836147d7565b8452604084015261273f61272d83866147d7565b60208601528060608601528451613818565b946127536020850151604086015190613818565b9361275d876137ce565b8015612870575b61285e57612825612857957fd9fa84dd790c969daa5c33d8050dc06b4a9b59d5b42e2be5f5e8ae20447f618d9461280761285c9a60a0966127a68a8851613842565b6127b48c6020890151613842565b6127c28a60408901516138a0565b6127d08c60608901516138a0565b6127d98a6139cb565b6127e28c6139cb565b6001600160a01b036127fe60c435926060606435910151611d91565b51511633613a6b565b50506001600160a01b036127fe60e43592606060a435910151611d91565b5050606060405191338352805160208401526020810151604084015260408101518284015201516080820152a1613b57565b613b57565b565b604051630d86822160e01b8152600490fd5b5061287a856137ce565b612764565b6040516321badf1f60e01b8152600490fd5b61289c9150516137ce565b5f6126e8565b90506128b160608301516137ce565b906126e1565b6128c391925051613784565b15905f6126d9565b905092612658565b60249060405190630fbb8e5560e21b82526004820152fd5b90925061290a91503d805f833e6129028183611934565b8101906132e6565b915f612613565b905093612329565b90945061293091503d805f833e6129028183611934565b935f6122dd565b9151604080513381526001600160a01b039092166020830152810192909252507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f39250905080606081015b0390a1565b9351604080513381526001600160a01b039092166020830152810194909452507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f392915081905060608101612982565b604051631cd2f1c760e21b8152600490fd5b506001600160a01b03612a03606084015160a43590611d91565b5151166001600160a01b03612a1f604087015160443590611d91565b5151161415611efa565b604051630a98f1f360e21b8152600490fd5b908060209392818452848401375f828201840152601f01601f1916010190565b90929192612a6881611a18565b91604091612a796040519485611934565b839581855260208095019160051b8301938185116102d55783925b858410612aa45750505050505050565b67ffffffffffffffff9084358281116102d55786019083828603126102d5578351612ace816118b0565b82358481116102d55786612ae39185016119ba565b8152898301359384116102d557612afe868b95869501611c78565b83820152815201930192612a94565b903590605e19813603018212156102d5570190565b903590601e19813603018212156102d5570180359067ffffffffffffffff82116102d5576020019181360383136102d557565b903590601e19813603018212156102d5570180359067ffffffffffffffff82116102d557602001918160061b360383136102d557565b5f5b60c08110612b99575050565b606082820152602001612b8d565b5f5b828110612bb557505050565b606082820152602001612ba9565b903590601e19813603018212156102d5570180359067ffffffffffffffff82116102d557602001918160051b360383136102d557565b60405190612c0682611894565b60606040835f81525f60208201520152565b60405190612c2582611864565b5f608083828152612c34612bf9565b6020820152606060408201526060808201520152565b9015610d2457803590607e19813603018212156102d5570190565b903590609e19813603018212156102d5570190565b9190811015610d245760061b0190565b356001600160a01b03811681036102d55790565b3580151581036102d55790565b9081518082526020808093019301915f5b828110612cca575050505090565b835185529381019392810192600101612cbc565b90612cf6610142612cef8480612c65565b3690611ac5565b5f5260205f81526040926001845f2054036130165791612f1991612d7d85855f612e9e612d2683612d3d9a612c65565b612d42878501359182878701359c8d923690611ac5565b61429a565b612d5a612d4f8580612c65565b946060810190612bc3565b9690612d75875196612d6b88611918565b8688523690611ac5565b973691611b58565b90612d866132a9565b50612e67865191612d96836118fc565b60068352612da58a8401612b8b565b88612daf81613278565b988b6001600160a01b039a8b845116908351926003845283015282820152336060820152608081018252612de286611d34565b52612dec85611d34565b508051612df881611894565b6002815281368e830137612e0b86611d41565b52612e1585611d41565b50810160ff8c61214b612e508d80612e32816120cb8b8a51611d91565b97511690612e41898851611d91565b515116846121108a8951611d91565b958d612e5d828751611d91565b5151169451611d91565b612e7082611d51565b52612e7a81611d51565b506122218b886060810160ff8c61214b612e508d80612e32816120cb8b8a51611d91565b918385511693868601918b83519289818551169401511693878652308a52818087209151015190825192612ed184611918565b8784525195612edf876118fc565b86528a8601528d85015284606085015285608085015260a084015260c08301528a5180809a819463d04dfe2360e01b83526004830161342a565b03915afa95865f915f98612ff8575b50612f375788513d5f823e3d90fd5b9593865160028110612fe15750888798998260c09798990151990151612f5f61231085611d71565b51612f6a81836137f1565b15612fd75750998a925b612f968b85919060405192600284526020840152604083015260608201604052565b612f9f86611d51565b52612fa985611d51565b50825196612fb6886118fc565b8752860152840152866060840152608083015260a082015201526001929190565b9050998a92612f74565b6024908a5190630fbb8e5560e21b82526004820152fd5b90975061300f91503d805f833e6129028183611934565b965f612f28565b505f92508291829150565b9035601e19823603018112156102d557016020813591019167ffffffffffffffff82116102d5578160061b360383136102d557565b9190808252602080920192915f905b828210613073575050505090565b909192936001906001600160a01b0361308b87611850565b16815285830135838201526040908101950193920190613065565b82156130db576001600160a01b038091165f52600160205260405f2091165f5260205260405f20905f5260205260405f205490565b9091506130e782614468565b6001600160a01b03809316906040918251946370a0823160e01b86528416938460048701526020928387602481865afa9687156131fd575f97613207575b508361313e6131378361316e9a61522c565b5090614cee565b508651636eb1769f60e11b81526001600160a01b0390941660048501523060248501529297889081906044820190565b0381865afa9687156131fd575f976131cc575b50613137613192916119b79861522c565b5061319d81836137f1565b156131c45750935b5f5260018252825f20905f528152815f20905f8052525f205490614373565b9050936131a5565b96508387813d83116131f6575b6131e38183611934565b810103126102d557955195613137613181565b503d6131d9565b85513d5f823e3d90fd5b96508387813d831161322f575b61321e8183611934565b810103126102d55795519583613125565b503d613214565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0060028154146132665760029055565b604051633ee5aeb560e01b8152600490fd5b6040516132a3816132956020820194602086526040830190611dec565b03601f198101835282611934565b51902090565b604051906132b6826118fc565b606060c0836132c3612c18565b81525f60208201525f60408201525f838201528260808201525f60a08201520152565b91906040838203126102d557825167ffffffffffffffff908181116102d55784019082601f830112156102d557815160209261332182611a18565b9161332f6040519384611934565b808352848084019160051b830101918683116102d55785809101915b8383106133be575050505094828101519182116102d557019180601f840112156102d557825161337a81611a18565b936133886040519586611934565b818552838086019260051b8201019283116102d5578301905b8282106133af575050505090565b815181529083019083016133a1565b825181529181019186910161334b565b90808251908181526020809101926020808460051b8301019501935f915b8483106133fc5750505050505090565b909192939495848061341a600193601f198682030187528a51612cab565b98019301930191949392906133ec565b91906020928381526001600160a01b0382511684820152838201516040820152613464604083015160e06060840152610100830190611d10565b906060830151608082015261348b608084015192601f1993848483030160a08501526133ce565b9260a081015193838382030160c08401528680865192838152019501905f5b8181106134ce575050506119b794955060c060e09101519282850301910152612cab565b8251875295880195918801916001016134aa565b959491939086936134f16132a9565b505f92604061360c815192613505846118fc565b60068452602093613517858201612b8b565b6135d56135238b613278565b8b6001600160a01b03998a9283835116895191600383528b830152898201528360609b168b82015260808101895261355a86611d34565b5261356485611d34565b50875161357081611894565b6002815288368b83013761358386611d41565b5261358d85611d41565b5060ff8961214b8a8501936135c9876135ab816120cb858a51611d91565b975116886135ba848951611d91565b51511685612110858a51611d91565b96612e5d828751611d91565b6135de82611d51565b526135e881611d51565b50612221878b8d60ff8961214b8c8501936135c9876135ab816120cb858a51611d91565b9461368c5f868a511698869786889c0191825191888184511693015116928c8552308952878086209151015188519161364483611918565b868352895195613653876118fc565b86528a86015288850152848a8501528b608085015260a084015260c08301528551808095819463d04dfe2360e01b83526004830161342a565b03915afa90815f915f93613766575b50613759575050505f975b600285511098891599613746578284870151960151906136c861231089611d71565b51906136d482846137f1565b15905061373e5750925b6137008685919060405192600284526020840152604083015260608201604052565b61370988611d51565b5261371387611d51565b5082519b6137208d6118fc565b8c528b0152890152870152608086015260a085015260c08401529190565b9050926136de565b50505050505050505091506119b76132a9565b91999850945093966136a6565b90925061377d91503d805f833e6129028183611934565b915f61369b565b6137a3905f60e01d906001600160e01b038160e01d9116601b0b6152e3565b1290565b906137a3916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b615364565b6137ed905f60e01d906001600160e01b038160e01d9116601b0b6152e3565b1390565b906137ed916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b615364565b6119b791610ace916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b61483a565b61389c91608081018261385e6138588351611d71565b51611d71565b5261389561388f6001600160a01b038094515116936138866138808551611d71565b51611d34565b51169251611d71565b51611d51565b5191613e43565b5050565b906080810191806138b46138588551611d61565b526001600160a01b038092515116916138d06138808551611d61565b51166138df61388f8551611d61565b519081613993576138ef836137ce565b61397a579183917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a9593612982955f5260209060018252613945604094855f20835f528452855f20855f528452855f2054614373565b945f5260018252835f20905f528152825f20915f52525f20555b516040519182913383526040602084015260408301906133ce565b60405163793a8f5560e01b815260048101849052602490fd5b916139c4917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a959361298295613a6b565b505061395f565b608081016139dc61388f8251611d61565b519182156139e957505050565b613a036138806001600160a01b0380935151169351611d61565b5116815f5260209160018352604092835f20835f528152835f20855f528152835f2054936001600160e01b038516613a3e575b505050505050565b613a62955f9284845260018152828420868552815282842091845252812055613ea1565b5f808080613a36565b93929193613a78836137ce565b61397a5784613a9457613a8c939450613ea1565b50505f905f90565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f528152613ad1835f20549485614373565b95613adb876137ce565b613afe575f97885260018252838820908852815282872091875252909320829055565b835163c5e12af560e01b815260048101889052602490fd5b90604082019082526020606081936040838201528551809452019301915f5b828110613b43575050505090565b835185529381019392810192600101613b35565b60c0810151908151915f92613ccb575b50613c0c6020918281510151926001600160a01b039081818187511696015116928660a082019485518252308452604097888320898686510151015160808601518b5191613bb483611918565b8683528c5193613bc385611918565b8785528d5196613bd2886118fc565b8752898701528c86015260016060860152608085015260a084015260c08301528851808099819463d04dfe2360e01b83526004830161342a565b03915afa948515613cc1578795613ca3575b508451613c2f575b50505050505050565b81905101510151169051813b15613c9f57918491849383613c64965180978195829463012c676d60e21b845260048401613b16565b03925af1908115613c965750613c7f575b8080808080613c26565b613c8982916118e8565b613c935780613c75565b80fd5b513d84823e3d90fd5b8480fd5b613cb89195503d8089833e6129028183611934565b9050935f613c1e565b86513d89823e3d90fd5b6001600160a01b03602080845101510151169060a083015190823b156102d557613d0e925f928360405180968195829463012c676d60e21b845260048401613b16565b03925af180156103f55715613b6757613d289192506118e8565b5f905f613b67565b6040519263a9059cbb60e01b5f526001600160a01b0380931660045260245260205f60448180855af160015f5114811615613d8a575b8360405215613d7457505050565b635274afe760e01b835216600482015260249150fd5b6001811516613da057813b15153d151616613d66565b833d5f823e3d90fd5b9092604051936323b872dd60e01b5f526001600160a01b0393848092166004521660245260445260205f60648180855af160015f5114811615613df9575b836040525f60605215613d7457505050565b6001811516613da057813b15153d151616613de7565b909115613e1a575050565b6040516305dbdfd960e41b81526001600160a01b03918216600482015291166024820152604490fd5b93929193613e50836137ce565b61397a5784613e6457613a8c93945061439d565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f528152613ad1835f20549485613818565b90929192613eae81614869565b93613eb8816137ce565b613f015784816001600160e01b03613ed79360e01d9116601b0b61548e565b50809281613ee7575b5050509190565b6001600160a01b03613ef99316613d30565b5f8181613ee0565b604051632d1671a360e11b8152600490fd5b919091604092835192613f25846118fc565b60068452602094613f37868601612b8b565b5f5b8451811015613f6c5780613f4f60019287611d91565b51613f5a8289611d91565b52613f658188611d91565b5001613f39565b50925092939093335f52308252825f2091835195613f89876118b0565b613f91612bf9565b875260608281980152845190613fa682611918565b5f8252855190613fb582611918565b5f82525f3681375f5b815181101561411a57898688613fd48486611d91565b51888151948d80870151908151613ff6575b5050505050505050600101613fbe565b905f92916001600160a01b039661401b8887818d51169c015116998789015190614546565b958251996140288b6118fc565b8a5289015287015285015260808401528760a08401528660c08401525f8c51809563d04dfe2360e01b8252818061406360049889830161342a565b03915afa938415614110579089915f956140f2575b50845161408e575b50899250808e8c938e613fe6565b5101511691823b156102d5576140bc925f92838d5180968195829463012c676d60e21b845233908401613b16565b03925af180156140e85790600192916140d9575b81928782614080565b6140e2906118e8565b5f6140d0565b89513d5f823e3d90fd5b6141079195503d805f833e6129028183611934565b9050935f614078565b8c513d5f823e3d90fd5b50505050505050509050565b8115614130570490565b634e487b7160e01b5f52601260045260245ffd5b60408151106141a0576020810151908051603f19810190811161418c5760051c82116141785760016020920160051b010190565b505060405161418681611918565b5f815290565b634e487b7160e01b5f52601160045260245ffd5b5060405161418681611918565b8051156141bd57602001515f1a90565b505f90565b61285c92916141ed610531923390919060405192600284526020840152604083015260608201604052565b9260405193600185526020850152604084016040523691612a5b565b905f8091602081519101845af48080614287575b1561423d5750506040513d81523d5f602083013e60203d82010160405290565b1561426457604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b3d15614275576040513d5f823e3d90fd5b60405163d6bda27560e01b8152600490fd5b503d15158061421d5750813b151561421d565b916142c59060606142ba936001600160a01b039485916040880151611d91565b515116940151611d91565b515116146129d757565b6142f66001600160e01b0392838316601b0b9260e01d938160e01d9116601b0b8484614aa5565b90637ffffff58213614346575b9061430d91614cee565b929092158061433e575b61432057505090565b6044925060405191638eba4d0760e01b835260048301526024820152fd5b508215614317565b61435082826159b7565b1561430357604483856040519163d556b11160e01b835260048301526024820152fd5b6119b791610ace916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b615093565b9291926143a982614869565b936143b3816137ce565b6144145784816001600160e01b036143d29360e01d9116601b0b61548e565b92908093156143ff575b508290816143eb575050509190565b613ef9926001600160a01b03309216613da9565b9092505f19811461418c57600101915f6143dc565b604051632eaefac360e21b8152600490fd5b6004111561443057565b634e487b7160e01b5f52602160045260245ffd5b602090939291936001600160a01b03604082019516815261446483614426565b0152565b6144706159d0565b60408051630782d7e160e01b81526001600160a01b03831660048201529091828260248173200e12d10bb0c5e4a17e7018f0f1161919bb93895afa92831561453d575f925f94614508575b506144c583614426565b6001831415806144f6575b6144da5750505090565b5163ee07877f60e01b8152918291610571919060048401614444565b5061450083614426565b8215156144d0565b9080945061452c9293503d8511614536575b6145248183611934565b810190615202565b919091925f6144bb565b503d61451a565b513d5f823e3d90fd5b6145508251611e6b565b61455a8351611e6b565b9282519281518015155f146147cf57600201935b6001940184019061457e82611a18565b956145996040936145918551998a611934565b808952611a18565b6145ab602091601f1901828a01612ba7565b5f9584519389896002926002885233868901523089890152606097606081018a526145d584611d34565b526145df83611d34565b505f825b61478f575b5050505086516145ff575b50505050505050505090565b909192936002886146228c8661461b8e809c9d9e018093611d91565b528d611d91565b50018561462f828d611d91565b5261463a818c611d91565b505f965b614649575b506145f3565b885187101561478a576001600160a01b036146f5898b856146ec8c60428c886146728488611d91565b515116968582614682868a611d91565b51015192614690868a611d91565b51838d82511691015182815160051b910120908451927f6ec4dff745ec96dbde88c5d41f8aa5ac13aa1664afb47b8406b44fa945a650c88452830152838201522090519161190160f01b83528d83015260228201522093611d91565b5101519161525a565b1561477257876147618b8e8c8f9e9d9c9b9a999897968f61474e918d614744898f8f61473083889f614727828f611d91565b51511692611d91565b5261473b828b611d91565b51015192611d91565b52019c8d94611d91565b51015161475b8383611d91565b52611d91565b50019697989590919293949561463e565b8851630a57f30960e31b815260048101899052602490fd5b614643565b9091929a82518210156147c757906147bb84809301809d6147b08487611d91565b5161475b8383611d91565b50019082918d936145e3565b9a92916145e8565b505f9361456e565b9160408301926040614811610ace606087519401938451906001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6148ea565b945193016148208151866137a7565b614828575050565b9093506119b7919250519251836142cf565b919291600160ff1b840161485257611d0c93506153b9565b90611d0c935f0391615093565b61430d8282614cee565b6148716159d0565b6040805163b7bad1b160e01b81526001600160a01b0383166004820152909182826024815f73200e12d10bb0c5e4a17e7018f0f1161919bb93895af192831561453d575f925f9461450857506144c583614426565b60088151106141bd576008015167ffffffffffffffff1667ff0a89c674ee78741490565b9091939284158215175f146149045750505090505f905f90565b82810192600160fd1b8082019083011760fe1c614a3b575b50506149278161567c565b936149318161567c565b9461493c868261569c565b90918215614a2c575f9083986f0785ee10d5da46d900f436a000000000808611614a1e575b50670de0b6b3a7640000808b11614a0f575b50633b9aca00808b11614a00575b50612710808b116149f2575b5098805b6149e157508190611d0c989982600a0a9109960195817fcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccd0a93838211900382610100031b9203901c1702916156af565b60019290920191600a900480614991565b60049a04998a93019261498d565b600991939a049901915f614981565b601291939a049901915f614973565b85049950602592505f614961565b50929050611d0c9495506156af565b5f821215614a8f57808413614a81575b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb284131561491c57909250611d0c9394916155ba565b909250611d0c939491615621565b80841215614a4b57909250611d0c9394916155ba565b92909180614acb576044848460405191637a97930f60e01b835260048301526024820152fd5b90919280155f14614ae057505050505f905f90565b614af993614aed91615769565b92919490938492615769565b9093919284614b078861567c565b91614b118661567c565b947f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000094604c91868810614cb8575b030191600160ff1b98838a018112155f14614c85575050035b5f955f821280614c7c575b614c5e575b5f811280614c4c575b614c2e5786820103966001600160ff1b0388149081614c24575b5080614c1b575b80614c12575b614bf4575090614ba89291615915565b915f8113614bbb575b50611d0c936156af565b9091604c8213614be957614bd291600a0a90614126565b908115614bdf575f614bb1565b505050505f905f90565b50505050505f905f90565b876044916040519163d556b11160e01b835260048301526024820152fd5b505f8512614b98565b50828414614b92565b905088145f614b8b565b604489836040519163d556b11160e01b835260048301526024820152fd5b50806001600160ff1b03018213614b71565b9550808701861315614c765786818703015b95614b68565b5f614c70565b505f8113614b63565b89985090920390506001600160ff1b0381900387018213614ca95701860194614b58565b5050505050505050505f905f90565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009650604b9250614b3f565b8115614130570590565b8082601b82810b8314614ee3577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000008405614e8f575b8380820b03614e7e57507b199999999999999999999999999999999999999999999999999999987b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc84011115614e2f575b838060030b03614db3575b808413614d975750506001600160e01b036001925b60e01b91161791565b8303600a0a8015614130576001600160e01b0391071592614d8e565b92915f841315614e03575090614dc983836159b7565b614de557637ffffffe1901600a0a810290637fffffff92614d79565b506044916040519163d556b11160e01b835260048301526024820152fd5b637fffffff199283039060438213614be957614e2291600a0a90614ce4565b918215614bdf5792614d79565b5f198401808060030b14614e435750614d6e565b90506001600160e01b039293507b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff915060e01b9260ff1d181617905f90565b600190940193600a90930592614d21565b937f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000840515614ed0576305f5e100600894058094819201955b915050614d21565b620186a060059405809481920195614ec8565b5082614d6e57505050505f90600190565b919291600160ff1b9190801580615081575090614f1091615769565b9490929091905f868585858282138015615078575b61505b575b505050508682841860ff1c94860391039081604c0381116150405701600a0a808205919084615026575b505081019182821860ff1c111561501e57826001600160ff1b031461500057905f600192135f14614fd157600a9004915b01925b81158117614f9557509190565b80614fae575b508015614fa6579190565b505f91508190565b9192614fc49203600160ff1b01600a0a90614ce4565b600160ff1b91905f614f9b565b600a60037fe6666666666666666666666666666666666666666666666666666666666666679201040191614f85565b604490836040519163d556b11160e01b835260048301526024820152fd5b509092614f88565b8107615033575b80614f54565b60ff1d600117015f61502d565b50505091935061504e579190565b60018160ff1d1790039190565b5f9a50909750909550600160ff1b94509250905086808080614f2a565b50835f12614f25565b1561508c5750509190565b9350919050565b93929193841581158181176151e4575050906150ae91615769565b91949082956150bf82958294615769565b80969294919693878684821380156151db575b6151c2575b5050505050508682841860ff1c94860391039081604c0381116150405701600a0a8082059190846151a8575b505081019182821860ff1c11156151a057826001600160ff1b031461500057905f600192135f1461517157600a9004915b01925b8115811761514457509190565b8061515457508015614fa6579190565b600160ff1b9361516b9291038401600a0a90614ce4565b5f614f9b565b600a60037fe6666666666666666666666666666666666666666666666666666666666666679201040191615134565b509092615137565b81076151b5575b80615103565b60ff1d600117015f6151af565b929b5098509196509450925090505f80808080806150d7565b508584126150d2565b93959390929190156151fa575050614fa6579190565b945092915050565b91908260409103126102d557815160048110156102d55760209092015160ff811681036102d55790565b9060ff165f03916001600160ff1b0382115f1461525257600a6001818404940192061590565b909190600190565b9091813b6152955761526c9192615a39565b5061527681614426565b15918261528257505090565b6001600160a01b03918216911614919050565b6020918160645f935160405192630b135d3f60e11b9788855260048501526040602485015286820190604485015e8281018201859052601f01601f191601915afa905f5114601f3d11161690565b92915f9060018184145f8712871517171761535d575f9280821361534f575b03604c81135f82121761534357600a0a90846153218382029384614ce4565b1461533657505015615332575f9190565b5f90565b90935090156119b7579190565b505015615332575f9190565b5f9560019450925090615302565b5050505f90565b93929190918083145f83125f871218831587151717176153b3575f928082136153a65703604c81135f82121761534357600a0a90846153218382029384614ce4565b9194600193509190615302565b50919050565b909291600160ff1b9182810161544b575080841461544157808413918215615439578185035b604c8111156154285750505f915b1561541957507f8000000000000000000000000000000000000000000000000000000000000001019190565b92506001600160ff1b03039190565b600a0a9081156141305704916153ed565b8482036153df565b505090505f905f90565b9361545892945f03614ef4565b8093918092811461546c575b50505f039190565b915092506001600160ff1b03831461500057600a600191059201915f80615464565b91925f8312156154b6576044838360405191634a7d166b60e01b835260048301526024820152fd5b9192836154c857505090505f90600190565b60ff8116820191808312615590575f831215615500575050604c198112614fa6575f03600a0a916154f98382614126565b9283021490565b909293915f81135f1461558657604d811361555b57600a0a92831561413057835f190483116155325750500290600190565b60405163c849483b60e01b815260048101849052602481019290925260ff166044820152606490fd5b5060405163c849483b60e01b81526004810192909252602482015260ff919091166044820152606490fd5b5050905090600190565b60405163c849483b60e01b815260048101869052602481019190915260ff82166044820152606490fd5b909392915f6155ca9181846148ea565b9490945f8483019182019412159081615617575b811561560d575b506155ef57505090565b604492506040519163d556b11160e01b835260048301526024820152fd5b905083125f6155e5565b82811291506155de565b61563693600160fe1b908101939201906148ea565b9081815f82121561566d575050604b198212613a8c5761565b915f03600a0a90614ce4565b9081615665575f90565b600160ff1b90565b93600160ff1b90910192509050565b5f8112156119b757600160ff1b90808203615695575090565b90505f0390565b905f198183099102908180821091030391565b92939291905f8184181215615744576001600160ff1b03928383111561572e57600160ff1b938385036156e457505050509190565b909192935085146156fe575050600a600191045f03920190565b604051630ed8062160e21b8152600481019190915260248101919091526044810182905260648101849052608490fd5b5090915050600160ff1b811461418c575f039190565b90916001600160ff1b0380841115613ee05785146156fe575050600a60019104920190565b919091801561590b57827f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000080830515615819575b507f19999999999999999999999999999999999999999999999999999999999999997f0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc83011061580a575b83136157f45791905f90565b919060018060ff1b926001600160ff1b03030190565b9290600a02905f1901926157e8565b6f4b3b4ca85a86c47a098a224000000000808405156158f9575b507728c87cb5c89a2571ebfdcb54864ada834a000000000000008305156158e2575b7b097edd871cfda3a5697758bf0e3cbb5ac5741c6400000000000000008305156158ce575b7e3899162693736ac531a5a58f1fbb4b746504382ca7e40000000000000000008305156158be578205156158af575b5f61579d565b9290600a02905f1901926158a9565b939160640291600119019361587a565b93916402540be4000291600919019361587a565b9391678ac7230489e8000002916012190193615855565b6025198301955092909202915f615833565b505f915081908190565b90915f198383099280830292838086109503948086039584871015615993571461598b579082910960018219018216809204600280826003021880830282030280830282030280830282030280830282030280830282030280920290030293600183805f03040190848311900302920304170290565b505091500490565b60648386866040519263362ced0960e11b8452600484015260248301526044820152fd5b6119b791905f8112156159cb575f03615a73565b615a73565b73200e12d10bb0c5e4a17e7018f0f1161919bb9389803b158015615a0e575b6159f65750565b602490604051906373e6d7b360e01b82526004820152fd5b507f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d41813f14156159ef565b8151919060418303615a6957615a629250602082015190606060408401519301515f1a90615b02565b9192909190565b50505f9160029190565b90637ffffff5811315615afc57637ffffffe1981019060438213615af5575f821215615ac957637fffffff91505f0301600a0a7b8000000000000000000000000000000000000000000000000000000202111590565b50600a0a8015614130577b80000000000000000000000000000000000000000000000000000001041090565b5050151590565b50505f90565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411615b79579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa156103f5575f516001600160a01b03811615615b6f57905f905f90565b505f906001905f90565b5050505f91600391905600000000000000000000000000000000000000000000000000000000000000000000000000000000200e12d10bb0c5e4a17e7018f0f1161919bb93890000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000044b608060405234801561000f575f80fd5b506004361061004a575f3560e01c80630782d7e11461004e57806354636d2b14610078578063b7bad1b11461009d578063f5c36eaf146100b0575b5f80fd5b61006161005c366004610363565b6100c3565b60405161006f929190610403565b60405180910390f35b61008b610086366004610363565b6100d8565b60405160ff909116815260200161006f565b6100616100ab366004610363565b6100e9565b61008b6100be366004610363565b6100f5565b5f806100cf5f84610100565b91509150915091565b5f6100e35f836101f0565b92915050565b5f806100cf5f84610281565b5f6100e35f83610356565b73ffffffffffffffffffffffffffffffffffffffff81165f9081526020838152604080832081518083019092525460ff8082161515835261010090910416818301527f313ce56700000000000000000000000000000000000000000000000000000000808452839283908190816004818a5afa915060203d1015610182575f91505b811561019857505f5160ff811115610198575f91505b816101af57505050602001516003925090506101e9565b83516101c3575f955093506101e992505050565b836020015160ff1681146101d85760026101db565b60015b846020015195509550505050505b9250929050565b5f805f6101fd8585610281565b909250905060018260038111156102165761021661039d565b1415801561023557505f8260038111156102325761023261039d565b14155b156102795783826040517fee07877f000000000000000000000000000000000000000000000000000000008152600401610270929190610421565b60405180910390fd5b949350505050565b5f805f8061028f8686610100565b90925090505f8260038111156102a7576102a761039d565b0361034b576040805180820182526001815260ff838116602080840191825273ffffffffffffffffffffffffffffffffffffffff8a165f908152908b9052939093209151825493517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009094169015157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff161761010093909116929092029190911790555b909590945092505050565b5f805f6101fd8585610100565b5f60208284031215610373575f80fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114610396575f80fd5b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b600481106103ff577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b9052565b6040810161041182856103ca565b60ff831660208301529392505050565b73ffffffffffffffffffffffffffffffffffffffff831681526040810161039660208301846103ca56000000000000000000000000000000000000000000"; diff --git a/src/generated/candidate/GenericPoolRaindexV6FlashBorrower.sol b/src/generated/candidate/GenericPoolRaindexV6FlashBorrower.sol index d542a9a233..9fbf5f4847 100644 --- a/src/generated/candidate/GenericPoolRaindexV6FlashBorrower.sol +++ b/src/generated/candidate/GenericPoolRaindexV6FlashBorrower.sol @@ -5,23 +5,23 @@ pragma solidity ^0.8.25; // THIS FILE IS AUTOGENERATED BY THE BUILD SCRIPT. DO NOT EDIT BY HAND. /// @dev Hash of the known bytecode. -bytes32 constant BYTECODE_HASH = bytes32(0xd38a01ef5cb6a483c623ddc8df033838d8c146b756ad87c99e97d0a10d29a514); +bytes32 constant BYTECODE_HASH = bytes32(0x7340fb357856d8c66c3e9840d3f788868ca9c77af7c85743bd3d44e5fc732bd5); /// @dev The deterministic deploy address of the contract when deployed via /// the Zoltu factory. -address constant DEPLOYED_ADDRESS = address(0x1fc14F5F8B22a7dEC2Da3E76c065f5364855904e); +address constant DEPLOYED_ADDRESS = address(0x93b614F37dc1cf90D58adca29289e2B9f903bB5D); /// @dev The creation bytecode of the contract. bytes constant CREATION_CODE = - hex"6080604052348015600e575f80fd5b5060017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055612ebb806100405f395ff3fe608060405260043610610034575f3560e01c806301ffc9a71461003d57806323e30c8b146100715780634bacdc9d1461009e57005b3661003b57005b005b348015610048575f80fd5b5061005c610057366004611ac5565b6100b1565b60405190151581526020015b60405180910390f35b34801561007c575f80fd5b5061009061008b366004611b4e565b6100e7565b604051908152602001610068565b61003b6100ac366004611bc5565b610204565b5f6001600160e01b031982166323e30c8b60e01b14806100e157506301ffc9a760e01b6001600160e01b03198316145b92915050565b5f3373531167691b4f37f0266e226d03412c77fb2977ce1461012257604051625e1e6f60e51b81523360048201526024015b60405180910390fd5b6001600160a01b0387163014610156576040516322c7df1960e21b81526001600160a01b0388166004820152602401610119565b5f80610164848601866121c7565b91509150610172828261057c565b60405163b0460f0760e01b8152339063b0460f07906101959085906004016123eb565b60408051808303815f875af11580156101b0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101d49190612569565b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd99a9950505050505050505050565b61020c6105f0565b61021b6102188261258b565b50565b61022860808501856125f4565b90505f0361024957604051639c95219f60e01b815260040160405180910390fd5b6001600160a01b03851673531167691b4f37f0266e226d03412c77fb2977ce146102915760405163516e822d60e01b81526001600160a01b0386166004820152602401610119565b6102a1608085016060860161263a565b6102be57604051636d3a9fe560e01b815260040160405180910390fd5b5f8484846040516020016102d4939291906128ee565b60408051601f1981840301815291905290505f6102f460808701876125f4565b5f81811061030457610304612abf565b90506020028101906103169190612ad3565b6103209080612af1565b61032e906060810190612b05565b61033b60808901896125f4565b5f81811061034b5761034b612abf565b905060200281019061035d9190612ad3565b6040013581811061037057610370612abf565b6103869260206040909202019081019150612b4b565b90505f61039660808801886125f4565b5f8181106103a6576103a6612abf565b90506020028101906103b89190612ad3565b6103c29080612af1565b6103d0906040810190612b05565b6103dd60808a018a6125f4565b5f8181106103ed576103ed612abf565b90506020028101906103ff9190612ad3565b6020013581811061041257610412612abf565b6104289260206040909202019081019150612b4b565b90505f6104348261061e565b90505f6104408461061e565b90505f61044e8a35836106a2565b90506104656001600160a01b0385168c5f196106c9565b61047a6001600160a01b0386168c5f196106c9565b604051632e7ff4ef60e11b81526001600160a01b038c1690635cffe9de906104ac903090899086908c90600401612b66565b6020604051808303815f875af11580156104c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104ec9190612b97565b610509576040516349088f5960e11b815260040160405180910390fd5b61051d6001600160a01b0386168c5f6106c9565b6105316001600160a01b0385168c5f6106c9565b61054661053d8861258b565b85858886610743565b50505050505061057560017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5050505050565b5f82608001515f8151811061059357610593612abf565b60200260200101515f01516060015183608001515f815181106105b8576105b8612abf565b602002602001015160400151815181106105d4576105d4612abf565b60200260200101515f015190506105eb81836109e2565b505050565b6105f8610a8c565b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f610627610ad0565b6040516354636d2b60e01b81526001600160a01b038316600482015273200e12d10bb0c5e4a17e7018f0f1161919bb9389906354636d2b906024016020604051808303815f875af115801561067e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100e19190612bb2565b5f6001600160e01b038316601b0b60e084901d6106c0828286610b5b565b95945050505050565b6106d58383835f610b9f565b6105eb576106e683835f6001610b9f565b61070e57604051635274afe760e01b81526001600160a01b0384166004820152602401610119565b61071b8383836001610b9f565b6105eb57604051635274afe760e01b81526001600160a01b0384166004820152602401610119565b6040805160018082528183019092525f91816020015b6060815260200190600190039081610759575050604080516003808252608082019092529192505f919060208201606080368337019050506040516370a0823160e01b81523060048201529091505f906001600160a01b038816906370a0823190602401602060405180830381865afa1580156107d8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107fc9190612bd2565b90508015610818576108186001600160a01b0388163383610c01565b5f6108238288610c0e565b50905080835f8151811061083957610839612abf565b602090810291909101015250506040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa15801561088a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108ae9190612bd2565b905080156108ca576108ca6001600160a01b0386163383610c01565b5f6108d58286610c0e565b50905080836001815181106108ec576108ec612abf565b602090810291909101015250479050801561090b5761090b3382610c4f565b5f610917826012610c0e565b509050808360028151811061092e5761092e612abf565b602002602001018181525050505080825f8151811061094f5761094f612abf565b60209081029190910101526040805160018082528183019092525f91816020015b6040805160a0810182525f918101828152606080830193909352608082018390528152602081019190915281526020019060019003908161097057905050905087815f815181106109c3576109c3612abf565b60200260200101819052506109d88382610cc6565b5050505050505050565b5f805f838060200190518101906109f99190612be9565b919450925090506001600160a01b038316610a27576040516398521dc560e01b815260040160405180910390fd5b6001600160a01b038216610a4e5760405163456ac4c360e11b815260040160405180910390fd5b610a636001600160a01b038616845f196106c9565b610a776001600160a01b0383168247610f0e565b506105756001600160a01b038616845f6106c9565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054600203610ace57604051633ee5aeb560e01b815260040160405180910390fd5b565b73200e12d10bb0c5e4a17e7018f0f1161919bb93893b1580610b27575073200e12d10bb0c5e4a17e7018f0f1161919bb93893f7f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d4114155b15610ace576040516373e6d7b360e01b815273200e12d10bb0c5e4a17e7018f0f1161919bb93896004820152602401610119565b5f805f610b69868686610fbc565b9150915080610b945760405162bc8ecf60e31b81526004810187905260248101869052604401610119565b5090505b9392505050565b60405163095ea7b360e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610bf5578383151615610be9573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b61071b838383600161112e565b5f805f805f610c1d8787611178565b9250925092505f80610c2f85856111d4565b9150915081838015610c3e5750815b9650965050505050505b9250929050565b80471015610c795760405163cf47918160e01b815247600482015260248101829052604401610119565b610c92828260405180602001604052805f81525061141d565b15610c9b575050565b3d15610cad57610ca9611432565b5050565b60405163d6bda27560e01b815260040160405180910390fd5b60408051600480825260a082019092525f91816020015b6060815260200190600190039081610cdd5790505090505f5b8351811015610d3e57838181518110610d1157610d11612abf565b6020026020010151828281518110610d2b57610d2b612abf565b6020908102919091010152600101610cf6565b50335f8181523060209081526040808320815160a0810183528083018581526060808301879052608083018190529082528185015282518581529384018581528484019093529093909291905b8751811015610f0357878181518110610da657610da6612abf565b602002602001015193505f845f015160400151511115610efb575f845f01515f01516001600160a01b031663d04dfe236040518060e00160405280885f0151602001516001600160a01b03168152602001898152602001885f01516040015181526020015f8152602001610e1e8c8a6020015161143d565b8152602001878152602001868152506040518263ffffffff1660e01b8152600401610e499190612ccf565b5f60405180830381865afa158015610e63573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610e8a9190810190612dc7565b9150505f81511115610ef95784516020015160405163012c676d60e21b81526001600160a01b03909116906304b19db490610ecb908a908590600401612e73565b5f604051808303815f87803b158015610ee2575f80fd5b505af1158015610ef4573d5f803e3d5ffd5b505050505b505b600101610d8b565b505050505050505050565b606081471015610f3a5760405163cf47918160e01b815247600482015260248101839052604401610119565b5f610f4685848661141d565b9050808015610f6757505f3d1180610f6757505f856001600160a01b03163b115b15610f7c57610f74611810565b915050610b98565b8015610fa657604051639996b31560e01b81526001600160a01b0386166004820152602401610119565b3d15610cad57610fb4611432565b509392505050565b5f805f851215610fe957604051634a7d166b60e01b81526004810186905260248101859052604401610119565b845f03610ffb57505f90506001611126565b8460ff84168501858112156110365760405163c849483b60e01b8152600481018890526024810187905260ff86166044820152606401610119565b5f805f83121561108257604c19831215611059575f809550955050505050611126565b825f03600a0a915081848161107057611070612e93565b04955050840290911491506111269050565b5f83131561111b57604d8313156110bf5760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610119565b82600a0a9150815f19816110d5576110d5612e93565b048411156111095760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610119565b50919091029250600191506111269050565b509193506001925050505b935093915050565b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610bf5578383151615610be9573d5f823e3d81fd5b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8611156111c357600a860460018201600a88065f14935093509350506111cd565b8593509150600190505b9250925092565b5f808383601b82900b82148061130a577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e1000000000000000000870515611255577f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000870515611246576305f5e10087059650600886019550611255565b620186a0870596506005860195505b8687601b0b1461127057600a87059650856001019550611255565b7b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc7b1999999999999999999999999999999999999999999999999999999888820111611304575f600188039050808160030b036113025760e01b6001600160e01b037b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff60ff8b901d18161795505f9450610c489350505050565b505b50611321565b865f0361132157505f935060019250610c48915050565b858660030b146113d8575f8213156113805761133d8383611829565b156113655760405163d556b11160e01b81526004810184905260248101839052604401610119565b637ffffffe19909501600a0a82029550637fffffff946113d8565b637fffffff1986900360438113156113a257505f9450849350610c4892505050565b80600a0a88816113b4576113b4612e93565b059750875f036113ce57505f9450849350610c4892505050565b50637fffffff1995505b8186136113e85760019350611401565b818603600a0a83816113fc576113fc612e93565b071593505b5050506001600160e01b03841660e084901b1791509250929050565b5f805f83516020850186885af1949350505050565b6040513d5f823e3d81fd5b60605f825167ffffffffffffffff81111561145a5761145a611c6c565b604051908082528060200260200182016040528015611483578160200160208202803683370190505b5090505f835167ffffffffffffffff8111156114a1576114a1611c6c565b6040519080825280602002602001820160405280156114ca578160200160208202803683370190505b5090505f808551116114dc575f6114e2565b84516002015b86516001010190505f8167ffffffffffffffff81111561150457611504611c6c565b60405190808252806020026020018201604052801561153757816020015b60608152602001906001900390816115225790505b5090505f61155b604080516002815233602082015230818301526060810190915290565b82828151811061156d5761156d612abf565b60200260200101819052505f5b88518110156115ca57818060010192505088818151811061159d5761159d612abf565b60200260200101518383815181106115b7576115b7612abf565b602090810291909101015260010161157a565b50865115611805578080600101915050848282815181106115ed576115ed612abf565b602002602001018190525080806001019150508382828151811061161357611613612abf565b60200260200101819052505f5b87518110156118035761171688828151811061163e5761163e612abf565b60200260200101515f01516116f38a848151811061165e5761165e612abf565b6020026020010151602001516116d48c868151811061167f5761167f612abf565b60200260200101518051604091820151805160209081029181019190912083517f6ec4dff745ec96dbde88c5d41f8aa5ac13aa1664afb47b8406b44fa945a650c8815291820192909252918201526060902090565b60405161190160f01b8152600281019290925260228201526042902090565b8a848151811061170557611705612abf565b602002602001015160600151611844565b61173657604051630a57f30960e31b815260048101829052602401610119565b87818151811061174857611748612abf565b60200260200101515f01516001600160a01b03165f1b86828151811061177057611770612abf565b60200260200101818152505087818151811061178e5761178e612abf565b6020026020010151602001518582815181106117ac576117ac612abf565b60200260200101818152505081806001019250508781815181106117d2576117d2612abf565b6020026020010151604001518383815181106117f0576117f0612abf565b6020908102919091010152600101611620565b505b509695505050505050565b6040513d81523d5f602083013e3d602001810160405290565b5f610b985f841261183a578361183e565b835f035b836118b4565b5f836001600160a01b03163b5f036118a2575f806118628585611952565b5090925090505f81600381111561187b5761187b612ea7565b1480156118995750856001600160a01b0316826001600160a01b0316145b92505050610b98565b6118ad848484611998565b9050610b98565b5f637ffffff582136118c757505f6100e1565b637ffffffe19820160438113156118e25750508115156100e1565b5f81126119225780600a0a7b800000000000000000000000000000000000000000000000000000018161191757611917612e93565b0484119150506100e1565b805f03600a0a7b800000000000000000000000000000000000000000000000000000020284101591505092915050565b5f805f8351604103611989576020840151604085015160608601515f1a61197b888285856119fd565b9550955095505050506111cd565b505081515f91506002906111cd565b805160408051630b135d3f60e11b8082526004820186905260248201929092525f92906020820185604483015e5f82606483010152601f820160051c60051b915060205f60648401838a5afa9050825f5114601f3d1116811693505050509392505050565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841115611a3657505f91506003905082611abb565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015611a87573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b038116611ab257505f925060019150829050611abb565b92505f91508190505b9450945094915050565b5f60208284031215611ad5575f80fd5b81356001600160e01b031981168114610b98575f80fd5b6001600160a01b0381168114610218575f80fd5b8035611b0b81611aec565b919050565b5f8083601f840112611b20575f80fd5b50813567ffffffffffffffff811115611b37575f80fd5b602083019150836020828501011115610c48575f80fd5b5f805f805f8060a08789031215611b63575f80fd5b8635611b6e81611aec565b95506020870135611b7e81611aec565b94506040870135935060608701359250608087013567ffffffffffffffff811115611ba7575f80fd5b611bb389828a01611b10565b979a9699509497509295939492505050565b5f805f805f60808688031215611bd9575f80fd5b8535611be481611aec565b9450602086013567ffffffffffffffff80821115611c00575f80fd5b9087019060c0828a031215611c13575f80fd5b90945060408701359080821115611c28575f80fd5b611c3489838a01611b10565b90955093506060880135915080821115611c4c575f80fd5b50860160408189031215611c5e575f80fd5b809150509295509295909350565b634e487b7160e01b5f52604160045260245ffd5b6040805190810167ffffffffffffffff81118282101715611ca357611ca3611c6c565b60405290565b6040516080810167ffffffffffffffff81118282101715611ca357611ca3611c6c565b60405160a0810167ffffffffffffffff81118282101715611ca357611ca3611c6c565b60405160c0810167ffffffffffffffff81118282101715611ca357611ca3611c6c565b604051601f8201601f1916810167ffffffffffffffff81118282101715611d3b57611d3b611c6c565b604052919050565b8015158114610218575f80fd5b8035611b0b81611d43565b5f67ffffffffffffffff821115611d7457611d74611c6c565b5060051b60200190565b5f67ffffffffffffffff821115611d9757611d97611c6c565b50601f01601f191660200190565b5f82601f830112611db4575f80fd5b8135611dc7611dc282611d7e565b611d12565b818152846020838601011115611ddb575f80fd5b816020850160208301375f918101602001919091529392505050565b5f60608284031215611e07575f80fd5b6040516060810167ffffffffffffffff8282108183111715611e2b57611e2b611c6c565b8160405282935084359150611e3f82611aec565b908252602084013590611e5182611aec565b8160208401526040850135915080821115611e6a575f80fd5b50611e7785828601611da5565b6040830152505092915050565b5f82601f830112611e93575f80fd5b81356020611ea3611dc283611d5b565b82815260069290921b84018101918181019086841115611ec1575f80fd5b8286015b848110156118055760408189031215611edc575f80fd5b611ee4611c80565b8135611eef81611aec565b81528185013585820152835291830191604001611ec5565b5f82601f830112611f16575f80fd5b81356020611f26611dc283611d5b565b82815260059290921b84018101918181019086841115611f44575f80fd5b8286015b8481101561180557803567ffffffffffffffff80821115611f67575f80fd5b908801906080828b03601f19011215611f7e575f80fd5b611f86611ca9565b86830135611f9381611aec565b815260408381013588830152606084013583811115611fb0575f80fd5b8401603f81018d13611fc0575f80fd5b88810135611fd0611dc282611d5b565b81815260059190911b82018301908a8101908f831115611fee575f80fd5b928401925b8284101561200c5783358252928b0192908b0190611ff3565b80858701525050505050608083013582811115612027575f80fd5b6120358c8983870101611da5565b60608301525085525050918301918301611f48565b5f82601f830112612059575f80fd5b81356020612069611dc283611d5b565b82815260059290921b84018101918181019086841115612087575f80fd5b8286015b8481101561180557803567ffffffffffffffff808211156120aa575f80fd5b90880190601f196080838c03820112156120c2575f80fd5b6120ca611ca9565b87840135838111156120da575f80fd5b840160a0818e03840112156120ed575f80fd5b6120f5611ccc565b9250612102898201611b00565b8352604081013584811115612115575f80fd5b6121238e8b83850101611df7565b8a850152506060808201358581111561213a575f80fd5b6121488f8c83860101611e84565b60408601525060808201358581111561215f575f80fd5b61216d8f8c83860101611e84565b828601525060a0820135608085015283835260408601358a84015280860135604084015260808601359350848411156121a4575f80fd5b6121b28e8b86890101611f07565b9083015250865250505091830191830161208b565b5f80604083850312156121d8575f80fd5b823567ffffffffffffffff808211156121ef575f80fd5b9084019060c08287031215612202575f80fd5b61220a611cef565b82358152602083013560208201526040830135604082015261222e60608401611d50565b6060820152608083013582811115612244575f80fd5b6122508882860161204a565b60808301525060a083013582811115612267575f80fd5b61227388828601611da5565b60a0830152509350602085013591508082111561228e575f80fd5b5061229b85828601611da5565b9150509250929050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f815180845260208085019450602084015f5b8381101561231657815180516001600160a01b0316885283015183880152604090960195908201906001016122e6565b509495945050505050565b5f815180845260208085019450602084015f5b8381101561231657815187529582019590820190600101612334565b5f82825180855260208086019550808260051b8401018186015f5b848110156123de57601f19868403018952815160806001600160a01b038251168552858201518686015260408083015182828801526123ac83880182612321565b92505050606080830151925085820381870152506123ca81836122a5565b9a86019a945050509083019060010161236b565b5090979650505050505050565b5f602080835260e08301845182850152818501516040818187015280870151915060608281880152808801519250608083151560808901526080890151935060a060c060a08a01528585518088526101009750878b019150878160051b8c010189880197505f5b8281101561253a578c820360ff190184528851805187845280516001600160a01b03908116898601528d82015188860189905280518216610120870152808f01519091166101408601528a015161016085018a90526124b56101808601826122a5565b90508a820151607f19808784030160c08801526124d283836122d3565b92508b8401519150808784030160e0880152506124ef82826122d3565b915050888201518d8601528d8301518e8601528a8301518b8601528983015192508481038a8601526125218184612350565b9b8e019b968e0196945050506001919091019050612452565b5060a08d01518c8203601f190160c08e01529950612558818b6122a5565b9d9c50505050505050505050505050565b5f806040838503121561257a575f80fd5b505080516020909101519092909150565b5f6040823603121561259b575f80fd5b6125a3611c80565b823567ffffffffffffffff808211156125ba575f80fd5b6125c636838701611df7565b835260208501359150808211156125db575f80fd5b506125e836828601611f07565b60208301525092915050565b5f808335601e19843603018112612609575f80fd5b83018035915067ffffffffffffffff821115612623575f80fd5b6020019150600581901b3603821315610c48575f80fd5b5f6020828403121561264a575f80fd5b8135610b9881611d43565b5f808335601e1984360301811261266a575f80fd5b830160208101925035905067ffffffffffffffff811115612689575f80fd5b8060051b3603821315610c48575f80fd5b5f808335601e198436030181126126af575f80fd5b830160208101925035905067ffffffffffffffff8111156126ce575f80fd5b803603821315610c48575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f813561271081611aec565b6001600160a01b03908116845260208301359061272c82611aec565b16602084015261273f604083018361269a565b606060408601526106c06060860182846126dc565b5f808335601e19843603018112612769575f80fd5b830160208101925035905067ffffffffffffffff811115612788575f80fd5b8060061b3603821315610c48575f80fd5b8183525f60208085019450825f5b858110156123165781356127ba81611aec565b6001600160a01b031687528183013583880152604096870196909101906001016127a7565b5f8235607e198336030181126127f3575f80fd5b90910192915050565b8183526020808401935f91600585811b8301820185855b888110156128e057858303601f19018a5261282e82896127df565b6080813561283b81611aec565b6001600160a01b031685528187013587860152604061285c81840184612655565b8383890152808489015260a093507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811115612896575f80fd5b881b915081818885013750850160606128b18482018561269a565b94508388840301828901526128c984840186836126dc565b9e8a019e9750505093870193505050600101612813565b509098975050505050505050565b5f604080835261010080840187358386015260208089013560608701526080848a0135608088015260608a013561292481611d43565b151560a088015261293860808b018b612655565b60c0898101529384905261012093848901600582901b8a018601835f5b84811015612a6f578c830361011f1901845261297182876127df565b8035609e19823603018112612984575f80fd5b8885528101803561299481611aec565b6001600160a01b0316858a0152808a013536829003605e190181126129b7575f80fd5b60a0808701526129cb8c8701838301612704565b90506129d98e830183612754565b607f19808985030160c08a01526129f1848385612799565b9350612a006060860186612754565b93509150808985030160e08a015250612a1a838383612799565b92505050898201358d8701528a8301358b8701528d8301358e870152612a436060840184612655565b935091508581036060870152612a5a8184846127fc565b968b0196955050509188019150600101612955565b5050612a7e60a08f018f61269a565b8c8303603f190160e08e015299509750612a99818a8a6126dc565b9850505050505085840381870152505050612ab58185876126dc565b9695505050505050565b634e487b7160e01b5f52603260045260245ffd5b5f8235607e19833603018112612ae7575f80fd5b9190910192915050565b5f8235609e19833603018112612ae7575f80fd5b5f808335601e19843603018112612b1a575f80fd5b83018035915067ffffffffffffffff821115612b34575f80fd5b6020019150600681901b3603821315610c48575f80fd5b5f60208284031215612b5b575f80fd5b8135610b9881611aec565b5f6001600160a01b03808716835280861660208401525083604083015260806060830152612ab560808301846122a5565b5f60208284031215612ba7575f80fd5b8151610b9881611d43565b5f60208284031215612bc2575f80fd5b815160ff81168114610b98575f80fd5b5f60208284031215612be2575f80fd5b5051919050565b5f805f60608486031215612bfb575f80fd5b8351612c0681611aec565b6020850151909350612c1781611aec565b604085015190925067ffffffffffffffff811115612c33575f80fd5b8401601f81018613612c43575f80fd5b8051612c51611dc282611d7e565b818152876020838501011115612c65575f80fd5b8160208401602083015e5f602083830101528093505050509250925092565b5f8282518085526020808601955060208260051b840101602086015f5b848110156123de57601f19868403018952612cbd838351612321565b98840198925090830190600101612ca1565b602081526001600160a01b038251166020820152602082015160408201525f604083015160e06060840152612d086101008401826122a5565b9050606084015160808401526080840151601f19808584030160a0860152612d308383612c84565b925060a08601519150808584030160c0860152612d4d8383612321565b925060c08601519150808584030160e0860152506106c08282612321565b5f82601f830112612d7a575f80fd5b81516020612d8a611dc283611d5b565b8083825260208201915060208460051b870101935086841115612dab575f80fd5b602086015b848110156118055780518352918301918301612db0565b5f8060408385031215612dd8575f80fd5b825167ffffffffffffffff80821115612def575f80fd5b818501915085601f830112612e02575f80fd5b81516020612e12611dc283611d5b565b82815260059290921b84018101918181019089841115612e30575f80fd5b948201945b83861015612e4e57855182529482019490820190612e35565b91880151919650909350505080821115612e66575f80fd5b5061229b85828601612d6b565b828152604060208201525f612e8b6040830184612321565b949350505050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52602160045260245ffd"; + hex"6080604052348015600e575f80fd5b5060017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055612ebb806100405f395ff3fe608060405260043610610034575f3560e01c806301ffc9a71461003d57806323e30c8b146100715780634bacdc9d1461009e57005b3661003b57005b005b348015610048575f80fd5b5061005c610057366004611ac5565b6100b1565b60405190151581526020015b60405180910390f35b34801561007c575f80fd5b5061009061008b366004611b4e565b6100e7565b604051908152602001610068565b61003b6100ac366004611bc5565b610204565b5f6001600160e01b031982166323e30c8b60e01b14806100e157506301ffc9a760e01b6001600160e01b03198316145b92915050565b5f3373d2cd1d4ad3bf3ecb581e4653c9c02a67ca44305c1461012257604051625e1e6f60e51b81523360048201526024015b60405180910390fd5b6001600160a01b0387163014610156576040516322c7df1960e21b81526001600160a01b0388166004820152602401610119565b5f80610164848601866121c7565b91509150610172828261057c565b60405163b0460f0760e01b8152339063b0460f07906101959085906004016123eb565b60408051808303815f875af11580156101b0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101d49190612569565b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd99a9950505050505050505050565b61020c6105f0565b61021b6102188261258b565b50565b61022860808501856125f4565b90505f0361024957604051639c95219f60e01b815260040160405180910390fd5b6001600160a01b03851673d2cd1d4ad3bf3ecb581e4653c9c02a67ca44305c146102915760405163516e822d60e01b81526001600160a01b0386166004820152602401610119565b6102a1608085016060860161263a565b6102be57604051636d3a9fe560e01b815260040160405180910390fd5b5f8484846040516020016102d4939291906128ee565b60408051601f1981840301815291905290505f6102f460808701876125f4565b5f81811061030457610304612abf565b90506020028101906103169190612ad3565b6103209080612af1565b61032e906060810190612b05565b61033b60808901896125f4565b5f81811061034b5761034b612abf565b905060200281019061035d9190612ad3565b6040013581811061037057610370612abf565b6103869260206040909202019081019150612b4b565b90505f61039660808801886125f4565b5f8181106103a6576103a6612abf565b90506020028101906103b89190612ad3565b6103c29080612af1565b6103d0906040810190612b05565b6103dd60808a018a6125f4565b5f8181106103ed576103ed612abf565b90506020028101906103ff9190612ad3565b6020013581811061041257610412612abf565b6104289260206040909202019081019150612b4b565b90505f6104348261061e565b90505f6104408461061e565b90505f61044e8a35836106a2565b90506104656001600160a01b0385168c5f196106c9565b61047a6001600160a01b0386168c5f196106c9565b604051632e7ff4ef60e11b81526001600160a01b038c1690635cffe9de906104ac903090899086908c90600401612b66565b6020604051808303815f875af11580156104c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104ec9190612b97565b610509576040516349088f5960e11b815260040160405180910390fd5b61051d6001600160a01b0386168c5f6106c9565b6105316001600160a01b0385168c5f6106c9565b61054661053d8861258b565b85858886610743565b50505050505061057560017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5050505050565b5f82608001515f8151811061059357610593612abf565b60200260200101515f01516060015183608001515f815181106105b8576105b8612abf565b602002602001015160400151815181106105d4576105d4612abf565b60200260200101515f015190506105eb81836109e2565b505050565b6105f8610a8c565b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f610627610ad0565b6040516354636d2b60e01b81526001600160a01b038316600482015273200e12d10bb0c5e4a17e7018f0f1161919bb9389906354636d2b906024016020604051808303815f875af115801561067e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100e19190612bb2565b5f6001600160e01b038316601b0b60e084901d6106c0828286610b5b565b95945050505050565b6106d58383835f610b9f565b6105eb576106e683835f6001610b9f565b61070e57604051635274afe760e01b81526001600160a01b0384166004820152602401610119565b61071b8383836001610b9f565b6105eb57604051635274afe760e01b81526001600160a01b0384166004820152602401610119565b6040805160018082528183019092525f91816020015b6060815260200190600190039081610759575050604080516003808252608082019092529192505f919060208201606080368337019050506040516370a0823160e01b81523060048201529091505f906001600160a01b038816906370a0823190602401602060405180830381865afa1580156107d8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107fc9190612bd2565b90508015610818576108186001600160a01b0388163383610c01565b5f6108238288610c0e565b50905080835f8151811061083957610839612abf565b602090810291909101015250506040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa15801561088a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108ae9190612bd2565b905080156108ca576108ca6001600160a01b0386163383610c01565b5f6108d58286610c0e565b50905080836001815181106108ec576108ec612abf565b602090810291909101015250479050801561090b5761090b3382610c4f565b5f610917826012610c0e565b509050808360028151811061092e5761092e612abf565b602002602001018181525050505080825f8151811061094f5761094f612abf565b60209081029190910101526040805160018082528183019092525f91816020015b6040805160a0810182525f918101828152606080830193909352608082018390528152602081019190915281526020019060019003908161097057905050905087815f815181106109c3576109c3612abf565b60200260200101819052506109d88382610cc6565b5050505050505050565b5f805f838060200190518101906109f99190612be9565b919450925090506001600160a01b038316610a27576040516398521dc560e01b815260040160405180910390fd5b6001600160a01b038216610a4e5760405163456ac4c360e11b815260040160405180910390fd5b610a636001600160a01b038616845f196106c9565b610a776001600160a01b0383168247610f0e565b506105756001600160a01b038616845f6106c9565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054600203610ace57604051633ee5aeb560e01b815260040160405180910390fd5b565b73200e12d10bb0c5e4a17e7018f0f1161919bb93893b1580610b27575073200e12d10bb0c5e4a17e7018f0f1161919bb93893f7f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d4114155b15610ace576040516373e6d7b360e01b815273200e12d10bb0c5e4a17e7018f0f1161919bb93896004820152602401610119565b5f805f610b69868686610fbc565b9150915080610b945760405162bc8ecf60e31b81526004810187905260248101869052604401610119565b5090505b9392505050565b60405163095ea7b360e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610bf5578383151615610be9573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b61071b838383600161112e565b5f805f805f610c1d8787611178565b9250925092505f80610c2f85856111d4565b9150915081838015610c3e5750815b9650965050505050505b9250929050565b80471015610c795760405163cf47918160e01b815247600482015260248101829052604401610119565b610c92828260405180602001604052805f81525061141d565b15610c9b575050565b3d15610cad57610ca9611432565b5050565b60405163d6bda27560e01b815260040160405180910390fd5b60408051600680825260e082019092525f91816020015b6060815260200190600190039081610cdd5790505090505f5b8351811015610d3e57838181518110610d1157610d11612abf565b6020026020010151828281518110610d2b57610d2b612abf565b6020908102919091010152600101610cf6565b50335f8181523060209081526040808320815160a0810183528083018581526060808301879052608083018190529082528185015282518581529384018581528484019093529093909291905b8751811015610f0357878181518110610da657610da6612abf565b602002602001015193505f845f015160400151511115610efb575f845f01515f01516001600160a01b031663d04dfe236040518060e00160405280885f0151602001516001600160a01b03168152602001898152602001885f01516040015181526020015f8152602001610e1e8c8a6020015161143d565b8152602001878152602001868152506040518263ffffffff1660e01b8152600401610e499190612ccf565b5f60405180830381865afa158015610e63573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610e8a9190810190612dc7565b9150505f81511115610ef95784516020015160405163012c676d60e21b81526001600160a01b03909116906304b19db490610ecb908a908590600401612e73565b5f604051808303815f87803b158015610ee2575f80fd5b505af1158015610ef4573d5f803e3d5ffd5b505050505b505b600101610d8b565b505050505050505050565b606081471015610f3a5760405163cf47918160e01b815247600482015260248101839052604401610119565b5f610f4685848661141d565b9050808015610f6757505f3d1180610f6757505f856001600160a01b03163b115b15610f7c57610f74611810565b915050610b98565b8015610fa657604051639996b31560e01b81526001600160a01b0386166004820152602401610119565b3d15610cad57610fb4611432565b509392505050565b5f805f851215610fe957604051634a7d166b60e01b81526004810186905260248101859052604401610119565b845f03610ffb57505f90506001611126565b8460ff84168501858112156110365760405163c849483b60e01b8152600481018890526024810187905260ff86166044820152606401610119565b5f805f83121561108257604c19831215611059575f809550955050505050611126565b825f03600a0a915081848161107057611070612e93565b04955050840290911491506111269050565b5f83131561111b57604d8313156110bf5760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610119565b82600a0a9150815f19816110d5576110d5612e93565b048411156111095760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610119565b50919091029250600191506111269050565b509193506001925050505b935093915050565b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610bf5578383151615610be9573d5f823e3d81fd5b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8611156111c357600a860460018201600a88065f14935093509350506111cd565b8593509150600190505b9250925092565b5f808383601b82900b82148061130a577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e1000000000000000000870515611255577f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000870515611246576305f5e10087059650600886019550611255565b620186a0870596506005860195505b8687601b0b1461127057600a87059650856001019550611255565b7b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc7b1999999999999999999999999999999999999999999999999999999888820111611304575f600188039050808160030b036113025760e01b6001600160e01b037b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff60ff8b901d18161795505f9450610c489350505050565b505b50611321565b865f0361132157505f935060019250610c48915050565b858660030b146113d8575f8213156113805761133d8383611829565b156113655760405163d556b11160e01b81526004810184905260248101839052604401610119565b637ffffffe19909501600a0a82029550637fffffff946113d8565b637fffffff1986900360438113156113a257505f9450849350610c4892505050565b80600a0a88816113b4576113b4612e93565b059750875f036113ce57505f9450849350610c4892505050565b50637fffffff1995505b8186136113e85760019350611401565b818603600a0a83816113fc576113fc612e93565b071593505b5050506001600160e01b03841660e084901b1791509250929050565b5f805f83516020850186885af1949350505050565b6040513d5f823e3d81fd5b60605f825167ffffffffffffffff81111561145a5761145a611c6c565b604051908082528060200260200182016040528015611483578160200160208202803683370190505b5090505f835167ffffffffffffffff8111156114a1576114a1611c6c565b6040519080825280602002602001820160405280156114ca578160200160208202803683370190505b5090505f808551116114dc575f6114e2565b84516002015b86516001010190505f8167ffffffffffffffff81111561150457611504611c6c565b60405190808252806020026020018201604052801561153757816020015b60608152602001906001900390816115225790505b5090505f61155b604080516002815233602082015230818301526060810190915290565b82828151811061156d5761156d612abf565b60200260200101819052505f5b88518110156115ca57818060010192505088818151811061159d5761159d612abf565b60200260200101518383815181106115b7576115b7612abf565b602090810291909101015260010161157a565b50865115611805578080600101915050848282815181106115ed576115ed612abf565b602002602001018190525080806001019150508382828151811061161357611613612abf565b60200260200101819052505f5b87518110156118035761171688828151811061163e5761163e612abf565b60200260200101515f01516116f38a848151811061165e5761165e612abf565b6020026020010151602001516116d48c868151811061167f5761167f612abf565b60200260200101518051604091820151805160209081029181019190912083517f6ec4dff745ec96dbde88c5d41f8aa5ac13aa1664afb47b8406b44fa945a650c8815291820192909252918201526060902090565b60405161190160f01b8152600281019290925260228201526042902090565b8a848151811061170557611705612abf565b602002602001015160600151611844565b61173657604051630a57f30960e31b815260048101829052602401610119565b87818151811061174857611748612abf565b60200260200101515f01516001600160a01b03165f1b86828151811061177057611770612abf565b60200260200101818152505087818151811061178e5761178e612abf565b6020026020010151602001518582815181106117ac576117ac612abf565b60200260200101818152505081806001019250508781815181106117d2576117d2612abf565b6020026020010151604001518383815181106117f0576117f0612abf565b6020908102919091010152600101611620565b505b509695505050505050565b6040513d81523d5f602083013e3d602001810160405290565b5f610b985f841261183a578361183e565b835f035b836118b4565b5f836001600160a01b03163b5f036118a2575f806118628585611952565b5090925090505f81600381111561187b5761187b612ea7565b1480156118995750856001600160a01b0316826001600160a01b0316145b92505050610b98565b6118ad848484611998565b9050610b98565b5f637ffffff582136118c757505f6100e1565b637ffffffe19820160438113156118e25750508115156100e1565b5f81126119225780600a0a7b800000000000000000000000000000000000000000000000000000018161191757611917612e93565b0484119150506100e1565b805f03600a0a7b800000000000000000000000000000000000000000000000000000020284101591505092915050565b5f805f8351604103611989576020840151604085015160608601515f1a61197b888285856119fd565b9550955095505050506111cd565b505081515f91506002906111cd565b805160408051630b135d3f60e11b8082526004820186905260248201929092525f92906020820185604483015e5f82606483010152601f820160051c60051b915060205f60648401838a5afa9050825f5114601f3d1116811693505050509392505050565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841115611a3657505f91506003905082611abb565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015611a87573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b038116611ab257505f925060019150829050611abb565b92505f91508190505b9450945094915050565b5f60208284031215611ad5575f80fd5b81356001600160e01b031981168114610b98575f80fd5b6001600160a01b0381168114610218575f80fd5b8035611b0b81611aec565b919050565b5f8083601f840112611b20575f80fd5b50813567ffffffffffffffff811115611b37575f80fd5b602083019150836020828501011115610c48575f80fd5b5f805f805f8060a08789031215611b63575f80fd5b8635611b6e81611aec565b95506020870135611b7e81611aec565b94506040870135935060608701359250608087013567ffffffffffffffff811115611ba7575f80fd5b611bb389828a01611b10565b979a9699509497509295939492505050565b5f805f805f60808688031215611bd9575f80fd5b8535611be481611aec565b9450602086013567ffffffffffffffff80821115611c00575f80fd5b9087019060c0828a031215611c13575f80fd5b90945060408701359080821115611c28575f80fd5b611c3489838a01611b10565b90955093506060880135915080821115611c4c575f80fd5b50860160408189031215611c5e575f80fd5b809150509295509295909350565b634e487b7160e01b5f52604160045260245ffd5b6040805190810167ffffffffffffffff81118282101715611ca357611ca3611c6c565b60405290565b6040516080810167ffffffffffffffff81118282101715611ca357611ca3611c6c565b60405160a0810167ffffffffffffffff81118282101715611ca357611ca3611c6c565b60405160c0810167ffffffffffffffff81118282101715611ca357611ca3611c6c565b604051601f8201601f1916810167ffffffffffffffff81118282101715611d3b57611d3b611c6c565b604052919050565b8015158114610218575f80fd5b8035611b0b81611d43565b5f67ffffffffffffffff821115611d7457611d74611c6c565b5060051b60200190565b5f67ffffffffffffffff821115611d9757611d97611c6c565b50601f01601f191660200190565b5f82601f830112611db4575f80fd5b8135611dc7611dc282611d7e565b611d12565b818152846020838601011115611ddb575f80fd5b816020850160208301375f918101602001919091529392505050565b5f60608284031215611e07575f80fd5b6040516060810167ffffffffffffffff8282108183111715611e2b57611e2b611c6c565b8160405282935084359150611e3f82611aec565b908252602084013590611e5182611aec565b8160208401526040850135915080821115611e6a575f80fd5b50611e7785828601611da5565b6040830152505092915050565b5f82601f830112611e93575f80fd5b81356020611ea3611dc283611d5b565b82815260069290921b84018101918181019086841115611ec1575f80fd5b8286015b848110156118055760408189031215611edc575f80fd5b611ee4611c80565b8135611eef81611aec565b81528185013585820152835291830191604001611ec5565b5f82601f830112611f16575f80fd5b81356020611f26611dc283611d5b565b82815260059290921b84018101918181019086841115611f44575f80fd5b8286015b8481101561180557803567ffffffffffffffff80821115611f67575f80fd5b908801906080828b03601f19011215611f7e575f80fd5b611f86611ca9565b86830135611f9381611aec565b815260408381013588830152606084013583811115611fb0575f80fd5b8401603f81018d13611fc0575f80fd5b88810135611fd0611dc282611d5b565b81815260059190911b82018301908a8101908f831115611fee575f80fd5b928401925b8284101561200c5783358252928b0192908b0190611ff3565b80858701525050505050608083013582811115612027575f80fd5b6120358c8983870101611da5565b60608301525085525050918301918301611f48565b5f82601f830112612059575f80fd5b81356020612069611dc283611d5b565b82815260059290921b84018101918181019086841115612087575f80fd5b8286015b8481101561180557803567ffffffffffffffff808211156120aa575f80fd5b90880190601f196080838c03820112156120c2575f80fd5b6120ca611ca9565b87840135838111156120da575f80fd5b840160a0818e03840112156120ed575f80fd5b6120f5611ccc565b9250612102898201611b00565b8352604081013584811115612115575f80fd5b6121238e8b83850101611df7565b8a850152506060808201358581111561213a575f80fd5b6121488f8c83860101611e84565b60408601525060808201358581111561215f575f80fd5b61216d8f8c83860101611e84565b828601525060a0820135608085015283835260408601358a84015280860135604084015260808601359350848411156121a4575f80fd5b6121b28e8b86890101611f07565b9083015250865250505091830191830161208b565b5f80604083850312156121d8575f80fd5b823567ffffffffffffffff808211156121ef575f80fd5b9084019060c08287031215612202575f80fd5b61220a611cef565b82358152602083013560208201526040830135604082015261222e60608401611d50565b6060820152608083013582811115612244575f80fd5b6122508882860161204a565b60808301525060a083013582811115612267575f80fd5b61227388828601611da5565b60a0830152509350602085013591508082111561228e575f80fd5b5061229b85828601611da5565b9150509250929050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f815180845260208085019450602084015f5b8381101561231657815180516001600160a01b0316885283015183880152604090960195908201906001016122e6565b509495945050505050565b5f815180845260208085019450602084015f5b8381101561231657815187529582019590820190600101612334565b5f82825180855260208086019550808260051b8401018186015f5b848110156123de57601f19868403018952815160806001600160a01b038251168552858201518686015260408083015182828801526123ac83880182612321565b92505050606080830151925085820381870152506123ca81836122a5565b9a86019a945050509083019060010161236b565b5090979650505050505050565b5f602080835260e08301845182850152818501516040818187015280870151915060608281880152808801519250608083151560808901526080890151935060a060c060a08a01528585518088526101009750878b019150878160051b8c010189880197505f5b8281101561253a578c820360ff190184528851805187845280516001600160a01b03908116898601528d82015188860189905280518216610120870152808f01519091166101408601528a015161016085018a90526124b56101808601826122a5565b90508a820151607f19808784030160c08801526124d283836122d3565b92508b8401519150808784030160e0880152506124ef82826122d3565b915050888201518d8601528d8301518e8601528a8301518b8601528983015192508481038a8601526125218184612350565b9b8e019b968e0196945050506001919091019050612452565b5060a08d01518c8203601f190160c08e01529950612558818b6122a5565b9d9c50505050505050505050505050565b5f806040838503121561257a575f80fd5b505080516020909101519092909150565b5f6040823603121561259b575f80fd5b6125a3611c80565b823567ffffffffffffffff808211156125ba575f80fd5b6125c636838701611df7565b835260208501359150808211156125db575f80fd5b506125e836828601611f07565b60208301525092915050565b5f808335601e19843603018112612609575f80fd5b83018035915067ffffffffffffffff821115612623575f80fd5b6020019150600581901b3603821315610c48575f80fd5b5f6020828403121561264a575f80fd5b8135610b9881611d43565b5f808335601e1984360301811261266a575f80fd5b830160208101925035905067ffffffffffffffff811115612689575f80fd5b8060051b3603821315610c48575f80fd5b5f808335601e198436030181126126af575f80fd5b830160208101925035905067ffffffffffffffff8111156126ce575f80fd5b803603821315610c48575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f813561271081611aec565b6001600160a01b03908116845260208301359061272c82611aec565b16602084015261273f604083018361269a565b606060408601526106c06060860182846126dc565b5f808335601e19843603018112612769575f80fd5b830160208101925035905067ffffffffffffffff811115612788575f80fd5b8060061b3603821315610c48575f80fd5b8183525f60208085019450825f5b858110156123165781356127ba81611aec565b6001600160a01b031687528183013583880152604096870196909101906001016127a7565b5f8235607e198336030181126127f3575f80fd5b90910192915050565b8183526020808401935f91600585811b8301820185855b888110156128e057858303601f19018a5261282e82896127df565b6080813561283b81611aec565b6001600160a01b031685528187013587860152604061285c81840184612655565b8383890152808489015260a093507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811115612896575f80fd5b881b915081818885013750850160606128b18482018561269a565b94508388840301828901526128c984840186836126dc565b9e8a019e9750505093870193505050600101612813565b509098975050505050505050565b5f604080835261010080840187358386015260208089013560608701526080848a0135608088015260608a013561292481611d43565b151560a088015261293860808b018b612655565b60c0898101529384905261012093848901600582901b8a018601835f5b84811015612a6f578c830361011f1901845261297182876127df565b8035609e19823603018112612984575f80fd5b8885528101803561299481611aec565b6001600160a01b0316858a0152808a013536829003605e190181126129b7575f80fd5b60a0808701526129cb8c8701838301612704565b90506129d98e830183612754565b607f19808985030160c08a01526129f1848385612799565b9350612a006060860186612754565b93509150808985030160e08a015250612a1a838383612799565b92505050898201358d8701528a8301358b8701528d8301358e870152612a436060840184612655565b935091508581036060870152612a5a8184846127fc565b968b0196955050509188019150600101612955565b5050612a7e60a08f018f61269a565b8c8303603f190160e08e015299509750612a99818a8a6126dc565b9850505050505085840381870152505050612ab58185876126dc565b9695505050505050565b634e487b7160e01b5f52603260045260245ffd5b5f8235607e19833603018112612ae7575f80fd5b9190910192915050565b5f8235609e19833603018112612ae7575f80fd5b5f808335601e19843603018112612b1a575f80fd5b83018035915067ffffffffffffffff821115612b34575f80fd5b6020019150600681901b3603821315610c48575f80fd5b5f60208284031215612b5b575f80fd5b8135610b9881611aec565b5f6001600160a01b03808716835280861660208401525083604083015260806060830152612ab560808301846122a5565b5f60208284031215612ba7575f80fd5b8151610b9881611d43565b5f60208284031215612bc2575f80fd5b815160ff81168114610b98575f80fd5b5f60208284031215612be2575f80fd5b5051919050565b5f805f60608486031215612bfb575f80fd5b8351612c0681611aec565b6020850151909350612c1781611aec565b604085015190925067ffffffffffffffff811115612c33575f80fd5b8401601f81018613612c43575f80fd5b8051612c51611dc282611d7e565b818152876020838501011115612c65575f80fd5b8160208401602083015e5f602083830101528093505050509250925092565b5f8282518085526020808601955060208260051b840101602086015f5b848110156123de57601f19868403018952612cbd838351612321565b98840198925090830190600101612ca1565b602081526001600160a01b038251166020820152602082015160408201525f604083015160e06060840152612d086101008401826122a5565b9050606084015160808401526080840151601f19808584030160a0860152612d308383612c84565b925060a08601519150808584030160c0860152612d4d8383612321565b925060c08601519150808584030160e0860152506106c08282612321565b5f82601f830112612d7a575f80fd5b81516020612d8a611dc283611d5b565b8083825260208201915060208460051b870101935086841115612dab575f80fd5b602086015b848110156118055780518352918301918301612db0565b5f8060408385031215612dd8575f80fd5b825167ffffffffffffffff80821115612def575f80fd5b818501915085601f830112612e02575f80fd5b81516020612e12611dc283611d5b565b82815260059290921b84018101918181019089841115612e30575f80fd5b948201945b83861015612e4e57855182529482019490820190612e35565b91880151919650909350505080821115612e66575f80fd5b5061229b85828601612d6b565b828152604060208201525f612e8b6040830184612321565b949350505050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52602160045260245ffd"; /// @dev The runtime bytecode of the contract. bytes constant RUNTIME_CODE = - hex"608060405260043610610034575f3560e01c806301ffc9a71461003d57806323e30c8b146100715780634bacdc9d1461009e57005b3661003b57005b005b348015610048575f80fd5b5061005c610057366004611ac5565b6100b1565b60405190151581526020015b60405180910390f35b34801561007c575f80fd5b5061009061008b366004611b4e565b6100e7565b604051908152602001610068565b61003b6100ac366004611bc5565b610204565b5f6001600160e01b031982166323e30c8b60e01b14806100e157506301ffc9a760e01b6001600160e01b03198316145b92915050565b5f3373531167691b4f37f0266e226d03412c77fb2977ce1461012257604051625e1e6f60e51b81523360048201526024015b60405180910390fd5b6001600160a01b0387163014610156576040516322c7df1960e21b81526001600160a01b0388166004820152602401610119565b5f80610164848601866121c7565b91509150610172828261057c565b60405163b0460f0760e01b8152339063b0460f07906101959085906004016123eb565b60408051808303815f875af11580156101b0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101d49190612569565b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd99a9950505050505050505050565b61020c6105f0565b61021b6102188261258b565b50565b61022860808501856125f4565b90505f0361024957604051639c95219f60e01b815260040160405180910390fd5b6001600160a01b03851673531167691b4f37f0266e226d03412c77fb2977ce146102915760405163516e822d60e01b81526001600160a01b0386166004820152602401610119565b6102a1608085016060860161263a565b6102be57604051636d3a9fe560e01b815260040160405180910390fd5b5f8484846040516020016102d4939291906128ee565b60408051601f1981840301815291905290505f6102f460808701876125f4565b5f81811061030457610304612abf565b90506020028101906103169190612ad3565b6103209080612af1565b61032e906060810190612b05565b61033b60808901896125f4565b5f81811061034b5761034b612abf565b905060200281019061035d9190612ad3565b6040013581811061037057610370612abf565b6103869260206040909202019081019150612b4b565b90505f61039660808801886125f4565b5f8181106103a6576103a6612abf565b90506020028101906103b89190612ad3565b6103c29080612af1565b6103d0906040810190612b05565b6103dd60808a018a6125f4565b5f8181106103ed576103ed612abf565b90506020028101906103ff9190612ad3565b6020013581811061041257610412612abf565b6104289260206040909202019081019150612b4b565b90505f6104348261061e565b90505f6104408461061e565b90505f61044e8a35836106a2565b90506104656001600160a01b0385168c5f196106c9565b61047a6001600160a01b0386168c5f196106c9565b604051632e7ff4ef60e11b81526001600160a01b038c1690635cffe9de906104ac903090899086908c90600401612b66565b6020604051808303815f875af11580156104c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104ec9190612b97565b610509576040516349088f5960e11b815260040160405180910390fd5b61051d6001600160a01b0386168c5f6106c9565b6105316001600160a01b0385168c5f6106c9565b61054661053d8861258b565b85858886610743565b50505050505061057560017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5050505050565b5f82608001515f8151811061059357610593612abf565b60200260200101515f01516060015183608001515f815181106105b8576105b8612abf565b602002602001015160400151815181106105d4576105d4612abf565b60200260200101515f015190506105eb81836109e2565b505050565b6105f8610a8c565b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f610627610ad0565b6040516354636d2b60e01b81526001600160a01b038316600482015273200e12d10bb0c5e4a17e7018f0f1161919bb9389906354636d2b906024016020604051808303815f875af115801561067e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100e19190612bb2565b5f6001600160e01b038316601b0b60e084901d6106c0828286610b5b565b95945050505050565b6106d58383835f610b9f565b6105eb576106e683835f6001610b9f565b61070e57604051635274afe760e01b81526001600160a01b0384166004820152602401610119565b61071b8383836001610b9f565b6105eb57604051635274afe760e01b81526001600160a01b0384166004820152602401610119565b6040805160018082528183019092525f91816020015b6060815260200190600190039081610759575050604080516003808252608082019092529192505f919060208201606080368337019050506040516370a0823160e01b81523060048201529091505f906001600160a01b038816906370a0823190602401602060405180830381865afa1580156107d8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107fc9190612bd2565b90508015610818576108186001600160a01b0388163383610c01565b5f6108238288610c0e565b50905080835f8151811061083957610839612abf565b602090810291909101015250506040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa15801561088a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108ae9190612bd2565b905080156108ca576108ca6001600160a01b0386163383610c01565b5f6108d58286610c0e565b50905080836001815181106108ec576108ec612abf565b602090810291909101015250479050801561090b5761090b3382610c4f565b5f610917826012610c0e565b509050808360028151811061092e5761092e612abf565b602002602001018181525050505080825f8151811061094f5761094f612abf565b60209081029190910101526040805160018082528183019092525f91816020015b6040805160a0810182525f918101828152606080830193909352608082018390528152602081019190915281526020019060019003908161097057905050905087815f815181106109c3576109c3612abf565b60200260200101819052506109d88382610cc6565b5050505050505050565b5f805f838060200190518101906109f99190612be9565b919450925090506001600160a01b038316610a27576040516398521dc560e01b815260040160405180910390fd5b6001600160a01b038216610a4e5760405163456ac4c360e11b815260040160405180910390fd5b610a636001600160a01b038616845f196106c9565b610a776001600160a01b0383168247610f0e565b506105756001600160a01b038616845f6106c9565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054600203610ace57604051633ee5aeb560e01b815260040160405180910390fd5b565b73200e12d10bb0c5e4a17e7018f0f1161919bb93893b1580610b27575073200e12d10bb0c5e4a17e7018f0f1161919bb93893f7f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d4114155b15610ace576040516373e6d7b360e01b815273200e12d10bb0c5e4a17e7018f0f1161919bb93896004820152602401610119565b5f805f610b69868686610fbc565b9150915080610b945760405162bc8ecf60e31b81526004810187905260248101869052604401610119565b5090505b9392505050565b60405163095ea7b360e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610bf5578383151615610be9573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b61071b838383600161112e565b5f805f805f610c1d8787611178565b9250925092505f80610c2f85856111d4565b9150915081838015610c3e5750815b9650965050505050505b9250929050565b80471015610c795760405163cf47918160e01b815247600482015260248101829052604401610119565b610c92828260405180602001604052805f81525061141d565b15610c9b575050565b3d15610cad57610ca9611432565b5050565b60405163d6bda27560e01b815260040160405180910390fd5b60408051600480825260a082019092525f91816020015b6060815260200190600190039081610cdd5790505090505f5b8351811015610d3e57838181518110610d1157610d11612abf565b6020026020010151828281518110610d2b57610d2b612abf565b6020908102919091010152600101610cf6565b50335f8181523060209081526040808320815160a0810183528083018581526060808301879052608083018190529082528185015282518581529384018581528484019093529093909291905b8751811015610f0357878181518110610da657610da6612abf565b602002602001015193505f845f015160400151511115610efb575f845f01515f01516001600160a01b031663d04dfe236040518060e00160405280885f0151602001516001600160a01b03168152602001898152602001885f01516040015181526020015f8152602001610e1e8c8a6020015161143d565b8152602001878152602001868152506040518263ffffffff1660e01b8152600401610e499190612ccf565b5f60405180830381865afa158015610e63573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610e8a9190810190612dc7565b9150505f81511115610ef95784516020015160405163012c676d60e21b81526001600160a01b03909116906304b19db490610ecb908a908590600401612e73565b5f604051808303815f87803b158015610ee2575f80fd5b505af1158015610ef4573d5f803e3d5ffd5b505050505b505b600101610d8b565b505050505050505050565b606081471015610f3a5760405163cf47918160e01b815247600482015260248101839052604401610119565b5f610f4685848661141d565b9050808015610f6757505f3d1180610f6757505f856001600160a01b03163b115b15610f7c57610f74611810565b915050610b98565b8015610fa657604051639996b31560e01b81526001600160a01b0386166004820152602401610119565b3d15610cad57610fb4611432565b509392505050565b5f805f851215610fe957604051634a7d166b60e01b81526004810186905260248101859052604401610119565b845f03610ffb57505f90506001611126565b8460ff84168501858112156110365760405163c849483b60e01b8152600481018890526024810187905260ff86166044820152606401610119565b5f805f83121561108257604c19831215611059575f809550955050505050611126565b825f03600a0a915081848161107057611070612e93565b04955050840290911491506111269050565b5f83131561111b57604d8313156110bf5760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610119565b82600a0a9150815f19816110d5576110d5612e93565b048411156111095760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610119565b50919091029250600191506111269050565b509193506001925050505b935093915050565b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610bf5578383151615610be9573d5f823e3d81fd5b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8611156111c357600a860460018201600a88065f14935093509350506111cd565b8593509150600190505b9250925092565b5f808383601b82900b82148061130a577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e1000000000000000000870515611255577f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000870515611246576305f5e10087059650600886019550611255565b620186a0870596506005860195505b8687601b0b1461127057600a87059650856001019550611255565b7b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc7b1999999999999999999999999999999999999999999999999999999888820111611304575f600188039050808160030b036113025760e01b6001600160e01b037b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff60ff8b901d18161795505f9450610c489350505050565b505b50611321565b865f0361132157505f935060019250610c48915050565b858660030b146113d8575f8213156113805761133d8383611829565b156113655760405163d556b11160e01b81526004810184905260248101839052604401610119565b637ffffffe19909501600a0a82029550637fffffff946113d8565b637fffffff1986900360438113156113a257505f9450849350610c4892505050565b80600a0a88816113b4576113b4612e93565b059750875f036113ce57505f9450849350610c4892505050565b50637fffffff1995505b8186136113e85760019350611401565b818603600a0a83816113fc576113fc612e93565b071593505b5050506001600160e01b03841660e084901b1791509250929050565b5f805f83516020850186885af1949350505050565b6040513d5f823e3d81fd5b60605f825167ffffffffffffffff81111561145a5761145a611c6c565b604051908082528060200260200182016040528015611483578160200160208202803683370190505b5090505f835167ffffffffffffffff8111156114a1576114a1611c6c565b6040519080825280602002602001820160405280156114ca578160200160208202803683370190505b5090505f808551116114dc575f6114e2565b84516002015b86516001010190505f8167ffffffffffffffff81111561150457611504611c6c565b60405190808252806020026020018201604052801561153757816020015b60608152602001906001900390816115225790505b5090505f61155b604080516002815233602082015230818301526060810190915290565b82828151811061156d5761156d612abf565b60200260200101819052505f5b88518110156115ca57818060010192505088818151811061159d5761159d612abf565b60200260200101518383815181106115b7576115b7612abf565b602090810291909101015260010161157a565b50865115611805578080600101915050848282815181106115ed576115ed612abf565b602002602001018190525080806001019150508382828151811061161357611613612abf565b60200260200101819052505f5b87518110156118035761171688828151811061163e5761163e612abf565b60200260200101515f01516116f38a848151811061165e5761165e612abf565b6020026020010151602001516116d48c868151811061167f5761167f612abf565b60200260200101518051604091820151805160209081029181019190912083517f6ec4dff745ec96dbde88c5d41f8aa5ac13aa1664afb47b8406b44fa945a650c8815291820192909252918201526060902090565b60405161190160f01b8152600281019290925260228201526042902090565b8a848151811061170557611705612abf565b602002602001015160600151611844565b61173657604051630a57f30960e31b815260048101829052602401610119565b87818151811061174857611748612abf565b60200260200101515f01516001600160a01b03165f1b86828151811061177057611770612abf565b60200260200101818152505087818151811061178e5761178e612abf565b6020026020010151602001518582815181106117ac576117ac612abf565b60200260200101818152505081806001019250508781815181106117d2576117d2612abf565b6020026020010151604001518383815181106117f0576117f0612abf565b6020908102919091010152600101611620565b505b509695505050505050565b6040513d81523d5f602083013e3d602001810160405290565b5f610b985f841261183a578361183e565b835f035b836118b4565b5f836001600160a01b03163b5f036118a2575f806118628585611952565b5090925090505f81600381111561187b5761187b612ea7565b1480156118995750856001600160a01b0316826001600160a01b0316145b92505050610b98565b6118ad848484611998565b9050610b98565b5f637ffffff582136118c757505f6100e1565b637ffffffe19820160438113156118e25750508115156100e1565b5f81126119225780600a0a7b800000000000000000000000000000000000000000000000000000018161191757611917612e93565b0484119150506100e1565b805f03600a0a7b800000000000000000000000000000000000000000000000000000020284101591505092915050565b5f805f8351604103611989576020840151604085015160608601515f1a61197b888285856119fd565b9550955095505050506111cd565b505081515f91506002906111cd565b805160408051630b135d3f60e11b8082526004820186905260248201929092525f92906020820185604483015e5f82606483010152601f820160051c60051b915060205f60648401838a5afa9050825f5114601f3d1116811693505050509392505050565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841115611a3657505f91506003905082611abb565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015611a87573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b038116611ab257505f925060019150829050611abb565b92505f91508190505b9450945094915050565b5f60208284031215611ad5575f80fd5b81356001600160e01b031981168114610b98575f80fd5b6001600160a01b0381168114610218575f80fd5b8035611b0b81611aec565b919050565b5f8083601f840112611b20575f80fd5b50813567ffffffffffffffff811115611b37575f80fd5b602083019150836020828501011115610c48575f80fd5b5f805f805f8060a08789031215611b63575f80fd5b8635611b6e81611aec565b95506020870135611b7e81611aec565b94506040870135935060608701359250608087013567ffffffffffffffff811115611ba7575f80fd5b611bb389828a01611b10565b979a9699509497509295939492505050565b5f805f805f60808688031215611bd9575f80fd5b8535611be481611aec565b9450602086013567ffffffffffffffff80821115611c00575f80fd5b9087019060c0828a031215611c13575f80fd5b90945060408701359080821115611c28575f80fd5b611c3489838a01611b10565b90955093506060880135915080821115611c4c575f80fd5b50860160408189031215611c5e575f80fd5b809150509295509295909350565b634e487b7160e01b5f52604160045260245ffd5b6040805190810167ffffffffffffffff81118282101715611ca357611ca3611c6c565b60405290565b6040516080810167ffffffffffffffff81118282101715611ca357611ca3611c6c565b60405160a0810167ffffffffffffffff81118282101715611ca357611ca3611c6c565b60405160c0810167ffffffffffffffff81118282101715611ca357611ca3611c6c565b604051601f8201601f1916810167ffffffffffffffff81118282101715611d3b57611d3b611c6c565b604052919050565b8015158114610218575f80fd5b8035611b0b81611d43565b5f67ffffffffffffffff821115611d7457611d74611c6c565b5060051b60200190565b5f67ffffffffffffffff821115611d9757611d97611c6c565b50601f01601f191660200190565b5f82601f830112611db4575f80fd5b8135611dc7611dc282611d7e565b611d12565b818152846020838601011115611ddb575f80fd5b816020850160208301375f918101602001919091529392505050565b5f60608284031215611e07575f80fd5b6040516060810167ffffffffffffffff8282108183111715611e2b57611e2b611c6c565b8160405282935084359150611e3f82611aec565b908252602084013590611e5182611aec565b8160208401526040850135915080821115611e6a575f80fd5b50611e7785828601611da5565b6040830152505092915050565b5f82601f830112611e93575f80fd5b81356020611ea3611dc283611d5b565b82815260069290921b84018101918181019086841115611ec1575f80fd5b8286015b848110156118055760408189031215611edc575f80fd5b611ee4611c80565b8135611eef81611aec565b81528185013585820152835291830191604001611ec5565b5f82601f830112611f16575f80fd5b81356020611f26611dc283611d5b565b82815260059290921b84018101918181019086841115611f44575f80fd5b8286015b8481101561180557803567ffffffffffffffff80821115611f67575f80fd5b908801906080828b03601f19011215611f7e575f80fd5b611f86611ca9565b86830135611f9381611aec565b815260408381013588830152606084013583811115611fb0575f80fd5b8401603f81018d13611fc0575f80fd5b88810135611fd0611dc282611d5b565b81815260059190911b82018301908a8101908f831115611fee575f80fd5b928401925b8284101561200c5783358252928b0192908b0190611ff3565b80858701525050505050608083013582811115612027575f80fd5b6120358c8983870101611da5565b60608301525085525050918301918301611f48565b5f82601f830112612059575f80fd5b81356020612069611dc283611d5b565b82815260059290921b84018101918181019086841115612087575f80fd5b8286015b8481101561180557803567ffffffffffffffff808211156120aa575f80fd5b90880190601f196080838c03820112156120c2575f80fd5b6120ca611ca9565b87840135838111156120da575f80fd5b840160a0818e03840112156120ed575f80fd5b6120f5611ccc565b9250612102898201611b00565b8352604081013584811115612115575f80fd5b6121238e8b83850101611df7565b8a850152506060808201358581111561213a575f80fd5b6121488f8c83860101611e84565b60408601525060808201358581111561215f575f80fd5b61216d8f8c83860101611e84565b828601525060a0820135608085015283835260408601358a84015280860135604084015260808601359350848411156121a4575f80fd5b6121b28e8b86890101611f07565b9083015250865250505091830191830161208b565b5f80604083850312156121d8575f80fd5b823567ffffffffffffffff808211156121ef575f80fd5b9084019060c08287031215612202575f80fd5b61220a611cef565b82358152602083013560208201526040830135604082015261222e60608401611d50565b6060820152608083013582811115612244575f80fd5b6122508882860161204a565b60808301525060a083013582811115612267575f80fd5b61227388828601611da5565b60a0830152509350602085013591508082111561228e575f80fd5b5061229b85828601611da5565b9150509250929050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f815180845260208085019450602084015f5b8381101561231657815180516001600160a01b0316885283015183880152604090960195908201906001016122e6565b509495945050505050565b5f815180845260208085019450602084015f5b8381101561231657815187529582019590820190600101612334565b5f82825180855260208086019550808260051b8401018186015f5b848110156123de57601f19868403018952815160806001600160a01b038251168552858201518686015260408083015182828801526123ac83880182612321565b92505050606080830151925085820381870152506123ca81836122a5565b9a86019a945050509083019060010161236b565b5090979650505050505050565b5f602080835260e08301845182850152818501516040818187015280870151915060608281880152808801519250608083151560808901526080890151935060a060c060a08a01528585518088526101009750878b019150878160051b8c010189880197505f5b8281101561253a578c820360ff190184528851805187845280516001600160a01b03908116898601528d82015188860189905280518216610120870152808f01519091166101408601528a015161016085018a90526124b56101808601826122a5565b90508a820151607f19808784030160c08801526124d283836122d3565b92508b8401519150808784030160e0880152506124ef82826122d3565b915050888201518d8601528d8301518e8601528a8301518b8601528983015192508481038a8601526125218184612350565b9b8e019b968e0196945050506001919091019050612452565b5060a08d01518c8203601f190160c08e01529950612558818b6122a5565b9d9c50505050505050505050505050565b5f806040838503121561257a575f80fd5b505080516020909101519092909150565b5f6040823603121561259b575f80fd5b6125a3611c80565b823567ffffffffffffffff808211156125ba575f80fd5b6125c636838701611df7565b835260208501359150808211156125db575f80fd5b506125e836828601611f07565b60208301525092915050565b5f808335601e19843603018112612609575f80fd5b83018035915067ffffffffffffffff821115612623575f80fd5b6020019150600581901b3603821315610c48575f80fd5b5f6020828403121561264a575f80fd5b8135610b9881611d43565b5f808335601e1984360301811261266a575f80fd5b830160208101925035905067ffffffffffffffff811115612689575f80fd5b8060051b3603821315610c48575f80fd5b5f808335601e198436030181126126af575f80fd5b830160208101925035905067ffffffffffffffff8111156126ce575f80fd5b803603821315610c48575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f813561271081611aec565b6001600160a01b03908116845260208301359061272c82611aec565b16602084015261273f604083018361269a565b606060408601526106c06060860182846126dc565b5f808335601e19843603018112612769575f80fd5b830160208101925035905067ffffffffffffffff811115612788575f80fd5b8060061b3603821315610c48575f80fd5b8183525f60208085019450825f5b858110156123165781356127ba81611aec565b6001600160a01b031687528183013583880152604096870196909101906001016127a7565b5f8235607e198336030181126127f3575f80fd5b90910192915050565b8183526020808401935f91600585811b8301820185855b888110156128e057858303601f19018a5261282e82896127df565b6080813561283b81611aec565b6001600160a01b031685528187013587860152604061285c81840184612655565b8383890152808489015260a093507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811115612896575f80fd5b881b915081818885013750850160606128b18482018561269a565b94508388840301828901526128c984840186836126dc565b9e8a019e9750505093870193505050600101612813565b509098975050505050505050565b5f604080835261010080840187358386015260208089013560608701526080848a0135608088015260608a013561292481611d43565b151560a088015261293860808b018b612655565b60c0898101529384905261012093848901600582901b8a018601835f5b84811015612a6f578c830361011f1901845261297182876127df565b8035609e19823603018112612984575f80fd5b8885528101803561299481611aec565b6001600160a01b0316858a0152808a013536829003605e190181126129b7575f80fd5b60a0808701526129cb8c8701838301612704565b90506129d98e830183612754565b607f19808985030160c08a01526129f1848385612799565b9350612a006060860186612754565b93509150808985030160e08a015250612a1a838383612799565b92505050898201358d8701528a8301358b8701528d8301358e870152612a436060840184612655565b935091508581036060870152612a5a8184846127fc565b968b0196955050509188019150600101612955565b5050612a7e60a08f018f61269a565b8c8303603f190160e08e015299509750612a99818a8a6126dc565b9850505050505085840381870152505050612ab58185876126dc565b9695505050505050565b634e487b7160e01b5f52603260045260245ffd5b5f8235607e19833603018112612ae7575f80fd5b9190910192915050565b5f8235609e19833603018112612ae7575f80fd5b5f808335601e19843603018112612b1a575f80fd5b83018035915067ffffffffffffffff821115612b34575f80fd5b6020019150600681901b3603821315610c48575f80fd5b5f60208284031215612b5b575f80fd5b8135610b9881611aec565b5f6001600160a01b03808716835280861660208401525083604083015260806060830152612ab560808301846122a5565b5f60208284031215612ba7575f80fd5b8151610b9881611d43565b5f60208284031215612bc2575f80fd5b815160ff81168114610b98575f80fd5b5f60208284031215612be2575f80fd5b5051919050565b5f805f60608486031215612bfb575f80fd5b8351612c0681611aec565b6020850151909350612c1781611aec565b604085015190925067ffffffffffffffff811115612c33575f80fd5b8401601f81018613612c43575f80fd5b8051612c51611dc282611d7e565b818152876020838501011115612c65575f80fd5b8160208401602083015e5f602083830101528093505050509250925092565b5f8282518085526020808601955060208260051b840101602086015f5b848110156123de57601f19868403018952612cbd838351612321565b98840198925090830190600101612ca1565b602081526001600160a01b038251166020820152602082015160408201525f604083015160e06060840152612d086101008401826122a5565b9050606084015160808401526080840151601f19808584030160a0860152612d308383612c84565b925060a08601519150808584030160c0860152612d4d8383612321565b925060c08601519150808584030160e0860152506106c08282612321565b5f82601f830112612d7a575f80fd5b81516020612d8a611dc283611d5b565b8083825260208201915060208460051b870101935086841115612dab575f80fd5b602086015b848110156118055780518352918301918301612db0565b5f8060408385031215612dd8575f80fd5b825167ffffffffffffffff80821115612def575f80fd5b818501915085601f830112612e02575f80fd5b81516020612e12611dc283611d5b565b82815260059290921b84018101918181019089841115612e30575f80fd5b948201945b83861015612e4e57855182529482019490820190612e35565b91880151919650909350505080821115612e66575f80fd5b5061229b85828601612d6b565b828152604060208201525f612e8b6040830184612321565b949350505050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52602160045260245ffd"; + hex"608060405260043610610034575f3560e01c806301ffc9a71461003d57806323e30c8b146100715780634bacdc9d1461009e57005b3661003b57005b005b348015610048575f80fd5b5061005c610057366004611ac5565b6100b1565b60405190151581526020015b60405180910390f35b34801561007c575f80fd5b5061009061008b366004611b4e565b6100e7565b604051908152602001610068565b61003b6100ac366004611bc5565b610204565b5f6001600160e01b031982166323e30c8b60e01b14806100e157506301ffc9a760e01b6001600160e01b03198316145b92915050565b5f3373d2cd1d4ad3bf3ecb581e4653c9c02a67ca44305c1461012257604051625e1e6f60e51b81523360048201526024015b60405180910390fd5b6001600160a01b0387163014610156576040516322c7df1960e21b81526001600160a01b0388166004820152602401610119565b5f80610164848601866121c7565b91509150610172828261057c565b60405163b0460f0760e01b8152339063b0460f07906101959085906004016123eb565b60408051808303815f875af11580156101b0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101d49190612569565b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd99a9950505050505050505050565b61020c6105f0565b61021b6102188261258b565b50565b61022860808501856125f4565b90505f0361024957604051639c95219f60e01b815260040160405180910390fd5b6001600160a01b03851673d2cd1d4ad3bf3ecb581e4653c9c02a67ca44305c146102915760405163516e822d60e01b81526001600160a01b0386166004820152602401610119565b6102a1608085016060860161263a565b6102be57604051636d3a9fe560e01b815260040160405180910390fd5b5f8484846040516020016102d4939291906128ee565b60408051601f1981840301815291905290505f6102f460808701876125f4565b5f81811061030457610304612abf565b90506020028101906103169190612ad3565b6103209080612af1565b61032e906060810190612b05565b61033b60808901896125f4565b5f81811061034b5761034b612abf565b905060200281019061035d9190612ad3565b6040013581811061037057610370612abf565b6103869260206040909202019081019150612b4b565b90505f61039660808801886125f4565b5f8181106103a6576103a6612abf565b90506020028101906103b89190612ad3565b6103c29080612af1565b6103d0906040810190612b05565b6103dd60808a018a6125f4565b5f8181106103ed576103ed612abf565b90506020028101906103ff9190612ad3565b6020013581811061041257610412612abf565b6104289260206040909202019081019150612b4b565b90505f6104348261061e565b90505f6104408461061e565b90505f61044e8a35836106a2565b90506104656001600160a01b0385168c5f196106c9565b61047a6001600160a01b0386168c5f196106c9565b604051632e7ff4ef60e11b81526001600160a01b038c1690635cffe9de906104ac903090899086908c90600401612b66565b6020604051808303815f875af11580156104c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104ec9190612b97565b610509576040516349088f5960e11b815260040160405180910390fd5b61051d6001600160a01b0386168c5f6106c9565b6105316001600160a01b0385168c5f6106c9565b61054661053d8861258b565b85858886610743565b50505050505061057560017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5050505050565b5f82608001515f8151811061059357610593612abf565b60200260200101515f01516060015183608001515f815181106105b8576105b8612abf565b602002602001015160400151815181106105d4576105d4612abf565b60200260200101515f015190506105eb81836109e2565b505050565b6105f8610a8c565b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f610627610ad0565b6040516354636d2b60e01b81526001600160a01b038316600482015273200e12d10bb0c5e4a17e7018f0f1161919bb9389906354636d2b906024016020604051808303815f875af115801561067e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100e19190612bb2565b5f6001600160e01b038316601b0b60e084901d6106c0828286610b5b565b95945050505050565b6106d58383835f610b9f565b6105eb576106e683835f6001610b9f565b61070e57604051635274afe760e01b81526001600160a01b0384166004820152602401610119565b61071b8383836001610b9f565b6105eb57604051635274afe760e01b81526001600160a01b0384166004820152602401610119565b6040805160018082528183019092525f91816020015b6060815260200190600190039081610759575050604080516003808252608082019092529192505f919060208201606080368337019050506040516370a0823160e01b81523060048201529091505f906001600160a01b038816906370a0823190602401602060405180830381865afa1580156107d8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107fc9190612bd2565b90508015610818576108186001600160a01b0388163383610c01565b5f6108238288610c0e565b50905080835f8151811061083957610839612abf565b602090810291909101015250506040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa15801561088a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108ae9190612bd2565b905080156108ca576108ca6001600160a01b0386163383610c01565b5f6108d58286610c0e565b50905080836001815181106108ec576108ec612abf565b602090810291909101015250479050801561090b5761090b3382610c4f565b5f610917826012610c0e565b509050808360028151811061092e5761092e612abf565b602002602001018181525050505080825f8151811061094f5761094f612abf565b60209081029190910101526040805160018082528183019092525f91816020015b6040805160a0810182525f918101828152606080830193909352608082018390528152602081019190915281526020019060019003908161097057905050905087815f815181106109c3576109c3612abf565b60200260200101819052506109d88382610cc6565b5050505050505050565b5f805f838060200190518101906109f99190612be9565b919450925090506001600160a01b038316610a27576040516398521dc560e01b815260040160405180910390fd5b6001600160a01b038216610a4e5760405163456ac4c360e11b815260040160405180910390fd5b610a636001600160a01b038616845f196106c9565b610a776001600160a01b0383168247610f0e565b506105756001600160a01b038616845f6106c9565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054600203610ace57604051633ee5aeb560e01b815260040160405180910390fd5b565b73200e12d10bb0c5e4a17e7018f0f1161919bb93893b1580610b27575073200e12d10bb0c5e4a17e7018f0f1161919bb93893f7f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d4114155b15610ace576040516373e6d7b360e01b815273200e12d10bb0c5e4a17e7018f0f1161919bb93896004820152602401610119565b5f805f610b69868686610fbc565b9150915080610b945760405162bc8ecf60e31b81526004810187905260248101869052604401610119565b5090505b9392505050565b60405163095ea7b360e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610bf5578383151615610be9573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b61071b838383600161112e565b5f805f805f610c1d8787611178565b9250925092505f80610c2f85856111d4565b9150915081838015610c3e5750815b9650965050505050505b9250929050565b80471015610c795760405163cf47918160e01b815247600482015260248101829052604401610119565b610c92828260405180602001604052805f81525061141d565b15610c9b575050565b3d15610cad57610ca9611432565b5050565b60405163d6bda27560e01b815260040160405180910390fd5b60408051600680825260e082019092525f91816020015b6060815260200190600190039081610cdd5790505090505f5b8351811015610d3e57838181518110610d1157610d11612abf565b6020026020010151828281518110610d2b57610d2b612abf565b6020908102919091010152600101610cf6565b50335f8181523060209081526040808320815160a0810183528083018581526060808301879052608083018190529082528185015282518581529384018581528484019093529093909291905b8751811015610f0357878181518110610da657610da6612abf565b602002602001015193505f845f015160400151511115610efb575f845f01515f01516001600160a01b031663d04dfe236040518060e00160405280885f0151602001516001600160a01b03168152602001898152602001885f01516040015181526020015f8152602001610e1e8c8a6020015161143d565b8152602001878152602001868152506040518263ffffffff1660e01b8152600401610e499190612ccf565b5f60405180830381865afa158015610e63573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610e8a9190810190612dc7565b9150505f81511115610ef95784516020015160405163012c676d60e21b81526001600160a01b03909116906304b19db490610ecb908a908590600401612e73565b5f604051808303815f87803b158015610ee2575f80fd5b505af1158015610ef4573d5f803e3d5ffd5b505050505b505b600101610d8b565b505050505050505050565b606081471015610f3a5760405163cf47918160e01b815247600482015260248101839052604401610119565b5f610f4685848661141d565b9050808015610f6757505f3d1180610f6757505f856001600160a01b03163b115b15610f7c57610f74611810565b915050610b98565b8015610fa657604051639996b31560e01b81526001600160a01b0386166004820152602401610119565b3d15610cad57610fb4611432565b509392505050565b5f805f851215610fe957604051634a7d166b60e01b81526004810186905260248101859052604401610119565b845f03610ffb57505f90506001611126565b8460ff84168501858112156110365760405163c849483b60e01b8152600481018890526024810187905260ff86166044820152606401610119565b5f805f83121561108257604c19831215611059575f809550955050505050611126565b825f03600a0a915081848161107057611070612e93565b04955050840290911491506111269050565b5f83131561111b57604d8313156110bf5760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610119565b82600a0a9150815f19816110d5576110d5612e93565b048411156111095760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610119565b50919091029250600191506111269050565b509193506001925050505b935093915050565b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610bf5578383151615610be9573d5f823e3d81fd5b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8611156111c357600a860460018201600a88065f14935093509350506111cd565b8593509150600190505b9250925092565b5f808383601b82900b82148061130a577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e1000000000000000000870515611255577f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000870515611246576305f5e10087059650600886019550611255565b620186a0870596506005860195505b8687601b0b1461127057600a87059650856001019550611255565b7b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc7b1999999999999999999999999999999999999999999999999999999888820111611304575f600188039050808160030b036113025760e01b6001600160e01b037b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff60ff8b901d18161795505f9450610c489350505050565b505b50611321565b865f0361132157505f935060019250610c48915050565b858660030b146113d8575f8213156113805761133d8383611829565b156113655760405163d556b11160e01b81526004810184905260248101839052604401610119565b637ffffffe19909501600a0a82029550637fffffff946113d8565b637fffffff1986900360438113156113a257505f9450849350610c4892505050565b80600a0a88816113b4576113b4612e93565b059750875f036113ce57505f9450849350610c4892505050565b50637fffffff1995505b8186136113e85760019350611401565b818603600a0a83816113fc576113fc612e93565b071593505b5050506001600160e01b03841660e084901b1791509250929050565b5f805f83516020850186885af1949350505050565b6040513d5f823e3d81fd5b60605f825167ffffffffffffffff81111561145a5761145a611c6c565b604051908082528060200260200182016040528015611483578160200160208202803683370190505b5090505f835167ffffffffffffffff8111156114a1576114a1611c6c565b6040519080825280602002602001820160405280156114ca578160200160208202803683370190505b5090505f808551116114dc575f6114e2565b84516002015b86516001010190505f8167ffffffffffffffff81111561150457611504611c6c565b60405190808252806020026020018201604052801561153757816020015b60608152602001906001900390816115225790505b5090505f61155b604080516002815233602082015230818301526060810190915290565b82828151811061156d5761156d612abf565b60200260200101819052505f5b88518110156115ca57818060010192505088818151811061159d5761159d612abf565b60200260200101518383815181106115b7576115b7612abf565b602090810291909101015260010161157a565b50865115611805578080600101915050848282815181106115ed576115ed612abf565b602002602001018190525080806001019150508382828151811061161357611613612abf565b60200260200101819052505f5b87518110156118035761171688828151811061163e5761163e612abf565b60200260200101515f01516116f38a848151811061165e5761165e612abf565b6020026020010151602001516116d48c868151811061167f5761167f612abf565b60200260200101518051604091820151805160209081029181019190912083517f6ec4dff745ec96dbde88c5d41f8aa5ac13aa1664afb47b8406b44fa945a650c8815291820192909252918201526060902090565b60405161190160f01b8152600281019290925260228201526042902090565b8a848151811061170557611705612abf565b602002602001015160600151611844565b61173657604051630a57f30960e31b815260048101829052602401610119565b87818151811061174857611748612abf565b60200260200101515f01516001600160a01b03165f1b86828151811061177057611770612abf565b60200260200101818152505087818151811061178e5761178e612abf565b6020026020010151602001518582815181106117ac576117ac612abf565b60200260200101818152505081806001019250508781815181106117d2576117d2612abf565b6020026020010151604001518383815181106117f0576117f0612abf565b6020908102919091010152600101611620565b505b509695505050505050565b6040513d81523d5f602083013e3d602001810160405290565b5f610b985f841261183a578361183e565b835f035b836118b4565b5f836001600160a01b03163b5f036118a2575f806118628585611952565b5090925090505f81600381111561187b5761187b612ea7565b1480156118995750856001600160a01b0316826001600160a01b0316145b92505050610b98565b6118ad848484611998565b9050610b98565b5f637ffffff582136118c757505f6100e1565b637ffffffe19820160438113156118e25750508115156100e1565b5f81126119225780600a0a7b800000000000000000000000000000000000000000000000000000018161191757611917612e93565b0484119150506100e1565b805f03600a0a7b800000000000000000000000000000000000000000000000000000020284101591505092915050565b5f805f8351604103611989576020840151604085015160608601515f1a61197b888285856119fd565b9550955095505050506111cd565b505081515f91506002906111cd565b805160408051630b135d3f60e11b8082526004820186905260248201929092525f92906020820185604483015e5f82606483010152601f820160051c60051b915060205f60648401838a5afa9050825f5114601f3d1116811693505050509392505050565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841115611a3657505f91506003905082611abb565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015611a87573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b038116611ab257505f925060019150829050611abb565b92505f91508190505b9450945094915050565b5f60208284031215611ad5575f80fd5b81356001600160e01b031981168114610b98575f80fd5b6001600160a01b0381168114610218575f80fd5b8035611b0b81611aec565b919050565b5f8083601f840112611b20575f80fd5b50813567ffffffffffffffff811115611b37575f80fd5b602083019150836020828501011115610c48575f80fd5b5f805f805f8060a08789031215611b63575f80fd5b8635611b6e81611aec565b95506020870135611b7e81611aec565b94506040870135935060608701359250608087013567ffffffffffffffff811115611ba7575f80fd5b611bb389828a01611b10565b979a9699509497509295939492505050565b5f805f805f60808688031215611bd9575f80fd5b8535611be481611aec565b9450602086013567ffffffffffffffff80821115611c00575f80fd5b9087019060c0828a031215611c13575f80fd5b90945060408701359080821115611c28575f80fd5b611c3489838a01611b10565b90955093506060880135915080821115611c4c575f80fd5b50860160408189031215611c5e575f80fd5b809150509295509295909350565b634e487b7160e01b5f52604160045260245ffd5b6040805190810167ffffffffffffffff81118282101715611ca357611ca3611c6c565b60405290565b6040516080810167ffffffffffffffff81118282101715611ca357611ca3611c6c565b60405160a0810167ffffffffffffffff81118282101715611ca357611ca3611c6c565b60405160c0810167ffffffffffffffff81118282101715611ca357611ca3611c6c565b604051601f8201601f1916810167ffffffffffffffff81118282101715611d3b57611d3b611c6c565b604052919050565b8015158114610218575f80fd5b8035611b0b81611d43565b5f67ffffffffffffffff821115611d7457611d74611c6c565b5060051b60200190565b5f67ffffffffffffffff821115611d9757611d97611c6c565b50601f01601f191660200190565b5f82601f830112611db4575f80fd5b8135611dc7611dc282611d7e565b611d12565b818152846020838601011115611ddb575f80fd5b816020850160208301375f918101602001919091529392505050565b5f60608284031215611e07575f80fd5b6040516060810167ffffffffffffffff8282108183111715611e2b57611e2b611c6c565b8160405282935084359150611e3f82611aec565b908252602084013590611e5182611aec565b8160208401526040850135915080821115611e6a575f80fd5b50611e7785828601611da5565b6040830152505092915050565b5f82601f830112611e93575f80fd5b81356020611ea3611dc283611d5b565b82815260069290921b84018101918181019086841115611ec1575f80fd5b8286015b848110156118055760408189031215611edc575f80fd5b611ee4611c80565b8135611eef81611aec565b81528185013585820152835291830191604001611ec5565b5f82601f830112611f16575f80fd5b81356020611f26611dc283611d5b565b82815260059290921b84018101918181019086841115611f44575f80fd5b8286015b8481101561180557803567ffffffffffffffff80821115611f67575f80fd5b908801906080828b03601f19011215611f7e575f80fd5b611f86611ca9565b86830135611f9381611aec565b815260408381013588830152606084013583811115611fb0575f80fd5b8401603f81018d13611fc0575f80fd5b88810135611fd0611dc282611d5b565b81815260059190911b82018301908a8101908f831115611fee575f80fd5b928401925b8284101561200c5783358252928b0192908b0190611ff3565b80858701525050505050608083013582811115612027575f80fd5b6120358c8983870101611da5565b60608301525085525050918301918301611f48565b5f82601f830112612059575f80fd5b81356020612069611dc283611d5b565b82815260059290921b84018101918181019086841115612087575f80fd5b8286015b8481101561180557803567ffffffffffffffff808211156120aa575f80fd5b90880190601f196080838c03820112156120c2575f80fd5b6120ca611ca9565b87840135838111156120da575f80fd5b840160a0818e03840112156120ed575f80fd5b6120f5611ccc565b9250612102898201611b00565b8352604081013584811115612115575f80fd5b6121238e8b83850101611df7565b8a850152506060808201358581111561213a575f80fd5b6121488f8c83860101611e84565b60408601525060808201358581111561215f575f80fd5b61216d8f8c83860101611e84565b828601525060a0820135608085015283835260408601358a84015280860135604084015260808601359350848411156121a4575f80fd5b6121b28e8b86890101611f07565b9083015250865250505091830191830161208b565b5f80604083850312156121d8575f80fd5b823567ffffffffffffffff808211156121ef575f80fd5b9084019060c08287031215612202575f80fd5b61220a611cef565b82358152602083013560208201526040830135604082015261222e60608401611d50565b6060820152608083013582811115612244575f80fd5b6122508882860161204a565b60808301525060a083013582811115612267575f80fd5b61227388828601611da5565b60a0830152509350602085013591508082111561228e575f80fd5b5061229b85828601611da5565b9150509250929050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f815180845260208085019450602084015f5b8381101561231657815180516001600160a01b0316885283015183880152604090960195908201906001016122e6565b509495945050505050565b5f815180845260208085019450602084015f5b8381101561231657815187529582019590820190600101612334565b5f82825180855260208086019550808260051b8401018186015f5b848110156123de57601f19868403018952815160806001600160a01b038251168552858201518686015260408083015182828801526123ac83880182612321565b92505050606080830151925085820381870152506123ca81836122a5565b9a86019a945050509083019060010161236b565b5090979650505050505050565b5f602080835260e08301845182850152818501516040818187015280870151915060608281880152808801519250608083151560808901526080890151935060a060c060a08a01528585518088526101009750878b019150878160051b8c010189880197505f5b8281101561253a578c820360ff190184528851805187845280516001600160a01b03908116898601528d82015188860189905280518216610120870152808f01519091166101408601528a015161016085018a90526124b56101808601826122a5565b90508a820151607f19808784030160c08801526124d283836122d3565b92508b8401519150808784030160e0880152506124ef82826122d3565b915050888201518d8601528d8301518e8601528a8301518b8601528983015192508481038a8601526125218184612350565b9b8e019b968e0196945050506001919091019050612452565b5060a08d01518c8203601f190160c08e01529950612558818b6122a5565b9d9c50505050505050505050505050565b5f806040838503121561257a575f80fd5b505080516020909101519092909150565b5f6040823603121561259b575f80fd5b6125a3611c80565b823567ffffffffffffffff808211156125ba575f80fd5b6125c636838701611df7565b835260208501359150808211156125db575f80fd5b506125e836828601611f07565b60208301525092915050565b5f808335601e19843603018112612609575f80fd5b83018035915067ffffffffffffffff821115612623575f80fd5b6020019150600581901b3603821315610c48575f80fd5b5f6020828403121561264a575f80fd5b8135610b9881611d43565b5f808335601e1984360301811261266a575f80fd5b830160208101925035905067ffffffffffffffff811115612689575f80fd5b8060051b3603821315610c48575f80fd5b5f808335601e198436030181126126af575f80fd5b830160208101925035905067ffffffffffffffff8111156126ce575f80fd5b803603821315610c48575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f813561271081611aec565b6001600160a01b03908116845260208301359061272c82611aec565b16602084015261273f604083018361269a565b606060408601526106c06060860182846126dc565b5f808335601e19843603018112612769575f80fd5b830160208101925035905067ffffffffffffffff811115612788575f80fd5b8060061b3603821315610c48575f80fd5b8183525f60208085019450825f5b858110156123165781356127ba81611aec565b6001600160a01b031687528183013583880152604096870196909101906001016127a7565b5f8235607e198336030181126127f3575f80fd5b90910192915050565b8183526020808401935f91600585811b8301820185855b888110156128e057858303601f19018a5261282e82896127df565b6080813561283b81611aec565b6001600160a01b031685528187013587860152604061285c81840184612655565b8383890152808489015260a093507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811115612896575f80fd5b881b915081818885013750850160606128b18482018561269a565b94508388840301828901526128c984840186836126dc565b9e8a019e9750505093870193505050600101612813565b509098975050505050505050565b5f604080835261010080840187358386015260208089013560608701526080848a0135608088015260608a013561292481611d43565b151560a088015261293860808b018b612655565b60c0898101529384905261012093848901600582901b8a018601835f5b84811015612a6f578c830361011f1901845261297182876127df565b8035609e19823603018112612984575f80fd5b8885528101803561299481611aec565b6001600160a01b0316858a0152808a013536829003605e190181126129b7575f80fd5b60a0808701526129cb8c8701838301612704565b90506129d98e830183612754565b607f19808985030160c08a01526129f1848385612799565b9350612a006060860186612754565b93509150808985030160e08a015250612a1a838383612799565b92505050898201358d8701528a8301358b8701528d8301358e870152612a436060840184612655565b935091508581036060870152612a5a8184846127fc565b968b0196955050509188019150600101612955565b5050612a7e60a08f018f61269a565b8c8303603f190160e08e015299509750612a99818a8a6126dc565b9850505050505085840381870152505050612ab58185876126dc565b9695505050505050565b634e487b7160e01b5f52603260045260245ffd5b5f8235607e19833603018112612ae7575f80fd5b9190910192915050565b5f8235609e19833603018112612ae7575f80fd5b5f808335601e19843603018112612b1a575f80fd5b83018035915067ffffffffffffffff821115612b34575f80fd5b6020019150600681901b3603821315610c48575f80fd5b5f60208284031215612b5b575f80fd5b8135610b9881611aec565b5f6001600160a01b03808716835280861660208401525083604083015260806060830152612ab560808301846122a5565b5f60208284031215612ba7575f80fd5b8151610b9881611d43565b5f60208284031215612bc2575f80fd5b815160ff81168114610b98575f80fd5b5f60208284031215612be2575f80fd5b5051919050565b5f805f60608486031215612bfb575f80fd5b8351612c0681611aec565b6020850151909350612c1781611aec565b604085015190925067ffffffffffffffff811115612c33575f80fd5b8401601f81018613612c43575f80fd5b8051612c51611dc282611d7e565b818152876020838501011115612c65575f80fd5b8160208401602083015e5f602083830101528093505050509250925092565b5f8282518085526020808601955060208260051b840101602086015f5b848110156123de57601f19868403018952612cbd838351612321565b98840198925090830190600101612ca1565b602081526001600160a01b038251166020820152602082015160408201525f604083015160e06060840152612d086101008401826122a5565b9050606084015160808401526080840151601f19808584030160a0860152612d308383612c84565b925060a08601519150808584030160c0860152612d4d8383612321565b925060c08601519150808584030160e0860152506106c08282612321565b5f82601f830112612d7a575f80fd5b81516020612d8a611dc283611d5b565b8083825260208201915060208460051b870101935086841115612dab575f80fd5b602086015b848110156118055780518352918301918301612db0565b5f8060408385031215612dd8575f80fd5b825167ffffffffffffffff80821115612def575f80fd5b818501915085601f830112612e02575f80fd5b81516020612e12611dc283611d5b565b82815260059290921b84018101918181019089841115612e30575f80fd5b948201945b83861015612e4e57855182529482019490820190612e35565b91880151919650909350505080821115612e66575f80fd5b5061229b85828601612d6b565b828152604060208201525f612e8b6040830184612321565b949350505050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52602160045260245ffd"; /// @dev What MUST already be on a network before this release can be /// broadcast there: an address, and the runtime code that belongs at it. /// `abi.encode`d as a `DeployDependency[]` because Solidity has no /// file-scope constant of dynamic array type. bytes constant DEPENDENCIES = - hex"0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000005940000000000000000000000000531167691b4f37f0266e226d03412c77fb2977ce0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000588e6080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a71461180e575080632cb77e9f146117e257806341d1514f146117ab5780635343c1b7146117105780635cffe9de146115b45780635d003c4414611430578063613255ab146113ad578063687cf02a14611096578063ac9650d814610f48578063b0460f07146105f3578063b845b83e1461059b578063ca9109ba1461044c578063d9d98ce41461039b578063ddebc96f146103475763df6db3c2146100c1575f80fd5b34610321576003196040368201126103215767ffffffffffffffff9060043582811161032157806004019160a0823603918201126103215760243584811161032157610111903690600401611cd0565b909361011b612bf0565b5f946001600160a01b039485610130846125d7565b163303610325576101496101443685611b02565b612c32565b805f525f60205260405f20966001885414610190575b60208960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556040519015158152f35b9091929394959697505f600198556040519633885282602089015260606040890152816101bc8761188d565b166060890152602484013590606219018112156103215783019060a06080890152806101ea6004840161188d565b166101008901526101fd6024830161188d565b16610120880152604481013560221982360301811215610321570190602460048301359201988211610321578136038913610321577f09d18501db0080ca2d6cd7c17fa7255daff4b2d503ea93b76ff68b6752ea8e6387806103069560846102c561030e9a60209f610284906103149f9a60606101406102ef9d0152610160880191612388565b6102b66102ab61029760448801856129db565b605f198a8603810160a08c01529491612a10565b9260648701906129db565b918784030160c0880152612a10565b91013560e08301520390a13390919060405192600284526020840152604083015260608201604052565b906040519160018352602083015260408201604052565b9236916123a8565b90613c65565b5f8080808080808061015f565b5f80fd5b602486610331856125d7565b6040516335252be360e01b815291166004820152fd5b3461032157600319602036820112610321576004359067ffffffffffffffff82116103215760809082360301126103215761038660609160040161262b565b90604051921515835260208301526040820152f35b34610321576040366003190112610321576001600160a01b036103bc611861565b166040516370a0823160e01b8152306004820152602081602481855afa908115610441575f9161040f575b50156103f75760206040515f8152f35b60249060405190633c5bf76960e21b82526004820152fd5b90506020813d602011610439575b8161042a60209383611971565b810103126103215751826103e7565b3d915061041d565b6040513d5f823e3d90fd5b346103215761045a36611d01565b92809492610466612bf0565b610471828533613b61565b61047a816134d6565b15610567578061048e6104dd9286336140a7565b9790957f7f9dfa19cf1cc2f806f2f860fbc9c056b601fb1afc0e9b843dfe5c63616268e660806040513381526001600160a01b038416998a60208301528560408301526060820152a1336137bd565b9390918561050c575b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b61055b9661030e956103069460ff93604051956005875260208701526040860152606085015260808401521660a082015260c08101604052906040519160018352602083015260408201604052565b808080808080806104e6565b506040516306dde9c360e41b81523360048201526001600160a01b03841660248201526044810191909152606490fd5b0390fd5b346103215760203660031901126103215760043567ffffffffffffffff81116103215761030e6105d26104e6923690600401611cd0565b91906105dc612bf0565b604051926105e984611955565b5f845236916123a8565b34610321576003196020368201126103215767ffffffffffffffff600435116103215760c090600435360301126103215761062c612bf0565b5f808061064160048035608481019101612510565b905015610f36576024600435013592610659846134d6565b15610f245760608060405161066d81611909565b610675612565565b81525f60208201525f6040820152015261068d612565565b506106ed6106e86106c76106bd6106b76106b1608460043501600435600401612510565b90612597565b806125b2565b60408101906124a2565b60206106e06106b1608460043501600435600401612510565b0135916125c7565b6125d7565b936001600160a01b0361073c6106e86107236107196106b76106b1608460043501600435600401612510565b60608101906124a2565b60406106e06106b1608460043501600435600401612510565b816040519761074a896118d1565b168752166020860152604085015261076c608460043501600435600401612510565b9490506001604051955f87520160051b85016040525f905f5b610799608460043501600435600401612510565b9050811080610f11575b15610d5e576107bc608460043501600435600401612510565b821015610d4a578160051b810135607e198236030181121561032157608081830136031261032157604051916107f183611909565b8181013567ffffffffffffffff81116103215761081390369084840101611b02565b835280820160208181013590850152604080820135908501526060013567ffffffffffffffff81116103215761084c9236920101611cb5565b606082015280516001600160a01b0361086e6040830151602085015190611dbe565b5151166001600160a01b0385511614801590610d16575b610d045761089d602083015160408401519083613fa4565b6108a681612c32565b91825f525f60205260405f2054155f1461090a575051604080513381526001600160a01b039092166020830152810191909152600191907fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f390606090a15b01610785565b919061093b60208497959701516040850151906060860151906040519261093084611955565b5f8452339186613234565b5f94916109a457505051604080513381526001600160a01b03909216602083015281019190915260019291907f1e6fa9678edf81f9f25bbf308bde03ad3e110db1f429394b0915ba021532941490606090a15b811561099c575b5092610904565b905088610995565b6109b9606082015160446004350135906134f9565b15610a1357505051604080513381526001600160a01b03909216602083015281019190915260019291907fe3151dc8cb7a54ffc4baabd28c1f241c94d510b5e5b502491ac3cad6c16316d59080606081015b0390a161098e565b610a2060408201516134d6565b158015610cf1575b15610a7e57505051604080513381526001600160a01b03909216602083015281019190915260019291907f500b713857325f9e6dcb52ae832eca9109d107ed1aae9cb4928b4c1e13f051aa908060608101610a0b565b9250925050600196959691610a976064600435016125eb565b15610c5e5796610b0797610b1760408401516040880151610ab88183613543565b15610c565750925b610b11848592610afa610af460608a01516001600160e01b03601b918660e01d92828816810b928260e01d9216900b6145f4565b90614569565b9d8e9260408d015161356a565b60408c015261407d565b9961407d565b98610b228484613594565b610b2c84826135f2565b60405192338452608060208501526060610b528451608080880152610100870190611e19565b93602081015160a0870152604081015160c0870152015192607f198582030160e0860152835180825260208201906020808260051b8501019601925f5b828110610bee57505050505092806001979695937fbae4dbf76931c547f765e9def16d693d86daaa596f491de979008831789185ae93610be996604084015260608301520390a180858c5101808d5260051b8c01526138a9565b61098e565b9091929396602080610c49600193601f198782030189528b51906001600160a01b03825116815283820151848201526060610c3860408401516080604085015260808401906125f8565b920151906060818403910152611d4d565b9901950193929101610b8f565b905092610ac0565b610b0790610b176060840151610b11610c9c610af460408801516001600160e01b0394601b90868360e01d9316820b91878260e01d9216900b6145f4565b60408a0151610cab8183613543565b15610ce95750915b829c8d916060890151908116155f14610cda575060408801515b96879460408d015161356a565b610ce49085613fd9565b610ccd565b905091610cb3565b50610cff6060820151613520565b610a28565b60405163936bb5ad60e01b8152600490fd5b506001600160a01b03610d326060830151604085015190611dbe565b5151166001600160a01b036020860151161415610885565b634e487b7160e01b5f52603260045260245ffd5b50919390610d706064600435016125eb565b15610f0b57835b6004356004013590610d898282613543565b610eed5750508490610da9856001600160a01b0360208701511633613bf3565b505060a46004350190610dc18260043560040161246f565b905015159081610ee5575b50610e44575b506001600160a01b03610de892935116336140a7565b50505b8351811015610e105780610e0a610e0460019387611dbe565b5161371d565b01610deb565b5060409160017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005582519182526020820152f35b90506001600160a01b03602084015116610e6e6001600160a01b038551169260043560040161246f565b929091333b1561032157610eb65f93604051958694859463691f9ed760e01b8652600486015260248501528960448501528a606485015260a0608485015260a4840191612388565b038183335af190811561044157859115610dd2579050610ed69150611925565b5f836001600160a01b03610dd2565b905088610dcc565b604492506040519163573b6f4160e01b835260048301526024820152fd5b84610d77565b50610f1f60408301516134d6565b6107a3565b60405163315f9e2360e21b8152600490fd5b604051639c95219f60e01b8152600490fd5b34610321576020806003193601126103215760043567ffffffffffffffff811161032157610f7a903690600401611cd0565b919060405192610f8984611955565b5f8452828401610f9882611a55565b94610fa66040519687611971565b828652610fb283611a55565b93610fc486880195601f1901866124f4565b5f5b84811061102857604080518881528951818a018190525f92600582901b83018101918a918c9085015b828710610ffc5785850386f35b909192938280611018600193603f198a82030186528851611d4d565b9601920196019592919092610fef565b806110778861107161104460019560059d9c9d1b87018761246f565b929089846040519586938585013782018381015f81528b519283915e015f83820152038084520182611971565b30613f13565b611081828a611dbe565b5261108c8189611dbe565b5001969596610fc6565b34610321576003196040368201126103215760043567ffffffffffffffff8082116103215760c08260040193833603011261032157602435908111610321576110e3903690600401611cd0565b906110ec612bf0565b61111d61111861111361110c611102888061245a565b604081019061246f565b3691611993565b613e95565b613efe565b801561139b5760011015611389576024830161113981866124a2565b90501561137757604484019461114f86826124a2565b905015611365576111b561117d966111a961117461116d858061245a565b95856124a2565b999092856124a2565b91909261119a60405197611190896118a1565b33895236906119f7565b9a60209b8c8901523691611a6d565b60408601523691611a6d565b6060830152606485013560808301526111cd82612c32565b91825f525f875260405f20958654159687611211575b888860017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055604051908152f35b6001905560a46001600160a01b03917f87491344dfbcf91f6cbbc610cbbeedc85313d37a02df0c93527f7ea5f8db717f83855116604051908152878c82015260606040820152806112656060820188611e19565b0390a10191611274838561246f565b90506112b9575b505050506112ad92916103066102ef61030e933390919060405192600284526020840152604083015260608201604052565b828080808080806111e3565b6112c661110c848661246f565b6112cf816145d0565b156113425750937fd46c2c56b35c8210e9e712ec3f02242d5fc90187c0ac8ed80cc33626846ec369896112ad989795611335611318610306976102ef9761030e9b51169361246f565b866040519586958652850152606060408501526060840191612388565b0390a1938395965061127b565b89610597604051928392630c89984b60e31b845260048401526024830190611d4d565b60405163540e5f0b60e01b8152600490fd5b604051636c44ef8f60e01b8152600490fd5b604051633c8270bd60e21b8152600490fd5b604051632cff108b60e21b8152600490fd5b3461032157602080600319360112610321576024816001600160a01b036113d2611861565b16604051928380926370a0823160e01b82523060048301525afa908115610441575f91611403575b50604051908152f35b90508181813d8311611429575b61141a8183611971565b810103126103215751826113fa565b503d611410565b346103215761143e36611d01565b929161144b949194612bf0565b611456838333613b61565b61145f816134d6565b15611583578160ff916114778561153a969533612a60565b6114818183613543565b1561157d575080935b61149685828533613b95565b917f8045c25080b0868951141ed0a91720bcad09a8364a2b3109ee1fd49c1f0bc8b860c06114c5898833613bf3565b97906001600160a01b0360405192338452169a8b6020840152856040840152886060840152608083015260a0820152a16040519660068852602088015260408701526060860152608085015260a08401521660c082015260e08101604052906040519160018352602083015260408201604052565b90806115665760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b6115759261030e9136916123a8565b8080806104e6565b9361148a565b50604051623a3a4d60e21b81523360048201526001600160a01b039190911660248201526044810191909152606490fd5b34610321576080366003190112610321576004356001600160a01b0390818116809103610321576115e3611877565b6044359167ffffffffffffffff91606435838111610321573660238201121561032157806004013593841161032157366024858301011161032157611670956020921693611632868587613a82565b60405196879283926323e30c8b60e01b84523360048501528760248501528860448501525f606485015260a06084850152602460a485019201612388565b03815f855af1938415610441575f946116dc575b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd984036116c3576116b893503091613afb565b602060405160018152f35b604051630b6c58a960e31b815260048101859052602490fd5b9093506020813d602011611708575b816116f860209383611971565b8101031261032157519284611684565b3d91506116eb565b34610321576101403660031901126103215767ffffffffffffffff60043581811161032157611743903690600401611b02565b6024358281116103215761175b903690600401611b02565b60c0366043190112610321576101043583811161032157611780903690600401611cb5565b90610124359384116103215761179d6104e6943690600401611cb5565b926117a6612bf0565b611eca565b346103215760603660031901126103215760206117da6117c9611861565b6117d1611877565b60443591612a60565b604051908152f35b34610321576020366003190112610321576004355f525f6020526020600160405f205414604051908152f35b34610321576020366003190112610321576004359063ffffffff60e01b82168092036103215760209163e414309160e01b8114908115611850575b5015158152f35b6301ffc9a760e01b14905083611849565b600435906001600160a01b038216820361032157565b602435906001600160a01b038216820361032157565b35906001600160a01b038216820361032157565b60a0810190811067ffffffffffffffff8211176118bd57604052565b634e487b7160e01b5f52604160045260245ffd5b6060810190811067ffffffffffffffff8211176118bd57604052565b6040810190811067ffffffffffffffff8211176118bd57604052565b6080810190811067ffffffffffffffff8211176118bd57604052565b67ffffffffffffffff81116118bd57604052565b60e0810190811067ffffffffffffffff8211176118bd57604052565b6020810190811067ffffffffffffffff8211176118bd57604052565b90601f8019910116810190811067ffffffffffffffff8211176118bd57604052565b92919267ffffffffffffffff82116118bd57604051916119bd601f8201601f191660200184611971565b829481845281830111610321578281602093845f960137010152565b9080601f83011215610321578160206119f493359101611993565b90565b91906060838203126103215760405190611a10826118d1565b8193611a1b8161188d565b8352611a296020820161188d565b602084015260408101359167ffffffffffffffff831161032157604092611a5092016119d9565b910152565b67ffffffffffffffff81116118bd5760051b60200190565b929192611a7982611a55565b604092611a896040519283611971565b819581835260208093019160061b84019381851161032157915b848310611ab257505050505050565b8583830312610321578386918251611ac9816118ed565b611ad28661188d565b81528286013583820152815201920191611aa3565b9080601f83011215610321578160206119f493359101611a6d565b91909160a0818403126103215760405190611b1c826118a1565b8193611b278261188d565b835267ffffffffffffffff9160208101358381116103215782611b4b9183016119f7565b602085015260408101358381116103215782611b68918301611ae7565b6040850152606081013592831161032157611b896080939284938301611ae7565b60608501520135910152565b90929192611ba281611a55565b91604094611bb36040519485611971565b839583855260208095019160059460051b8401948186116103215784935b868510611be2575050505050505050565b67ffffffffffffffff90853582811161032157870190608082860312610321578551611c0d81611909565b611c168361188d565b81528a8301358b8201528683013584811161032157830186601f8201121561032157803590611c4482611a55565b91611c518a519384611971565b8083528d80840191891b83010191898311610321578e809101915b838310611ca557505050508782015260608084013594851161032157611c96878d968796016119d9565b90820152815201940193611bd1565b82358152918101918f9101611c6c565b9080601f83011215610321578160206119f493359101611b95565b9181601f840112156103215782359167ffffffffffffffff8311610321576020808501948460051b01011161032157565b906080600319830112610321576004356001600160a01b0381168103610321579160243591604435916064359067ffffffffffffffff821161032157611d4991600401611cd0565b9091565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b805115610d4a5760200190565b805160011015610d4a5760400190565b805160021015610d4a5760600190565b805160031015610d4a5760800190565b805160041015610d4a5760a00190565b8051821015610d4a5760209160051b010190565b9081518082526020808093019301915f5b828110611df1575050505090565b835180516001600160a01b031686528201518583015260409094019392810192600101611de3565b90608080611e8f611e7d611e6b60406001600160a01b0380895116885260208901519060a060208a01528082511660a08a015260208201511660c08901520151606060e0880152610100870190611d4d565b60408701518682036040880152611dd2565b60608601518582036060870152611dd2565b93015191015290565b90611ea282611a55565b611eaf6040519182611971565b8281528092611ec0601f1991611a55565b0190602036910137565b926001600160a01b038451166001600160a01b0383511614612376576001600160a01b03611eff606086015160643590611dbe565b515116906040830151916001600160a01b03611f1e6084358095611dbe565b51511614801590612336575b610d04576040850151906001600160a01b03611f496044358094611dbe565b5151166001600160a01b03611f6460643560608a0151611dbe565b5151161461232457611f7586612c32565b805f525f60205260405f2054156122d15750611f9084612c32565b805f525f60205260405f20541561227d5750612075929161204d917f6fa7f4c28634b0a9d6831401c45ae468195fb63aed07308935c35374ff5d9e3960405180611ff8611fea61012033845280602085015283018d611e19565b82810360408401528a611e19565b85606083015260643560808301528760a083015260a43560c083015260c43560e083015260e4356101008301520390a16001600160a01b038651166040519261204084611955565b5f8452606435908a612e9c565b9490506001600160a01b038651166040519261206884611955565b5f845260a4359086612e9c565b92905061208560408201516134d6565b158015612269575b8015612256575b8015612243575b61223157604051916120ac83611909565b5f83525f60208401525f60408401525f60608401526120cb84836144e1565b845260408401526120f16120df83866144e1565b6020860152806060860152845161356a565b94612105602085015160408601519061356a565b9361210f87613520565b8015612222575b612210576121d7612209957fd9fa84dd790c969daa5c33d8050dc06b4a9b59d5b42e2be5f5e8ae20447f618d946121b961220e9a60a0966121588a8851613594565b6121668c6020890151613594565b6121748a60408901516135f2565b6121828c60608901516135f2565b61218b8a61371d565b6121948c61371d565b6001600160a01b036121b060c435926060606435910151611dbe565b515116336137bd565b50506001600160a01b036121b060e43592606060a435910151611dbe565b5050606060405191338352805160208401526020810151604084015260408101518284015201516080820152a16138a9565b6138a9565b565b604051630d86822160e01b8152600490fd5b5061222c85613520565b612116565b6040516321badf1f60e01b8152600490fd5b506122516060840151613520565b61209b565b506122646060820151613520565b612094565b5061227760408401516134d6565b1561208d565b9351604080513381526001600160a01b039092166020830152810194909452507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f3945091925082915050606081015b0390a1565b9551604080513381526001600160a01b039092166020830152810196909652507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f3949350839250506060820190506122cc565b604051631cd2f1c760e21b8152600490fd5b506001600160a01b03612350606085015160a43590611dbe565b5151166001600160a01b0361236c604088015160443590611dbe565b5151161415611f2a565b604051630a98f1f360e21b8152600490fd5b908060209392818452848401375f828201840152601f01601f1916010190565b909291926123b581611a55565b916040916123c66040519485611971565b839581855260208095019160051b8301938185116103215783925b8584106123f15750505050505050565b67ffffffffffffffff90843582811161032157860190838286031261032157835161241b816118ed565b823584811161032157866124309185016119f7565b8152898301359384116103215761244b868b95869501611cb5565b838201528152019301926123e1565b903590605e1981360301821215610321570190565b903590601e1981360301821215610321570180359067ffffffffffffffff82116103215760200191813603831361032157565b903590601e1981360301821215610321570180359067ffffffffffffffff821161032157602001918160061b3603831361032157565b5f5b608081106124e6575050565b6060828201526020016124da565b5f5b82811061250257505050565b6060828201526020016124f6565b903590601e1981360301821215610321570180359067ffffffffffffffff821161032157602001918160051b3603831361032157565b60405190612553826118d1565b60606040835f81525f60208201520152565b60405190612572826118a1565b5f608083828152612581612546565b6020820152606060408201526060808201520152565b9015610d4a57803590607e1981360301821215610321570190565b903590609e1981360301821215610321570190565b9190811015610d4a5760061b0190565b356001600160a01b03811681036103215790565b3580151581036103215790565b9081518082526020808093019301915f5b828110612617575050505090565b835185529381019392810192600101612609565b9061264361014461263c84806125b2565b3690611b02565b5f5260205f81526040926001845f2054036129d057916128c5916126ca85855f61284a6126738361268a9a6125b2565b61268f878501359182878701359c8d923690611b02565b613fa4565b6126a761269c85806125b2565b946060810190612510565b96906126c28751966126b888611955565b8688523690611b02565b973691611b95565b906126d3612c63565b506127fa8651916126e3836118a1565b600483526126f28a84016124d8565b886126fc81612c32565b988b6001600160a01b039a8b84511690835192600384528301528282015233606082015260808101825261272f86611d71565b5261273985611d71565b508051612745816118d1565b6002815281368e83013761275886611d7e565b5261276285611d7e565b50810160ff8c6127c56127ae8d806127878161277f8b8a51611dbe565b515116614172565b97511690612796898851611dbe565b515116846127a58a8951611dbe565b51015191612a60565b958d6127bb828751611dbe565b5151169451611dbe565b51015192169093929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b61280382611d8e565b5261280d81611d8e565b506128318b886060810160ff8c6127c56127ae8d806127878161277f8b8a51611dbe565b61283a82611d9e565b5261284481611d9e565b50614250565b918385511693868601918b83519289818551169401511693878652308a5281808720915101519082519261287d84611955565b878452519561288b87611939565b86528a8601528d85015284606085015285608085015260a084015260c08301528a5180809a819463d04dfe2360e01b835260048301612de4565b03915afa95865f915f986129aa575b506128e35788513d5f823e3d90fd5b95938651600281106129935750888798998260c0979899015199015161291161290b85611dae565b51611d9e565b5161291c8183613543565b156129895750998a925b6129488b85919060405192600284526020840152604083015260608201604052565b61295186611d8e565b5261295b85611d8e565b5082519661296888611939565b8752860152840152866060840152608083015260a082015201526001929190565b9050998a92612926565b6024908a5190630fbb8e5560e21b82526004820152fd5b9097506129c991503d805f833e6129c18183611971565b810190612ca0565b965f6128d4565b505f92508291829150565b9035601e198236030181121561032157016020813591019167ffffffffffffffff8211610321578160061b3603831361032157565b9190808252602080920192915f905b828210612a2d575050505090565b909192936001906001600160a01b03612a458761188d565b16815285830135838201526040908101950193920190612a1f565b8215612a95576001600160a01b038091165f52600160205260405f2091165f5260205260405f20905f5260205260405f205490565b909150612aa182614172565b6001600160a01b03809316906040918251946370a0823160e01b86528416938460048701526020928387602481865afa968715612bb7575f97612bc1575b5083612af8612af183612b289a614f36565b50906149f8565b508651636eb1769f60e11b81526001600160a01b0390941660048501523060248501529297889081906044820190565b0381865afa968715612bb7575f97612b86575b50612af1612b4c916119f498614f36565b50612b578183613543565b15612b7e5750935b5f5260018252825f20905f528152815f20905f8052525f20549061407d565b905093612b5f565b96508387813d8311612bb0575b612b9d8183611971565b8101031261032157955195612af1612b3b565b503d612b93565b85513d5f823e3d90fd5b96508387813d8311612be9575b612bd88183611971565b810103126103215795519583612adf565b503d612bce565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f006002815414612c205760029055565b604051633ee5aeb560e01b8152600490fd5b604051612c5d81612c4f6020820194602086526040830190611e19565b03601f198101835282611971565b51902090565b60405190612c7082611939565b606060c083612c7d612565565b81525f60208201525f60408201525f838201528260808201525f60a08201520152565b919060408382031261032157825167ffffffffffffffff908181116103215784019082601f83011215610321578151602092612cdb82611a55565b91612ce96040519384611971565b808352848084019160051b830101918683116103215785809101915b838310612d785750505050948281015191821161032157019180601f84011215610321578251612d3481611a55565b93612d426040519586611971565b818552838086019260051b820101928311610321578301905b828210612d69575050505090565b81518152908301908301612d5b565b8251815291810191869101612d05565b90808251908181526020809101926020808460051b8301019501935f915b848310612db65750505050505090565b9091929394958480612dd4600193601f198682030187528a516125f8565b9801930193019194939290612da6565b91906020928381526001600160a01b0382511684820152838201516040820152612e1e604083015160e06060840152610100830190611d4d565b9060608301516080820152612e45608084015192601f1993848483030160a0850152612d88565b9260a081015193838382030160c08401528680865192838152019501905f5b818110612e88575050506119f494955060c060e091015192828503019101526125f8565b825187529588019591880191600101612e64565b94959395929192612eab612c63565b50604096875190612ebb826118a1565b60048252602093612ecd8584016124d8565b612ed689612c32565b6001600160a01b038097818c51168d519360038552898501528d840152166060820152608081018b52612f0884611d71565b52612f1283611d71565b508951612f1e816118d1565b600281528a3687830137612f3184611d7e565b52612f3b83611d7e565b50898901908681835190612f4e91611dbe565b515116612f5a90614172565b86888c51168984865190612f6d91611dbe565b5151168285875190612f7e91611dbe565b51015190612f8b92612a60565b928981865190612f9a91611dbe565b515116945190612fa991611dbe565b5101519060ff16612fe1929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b612fea83611d8e565b52612ff482611d8e565b5060608801858782519061300791611dbe565b51511661301390614172565b868a5116878984519061302591611dbe565b515116878a85519061303691611dbe565b5101519061304392612a60565b908689898186519061305491611dbe565b51511694519061306391611dbe565b5101519060ff1661309b929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b6130a483611d9e565b526130ae82611d9e565b506130b891614250565b9183875116938188019283519183818451169301511693865f523084528a805f20915101518b51916130e983611955565b5f83528c51966130f888611939565b8752858701528b8601525f60608601526080850186905260a085015260c0840152885163d04dfe2360e01b815292839081906131379060048301612de4565b03815a935f94fa91825f915f94613216575b506131585788513d5f823e3d90fd5b979495969791948251966002881097886131ff5750818385015194015161318161290b87611dae565b5161318c8183613543565b156131f75750925b6131b68585919060405192600284526020840152604083015260608201604052565b6131bf87611d8e565b526131c986611d8e565b5082519a6131d68c611939565b8b528a01528801526060870152608086015260a085015260c0840152159190565b905092613194565b602490835190630fbb8e5560e21b82526004820152fd5b90935061322d91503d805f833e6129c18183611971565b925f613149565b95949193908693613243612c63565b505f92604061335e815192613257846118a1565b600484526020936132698582016124d8565b6133276132758b612c32565b8b6001600160a01b03998a9283835116895191600383528b830152898201528360609b168b8201526080810189526132ac86611d71565b526132b685611d71565b5087516132c2816118d1565b6002815288368b8301376132d586611d7e565b526132df85611d7e565b5060ff896127c58a85019361331b876132fd8161277f858a51611dbe565b9751168861330c848951611dbe565b515116856127a5858a51611dbe565b966127bb828751611dbe565b61333082611d8e565b5261333a81611d8e565b50612831878b8d60ff896127c58c85019361331b876132fd8161277f858a51611dbe565b946133de5f868a511698869786889c0191825191888184511693015116928c8552308952878086209151015188519161339683611955565b8683528951956133a587611939565b86528a86015288850152848a8501528b608085015260a084015260c08301528551808095819463d04dfe2360e01b835260048301612de4565b03915afa90815f915f936134b8575b506134ab575050505f975b6002855110988915996134985782848701519601519061341a61290b89611dae565b51906134268284613543565b1590506134905750925b6134528685919060405192600284526020840152604083015260608201604052565b61345b88611d8e565b5261346587611d8e565b5082519b6134728d611939565b8c528b0152890152870152608086015260a085015260c08401529190565b905092613430565b50505050505050505091506119f4612c63565b91999850945093966133f8565b9092506134cf91503d805f833e6129c18183611971565b915f6133ed565b6134f5905f60e01d906001600160e01b038160e01d9116601b0b614fed565b1290565b906134f5916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b61506e565b61353f905f60e01d906001600160e01b038160e01d9116601b0b614fed565b1390565b9061353f916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b61506e565b6119f491610af4916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614544565b6135ee9160808101826135b06135aa8351611dae565b51611dae565b526135e76135e16001600160a01b038094515116936135d86135d28551611dae565b51611d71565b51169251611dae565b51611d8e565b5191613b95565b5050565b906080810191806136066135aa8551611d9e565b526001600160a01b038092515116916136226135d28551611d9e565b51166136316135e18551611d9e565b5190816136e55761364183613520565b6136cc579183917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a95936122cc955f5260209060018252613697604094855f20835f528452855f20855f528452855f205461407d565b945f5260018252835f20905f528152825f20915f52525f20555b51604051918291338352604060208401526040830190612d88565b60405163793a8f5560e01b815260048101849052602490fd5b91613716917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a95936122cc956137bd565b50506136b1565b6080810161372e6135e18251611d9e565b5191821561373b57505050565b6137556135d26001600160a01b0380935151169351611d9e565b5116815f5260209160018352604092835f20835f528152835f20855f528152835f2054936001600160e01b038516613790575b505050505050565b6137b4955f9284845260018152828420868552815282842091845252812055613bf3565b5f808080613788565b939291936137ca83613520565b6136cc57846137e6576137de939450613bf3565b50505f905f90565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f528152613823835f2054948561407d565b9561382d87613520565b613850575f97885260018252838820908852815282872091875252909320829055565b835163c5e12af560e01b815260048101889052602490fd5b90604082019082526020606081936040838201528551809452019301915f5b828110613895575050505090565b835185529381019392810192600101613887565b60c0810151908151915f92613a1d575b5061395e6020918281510151926001600160a01b039081818187511696015116928660a082019485518252308452604097888320898686510151015160808601518b519161390683611955565b8683528c519361391585611955565b8785528d519661392488611939565b8752898701528c86015260016060860152608085015260a084015260c08301528851808099819463d04dfe2360e01b835260048301612de4565b03915afa948515613a135787956139f5575b508451613981575b50505050505050565b81905101510151169051813b156139f1579184918493836139b6965180978195829463012c676d60e21b845260048401613868565b03925af19081156139e857506139d1575b8080808080613978565b6139db8291611925565b6139e557806139c7565b80fd5b513d84823e3d90fd5b8480fd5b613a0a9195503d8089833e6129c18183611971565b9050935f613970565b86513d89823e3d90fd5b6001600160a01b03602080845101510151169060a083015190823b1561032157613a60925f928360405180968195829463012c676d60e21b845260048401613868565b03925af1801561044157156138b957613a7a919250611925565b5f905f6138b9565b6040519263a9059cbb60e01b5f526001600160a01b0380931660045260245260205f60448180855af160015f5114811615613adc575b8360405215613ac657505050565b635274afe760e01b835216600482015260249150fd5b6001811516613af257813b15153d151616613ab8565b833d5f823e3d90fd5b9092604051936323b872dd60e01b5f526001600160a01b0393848092166004521660245260445260205f60648180855af160015f5114811615613b4b575b836040525f60605215613ac657505050565b6001811516613af257813b15153d151616613b39565b909115613b6c575050565b6040516305dbdfd960e41b81526001600160a01b03918216600482015291166024820152604490fd5b93929193613ba283613520565b6136cc5784613bb6576137de9394506140a7565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f528152613823835f2054948561356a565b90929192613c0081614573565b93613c0a81613520565b613c535784816001600160e01b03613c299360e01d9116601b0b615198565b50809281613c39575b5050509190565b6001600160a01b03613c4b9316613a82565b5f8181613c32565b604051632d1671a360e11b8152600490fd5b916040805191613c74836118a1565b60048084526020613c868186016124d8565b5f5b8751811015613cbb5780613c9e6001928a611dbe565b51613ca98289611dbe565b52613cb48188611dbe565b5001613c88565b5092955092939093335f52308352855f2091865190613cd9826118ed565b613ce1612546565b8252606085819301528751613cf581611955565b5f8152885191613d0483611955565b5f83525f3681375f5b8151811015613e6a57613d208183611dbe565b5190888c8b84519189818401518d8d8251613d48575b50505050505050506001915001613d0d565b5f613db797948197948c9794613d758c956001600160a01b039d8e81818d51169c0151169b015190614250565b94865199613d828b611939565b8a528901528488015286015260808501528a60a08501528b60c08501525180958194829363d04dfe2360e01b84528301612de4565b03915afa938415613e60578b915f95613e42575b508451613de0575b50908b8e89838d8d613d36565b51015116803b1561032157613e0f925f918c8f84905180978195829463012c676d60e21b845233908401613868565b03925af1918215613e3857600192613e29575b8981613dd3565b613e3290611925565b5f613e22565b8c513d5f823e3d90fd5b613e579195503d805f833e6129c18183611971565b9050935f613dcb565b8e513d5f823e3d90fd5b5050505050505050509050565b8115613e81570490565b634e487b7160e01b5f52601260045260245ffd5b6040815110613ef1576020810151908051603f198101908111613edd5760051c8211613ec95760016020920160051b010190565b5050604051613ed781611955565b5f815290565b634e487b7160e01b5f52601160045260245ffd5b50604051613ed781611955565b805115613f0e57602001515f1a90565b505f90565b905f8091602081519101845af48080613f91575b15613f475750506040513d81523d5f602083013e60203d82010160405290565b15613f6e57604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b3d15613f7f576040513d5f823e3d90fd5b60405163d6bda27560e01b8152600490fd5b503d151580613f275750813b1515613f27565b91613fcf906060613fc4936001600160a01b039485916040880151611dbe565b515116940151611dbe565b5151161461232457565b6140006001600160e01b0392838316601b0b9260e01d938160e01d9116601b0b84846147af565b90637ffffff58213614050575b90614017916149f8565b9290921580614048575b61402a57505090565b6044925060405191638eba4d0760e01b835260048301526024820152fd5b508215614021565b61405a82826156c1565b1561400d57604483856040519163d556b11160e01b835260048301526024820152fd5b6119f491610af4916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614d9d565b9291926140b382614573565b936140bd81613520565b61411e5784816001600160e01b036140dc9360e01d9116601b0b615198565b9290809315614109575b508290816140f5575050509190565b613c4b926001600160a01b03309216613afb565b9092505f198114613edd57600101915f6140e6565b604051632eaefac360e21b8152600490fd5b6004111561413a57565b634e487b7160e01b5f52602160045260245ffd5b602090939291936001600160a01b03604082019516815261416e83614130565b0152565b61417a6156da565b60408051630782d7e160e01b81526001600160a01b03831660048201529091828260248173200e12d10bb0c5e4a17e7018f0f1161919bb93895afa928315614247575f925f94614212575b506141cf83614130565b600183141580614200575b6141e45750505090565b5163ee07877f60e01b815291829161059791906004840161414e565b5061420a83614130565b8215156141da565b908094506142369293503d8511614240575b61422e8183611971565b810190614f0c565b919091925f6141c5565b503d614224565b513d5f823e3d90fd5b61425a8251611e98565b6142648351611e98565b9282519281518015155f146144d957600201935b6001940184019061428882611a55565b956142a360409361429b8551998a611971565b808952611a55565b6142b5602091601f1901828a016124f4565b5f9584519389896002926002885233868901523089890152606097606081018a526142df84611d71565b526142e983611d71565b505f825b614499575b505050508651614309575b50505050505050505090565b9091929360028861432c8c866143258e809c9d9e018093611dbe565b528d611dbe565b500185614339828d611dbe565b52614344818c611dbe565b505f965b614353575b506142fd565b8851871015614494576001600160a01b036143ff898b856143f68c60428c8861437c8488611dbe565b51511696858261438c868a611dbe565b5101519261439a868a611dbe565b51838d82511691015182815160051b910120908451927f6ec4dff745ec96dbde88c5d41f8aa5ac13aa1664afb47b8406b44fa945a650c88452830152838201522090519161190160f01b83528d83015260228201522093611dbe565b51015191614f64565b1561447c578761446b8b8e8c8f9e9d9c9b9a999897968f614458918d61444e898f8f61443a83889f614431828f611dbe565b51511692611dbe565b52614445828b611dbe565b51015192611dbe565b52019c8d94611dbe565b5101516144658383611dbe565b52611dbe565b500196979895909192939495614348565b8851630a57f30960e31b815260048101899052602490fd5b61434d565b9091929a82518210156144d157906144c584809301809d6144ba8487611dbe565b516144658383611dbe565b50019082918d936142ed565b9a92916142f2565b505f93614278565b916040830192604061451b610af4606087519401938451906001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6145f4565b9451930161452a8151866134f9565b614532575050565b9093506119f491925051925183613fd9565b919291600160ff1b840161455c57611d4993506150c3565b90611d49935f0391614d9d565b61401782826149f8565b61457b6156da565b6040805163b7bad1b160e01b81526001600160a01b0383166004820152909182826024815f73200e12d10bb0c5e4a17e7018f0f1161919bb93895af1928315614247575f925f9461421257506141cf83614130565b6008815110613f0e576008015167ffffffffffffffff1667ff0a89c674ee78741490565b9091939284158215175f1461460e5750505090505f905f90565b82810192600160fd1b8082019083011760fe1c614745575b505061463181615386565b9361463b81615386565b9461464686826153a6565b90918215614736575f9083986f0785ee10d5da46d900f436a000000000808611614728575b50670de0b6b3a7640000808b11614719575b50633b9aca00808b1161470a575b50612710808b116146fc575b5098805b6146eb57508190611d49989982600a0a9109960195817fcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccd0a93838211900382610100031b9203901c1702916153b9565b60019290920191600a90048061469b565b60049a04998a930192614697565b600991939a049901915f61468b565b601291939a049901915f61467d565b85049950602592505f61466b565b50929050611d499495506153b9565b5f8212156147995780841361478b575b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb284131561462657909250611d499394916152c4565b909250611d4993949161532b565b8084121561475557909250611d499394916152c4565b929091806147d5576044848460405191637a97930f60e01b835260048301526024820152fd5b90919280155f146147ea57505050505f905f90565b614803936147f791615473565b92919490938492615473565b909391928461481188615386565b9161481b86615386565b947f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000094604c918688106149c2575b030191600160ff1b98838a018112155f1461498f575050035b5f955f821280614986575b614968575b5f811280614956575b6149385786820103966001600160ff1b038814908161492e575b5080614925575b8061491c575b6148fe5750906148b2929161561f565b915f81136148c5575b50611d49936153b9565b9091604c82136148f3576148dc91600a0a90613e77565b9081156148e9575f6148bb565b505050505f905f90565b50505050505f905f90565b876044916040519163d556b11160e01b835260048301526024820152fd5b505f85126148a2565b5082841461489c565b905088145f614895565b604489836040519163d556b11160e01b835260048301526024820152fd5b50806001600160ff1b0301821361487b565b95508087018613156149805786818703015b95614872565b5f61497a565b505f811361486d565b89985090920390506001600160ff1b03819003870182136149b35701860194614862565b5050505050505050505f905f90565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009650604b9250614849565b8115613e81570590565b8082601b82810b8314614bed577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000008405614b99575b8380820b03614b8857507b199999999999999999999999999999999999999999999999999999987b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc84011115614b39575b838060030b03614abd575b808413614aa15750506001600160e01b036001925b60e01b91161791565b8303600a0a8015613e81576001600160e01b0391071592614a98565b92915f841315614b0d575090614ad383836156c1565b614aef57637ffffffe1901600a0a810290637fffffff92614a83565b506044916040519163d556b11160e01b835260048301526024820152fd5b637fffffff1992830390604382136148f357614b2c91600a0a906149ee565b9182156148e95792614a83565b5f198401808060030b14614b4d5750614a78565b90506001600160e01b039293507b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff915060e01b9260ff1d181617905f90565b600190940193600a90930592614a2b565b937f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000840515614bda576305f5e100600894058094819201955b915050614a2b565b620186a060059405809481920195614bd2565b5082614a7857505050505f90600190565b919291600160ff1b9190801580614d8b575090614c1a91615473565b9490929091905f868585858282138015614d82575b614d65575b505050508682841860ff1c94860391039081604c038111614d4a5701600a0a808205919084614d30575b505081019182821860ff1c1115614d2857826001600160ff1b0314614d0a57905f600192135f14614cdb57600a9004915b01925b81158117614c9f57509190565b80614cb8575b508015614cb0579190565b505f91508190565b9192614cce9203600160ff1b01600a0a906149ee565b600160ff1b91905f614ca5565b600a60037fe6666666666666666666666666666666666666666666666666666666666666679201040191614c8f565b604490836040519163d556b11160e01b835260048301526024820152fd5b509092614c92565b8107614d3d575b80614c5e565b60ff1d600117015f614d37565b505050919350614d58579190565b60018160ff1d1790039190565b5f9a50909750909550600160ff1b94509250905086808080614c34565b50835f12614c2f565b15614d965750509190565b9350919050565b9392919384158115818117614eee57505090614db891615473565b9194908295614dc982958294615473565b8096929491969387868482138015614ee5575b614ecc575b5050505050508682841860ff1c94860391039081604c038111614d4a5701600a0a808205919084614eb2575b505081019182821860ff1c1115614eaa57826001600160ff1b0314614d0a57905f600192135f14614e7b57600a9004915b01925b81158117614e4e57509190565b80614e5e57508015614cb0579190565b600160ff1b93614e759291038401600a0a906149ee565b5f614ca5565b600a60037fe6666666666666666666666666666666666666666666666666666666666666679201040191614e3e565b509092614e41565b8107614ebf575b80614e0d565b60ff1d600117015f614eb9565b929b5098509196509450925090505f8080808080614de1565b50858412614ddc565b9395939092919015614f04575050614cb0579190565b945092915050565b919082604091031261032157815160048110156103215760209092015160ff811681036103215790565b9060ff165f03916001600160ff1b0382115f14614f5c57600a6001818404940192061590565b909190600190565b9091813b614f9f57614f769192615743565b50614f8081614130565b159182614f8c57505090565b6001600160a01b03918216911614919050565b6020918160645f935160405192630b135d3f60e11b9788855260048501526040602485015286820190604485015e8281018201859052601f01601f191601915afa905f5114601f3d11161690565b92915f9060018184145f87128715171717615067575f92808213615059575b03604c81135f82121761504d57600a0a908461502b83820293846149ee565b146150405750501561503c575f9190565b5f90565b90935090156119f4579190565b50501561503c575f9190565b5f956001945092509061500c565b5050505f90565b93929190918083145f83125f871218831587151717176150bd575f928082136150b05703604c81135f82121761504d57600a0a908461502b83820293846149ee565b919460019350919061500c565b50919050565b909291600160ff1b91828101615155575080841461514b57808413918215615143578185035b604c8111156151325750505f915b1561512357507f8000000000000000000000000000000000000000000000000000000000000001019190565b92506001600160ff1b03039190565b600a0a908115613e815704916150f7565b8482036150e9565b505090505f905f90565b9361516292945f03614bfe565b80939180928114615176575b50505f039190565b915092506001600160ff1b038314614d0a57600a600191059201915f8061516e565b91925f8312156151c0576044838360405191634a7d166b60e01b835260048301526024820152fd5b9192836151d257505090505f90600190565b60ff811682019180831261529a575f83121561520a575050604c198112614cb0575f03600a0a916152038382613e77565b9283021490565b909293915f81135f1461529057604d811361526557600a0a928315613e8157835f1904831161523c5750500290600190565b60405163c849483b60e01b815260048101849052602481019290925260ff166044820152606490fd5b5060405163c849483b60e01b81526004810192909252602482015260ff919091166044820152606490fd5b5050905090600190565b60405163c849483b60e01b815260048101869052602481019190915260ff82166044820152606490fd5b909392915f6152d49181846145f4565b9490945f8483019182019412159081615321575b8115615317575b506152f957505090565b604492506040519163d556b11160e01b835260048301526024820152fd5b905083125f6152ef565b82811291506152e8565b61534093600160fe1b908101939201906145f4565b9081815f821215615377575050604b1982126137de57615365915f03600a0a906149ee565b908161536f575f90565b600160ff1b90565b93600160ff1b90910192509050565b5f8112156119f457600160ff1b9080820361539f575090565b90505f0390565b905f198183099102908180821091030391565b92939291905f818418121561544e576001600160ff1b03928383111561543857600160ff1b938385036153ee57505050509190565b90919293508514615408575050600a600191045f03920190565b604051630ed8062160e21b8152600481019190915260248101919091526044810182905260648101849052608490fd5b5090915050600160ff1b8114613edd575f039190565b90916001600160ff1b0380841115613c32578514615408575050600a60019104920190565b919091801561561557827f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000080830515615523575b507f19999999999999999999999999999999999999999999999999999999999999997f0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc830110615514575b83136154fe5791905f90565b919060018060ff1b926001600160ff1b03030190565b9290600a02905f1901926154f2565b6f4b3b4ca85a86c47a098a22400000000080840515615603575b507728c87cb5c89a2571ebfdcb54864ada834a000000000000008305156155ec575b7b097edd871cfda3a5697758bf0e3cbb5ac5741c6400000000000000008305156155d8575b7e3899162693736ac531a5a58f1fbb4b746504382ca7e40000000000000000008305156155c8578205156155b9575b5f6154a7565b9290600a02905f1901926155b3565b9391606402916001190193615584565b93916402540be40002916009190193615584565b9391678ac7230489e800000291601219019361555f565b6025198301955092909202915f61553d565b505f915081908190565b90915f19838309928083029283808610950394808603958487101561569d5714615695579082910960018219018216809204600280826003021880830282030280830282030280830282030280830282030280830282030280920290030293600183805f03040190848311900302920304170290565b505091500490565b60648386866040519263362ced0960e11b8452600484015260248301526044820152fd5b6119f491905f8112156156d5575f0361577d565b61577d565b73200e12d10bb0c5e4a17e7018f0f1161919bb9389803b158015615718575b6157005750565b602490604051906373e6d7b360e01b82526004820152fd5b507f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d41813f14156156f9565b81519190604183036157735761576c9250602082015190606060408401519301515f1a9061580c565b9192909190565b50505f9160029190565b90637ffffff581131561580657637ffffffe19810190604382136157ff575f8212156157d357637fffffff91505f0301600a0a7b8000000000000000000000000000000000000000000000000000000202111590565b50600a0a8015613e81577b80000000000000000000000000000000000000000000000000000001041090565b5050151590565b50505f90565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411615883579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa15610441575f516001600160a01b0381161561587957905f905f90565b505f906001905f90565b5050505f916003919056000000000000000000000000000000000000000000000000000000000000200e12d10bb0c5e4a17e7018f0f1161919bb93890000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000044b608060405234801561000f575f80fd5b506004361061004a575f3560e01c80630782d7e11461004e57806354636d2b14610078578063b7bad1b11461009d578063f5c36eaf146100b0575b5f80fd5b61006161005c366004610363565b6100c3565b60405161006f929190610403565b60405180910390f35b61008b610086366004610363565b6100d8565b60405160ff909116815260200161006f565b6100616100ab366004610363565b6100e9565b61008b6100be366004610363565b6100f5565b5f806100cf5f84610100565b91509150915091565b5f6100e35f836101f0565b92915050565b5f806100cf5f84610281565b5f6100e35f83610356565b73ffffffffffffffffffffffffffffffffffffffff81165f9081526020838152604080832081518083019092525460ff8082161515835261010090910416818301527f313ce56700000000000000000000000000000000000000000000000000000000808452839283908190816004818a5afa915060203d1015610182575f91505b811561019857505f5160ff811115610198575f91505b816101af57505050602001516003925090506101e9565b83516101c3575f955093506101e992505050565b836020015160ff1681146101d85760026101db565b60015b846020015195509550505050505b9250929050565b5f805f6101fd8585610281565b909250905060018260038111156102165761021661039d565b1415801561023557505f8260038111156102325761023261039d565b14155b156102795783826040517fee07877f000000000000000000000000000000000000000000000000000000008152600401610270929190610421565b60405180910390fd5b949350505050565b5f805f8061028f8686610100565b90925090505f8260038111156102a7576102a761039d565b0361034b576040805180820182526001815260ff838116602080840191825273ffffffffffffffffffffffffffffffffffffffff8a165f908152908b9052939093209151825493517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009094169015157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff161761010093909116929092029190911790555b909590945092505050565b5f805f6101fd8585610100565b5f60208284031215610373575f80fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114610396575f80fd5b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b600481106103ff577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b9052565b6040810161041182856103ca565b60ff831660208301529392505050565b73ffffffffffffffffffffffffffffffffffffffff831681526040810161039660208301846103ca56000000000000000000000000000000000000000000"; + hex"0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000005c40000000000000000000000000d2cd1d4ad3bf3ecb581e4653c9c02a67ca44305c00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000005b846080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a7146117d1575080632cb77e9f146117a557806341d1514f1461176e5780635343c1b7146116d35780635cffe9de146115775780635d003c44146113e3578063613255ab14611360578063687cf02a14611070578063ac9650d814610f22578063b0460f07146105cd578063b845b83e14610575578063ca9109ba14610400578063d9d98ce41461034f578063ddebc96f146102fb5763df6db3c2146100c1575f80fd5b346102d5576003196040368201126102d5576004359067ffffffffffffffff8083116102d5578260040160a0843603938401126102d5576024358281116102d557610110903690600401611c93565b90610119613236565b5f946001600160a01b03948561012e86612c8a565b1633036102d9576101476101423687611ac5565b613278565b91825f525f60205260405f2096600188541461018f575b60208960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556040519015158152f35b9091929394959697505f600198556040519133835284602084015260606040840152816101bb89611850565b16606084015260248a013590606219018112156102d55789019060a06080840152806101e960048401611850565b166101008401526101fc60248301611850565b166101208301526044810135602219823603018112156102d55701956024600488013597019287116102d55786360383136102d55760209860846102b884936102777f09d18501db0080ca2d6cd7c17fa7255daff4b2d503ea93b76ff68b6752ea8e63976102c89c6060610140890152610160880191612a3b565b6102a961029e61028a6044880185613021565b605f198a8603810160a08c01529491613056565b926064870190613021565b918784030160c0880152613056565b91013560e08301520390a16141c2565b5f8080808080808061015e565b5f80fd5b6024866102e587612c8a565b6040516335252be360e01b815291166004820152fd5b346102d5576003196020368201126102d5576004359067ffffffffffffffff82116102d55760809082360301126102d55761033a606091600401612cde565b90604051921515835260208301526040820152f35b346102d55760403660031901126102d5576001600160a01b03610370611824565b166040516370a0823160e01b8152306004820152602081602481855afa9081156103f5575f916103c3575b50156103ab5760206040515f8152f35b60249060405190633c5bf76960e21b82526004820152fd5b90506020813d6020116103ed575b816103de60209383611934565b810103126102d557518261039b565b3d91506103d1565b6040513d5f823e3d90fd5b346102d55761040e36611cc4565b8394939261041a613236565b610425848633613e0f565b61042e81613784565b15610543578061044261049192873361439d565b9590967f7f9dfa19cf1cc2f806f2f860fbc9c056b601fb1afc0e9b843dfe5c63616268e660806040513381526001600160a01b0384169a8b60208301528560408301526060820152a133613a6b565b959093826104c0575b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b610537966105319560ff936040519860068a5260208a01526040890152606088015260808701521660a08501523360c085015260e084019384604052610505856118fc565b600685526105166101008201612b8b565b61051f85611d71565b5261052984611d71565b503691612a5b565b90613f13565b8080808080808061049a565b6040516306dde9c360e41b81523360048201526001600160a01b038616602482015260448101859052606490fd5b0390fd5b346102d55760203660031901126102d55760043567ffffffffffffffff81116102d5576105316105ac61049a923690600401611c93565b91906105b6613236565b604051926105c384611918565b5f84523691612a5b565b346102d5576003196020368201126102d55767ffffffffffffffff600435116102d55760c090600435360301126102d557610606613236565b5f808061061b60048035608481019101612bc3565b905015610f1057602460043501359261063384613784565b15610efe57606080604051610647816118cc565b61064f612c18565b81525f60208201525f60408201520152610667612c18565b506106c76106c26106a161069761069161068b608460043501600435600401612bc3565b90612c4a565b80612c65565b6040810190612b55565b60206106ba61068b608460043501600435600401612bc3565b013591612c7a565b612c8a565b936001600160a01b036107166106c26106fd6106f361069161068b608460043501600435600401612bc3565b6060810190612b55565b60406106ba61068b608460043501600435600401612bc3565b816040519761072489611894565b1687521660208601526040850152610746608460043501600435600401612bc3565b9490506001604051955f87520160051b85016040525f905f5b610773608460043501600435600401612bc3565b9050811080610eeb575b15610d3857610796608460043501600435600401612bc3565b821015610d24578160051b810135607e19823603018112156102d55760808183013603126102d557604051916107cb836118cc565b8181013567ffffffffffffffff81116102d5576107ed90369084840101611ac5565b835280820160208181013590850152604080820135908501526060013567ffffffffffffffff81116102d5576108269236920101611c78565b606082015280516001600160a01b036108486040830151602085015190611d91565b5151166001600160a01b0385511614801590610cf0575b610cde5761087760208301516040840151908361429a565b61088081613278565b91825f525f60205260405f2054155f146108e4575051604080513381526001600160a01b039092166020830152810191909152600191907fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f390606090a15b0161075f565b919061091560208497959701516040850151906060860151906040519261090a84611918565b5f84523391866134e2565b5f949161097e57505051604080513381526001600160a01b03909216602083015281019190915260019291907f1e6fa9678edf81f9f25bbf308bde03ad3e110db1f429394b0915ba021532941490606090a15b8115610976575b50926108de565b90508861096f565b610993606082015160446004350135906137a7565b156109ed57505051604080513381526001600160a01b03909216602083015281019190915260019291907fe3151dc8cb7a54ffc4baabd28c1f241c94d510b5e5b502491ac3cad6c16316d59080606081015b0390a1610968565b6109fa6040820151613784565b158015610ccb575b15610a5857505051604080513381526001600160a01b03909216602083015281019190915260019291907f500b713857325f9e6dcb52ae832eca9109d107ed1aae9cb4928b4c1e13f051aa9080606081016109e5565b9250925050600196959691610a71606460043501612c9e565b15610c385796610ae197610af160408401516040880151610a9281836137f1565b15610c305750925b610aeb848592610ad4610ace60608a01516001600160e01b03601b918660e01d92828816810b928260e01d9216900b6148ea565b9061485f565b9d8e9260408d0151613818565b60408c0152614373565b99614373565b98610afc8484613842565b610b0684826138a0565b60405192338452608060208501526060610b2c8451608080880152610100870190611dec565b93602081015160a0870152604081015160c0870152015192607f198582030160e0860152835180825260208201906020808260051b8501019601925f5b828110610bc857505050505092806001979695937fbae4dbf76931c547f765e9def16d693d86daaa596f491de979008831789185ae93610bc396604084015260608301520390a180858c5101808d5260051b8c0152613b57565b610968565b9091929396602080610c23600193601f198782030189528b51906001600160a01b03825116815283820151848201526060610c126040840151608060408501526080840190612cab565b920151906060818403910152611d10565b9901950193929101610b69565b905092610a9a565b610ae190610af16060840151610aeb610c76610ace60408801516001600160e01b0394601b90868360e01d9316820b91878260e01d9216900b6148ea565b60408a0151610c8581836137f1565b15610cc35750915b829c8d916060890151908116155f14610cb4575060408801515b96879460408d0151613818565b610cbe90856142cf565b610ca7565b905091610c8d565b50610cd960608201516137ce565b610a02565b60405163936bb5ad60e01b8152600490fd5b506001600160a01b03610d0c6060830151604085015190611d91565b5151166001600160a01b03602086015116141561085f565b634e487b7160e01b5f52603260045260245ffd5b50919390610d4a606460043501612c9e565b15610ee557835b6004356004013590610d6382826137f1565b610ec75750508490610d83856001600160a01b0360208701511633613ea1565b505060a46004350190610d9b82600435600401612b22565b905015159081610ebf575b50610e1e575b506001600160a01b03610dc2929351163361439d565b50505b8351811015610dea5780610de4610dde60019387611d91565b516139cb565b01610dc5565b5060409160017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005582519182526020820152f35b90506001600160a01b03602084015116610e486001600160a01b0385511692600435600401612b22565b929091333b156102d557610e905f93604051958694859463691f9ed760e01b8652600486015260248501528960448501528a606485015260a0608485015260a4840191612a3b565b038183335af19081156103f557859115610dac579050610eb091506118e8565b5f836001600160a01b03610dac565b905088610da6565b604492506040519163573b6f4160e01b835260048301526024820152fd5b84610d51565b50610ef96040830151613784565b61077d565b60405163315f9e2360e21b8152600490fd5b604051639c95219f60e01b8152600490fd5b346102d5576020806003193601126102d55760043567ffffffffffffffff81116102d557610f54903690600401611c93565b919060405192610f6384611918565b5f8452828401610f7282611a18565b94610f806040519687611934565b828652610f8c83611a18565b93610f9e86880195601f190186612ba7565b5f5b84811061100257604080518881528951818a018190525f92600582901b83018101918a918c9085015b828710610fd65785850386f35b909192938280610ff2600193603f198a82030186528851611d10565b9601920196019592919092610fc9565b806110518861104b61101e60019560059d9c9d1b870187612b22565b929089846040519586938585013782018381015f81528b519283915e015f83820152038084520182611934565b30614209565b61105b828a611d91565b526110668189611d91565b5001969596610fa0565b346102d5576003196040368201126102d55760043567ffffffffffffffff8082116102d55760c0826004019383360301126102d5576024359081116102d5576110bd903690600401611c93565b6110c8929192613236565b6110f96110f46110ef6110e86110de8880612b0d565b6040810190612b22565b3691611956565b614144565b6141ad565b801561134e576001101561133c5760248201926111168486612b55565b90501561132a57604483019361112c8587612b55565b9050156113185761119261115a9561118661115161114a8a80612b0d565b948a612b55565b9890928a612b55565b9190926111776040519661116d88611864565b33885236906119ba565b9960209a8b8801523691611a30565b60408501523691611a30565b6060820152606484013560808201526111aa81613278565b90815f525f865260405f209485541595866111ee575b878760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055604051908152f35b6001905560a46001600160a01b03917f87491344dfbcf91f6cbbc610cbbeedc85313d37a02df0c93527f7ea5f8db717f83855116604051908152868b82015260606040820152806112426060820188611dec565b0390a10191611251838a612b22565b9050611274575b505050611267939495506141c2565b81908380808080806111c0565b6112816110e8848b612b22565b61128a816148c6565b156112f55750976112c87fd46c2c56b35c8210e9e712ec3f02242d5fc90187c0ac8ed80cc33626846ec369936112e893611267999a9b511692612b22565b92906040519384938452868c850152606060408501526060840191612a3b565b0390a18594938780611258565b88610571604051928392630c89984b60e31b845260048401526024830190611d10565b60405163540e5f0b60e01b8152600490fd5b604051636c44ef8f60e01b8152600490fd5b604051633c8270bd60e21b8152600490fd5b604051632cff108b60e21b8152600490fd5b346102d5576020806003193601126102d5576024816001600160a01b03611385611824565b16604051928380926370a0823160e01b82523060048301525afa9081156103f5575f916113b6575b50604051908152f35b90508181813d83116113dc575b6113cd8183611934565b810103126102d55751826113ad565b503d6113c3565b346102d5576113f136611cc4565b6113f9613236565b611404848633613e0f565b61140d83613784565b1561154a5761141d8486336130a6565b61142781856137f1565b15611544575082935b61143c85828833613e43565b9690947f8045c25080b0868951141ed0a91720bcad09a8364a2b3109ee1fd49c1f0bc8b860c061146d898533613ea1565b94906001600160a01b0360405192338452169a8b6020840152876040840152856060840152608083015260a0820152a1836114c85760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b611537976105319660ff946040519960078b5260208b015260408a01526060890152608088015260a08701521660c08501523360e085015261010084019384604052611513856118fc565b600685526115246101208201612b8b565b61152d85611d81565b5261052984611d81565b808080808080808061049a565b93611430565b604051623a3a4d60e21b81523360048201526001600160a01b038616602482015260448101859052606490fd5b346102d55760803660031901126102d5576004356001600160a01b03908181168091036102d5576115a661183a565b6044359167ffffffffffffffff916064358381116102d557366023820112156102d55780600401359384116102d55736602485830101116102d5576116339560209216936115f5868587613d30565b60405196879283926323e30c8b60e01b84523360048501528760248501528860448501525f606485015260a06084850152602460a485019201612a3b565b03815f855af19384156103f5575f9461169f575b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd984036116865761167b93503091613da9565b602060405160018152f35b604051630b6c58a960e31b815260048101859052602490fd5b9093506020813d6020116116cb575b816116bb60209383611934565b810103126102d557519284611647565b3d91506116ae565b346102d5576101403660031901126102d55767ffffffffffffffff6004358181116102d557611706903690600401611ac5565b6024358281116102d55761171e903690600401611ac5565b60c03660431901126102d557610104358381116102d557611743903690600401611c78565b90610124359384116102d55761176061049a943690600401611c78565b92611769613236565b611e9d565b346102d55760603660031901126102d557602061179d61178c611824565b61179461183a565b604435916130a6565b604051908152f35b346102d55760203660031901126102d5576004355f525f6020526020600160405f205414604051908152f35b346102d55760203660031901126102d5576004359063ffffffff60e01b82168092036102d55760209163e414309160e01b8114908115611813575b5015158152f35b6301ffc9a760e01b1490508361180c565b600435906001600160a01b03821682036102d557565b602435906001600160a01b03821682036102d557565b35906001600160a01b03821682036102d557565b60a0810190811067ffffffffffffffff82111761188057604052565b634e487b7160e01b5f52604160045260245ffd5b6060810190811067ffffffffffffffff82111761188057604052565b6040810190811067ffffffffffffffff82111761188057604052565b6080810190811067ffffffffffffffff82111761188057604052565b67ffffffffffffffff811161188057604052565b60e0810190811067ffffffffffffffff82111761188057604052565b6020810190811067ffffffffffffffff82111761188057604052565b90601f8019910116810190811067ffffffffffffffff82111761188057604052565b92919267ffffffffffffffff82116118805760405191611980601f8201601f191660200184611934565b8294818452818301116102d5578281602093845f960137010152565b9080601f830112156102d5578160206119b793359101611956565b90565b91906060838203126102d557604051906119d382611894565b81936119de81611850565b83526119ec60208201611850565b602084015260408101359167ffffffffffffffff83116102d557604092611a13920161199c565b910152565b67ffffffffffffffff81116118805760051b60200190565b929192611a3c82611a18565b604092611a4c6040519283611934565b819581835260208093019160061b8401938185116102d557915b848310611a7557505050505050565b85838303126102d5578386918251611a8c816118b0565b611a9586611850565b81528286013583820152815201920191611a66565b9080601f830112156102d5578160206119b793359101611a30565b91909160a0818403126102d55760405190611adf82611864565b8193611aea82611850565b835267ffffffffffffffff9160208101358381116102d55782611b0e9183016119ba565b602085015260408101358381116102d55782611b2b918301611aaa565b604085015260608101359283116102d557611b4c6080939284938301611aaa565b60608501520135910152565b90929192611b6581611a18565b91604094611b766040519485611934565b839583855260208095019160059460051b8401948186116102d55784935b868510611ba5575050505050505050565b67ffffffffffffffff9085358281116102d5578701906080828603126102d5578551611bd0816118cc565b611bd983611850565b81528a8301358b820152868301358481116102d557830186601f820112156102d557803590611c0782611a18565b91611c148a519384611934565b8083528d80840191891b830101918983116102d5578e809101915b838310611c685750505050878201526060808401359485116102d557611c59878d9687960161199c565b90820152815201940193611b94565b82358152918101918f9101611c2f565b9080601f830112156102d5578160206119b793359101611b58565b9181601f840112156102d55782359167ffffffffffffffff83116102d5576020808501948460051b0101116102d557565b9060806003198301126102d5576004356001600160a01b03811681036102d5579160243591604435916064359067ffffffffffffffff82116102d557611d0c91600401611c93565b9091565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b805115610d245760200190565b805160011015610d245760400190565b805160021015610d245760600190565b805160031015610d245760800190565b805160041015610d245760a00190565b805160051015610d245760c00190565b8051821015610d245760209160051b010190565b9081518082526020808093019301915f5b828110611dc4575050505090565b835180516001600160a01b031686528201518583015260409094019392810192600101611db6565b90608080611e62611e50611e3e60406001600160a01b0380895116885260208901519060a060208a01528082511660a08a015260208201511660c08901520151606060e0880152610100870190611d10565b60408701518682036040880152611da5565b60608601518582036060870152611da5565b93015191015290565b90611e7582611a18565b611e826040519182611934565b8281528092611e93601f1991611a18565b0190602036910137565b926001600160a01b038451166001600160a01b0383511614612a29576001600160a01b03611ed2606086015160643590611d91565b5151166001600160a01b03611eee604085015160843590611d91565b515116148015906129e9575b610cde576001600160a01b03611f17604086015160443590611d91565b5151166001600160a01b03611f326064356060880151611d91565b515116146129d757611f4384613278565b805f525f60205260405f2054156129875750611f5e82613278565b805f525f60205260405f20541561293757506122ce907f6fa7f4c28634b0a9d6831401c45ae468195fb63aed07308935c35374ff5d9e3960405180611fc1611fb361012033845280602085015283018a611dec565b828103604084015287611dec565b6044356060830152606435608083015260843560a083015260a43560c083015260c43560e083015260e4356101008301520390a161223a6001600160a01b03845116916040519261201184611918565b5f845261201c6132a9565b506040519061202a826118fc565b6006825261203a60208301612b8b565b61204389613278565b906001600160a01b038a511660405192600384526020840152604083015260608201526080810160405261207682611d34565b5261208081611d34565b5060405161208d81611894565b6002815260403660208301376120a282611d41565b526120ac81611d41565b506121806120d36001600160a01b036120cb60443560408d0151611d91565b515116614468565b6121196001600160a01b038b51168b60206121106001600160a01b036120ff6044356040860151611d91565b515116926040604435910151611d91565b510151916130a6565b908a60ff602061214b6001600160a01b0361213a6044356040870151611d91565b515116936040604435910151611d91565b51015192169093929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b61218982611d51565b5261219381611d51565b506122216121b26001600160a01b036120cb60643560608d0151611d91565b6121ef6001600160a01b038b51168b60206121106001600160a01b036121de6064356060860151611d91565b515116926060606435910151611d91565b908a60ff602061214b6001600160a01b036122106064356060870151611d91565b515116936060606435910151611d91565b61222a82611d61565b5261223481611d61565b50614546565b905f6001600160a01b038751169160208801516001600160a01b0360208183511692015116918484523060205260408420604060208c015101516040519161228183611918565b86835260405195612291876118fc565b86526020860152604085015284606085015286608085015260a084015260c0830152604051808097819463d04dfe2360e01b83526004830161342a565b03915afa92835f915f95612919575b506122ed576040513d5f823e3d90fd5b92918351600281106128d357506040602085015194015161231661231083611d71565b51611d61565b5161232181836137f1565b156129115750935b61234b8186919060405192600284526020840152604083015260608201604052565b61235483611d51565b5261235e82611d51565b506040519461236c866118fc565b888652606435602087015260408601526060850152608084015260a083015260c082015261256e6001600160a01b0385511693604051946123ac86611918565b5f86526123b76132a9565b50604051906123c5826118fc565b600682526123d560208301612b8b565b6123de86613278565b906001600160a01b0387511660405192600384526020840152604083015260608201526080810160405261241182611d34565b5261241b81611d34565b5060405161242881611894565b60028152604036602083013761243d82611d41565b5261244781611d41565b506124d16124666001600160a01b036120cb60843560408a0151611d91565b6124a16001600160a01b038851166001600160a01b0361248c60843560408c0151611d91565b515116602061211060843560408d0151611d91565b906001600160a01b036124ba60843560408b0151611d91565b51511660ff602061214b60843560408d0151611d91565b6124da82611d51565b526124e481611d51565b506122216125036001600160a01b036120cb60a43560608a0151611d91565b61253e6001600160a01b038851166001600160a01b0361252960a43560608c0151611d91565b515116602061211060a43560608d0151611d91565b906001600160a01b0361255760a43560608b0151611d91565b51511660ff602061214b60a43560608d0151611d91565b926126045f6001600160a01b038551169260208601908151906001600160a01b03602081845116930151169286855230602052604080862091510151604051916125b783611918565b868352604051956125c7876118fc565b86526020860152604085015284606085015289608085015260a084015260c0830152604051808095819463d04dfe2360e01b83526004830161342a565b03915afa90815f915f936128eb575b50612623576040513d5f823e3d90fd5b908151600281106128d357506040602083015192015161264561231088611d71565b5161265081836137f1565b156128cb5750925b61267a8385919060405192600284526020840152604083015260608201604052565b61268388611d51565b5261268d87611d51565b506040519661269b886118fc565b86885260a43560208901526040880194855260608801938452608088015260a087015260c08601526126d06040840151613784565b159182156128b7575b5081156128a2575b8115612891575b5061287f57604051916126fa836118cc565b5f83525f60208401525f60408401525f606084015261271984836147d7565b8452604084015261273f61272d83866147d7565b60208601528060608601528451613818565b946127536020850151604086015190613818565b9361275d876137ce565b8015612870575b61285e57612825612857957fd9fa84dd790c969daa5c33d8050dc06b4a9b59d5b42e2be5f5e8ae20447f618d9461280761285c9a60a0966127a68a8851613842565b6127b48c6020890151613842565b6127c28a60408901516138a0565b6127d08c60608901516138a0565b6127d98a6139cb565b6127e28c6139cb565b6001600160a01b036127fe60c435926060606435910151611d91565b51511633613a6b565b50506001600160a01b036127fe60e43592606060a435910151611d91565b5050606060405191338352805160208401526020810151604084015260408101518284015201516080820152a1613b57565b613b57565b565b604051630d86822160e01b8152600490fd5b5061287a856137ce565b612764565b6040516321badf1f60e01b8152600490fd5b61289c9150516137ce565b5f6126e8565b90506128b160608301516137ce565b906126e1565b6128c391925051613784565b15905f6126d9565b905092612658565b60249060405190630fbb8e5560e21b82526004820152fd5b90925061290a91503d805f833e6129028183611934565b8101906132e6565b915f612613565b905093612329565b90945061293091503d805f833e6129028183611934565b935f6122dd565b9151604080513381526001600160a01b039092166020830152810192909252507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f39250905080606081015b0390a1565b9351604080513381526001600160a01b039092166020830152810194909452507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f392915081905060608101612982565b604051631cd2f1c760e21b8152600490fd5b506001600160a01b03612a03606084015160a43590611d91565b5151166001600160a01b03612a1f604087015160443590611d91565b5151161415611efa565b604051630a98f1f360e21b8152600490fd5b908060209392818452848401375f828201840152601f01601f1916010190565b90929192612a6881611a18565b91604091612a796040519485611934565b839581855260208095019160051b8301938185116102d55783925b858410612aa45750505050505050565b67ffffffffffffffff9084358281116102d55786019083828603126102d5578351612ace816118b0565b82358481116102d55786612ae39185016119ba565b8152898301359384116102d557612afe868b95869501611c78565b83820152815201930192612a94565b903590605e19813603018212156102d5570190565b903590601e19813603018212156102d5570180359067ffffffffffffffff82116102d5576020019181360383136102d557565b903590601e19813603018212156102d5570180359067ffffffffffffffff82116102d557602001918160061b360383136102d557565b5f5b60c08110612b99575050565b606082820152602001612b8d565b5f5b828110612bb557505050565b606082820152602001612ba9565b903590601e19813603018212156102d5570180359067ffffffffffffffff82116102d557602001918160051b360383136102d557565b60405190612c0682611894565b60606040835f81525f60208201520152565b60405190612c2582611864565b5f608083828152612c34612bf9565b6020820152606060408201526060808201520152565b9015610d2457803590607e19813603018212156102d5570190565b903590609e19813603018212156102d5570190565b9190811015610d245760061b0190565b356001600160a01b03811681036102d55790565b3580151581036102d55790565b9081518082526020808093019301915f5b828110612cca575050505090565b835185529381019392810192600101612cbc565b90612cf6610142612cef8480612c65565b3690611ac5565b5f5260205f81526040926001845f2054036130165791612f1991612d7d85855f612e9e612d2683612d3d9a612c65565b612d42878501359182878701359c8d923690611ac5565b61429a565b612d5a612d4f8580612c65565b946060810190612bc3565b9690612d75875196612d6b88611918565b8688523690611ac5565b973691611b58565b90612d866132a9565b50612e67865191612d96836118fc565b60068352612da58a8401612b8b565b88612daf81613278565b988b6001600160a01b039a8b845116908351926003845283015282820152336060820152608081018252612de286611d34565b52612dec85611d34565b508051612df881611894565b6002815281368e830137612e0b86611d41565b52612e1585611d41565b50810160ff8c61214b612e508d80612e32816120cb8b8a51611d91565b97511690612e41898851611d91565b515116846121108a8951611d91565b958d612e5d828751611d91565b5151169451611d91565b612e7082611d51565b52612e7a81611d51565b506122218b886060810160ff8c61214b612e508d80612e32816120cb8b8a51611d91565b918385511693868601918b83519289818551169401511693878652308a52818087209151015190825192612ed184611918565b8784525195612edf876118fc565b86528a8601528d85015284606085015285608085015260a084015260c08301528a5180809a819463d04dfe2360e01b83526004830161342a565b03915afa95865f915f98612ff8575b50612f375788513d5f823e3d90fd5b9593865160028110612fe15750888798998260c09798990151990151612f5f61231085611d71565b51612f6a81836137f1565b15612fd75750998a925b612f968b85919060405192600284526020840152604083015260608201604052565b612f9f86611d51565b52612fa985611d51565b50825196612fb6886118fc565b8752860152840152866060840152608083015260a082015201526001929190565b9050998a92612f74565b6024908a5190630fbb8e5560e21b82526004820152fd5b90975061300f91503d805f833e6129028183611934565b965f612f28565b505f92508291829150565b9035601e19823603018112156102d557016020813591019167ffffffffffffffff82116102d5578160061b360383136102d557565b9190808252602080920192915f905b828210613073575050505090565b909192936001906001600160a01b0361308b87611850565b16815285830135838201526040908101950193920190613065565b82156130db576001600160a01b038091165f52600160205260405f2091165f5260205260405f20905f5260205260405f205490565b9091506130e782614468565b6001600160a01b03809316906040918251946370a0823160e01b86528416938460048701526020928387602481865afa9687156131fd575f97613207575b508361313e6131378361316e9a61522c565b5090614cee565b508651636eb1769f60e11b81526001600160a01b0390941660048501523060248501529297889081906044820190565b0381865afa9687156131fd575f976131cc575b50613137613192916119b79861522c565b5061319d81836137f1565b156131c45750935b5f5260018252825f20905f528152815f20905f8052525f205490614373565b9050936131a5565b96508387813d83116131f6575b6131e38183611934565b810103126102d557955195613137613181565b503d6131d9565b85513d5f823e3d90fd5b96508387813d831161322f575b61321e8183611934565b810103126102d55795519583613125565b503d613214565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0060028154146132665760029055565b604051633ee5aeb560e01b8152600490fd5b6040516132a3816132956020820194602086526040830190611dec565b03601f198101835282611934565b51902090565b604051906132b6826118fc565b606060c0836132c3612c18565b81525f60208201525f60408201525f838201528260808201525f60a08201520152565b91906040838203126102d557825167ffffffffffffffff908181116102d55784019082601f830112156102d557815160209261332182611a18565b9161332f6040519384611934565b808352848084019160051b830101918683116102d55785809101915b8383106133be575050505094828101519182116102d557019180601f840112156102d557825161337a81611a18565b936133886040519586611934565b818552838086019260051b8201019283116102d5578301905b8282106133af575050505090565b815181529083019083016133a1565b825181529181019186910161334b565b90808251908181526020809101926020808460051b8301019501935f915b8483106133fc5750505050505090565b909192939495848061341a600193601f198682030187528a51612cab565b98019301930191949392906133ec565b91906020928381526001600160a01b0382511684820152838201516040820152613464604083015160e06060840152610100830190611d10565b906060830151608082015261348b608084015192601f1993848483030160a08501526133ce565b9260a081015193838382030160c08401528680865192838152019501905f5b8181106134ce575050506119b794955060c060e09101519282850301910152612cab565b8251875295880195918801916001016134aa565b959491939086936134f16132a9565b505f92604061360c815192613505846118fc565b60068452602093613517858201612b8b565b6135d56135238b613278565b8b6001600160a01b03998a9283835116895191600383528b830152898201528360609b168b82015260808101895261355a86611d34565b5261356485611d34565b50875161357081611894565b6002815288368b83013761358386611d41565b5261358d85611d41565b5060ff8961214b8a8501936135c9876135ab816120cb858a51611d91565b975116886135ba848951611d91565b51511685612110858a51611d91565b96612e5d828751611d91565b6135de82611d51565b526135e881611d51565b50612221878b8d60ff8961214b8c8501936135c9876135ab816120cb858a51611d91565b9461368c5f868a511698869786889c0191825191888184511693015116928c8552308952878086209151015188519161364483611918565b868352895195613653876118fc565b86528a86015288850152848a8501528b608085015260a084015260c08301528551808095819463d04dfe2360e01b83526004830161342a565b03915afa90815f915f93613766575b50613759575050505f975b600285511098891599613746578284870151960151906136c861231089611d71565b51906136d482846137f1565b15905061373e5750925b6137008685919060405192600284526020840152604083015260608201604052565b61370988611d51565b5261371387611d51565b5082519b6137208d6118fc565b8c528b0152890152870152608086015260a085015260c08401529190565b9050926136de565b50505050505050505091506119b76132a9565b91999850945093966136a6565b90925061377d91503d805f833e6129028183611934565b915f61369b565b6137a3905f60e01d906001600160e01b038160e01d9116601b0b6152e3565b1290565b906137a3916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b615364565b6137ed905f60e01d906001600160e01b038160e01d9116601b0b6152e3565b1390565b906137ed916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b615364565b6119b791610ace916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b61483a565b61389c91608081018261385e6138588351611d71565b51611d71565b5261389561388f6001600160a01b038094515116936138866138808551611d71565b51611d34565b51169251611d71565b51611d51565b5191613e43565b5050565b906080810191806138b46138588551611d61565b526001600160a01b038092515116916138d06138808551611d61565b51166138df61388f8551611d61565b519081613993576138ef836137ce565b61397a579183917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a9593612982955f5260209060018252613945604094855f20835f528452855f20855f528452855f2054614373565b945f5260018252835f20905f528152825f20915f52525f20555b516040519182913383526040602084015260408301906133ce565b60405163793a8f5560e01b815260048101849052602490fd5b916139c4917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a959361298295613a6b565b505061395f565b608081016139dc61388f8251611d61565b519182156139e957505050565b613a036138806001600160a01b0380935151169351611d61565b5116815f5260209160018352604092835f20835f528152835f20855f528152835f2054936001600160e01b038516613a3e575b505050505050565b613a62955f9284845260018152828420868552815282842091845252812055613ea1565b5f808080613a36565b93929193613a78836137ce565b61397a5784613a9457613a8c939450613ea1565b50505f905f90565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f528152613ad1835f20549485614373565b95613adb876137ce565b613afe575f97885260018252838820908852815282872091875252909320829055565b835163c5e12af560e01b815260048101889052602490fd5b90604082019082526020606081936040838201528551809452019301915f5b828110613b43575050505090565b835185529381019392810192600101613b35565b60c0810151908151915f92613ccb575b50613c0c6020918281510151926001600160a01b039081818187511696015116928660a082019485518252308452604097888320898686510151015160808601518b5191613bb483611918565b8683528c5193613bc385611918565b8785528d5196613bd2886118fc565b8752898701528c86015260016060860152608085015260a084015260c08301528851808099819463d04dfe2360e01b83526004830161342a565b03915afa948515613cc1578795613ca3575b508451613c2f575b50505050505050565b81905101510151169051813b15613c9f57918491849383613c64965180978195829463012c676d60e21b845260048401613b16565b03925af1908115613c965750613c7f575b8080808080613c26565b613c8982916118e8565b613c935780613c75565b80fd5b513d84823e3d90fd5b8480fd5b613cb89195503d8089833e6129028183611934565b9050935f613c1e565b86513d89823e3d90fd5b6001600160a01b03602080845101510151169060a083015190823b156102d557613d0e925f928360405180968195829463012c676d60e21b845260048401613b16565b03925af180156103f55715613b6757613d289192506118e8565b5f905f613b67565b6040519263a9059cbb60e01b5f526001600160a01b0380931660045260245260205f60448180855af160015f5114811615613d8a575b8360405215613d7457505050565b635274afe760e01b835216600482015260249150fd5b6001811516613da057813b15153d151616613d66565b833d5f823e3d90fd5b9092604051936323b872dd60e01b5f526001600160a01b0393848092166004521660245260445260205f60648180855af160015f5114811615613df9575b836040525f60605215613d7457505050565b6001811516613da057813b15153d151616613de7565b909115613e1a575050565b6040516305dbdfd960e41b81526001600160a01b03918216600482015291166024820152604490fd5b93929193613e50836137ce565b61397a5784613e6457613a8c93945061439d565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f528152613ad1835f20549485613818565b90929192613eae81614869565b93613eb8816137ce565b613f015784816001600160e01b03613ed79360e01d9116601b0b61548e565b50809281613ee7575b5050509190565b6001600160a01b03613ef99316613d30565b5f8181613ee0565b604051632d1671a360e11b8152600490fd5b919091604092835192613f25846118fc565b60068452602094613f37868601612b8b565b5f5b8451811015613f6c5780613f4f60019287611d91565b51613f5a8289611d91565b52613f658188611d91565b5001613f39565b50925092939093335f52308252825f2091835195613f89876118b0565b613f91612bf9565b875260608281980152845190613fa682611918565b5f8252855190613fb582611918565b5f82525f3681375f5b815181101561411a57898688613fd48486611d91565b51888151948d80870151908151613ff6575b5050505050505050600101613fbe565b905f92916001600160a01b039661401b8887818d51169c015116998789015190614546565b958251996140288b6118fc565b8a5289015287015285015260808401528760a08401528660c08401525f8c51809563d04dfe2360e01b8252818061406360049889830161342a565b03915afa938415614110579089915f956140f2575b50845161408e575b50899250808e8c938e613fe6565b5101511691823b156102d5576140bc925f92838d5180968195829463012c676d60e21b845233908401613b16565b03925af180156140e85790600192916140d9575b81928782614080565b6140e2906118e8565b5f6140d0565b89513d5f823e3d90fd5b6141079195503d805f833e6129028183611934565b9050935f614078565b8c513d5f823e3d90fd5b50505050505050509050565b8115614130570490565b634e487b7160e01b5f52601260045260245ffd5b60408151106141a0576020810151908051603f19810190811161418c5760051c82116141785760016020920160051b010190565b505060405161418681611918565b5f815290565b634e487b7160e01b5f52601160045260245ffd5b5060405161418681611918565b8051156141bd57602001515f1a90565b505f90565b61285c92916141ed610531923390919060405192600284526020840152604083015260608201604052565b9260405193600185526020850152604084016040523691612a5b565b905f8091602081519101845af48080614287575b1561423d5750506040513d81523d5f602083013e60203d82010160405290565b1561426457604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b3d15614275576040513d5f823e3d90fd5b60405163d6bda27560e01b8152600490fd5b503d15158061421d5750813b151561421d565b916142c59060606142ba936001600160a01b039485916040880151611d91565b515116940151611d91565b515116146129d757565b6142f66001600160e01b0392838316601b0b9260e01d938160e01d9116601b0b8484614aa5565b90637ffffff58213614346575b9061430d91614cee565b929092158061433e575b61432057505090565b6044925060405191638eba4d0760e01b835260048301526024820152fd5b508215614317565b61435082826159b7565b1561430357604483856040519163d556b11160e01b835260048301526024820152fd5b6119b791610ace916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b615093565b9291926143a982614869565b936143b3816137ce565b6144145784816001600160e01b036143d29360e01d9116601b0b61548e565b92908093156143ff575b508290816143eb575050509190565b613ef9926001600160a01b03309216613da9565b9092505f19811461418c57600101915f6143dc565b604051632eaefac360e21b8152600490fd5b6004111561443057565b634e487b7160e01b5f52602160045260245ffd5b602090939291936001600160a01b03604082019516815261446483614426565b0152565b6144706159d0565b60408051630782d7e160e01b81526001600160a01b03831660048201529091828260248173200e12d10bb0c5e4a17e7018f0f1161919bb93895afa92831561453d575f925f94614508575b506144c583614426565b6001831415806144f6575b6144da5750505090565b5163ee07877f60e01b8152918291610571919060048401614444565b5061450083614426565b8215156144d0565b9080945061452c9293503d8511614536575b6145248183611934565b810190615202565b919091925f6144bb565b503d61451a565b513d5f823e3d90fd5b6145508251611e6b565b61455a8351611e6b565b9282519281518015155f146147cf57600201935b6001940184019061457e82611a18565b956145996040936145918551998a611934565b808952611a18565b6145ab602091601f1901828a01612ba7565b5f9584519389896002926002885233868901523089890152606097606081018a526145d584611d34565b526145df83611d34565b505f825b61478f575b5050505086516145ff575b50505050505050505090565b909192936002886146228c8661461b8e809c9d9e018093611d91565b528d611d91565b50018561462f828d611d91565b5261463a818c611d91565b505f965b614649575b506145f3565b885187101561478a576001600160a01b036146f5898b856146ec8c60428c886146728488611d91565b515116968582614682868a611d91565b51015192614690868a611d91565b51838d82511691015182815160051b910120908451927f6ec4dff745ec96dbde88c5d41f8aa5ac13aa1664afb47b8406b44fa945a650c88452830152838201522090519161190160f01b83528d83015260228201522093611d91565b5101519161525a565b1561477257876147618b8e8c8f9e9d9c9b9a999897968f61474e918d614744898f8f61473083889f614727828f611d91565b51511692611d91565b5261473b828b611d91565b51015192611d91565b52019c8d94611d91565b51015161475b8383611d91565b52611d91565b50019697989590919293949561463e565b8851630a57f30960e31b815260048101899052602490fd5b614643565b9091929a82518210156147c757906147bb84809301809d6147b08487611d91565b5161475b8383611d91565b50019082918d936145e3565b9a92916145e8565b505f9361456e565b9160408301926040614811610ace606087519401938451906001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6148ea565b945193016148208151866137a7565b614828575050565b9093506119b7919250519251836142cf565b919291600160ff1b840161485257611d0c93506153b9565b90611d0c935f0391615093565b61430d8282614cee565b6148716159d0565b6040805163b7bad1b160e01b81526001600160a01b0383166004820152909182826024815f73200e12d10bb0c5e4a17e7018f0f1161919bb93895af192831561453d575f925f9461450857506144c583614426565b60088151106141bd576008015167ffffffffffffffff1667ff0a89c674ee78741490565b9091939284158215175f146149045750505090505f905f90565b82810192600160fd1b8082019083011760fe1c614a3b575b50506149278161567c565b936149318161567c565b9461493c868261569c565b90918215614a2c575f9083986f0785ee10d5da46d900f436a000000000808611614a1e575b50670de0b6b3a7640000808b11614a0f575b50633b9aca00808b11614a00575b50612710808b116149f2575b5098805b6149e157508190611d0c989982600a0a9109960195817fcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccd0a93838211900382610100031b9203901c1702916156af565b60019290920191600a900480614991565b60049a04998a93019261498d565b600991939a049901915f614981565b601291939a049901915f614973565b85049950602592505f614961565b50929050611d0c9495506156af565b5f821215614a8f57808413614a81575b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb284131561491c57909250611d0c9394916155ba565b909250611d0c939491615621565b80841215614a4b57909250611d0c9394916155ba565b92909180614acb576044848460405191637a97930f60e01b835260048301526024820152fd5b90919280155f14614ae057505050505f905f90565b614af993614aed91615769565b92919490938492615769565b9093919284614b078861567c565b91614b118661567c565b947f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000094604c91868810614cb8575b030191600160ff1b98838a018112155f14614c85575050035b5f955f821280614c7c575b614c5e575b5f811280614c4c575b614c2e5786820103966001600160ff1b0388149081614c24575b5080614c1b575b80614c12575b614bf4575090614ba89291615915565b915f8113614bbb575b50611d0c936156af565b9091604c8213614be957614bd291600a0a90614126565b908115614bdf575f614bb1565b505050505f905f90565b50505050505f905f90565b876044916040519163d556b11160e01b835260048301526024820152fd5b505f8512614b98565b50828414614b92565b905088145f614b8b565b604489836040519163d556b11160e01b835260048301526024820152fd5b50806001600160ff1b03018213614b71565b9550808701861315614c765786818703015b95614b68565b5f614c70565b505f8113614b63565b89985090920390506001600160ff1b0381900387018213614ca95701860194614b58565b5050505050505050505f905f90565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009650604b9250614b3f565b8115614130570590565b8082601b82810b8314614ee3577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000008405614e8f575b8380820b03614e7e57507b199999999999999999999999999999999999999999999999999999987b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc84011115614e2f575b838060030b03614db3575b808413614d975750506001600160e01b036001925b60e01b91161791565b8303600a0a8015614130576001600160e01b0391071592614d8e565b92915f841315614e03575090614dc983836159b7565b614de557637ffffffe1901600a0a810290637fffffff92614d79565b506044916040519163d556b11160e01b835260048301526024820152fd5b637fffffff199283039060438213614be957614e2291600a0a90614ce4565b918215614bdf5792614d79565b5f198401808060030b14614e435750614d6e565b90506001600160e01b039293507b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff915060e01b9260ff1d181617905f90565b600190940193600a90930592614d21565b937f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000840515614ed0576305f5e100600894058094819201955b915050614d21565b620186a060059405809481920195614ec8565b5082614d6e57505050505f90600190565b919291600160ff1b9190801580615081575090614f1091615769565b9490929091905f868585858282138015615078575b61505b575b505050508682841860ff1c94860391039081604c0381116150405701600a0a808205919084615026575b505081019182821860ff1c111561501e57826001600160ff1b031461500057905f600192135f14614fd157600a9004915b01925b81158117614f9557509190565b80614fae575b508015614fa6579190565b505f91508190565b9192614fc49203600160ff1b01600a0a90614ce4565b600160ff1b91905f614f9b565b600a60037fe6666666666666666666666666666666666666666666666666666666666666679201040191614f85565b604490836040519163d556b11160e01b835260048301526024820152fd5b509092614f88565b8107615033575b80614f54565b60ff1d600117015f61502d565b50505091935061504e579190565b60018160ff1d1790039190565b5f9a50909750909550600160ff1b94509250905086808080614f2a565b50835f12614f25565b1561508c5750509190565b9350919050565b93929193841581158181176151e4575050906150ae91615769565b91949082956150bf82958294615769565b80969294919693878684821380156151db575b6151c2575b5050505050508682841860ff1c94860391039081604c0381116150405701600a0a8082059190846151a8575b505081019182821860ff1c11156151a057826001600160ff1b031461500057905f600192135f1461517157600a9004915b01925b8115811761514457509190565b8061515457508015614fa6579190565b600160ff1b9361516b9291038401600a0a90614ce4565b5f614f9b565b600a60037fe6666666666666666666666666666666666666666666666666666666666666679201040191615134565b509092615137565b81076151b5575b80615103565b60ff1d600117015f6151af565b929b5098509196509450925090505f80808080806150d7565b508584126150d2565b93959390929190156151fa575050614fa6579190565b945092915050565b91908260409103126102d557815160048110156102d55760209092015160ff811681036102d55790565b9060ff165f03916001600160ff1b0382115f1461525257600a6001818404940192061590565b909190600190565b9091813b6152955761526c9192615a39565b5061527681614426565b15918261528257505090565b6001600160a01b03918216911614919050565b6020918160645f935160405192630b135d3f60e11b9788855260048501526040602485015286820190604485015e8281018201859052601f01601f191601915afa905f5114601f3d11161690565b92915f9060018184145f8712871517171761535d575f9280821361534f575b03604c81135f82121761534357600a0a90846153218382029384614ce4565b1461533657505015615332575f9190565b5f90565b90935090156119b7579190565b505015615332575f9190565b5f9560019450925090615302565b5050505f90565b93929190918083145f83125f871218831587151717176153b3575f928082136153a65703604c81135f82121761534357600a0a90846153218382029384614ce4565b9194600193509190615302565b50919050565b909291600160ff1b9182810161544b575080841461544157808413918215615439578185035b604c8111156154285750505f915b1561541957507f8000000000000000000000000000000000000000000000000000000000000001019190565b92506001600160ff1b03039190565b600a0a9081156141305704916153ed565b8482036153df565b505090505f905f90565b9361545892945f03614ef4565b8093918092811461546c575b50505f039190565b915092506001600160ff1b03831461500057600a600191059201915f80615464565b91925f8312156154b6576044838360405191634a7d166b60e01b835260048301526024820152fd5b9192836154c857505090505f90600190565b60ff8116820191808312615590575f831215615500575050604c198112614fa6575f03600a0a916154f98382614126565b9283021490565b909293915f81135f1461558657604d811361555b57600a0a92831561413057835f190483116155325750500290600190565b60405163c849483b60e01b815260048101849052602481019290925260ff166044820152606490fd5b5060405163c849483b60e01b81526004810192909252602482015260ff919091166044820152606490fd5b5050905090600190565b60405163c849483b60e01b815260048101869052602481019190915260ff82166044820152606490fd5b909392915f6155ca9181846148ea565b9490945f8483019182019412159081615617575b811561560d575b506155ef57505090565b604492506040519163d556b11160e01b835260048301526024820152fd5b905083125f6155e5565b82811291506155de565b61563693600160fe1b908101939201906148ea565b9081815f82121561566d575050604b198212613a8c5761565b915f03600a0a90614ce4565b9081615665575f90565b600160ff1b90565b93600160ff1b90910192509050565b5f8112156119b757600160ff1b90808203615695575090565b90505f0390565b905f198183099102908180821091030391565b92939291905f8184181215615744576001600160ff1b03928383111561572e57600160ff1b938385036156e457505050509190565b909192935085146156fe575050600a600191045f03920190565b604051630ed8062160e21b8152600481019190915260248101919091526044810182905260648101849052608490fd5b5090915050600160ff1b811461418c575f039190565b90916001600160ff1b0380841115613ee05785146156fe575050600a60019104920190565b919091801561590b57827f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000080830515615819575b507f19999999999999999999999999999999999999999999999999999999999999997f0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc83011061580a575b83136157f45791905f90565b919060018060ff1b926001600160ff1b03030190565b9290600a02905f1901926157e8565b6f4b3b4ca85a86c47a098a224000000000808405156158f9575b507728c87cb5c89a2571ebfdcb54864ada834a000000000000008305156158e2575b7b097edd871cfda3a5697758bf0e3cbb5ac5741c6400000000000000008305156158ce575b7e3899162693736ac531a5a58f1fbb4b746504382ca7e40000000000000000008305156158be578205156158af575b5f61579d565b9290600a02905f1901926158a9565b939160640291600119019361587a565b93916402540be4000291600919019361587a565b9391678ac7230489e8000002916012190193615855565b6025198301955092909202915f615833565b505f915081908190565b90915f198383099280830292838086109503948086039584871015615993571461598b579082910960018219018216809204600280826003021880830282030280830282030280830282030280830282030280830282030280920290030293600183805f03040190848311900302920304170290565b505091500490565b60648386866040519263362ced0960e11b8452600484015260248301526044820152fd5b6119b791905f8112156159cb575f03615a73565b615a73565b73200e12d10bb0c5e4a17e7018f0f1161919bb9389803b158015615a0e575b6159f65750565b602490604051906373e6d7b360e01b82526004820152fd5b507f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d41813f14156159ef565b8151919060418303615a6957615a629250602082015190606060408401519301515f1a90615b02565b9192909190565b50505f9160029190565b90637ffffff5811315615afc57637ffffffe1981019060438213615af5575f821215615ac957637fffffff91505f0301600a0a7b8000000000000000000000000000000000000000000000000000000202111590565b50600a0a8015614130577b80000000000000000000000000000000000000000000000000000001041090565b5050151590565b50505f90565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411615b79579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa156103f5575f516001600160a01b03811615615b6f57905f905f90565b505f906001905f90565b5050505f91600391905600000000000000000000000000000000000000000000000000000000000000000000000000000000200e12d10bb0c5e4a17e7018f0f1161919bb93890000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000044b608060405234801561000f575f80fd5b506004361061004a575f3560e01c80630782d7e11461004e57806354636d2b14610078578063b7bad1b11461009d578063f5c36eaf146100b0575b5f80fd5b61006161005c366004610363565b6100c3565b60405161006f929190610403565b60405180910390f35b61008b610086366004610363565b6100d8565b60405160ff909116815260200161006f565b6100616100ab366004610363565b6100e9565b61008b6100be366004610363565b6100f5565b5f806100cf5f84610100565b91509150915091565b5f6100e35f836101f0565b92915050565b5f806100cf5f84610281565b5f6100e35f83610356565b73ffffffffffffffffffffffffffffffffffffffff81165f9081526020838152604080832081518083019092525460ff8082161515835261010090910416818301527f313ce56700000000000000000000000000000000000000000000000000000000808452839283908190816004818a5afa915060203d1015610182575f91505b811561019857505f5160ff811115610198575f91505b816101af57505050602001516003925090506101e9565b83516101c3575f955093506101e992505050565b836020015160ff1681146101d85760026101db565b60015b846020015195509550505050505b9250929050565b5f805f6101fd8585610281565b909250905060018260038111156102165761021661039d565b1415801561023557505f8260038111156102325761023261039d565b14155b156102795783826040517fee07877f000000000000000000000000000000000000000000000000000000008152600401610270929190610421565b60405180910390fd5b949350505050565b5f805f8061028f8686610100565b90925090505f8260038111156102a7576102a761039d565b0361034b576040805180820182526001815260ff838116602080840191825273ffffffffffffffffffffffffffffffffffffffff8a165f908152908b9052939093209151825493517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009094169015157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff161761010093909116929092029190911790555b909590945092505050565b5f805f6101fd8585610100565b5f60208284031215610373575f80fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114610396575f80fd5b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b600481106103ff577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b9052565b6040810161041182856103ca565b60ff831660208301529392505050565b73ffffffffffffffffffffffffffffffffffffffff831681526040810161039660208301846103ca56000000000000000000000000000000000000000000"; diff --git a/src/generated/candidate/RaindexV6.sol b/src/generated/candidate/RaindexV6.sol index 6e5556aecd..f1d3c318e3 100644 --- a/src/generated/candidate/RaindexV6.sol +++ b/src/generated/candidate/RaindexV6.sol @@ -5,19 +5,19 @@ pragma solidity ^0.8.25; // THIS FILE IS AUTOGENERATED BY THE BUILD SCRIPT. DO NOT EDIT BY HAND. /// @dev Hash of the known bytecode. -bytes32 constant BYTECODE_HASH = bytes32(0xda75698cbc7f94bb7dbb0586d7645d5b367eaeab0a0a325ed251fe3369572fcf); +bytes32 constant BYTECODE_HASH = bytes32(0xf7836bd1e32131aceee1da315cce56edfff68a0a5faf1764f373af0426080faf); /// @dev The deterministic deploy address of the contract when deployed via /// the Zoltu factory. -address constant DEPLOYED_ADDRESS = address(0x531167691b4f37f0266e226d03412c77Fb2977ce); +address constant DEPLOYED_ADDRESS = address(0xD2cd1D4AD3bf3eCB581E4653c9C02a67cA44305c); /// @dev The creation bytecode of the contract. bytes constant CREATION_CODE = - hex"6080806040523460395760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005561588e908161003e8239f35b5f80fdfe6080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a71461180e575080632cb77e9f146117e257806341d1514f146117ab5780635343c1b7146117105780635cffe9de146115b45780635d003c4414611430578063613255ab146113ad578063687cf02a14611096578063ac9650d814610f48578063b0460f07146105f3578063b845b83e1461059b578063ca9109ba1461044c578063d9d98ce41461039b578063ddebc96f146103475763df6db3c2146100c1575f80fd5b34610321576003196040368201126103215767ffffffffffffffff9060043582811161032157806004019160a0823603918201126103215760243584811161032157610111903690600401611cd0565b909361011b612bf0565b5f946001600160a01b039485610130846125d7565b163303610325576101496101443685611b02565b612c32565b805f525f60205260405f20966001885414610190575b60208960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556040519015158152f35b9091929394959697505f600198556040519633885282602089015260606040890152816101bc8761188d565b166060890152602484013590606219018112156103215783019060a06080890152806101ea6004840161188d565b166101008901526101fd6024830161188d565b16610120880152604481013560221982360301811215610321570190602460048301359201988211610321578136038913610321577f09d18501db0080ca2d6cd7c17fa7255daff4b2d503ea93b76ff68b6752ea8e6387806103069560846102c561030e9a60209f610284906103149f9a60606101406102ef9d0152610160880191612388565b6102b66102ab61029760448801856129db565b605f198a8603810160a08c01529491612a10565b9260648701906129db565b918784030160c0880152612a10565b91013560e08301520390a13390919060405192600284526020840152604083015260608201604052565b906040519160018352602083015260408201604052565b9236916123a8565b90613c65565b5f8080808080808061015f565b5f80fd5b602486610331856125d7565b6040516335252be360e01b815291166004820152fd5b3461032157600319602036820112610321576004359067ffffffffffffffff82116103215760809082360301126103215761038660609160040161262b565b90604051921515835260208301526040820152f35b34610321576040366003190112610321576001600160a01b036103bc611861565b166040516370a0823160e01b8152306004820152602081602481855afa908115610441575f9161040f575b50156103f75760206040515f8152f35b60249060405190633c5bf76960e21b82526004820152fd5b90506020813d602011610439575b8161042a60209383611971565b810103126103215751826103e7565b3d915061041d565b6040513d5f823e3d90fd5b346103215761045a36611d01565b92809492610466612bf0565b610471828533613b61565b61047a816134d6565b15610567578061048e6104dd9286336140a7565b9790957f7f9dfa19cf1cc2f806f2f860fbc9c056b601fb1afc0e9b843dfe5c63616268e660806040513381526001600160a01b038416998a60208301528560408301526060820152a1336137bd565b9390918561050c575b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b61055b9661030e956103069460ff93604051956005875260208701526040860152606085015260808401521660a082015260c08101604052906040519160018352602083015260408201604052565b808080808080806104e6565b506040516306dde9c360e41b81523360048201526001600160a01b03841660248201526044810191909152606490fd5b0390fd5b346103215760203660031901126103215760043567ffffffffffffffff81116103215761030e6105d26104e6923690600401611cd0565b91906105dc612bf0565b604051926105e984611955565b5f845236916123a8565b34610321576003196020368201126103215767ffffffffffffffff600435116103215760c090600435360301126103215761062c612bf0565b5f808061064160048035608481019101612510565b905015610f36576024600435013592610659846134d6565b15610f245760608060405161066d81611909565b610675612565565b81525f60208201525f6040820152015261068d612565565b506106ed6106e86106c76106bd6106b76106b1608460043501600435600401612510565b90612597565b806125b2565b60408101906124a2565b60206106e06106b1608460043501600435600401612510565b0135916125c7565b6125d7565b936001600160a01b0361073c6106e86107236107196106b76106b1608460043501600435600401612510565b60608101906124a2565b60406106e06106b1608460043501600435600401612510565b816040519761074a896118d1565b168752166020860152604085015261076c608460043501600435600401612510565b9490506001604051955f87520160051b85016040525f905f5b610799608460043501600435600401612510565b9050811080610f11575b15610d5e576107bc608460043501600435600401612510565b821015610d4a578160051b810135607e198236030181121561032157608081830136031261032157604051916107f183611909565b8181013567ffffffffffffffff81116103215761081390369084840101611b02565b835280820160208181013590850152604080820135908501526060013567ffffffffffffffff81116103215761084c9236920101611cb5565b606082015280516001600160a01b0361086e6040830151602085015190611dbe565b5151166001600160a01b0385511614801590610d16575b610d045761089d602083015160408401519083613fa4565b6108a681612c32565b91825f525f60205260405f2054155f1461090a575051604080513381526001600160a01b039092166020830152810191909152600191907fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f390606090a15b01610785565b919061093b60208497959701516040850151906060860151906040519261093084611955565b5f8452339186613234565b5f94916109a457505051604080513381526001600160a01b03909216602083015281019190915260019291907f1e6fa9678edf81f9f25bbf308bde03ad3e110db1f429394b0915ba021532941490606090a15b811561099c575b5092610904565b905088610995565b6109b9606082015160446004350135906134f9565b15610a1357505051604080513381526001600160a01b03909216602083015281019190915260019291907fe3151dc8cb7a54ffc4baabd28c1f241c94d510b5e5b502491ac3cad6c16316d59080606081015b0390a161098e565b610a2060408201516134d6565b158015610cf1575b15610a7e57505051604080513381526001600160a01b03909216602083015281019190915260019291907f500b713857325f9e6dcb52ae832eca9109d107ed1aae9cb4928b4c1e13f051aa908060608101610a0b565b9250925050600196959691610a976064600435016125eb565b15610c5e5796610b0797610b1760408401516040880151610ab88183613543565b15610c565750925b610b11848592610afa610af460608a01516001600160e01b03601b918660e01d92828816810b928260e01d9216900b6145f4565b90614569565b9d8e9260408d015161356a565b60408c015261407d565b9961407d565b98610b228484613594565b610b2c84826135f2565b60405192338452608060208501526060610b528451608080880152610100870190611e19565b93602081015160a0870152604081015160c0870152015192607f198582030160e0860152835180825260208201906020808260051b8501019601925f5b828110610bee57505050505092806001979695937fbae4dbf76931c547f765e9def16d693d86daaa596f491de979008831789185ae93610be996604084015260608301520390a180858c5101808d5260051b8c01526138a9565b61098e565b9091929396602080610c49600193601f198782030189528b51906001600160a01b03825116815283820151848201526060610c3860408401516080604085015260808401906125f8565b920151906060818403910152611d4d565b9901950193929101610b8f565b905092610ac0565b610b0790610b176060840151610b11610c9c610af460408801516001600160e01b0394601b90868360e01d9316820b91878260e01d9216900b6145f4565b60408a0151610cab8183613543565b15610ce95750915b829c8d916060890151908116155f14610cda575060408801515b96879460408d015161356a565b610ce49085613fd9565b610ccd565b905091610cb3565b50610cff6060820151613520565b610a28565b60405163936bb5ad60e01b8152600490fd5b506001600160a01b03610d326060830151604085015190611dbe565b5151166001600160a01b036020860151161415610885565b634e487b7160e01b5f52603260045260245ffd5b50919390610d706064600435016125eb565b15610f0b57835b6004356004013590610d898282613543565b610eed5750508490610da9856001600160a01b0360208701511633613bf3565b505060a46004350190610dc18260043560040161246f565b905015159081610ee5575b50610e44575b506001600160a01b03610de892935116336140a7565b50505b8351811015610e105780610e0a610e0460019387611dbe565b5161371d565b01610deb565b5060409160017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005582519182526020820152f35b90506001600160a01b03602084015116610e6e6001600160a01b038551169260043560040161246f565b929091333b1561032157610eb65f93604051958694859463691f9ed760e01b8652600486015260248501528960448501528a606485015260a0608485015260a4840191612388565b038183335af190811561044157859115610dd2579050610ed69150611925565b5f836001600160a01b03610dd2565b905088610dcc565b604492506040519163573b6f4160e01b835260048301526024820152fd5b84610d77565b50610f1f60408301516134d6565b6107a3565b60405163315f9e2360e21b8152600490fd5b604051639c95219f60e01b8152600490fd5b34610321576020806003193601126103215760043567ffffffffffffffff811161032157610f7a903690600401611cd0565b919060405192610f8984611955565b5f8452828401610f9882611a55565b94610fa66040519687611971565b828652610fb283611a55565b93610fc486880195601f1901866124f4565b5f5b84811061102857604080518881528951818a018190525f92600582901b83018101918a918c9085015b828710610ffc5785850386f35b909192938280611018600193603f198a82030186528851611d4d565b9601920196019592919092610fef565b806110778861107161104460019560059d9c9d1b87018761246f565b929089846040519586938585013782018381015f81528b519283915e015f83820152038084520182611971565b30613f13565b611081828a611dbe565b5261108c8189611dbe565b5001969596610fc6565b34610321576003196040368201126103215760043567ffffffffffffffff8082116103215760c08260040193833603011261032157602435908111610321576110e3903690600401611cd0565b906110ec612bf0565b61111d61111861111361110c611102888061245a565b604081019061246f565b3691611993565b613e95565b613efe565b801561139b5760011015611389576024830161113981866124a2565b90501561137757604484019461114f86826124a2565b905015611365576111b561117d966111a961117461116d858061245a565b95856124a2565b999092856124a2565b91909261119a60405197611190896118a1565b33895236906119f7565b9a60209b8c8901523691611a6d565b60408601523691611a6d565b6060830152606485013560808301526111cd82612c32565b91825f525f875260405f20958654159687611211575b888860017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055604051908152f35b6001905560a46001600160a01b03917f87491344dfbcf91f6cbbc610cbbeedc85313d37a02df0c93527f7ea5f8db717f83855116604051908152878c82015260606040820152806112656060820188611e19565b0390a10191611274838561246f565b90506112b9575b505050506112ad92916103066102ef61030e933390919060405192600284526020840152604083015260608201604052565b828080808080806111e3565b6112c661110c848661246f565b6112cf816145d0565b156113425750937fd46c2c56b35c8210e9e712ec3f02242d5fc90187c0ac8ed80cc33626846ec369896112ad989795611335611318610306976102ef9761030e9b51169361246f565b866040519586958652850152606060408501526060840191612388565b0390a1938395965061127b565b89610597604051928392630c89984b60e31b845260048401526024830190611d4d565b60405163540e5f0b60e01b8152600490fd5b604051636c44ef8f60e01b8152600490fd5b604051633c8270bd60e21b8152600490fd5b604051632cff108b60e21b8152600490fd5b3461032157602080600319360112610321576024816001600160a01b036113d2611861565b16604051928380926370a0823160e01b82523060048301525afa908115610441575f91611403575b50604051908152f35b90508181813d8311611429575b61141a8183611971565b810103126103215751826113fa565b503d611410565b346103215761143e36611d01565b929161144b949194612bf0565b611456838333613b61565b61145f816134d6565b15611583578160ff916114778561153a969533612a60565b6114818183613543565b1561157d575080935b61149685828533613b95565b917f8045c25080b0868951141ed0a91720bcad09a8364a2b3109ee1fd49c1f0bc8b860c06114c5898833613bf3565b97906001600160a01b0360405192338452169a8b6020840152856040840152886060840152608083015260a0820152a16040519660068852602088015260408701526060860152608085015260a08401521660c082015260e08101604052906040519160018352602083015260408201604052565b90806115665760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b6115759261030e9136916123a8565b8080806104e6565b9361148a565b50604051623a3a4d60e21b81523360048201526001600160a01b039190911660248201526044810191909152606490fd5b34610321576080366003190112610321576004356001600160a01b0390818116809103610321576115e3611877565b6044359167ffffffffffffffff91606435838111610321573660238201121561032157806004013593841161032157366024858301011161032157611670956020921693611632868587613a82565b60405196879283926323e30c8b60e01b84523360048501528760248501528860448501525f606485015260a06084850152602460a485019201612388565b03815f855af1938415610441575f946116dc575b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd984036116c3576116b893503091613afb565b602060405160018152f35b604051630b6c58a960e31b815260048101859052602490fd5b9093506020813d602011611708575b816116f860209383611971565b8101031261032157519284611684565b3d91506116eb565b34610321576101403660031901126103215767ffffffffffffffff60043581811161032157611743903690600401611b02565b6024358281116103215761175b903690600401611b02565b60c0366043190112610321576101043583811161032157611780903690600401611cb5565b90610124359384116103215761179d6104e6943690600401611cb5565b926117a6612bf0565b611eca565b346103215760603660031901126103215760206117da6117c9611861565b6117d1611877565b60443591612a60565b604051908152f35b34610321576020366003190112610321576004355f525f6020526020600160405f205414604051908152f35b34610321576020366003190112610321576004359063ffffffff60e01b82168092036103215760209163e414309160e01b8114908115611850575b5015158152f35b6301ffc9a760e01b14905083611849565b600435906001600160a01b038216820361032157565b602435906001600160a01b038216820361032157565b35906001600160a01b038216820361032157565b60a0810190811067ffffffffffffffff8211176118bd57604052565b634e487b7160e01b5f52604160045260245ffd5b6060810190811067ffffffffffffffff8211176118bd57604052565b6040810190811067ffffffffffffffff8211176118bd57604052565b6080810190811067ffffffffffffffff8211176118bd57604052565b67ffffffffffffffff81116118bd57604052565b60e0810190811067ffffffffffffffff8211176118bd57604052565b6020810190811067ffffffffffffffff8211176118bd57604052565b90601f8019910116810190811067ffffffffffffffff8211176118bd57604052565b92919267ffffffffffffffff82116118bd57604051916119bd601f8201601f191660200184611971565b829481845281830111610321578281602093845f960137010152565b9080601f83011215610321578160206119f493359101611993565b90565b91906060838203126103215760405190611a10826118d1565b8193611a1b8161188d565b8352611a296020820161188d565b602084015260408101359167ffffffffffffffff831161032157604092611a5092016119d9565b910152565b67ffffffffffffffff81116118bd5760051b60200190565b929192611a7982611a55565b604092611a896040519283611971565b819581835260208093019160061b84019381851161032157915b848310611ab257505050505050565b8583830312610321578386918251611ac9816118ed565b611ad28661188d565b81528286013583820152815201920191611aa3565b9080601f83011215610321578160206119f493359101611a6d565b91909160a0818403126103215760405190611b1c826118a1565b8193611b278261188d565b835267ffffffffffffffff9160208101358381116103215782611b4b9183016119f7565b602085015260408101358381116103215782611b68918301611ae7565b6040850152606081013592831161032157611b896080939284938301611ae7565b60608501520135910152565b90929192611ba281611a55565b91604094611bb36040519485611971565b839583855260208095019160059460051b8401948186116103215784935b868510611be2575050505050505050565b67ffffffffffffffff90853582811161032157870190608082860312610321578551611c0d81611909565b611c168361188d565b81528a8301358b8201528683013584811161032157830186601f8201121561032157803590611c4482611a55565b91611c518a519384611971565b8083528d80840191891b83010191898311610321578e809101915b838310611ca557505050508782015260608084013594851161032157611c96878d968796016119d9565b90820152815201940193611bd1565b82358152918101918f9101611c6c565b9080601f83011215610321578160206119f493359101611b95565b9181601f840112156103215782359167ffffffffffffffff8311610321576020808501948460051b01011161032157565b906080600319830112610321576004356001600160a01b0381168103610321579160243591604435916064359067ffffffffffffffff821161032157611d4991600401611cd0565b9091565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b805115610d4a5760200190565b805160011015610d4a5760400190565b805160021015610d4a5760600190565b805160031015610d4a5760800190565b805160041015610d4a5760a00190565b8051821015610d4a5760209160051b010190565b9081518082526020808093019301915f5b828110611df1575050505090565b835180516001600160a01b031686528201518583015260409094019392810192600101611de3565b90608080611e8f611e7d611e6b60406001600160a01b0380895116885260208901519060a060208a01528082511660a08a015260208201511660c08901520151606060e0880152610100870190611d4d565b60408701518682036040880152611dd2565b60608601518582036060870152611dd2565b93015191015290565b90611ea282611a55565b611eaf6040519182611971565b8281528092611ec0601f1991611a55565b0190602036910137565b926001600160a01b038451166001600160a01b0383511614612376576001600160a01b03611eff606086015160643590611dbe565b515116906040830151916001600160a01b03611f1e6084358095611dbe565b51511614801590612336575b610d04576040850151906001600160a01b03611f496044358094611dbe565b5151166001600160a01b03611f6460643560608a0151611dbe565b5151161461232457611f7586612c32565b805f525f60205260405f2054156122d15750611f9084612c32565b805f525f60205260405f20541561227d5750612075929161204d917f6fa7f4c28634b0a9d6831401c45ae468195fb63aed07308935c35374ff5d9e3960405180611ff8611fea61012033845280602085015283018d611e19565b82810360408401528a611e19565b85606083015260643560808301528760a083015260a43560c083015260c43560e083015260e4356101008301520390a16001600160a01b038651166040519261204084611955565b5f8452606435908a612e9c565b9490506001600160a01b038651166040519261206884611955565b5f845260a4359086612e9c565b92905061208560408201516134d6565b158015612269575b8015612256575b8015612243575b61223157604051916120ac83611909565b5f83525f60208401525f60408401525f60608401526120cb84836144e1565b845260408401526120f16120df83866144e1565b6020860152806060860152845161356a565b94612105602085015160408601519061356a565b9361210f87613520565b8015612222575b612210576121d7612209957fd9fa84dd790c969daa5c33d8050dc06b4a9b59d5b42e2be5f5e8ae20447f618d946121b961220e9a60a0966121588a8851613594565b6121668c6020890151613594565b6121748a60408901516135f2565b6121828c60608901516135f2565b61218b8a61371d565b6121948c61371d565b6001600160a01b036121b060c435926060606435910151611dbe565b515116336137bd565b50506001600160a01b036121b060e43592606060a435910151611dbe565b5050606060405191338352805160208401526020810151604084015260408101518284015201516080820152a16138a9565b6138a9565b565b604051630d86822160e01b8152600490fd5b5061222c85613520565b612116565b6040516321badf1f60e01b8152600490fd5b506122516060840151613520565b61209b565b506122646060820151613520565b612094565b5061227760408401516134d6565b1561208d565b9351604080513381526001600160a01b039092166020830152810194909452507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f3945091925082915050606081015b0390a1565b9551604080513381526001600160a01b039092166020830152810196909652507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f3949350839250506060820190506122cc565b604051631cd2f1c760e21b8152600490fd5b506001600160a01b03612350606085015160a43590611dbe565b5151166001600160a01b0361236c604088015160443590611dbe565b5151161415611f2a565b604051630a98f1f360e21b8152600490fd5b908060209392818452848401375f828201840152601f01601f1916010190565b909291926123b581611a55565b916040916123c66040519485611971565b839581855260208095019160051b8301938185116103215783925b8584106123f15750505050505050565b67ffffffffffffffff90843582811161032157860190838286031261032157835161241b816118ed565b823584811161032157866124309185016119f7565b8152898301359384116103215761244b868b95869501611cb5565b838201528152019301926123e1565b903590605e1981360301821215610321570190565b903590601e1981360301821215610321570180359067ffffffffffffffff82116103215760200191813603831361032157565b903590601e1981360301821215610321570180359067ffffffffffffffff821161032157602001918160061b3603831361032157565b5f5b608081106124e6575050565b6060828201526020016124da565b5f5b82811061250257505050565b6060828201526020016124f6565b903590601e1981360301821215610321570180359067ffffffffffffffff821161032157602001918160051b3603831361032157565b60405190612553826118d1565b60606040835f81525f60208201520152565b60405190612572826118a1565b5f608083828152612581612546565b6020820152606060408201526060808201520152565b9015610d4a57803590607e1981360301821215610321570190565b903590609e1981360301821215610321570190565b9190811015610d4a5760061b0190565b356001600160a01b03811681036103215790565b3580151581036103215790565b9081518082526020808093019301915f5b828110612617575050505090565b835185529381019392810192600101612609565b9061264361014461263c84806125b2565b3690611b02565b5f5260205f81526040926001845f2054036129d057916128c5916126ca85855f61284a6126738361268a9a6125b2565b61268f878501359182878701359c8d923690611b02565b613fa4565b6126a761269c85806125b2565b946060810190612510565b96906126c28751966126b888611955565b8688523690611b02565b973691611b95565b906126d3612c63565b506127fa8651916126e3836118a1565b600483526126f28a84016124d8565b886126fc81612c32565b988b6001600160a01b039a8b84511690835192600384528301528282015233606082015260808101825261272f86611d71565b5261273985611d71565b508051612745816118d1565b6002815281368e83013761275886611d7e565b5261276285611d7e565b50810160ff8c6127c56127ae8d806127878161277f8b8a51611dbe565b515116614172565b97511690612796898851611dbe565b515116846127a58a8951611dbe565b51015191612a60565b958d6127bb828751611dbe565b5151169451611dbe565b51015192169093929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b61280382611d8e565b5261280d81611d8e565b506128318b886060810160ff8c6127c56127ae8d806127878161277f8b8a51611dbe565b61283a82611d9e565b5261284481611d9e565b50614250565b918385511693868601918b83519289818551169401511693878652308a5281808720915101519082519261287d84611955565b878452519561288b87611939565b86528a8601528d85015284606085015285608085015260a084015260c08301528a5180809a819463d04dfe2360e01b835260048301612de4565b03915afa95865f915f986129aa575b506128e35788513d5f823e3d90fd5b95938651600281106129935750888798998260c0979899015199015161291161290b85611dae565b51611d9e565b5161291c8183613543565b156129895750998a925b6129488b85919060405192600284526020840152604083015260608201604052565b61295186611d8e565b5261295b85611d8e565b5082519661296888611939565b8752860152840152866060840152608083015260a082015201526001929190565b9050998a92612926565b6024908a5190630fbb8e5560e21b82526004820152fd5b9097506129c991503d805f833e6129c18183611971565b810190612ca0565b965f6128d4565b505f92508291829150565b9035601e198236030181121561032157016020813591019167ffffffffffffffff8211610321578160061b3603831361032157565b9190808252602080920192915f905b828210612a2d575050505090565b909192936001906001600160a01b03612a458761188d565b16815285830135838201526040908101950193920190612a1f565b8215612a95576001600160a01b038091165f52600160205260405f2091165f5260205260405f20905f5260205260405f205490565b909150612aa182614172565b6001600160a01b03809316906040918251946370a0823160e01b86528416938460048701526020928387602481865afa968715612bb7575f97612bc1575b5083612af8612af183612b289a614f36565b50906149f8565b508651636eb1769f60e11b81526001600160a01b0390941660048501523060248501529297889081906044820190565b0381865afa968715612bb7575f97612b86575b50612af1612b4c916119f498614f36565b50612b578183613543565b15612b7e5750935b5f5260018252825f20905f528152815f20905f8052525f20549061407d565b905093612b5f565b96508387813d8311612bb0575b612b9d8183611971565b8101031261032157955195612af1612b3b565b503d612b93565b85513d5f823e3d90fd5b96508387813d8311612be9575b612bd88183611971565b810103126103215795519583612adf565b503d612bce565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f006002815414612c205760029055565b604051633ee5aeb560e01b8152600490fd5b604051612c5d81612c4f6020820194602086526040830190611e19565b03601f198101835282611971565b51902090565b60405190612c7082611939565b606060c083612c7d612565565b81525f60208201525f60408201525f838201528260808201525f60a08201520152565b919060408382031261032157825167ffffffffffffffff908181116103215784019082601f83011215610321578151602092612cdb82611a55565b91612ce96040519384611971565b808352848084019160051b830101918683116103215785809101915b838310612d785750505050948281015191821161032157019180601f84011215610321578251612d3481611a55565b93612d426040519586611971565b818552838086019260051b820101928311610321578301905b828210612d69575050505090565b81518152908301908301612d5b565b8251815291810191869101612d05565b90808251908181526020809101926020808460051b8301019501935f915b848310612db65750505050505090565b9091929394958480612dd4600193601f198682030187528a516125f8565b9801930193019194939290612da6565b91906020928381526001600160a01b0382511684820152838201516040820152612e1e604083015160e06060840152610100830190611d4d565b9060608301516080820152612e45608084015192601f1993848483030160a0850152612d88565b9260a081015193838382030160c08401528680865192838152019501905f5b818110612e88575050506119f494955060c060e091015192828503019101526125f8565b825187529588019591880191600101612e64565b94959395929192612eab612c63565b50604096875190612ebb826118a1565b60048252602093612ecd8584016124d8565b612ed689612c32565b6001600160a01b038097818c51168d519360038552898501528d840152166060820152608081018b52612f0884611d71565b52612f1283611d71565b508951612f1e816118d1565b600281528a3687830137612f3184611d7e565b52612f3b83611d7e565b50898901908681835190612f4e91611dbe565b515116612f5a90614172565b86888c51168984865190612f6d91611dbe565b5151168285875190612f7e91611dbe565b51015190612f8b92612a60565b928981865190612f9a91611dbe565b515116945190612fa991611dbe565b5101519060ff16612fe1929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b612fea83611d8e565b52612ff482611d8e565b5060608801858782519061300791611dbe565b51511661301390614172565b868a5116878984519061302591611dbe565b515116878a85519061303691611dbe565b5101519061304392612a60565b908689898186519061305491611dbe565b51511694519061306391611dbe565b5101519060ff1661309b929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b6130a483611d9e565b526130ae82611d9e565b506130b891614250565b9183875116938188019283519183818451169301511693865f523084528a805f20915101518b51916130e983611955565b5f83528c51966130f888611939565b8752858701528b8601525f60608601526080850186905260a085015260c0840152885163d04dfe2360e01b815292839081906131379060048301612de4565b03815a935f94fa91825f915f94613216575b506131585788513d5f823e3d90fd5b979495969791948251966002881097886131ff5750818385015194015161318161290b87611dae565b5161318c8183613543565b156131f75750925b6131b68585919060405192600284526020840152604083015260608201604052565b6131bf87611d8e565b526131c986611d8e565b5082519a6131d68c611939565b8b528a01528801526060870152608086015260a085015260c0840152159190565b905092613194565b602490835190630fbb8e5560e21b82526004820152fd5b90935061322d91503d805f833e6129c18183611971565b925f613149565b95949193908693613243612c63565b505f92604061335e815192613257846118a1565b600484526020936132698582016124d8565b6133276132758b612c32565b8b6001600160a01b03998a9283835116895191600383528b830152898201528360609b168b8201526080810189526132ac86611d71565b526132b685611d71565b5087516132c2816118d1565b6002815288368b8301376132d586611d7e565b526132df85611d7e565b5060ff896127c58a85019361331b876132fd8161277f858a51611dbe565b9751168861330c848951611dbe565b515116856127a5858a51611dbe565b966127bb828751611dbe565b61333082611d8e565b5261333a81611d8e565b50612831878b8d60ff896127c58c85019361331b876132fd8161277f858a51611dbe565b946133de5f868a511698869786889c0191825191888184511693015116928c8552308952878086209151015188519161339683611955565b8683528951956133a587611939565b86528a86015288850152848a8501528b608085015260a084015260c08301528551808095819463d04dfe2360e01b835260048301612de4565b03915afa90815f915f936134b8575b506134ab575050505f975b6002855110988915996134985782848701519601519061341a61290b89611dae565b51906134268284613543565b1590506134905750925b6134528685919060405192600284526020840152604083015260608201604052565b61345b88611d8e565b5261346587611d8e565b5082519b6134728d611939565b8c528b0152890152870152608086015260a085015260c08401529190565b905092613430565b50505050505050505091506119f4612c63565b91999850945093966133f8565b9092506134cf91503d805f833e6129c18183611971565b915f6133ed565b6134f5905f60e01d906001600160e01b038160e01d9116601b0b614fed565b1290565b906134f5916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b61506e565b61353f905f60e01d906001600160e01b038160e01d9116601b0b614fed565b1390565b9061353f916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b61506e565b6119f491610af4916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614544565b6135ee9160808101826135b06135aa8351611dae565b51611dae565b526135e76135e16001600160a01b038094515116936135d86135d28551611dae565b51611d71565b51169251611dae565b51611d8e565b5191613b95565b5050565b906080810191806136066135aa8551611d9e565b526001600160a01b038092515116916136226135d28551611d9e565b51166136316135e18551611d9e565b5190816136e55761364183613520565b6136cc579183917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a95936122cc955f5260209060018252613697604094855f20835f528452855f20855f528452855f205461407d565b945f5260018252835f20905f528152825f20915f52525f20555b51604051918291338352604060208401526040830190612d88565b60405163793a8f5560e01b815260048101849052602490fd5b91613716917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a95936122cc956137bd565b50506136b1565b6080810161372e6135e18251611d9e565b5191821561373b57505050565b6137556135d26001600160a01b0380935151169351611d9e565b5116815f5260209160018352604092835f20835f528152835f20855f528152835f2054936001600160e01b038516613790575b505050505050565b6137b4955f9284845260018152828420868552815282842091845252812055613bf3565b5f808080613788565b939291936137ca83613520565b6136cc57846137e6576137de939450613bf3565b50505f905f90565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f528152613823835f2054948561407d565b9561382d87613520565b613850575f97885260018252838820908852815282872091875252909320829055565b835163c5e12af560e01b815260048101889052602490fd5b90604082019082526020606081936040838201528551809452019301915f5b828110613895575050505090565b835185529381019392810192600101613887565b60c0810151908151915f92613a1d575b5061395e6020918281510151926001600160a01b039081818187511696015116928660a082019485518252308452604097888320898686510151015160808601518b519161390683611955565b8683528c519361391585611955565b8785528d519661392488611939565b8752898701528c86015260016060860152608085015260a084015260c08301528851808099819463d04dfe2360e01b835260048301612de4565b03915afa948515613a135787956139f5575b508451613981575b50505050505050565b81905101510151169051813b156139f1579184918493836139b6965180978195829463012c676d60e21b845260048401613868565b03925af19081156139e857506139d1575b8080808080613978565b6139db8291611925565b6139e557806139c7565b80fd5b513d84823e3d90fd5b8480fd5b613a0a9195503d8089833e6129c18183611971565b9050935f613970565b86513d89823e3d90fd5b6001600160a01b03602080845101510151169060a083015190823b1561032157613a60925f928360405180968195829463012c676d60e21b845260048401613868565b03925af1801561044157156138b957613a7a919250611925565b5f905f6138b9565b6040519263a9059cbb60e01b5f526001600160a01b0380931660045260245260205f60448180855af160015f5114811615613adc575b8360405215613ac657505050565b635274afe760e01b835216600482015260249150fd5b6001811516613af257813b15153d151616613ab8565b833d5f823e3d90fd5b9092604051936323b872dd60e01b5f526001600160a01b0393848092166004521660245260445260205f60648180855af160015f5114811615613b4b575b836040525f60605215613ac657505050565b6001811516613af257813b15153d151616613b39565b909115613b6c575050565b6040516305dbdfd960e41b81526001600160a01b03918216600482015291166024820152604490fd5b93929193613ba283613520565b6136cc5784613bb6576137de9394506140a7565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f528152613823835f2054948561356a565b90929192613c0081614573565b93613c0a81613520565b613c535784816001600160e01b03613c299360e01d9116601b0b615198565b50809281613c39575b5050509190565b6001600160a01b03613c4b9316613a82565b5f8181613c32565b604051632d1671a360e11b8152600490fd5b916040805191613c74836118a1565b60048084526020613c868186016124d8565b5f5b8751811015613cbb5780613c9e6001928a611dbe565b51613ca98289611dbe565b52613cb48188611dbe565b5001613c88565b5092955092939093335f52308352855f2091865190613cd9826118ed565b613ce1612546565b8252606085819301528751613cf581611955565b5f8152885191613d0483611955565b5f83525f3681375f5b8151811015613e6a57613d208183611dbe565b5190888c8b84519189818401518d8d8251613d48575b50505050505050506001915001613d0d565b5f613db797948197948c9794613d758c956001600160a01b039d8e81818d51169c0151169b015190614250565b94865199613d828b611939565b8a528901528488015286015260808501528a60a08501528b60c08501525180958194829363d04dfe2360e01b84528301612de4565b03915afa938415613e60578b915f95613e42575b508451613de0575b50908b8e89838d8d613d36565b51015116803b1561032157613e0f925f918c8f84905180978195829463012c676d60e21b845233908401613868565b03925af1918215613e3857600192613e29575b8981613dd3565b613e3290611925565b5f613e22565b8c513d5f823e3d90fd5b613e579195503d805f833e6129c18183611971565b9050935f613dcb565b8e513d5f823e3d90fd5b5050505050505050509050565b8115613e81570490565b634e487b7160e01b5f52601260045260245ffd5b6040815110613ef1576020810151908051603f198101908111613edd5760051c8211613ec95760016020920160051b010190565b5050604051613ed781611955565b5f815290565b634e487b7160e01b5f52601160045260245ffd5b50604051613ed781611955565b805115613f0e57602001515f1a90565b505f90565b905f8091602081519101845af48080613f91575b15613f475750506040513d81523d5f602083013e60203d82010160405290565b15613f6e57604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b3d15613f7f576040513d5f823e3d90fd5b60405163d6bda27560e01b8152600490fd5b503d151580613f275750813b1515613f27565b91613fcf906060613fc4936001600160a01b039485916040880151611dbe565b515116940151611dbe565b5151161461232457565b6140006001600160e01b0392838316601b0b9260e01d938160e01d9116601b0b84846147af565b90637ffffff58213614050575b90614017916149f8565b9290921580614048575b61402a57505090565b6044925060405191638eba4d0760e01b835260048301526024820152fd5b508215614021565b61405a82826156c1565b1561400d57604483856040519163d556b11160e01b835260048301526024820152fd5b6119f491610af4916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614d9d565b9291926140b382614573565b936140bd81613520565b61411e5784816001600160e01b036140dc9360e01d9116601b0b615198565b9290809315614109575b508290816140f5575050509190565b613c4b926001600160a01b03309216613afb565b9092505f198114613edd57600101915f6140e6565b604051632eaefac360e21b8152600490fd5b6004111561413a57565b634e487b7160e01b5f52602160045260245ffd5b602090939291936001600160a01b03604082019516815261416e83614130565b0152565b61417a6156da565b60408051630782d7e160e01b81526001600160a01b03831660048201529091828260248173200e12d10bb0c5e4a17e7018f0f1161919bb93895afa928315614247575f925f94614212575b506141cf83614130565b600183141580614200575b6141e45750505090565b5163ee07877f60e01b815291829161059791906004840161414e565b5061420a83614130565b8215156141da565b908094506142369293503d8511614240575b61422e8183611971565b810190614f0c565b919091925f6141c5565b503d614224565b513d5f823e3d90fd5b61425a8251611e98565b6142648351611e98565b9282519281518015155f146144d957600201935b6001940184019061428882611a55565b956142a360409361429b8551998a611971565b808952611a55565b6142b5602091601f1901828a016124f4565b5f9584519389896002926002885233868901523089890152606097606081018a526142df84611d71565b526142e983611d71565b505f825b614499575b505050508651614309575b50505050505050505090565b9091929360028861432c8c866143258e809c9d9e018093611dbe565b528d611dbe565b500185614339828d611dbe565b52614344818c611dbe565b505f965b614353575b506142fd565b8851871015614494576001600160a01b036143ff898b856143f68c60428c8861437c8488611dbe565b51511696858261438c868a611dbe565b5101519261439a868a611dbe565b51838d82511691015182815160051b910120908451927f6ec4dff745ec96dbde88c5d41f8aa5ac13aa1664afb47b8406b44fa945a650c88452830152838201522090519161190160f01b83528d83015260228201522093611dbe565b51015191614f64565b1561447c578761446b8b8e8c8f9e9d9c9b9a999897968f614458918d61444e898f8f61443a83889f614431828f611dbe565b51511692611dbe565b52614445828b611dbe565b51015192611dbe565b52019c8d94611dbe565b5101516144658383611dbe565b52611dbe565b500196979895909192939495614348565b8851630a57f30960e31b815260048101899052602490fd5b61434d565b9091929a82518210156144d157906144c584809301809d6144ba8487611dbe565b516144658383611dbe565b50019082918d936142ed565b9a92916142f2565b505f93614278565b916040830192604061451b610af4606087519401938451906001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6145f4565b9451930161452a8151866134f9565b614532575050565b9093506119f491925051925183613fd9565b919291600160ff1b840161455c57611d4993506150c3565b90611d49935f0391614d9d565b61401782826149f8565b61457b6156da565b6040805163b7bad1b160e01b81526001600160a01b0383166004820152909182826024815f73200e12d10bb0c5e4a17e7018f0f1161919bb93895af1928315614247575f925f9461421257506141cf83614130565b6008815110613f0e576008015167ffffffffffffffff1667ff0a89c674ee78741490565b9091939284158215175f1461460e5750505090505f905f90565b82810192600160fd1b8082019083011760fe1c614745575b505061463181615386565b9361463b81615386565b9461464686826153a6565b90918215614736575f9083986f0785ee10d5da46d900f436a000000000808611614728575b50670de0b6b3a7640000808b11614719575b50633b9aca00808b1161470a575b50612710808b116146fc575b5098805b6146eb57508190611d49989982600a0a9109960195817fcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccd0a93838211900382610100031b9203901c1702916153b9565b60019290920191600a90048061469b565b60049a04998a930192614697565b600991939a049901915f61468b565b601291939a049901915f61467d565b85049950602592505f61466b565b50929050611d499495506153b9565b5f8212156147995780841361478b575b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb284131561462657909250611d499394916152c4565b909250611d4993949161532b565b8084121561475557909250611d499394916152c4565b929091806147d5576044848460405191637a97930f60e01b835260048301526024820152fd5b90919280155f146147ea57505050505f905f90565b614803936147f791615473565b92919490938492615473565b909391928461481188615386565b9161481b86615386565b947f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000094604c918688106149c2575b030191600160ff1b98838a018112155f1461498f575050035b5f955f821280614986575b614968575b5f811280614956575b6149385786820103966001600160ff1b038814908161492e575b5080614925575b8061491c575b6148fe5750906148b2929161561f565b915f81136148c5575b50611d49936153b9565b9091604c82136148f3576148dc91600a0a90613e77565b9081156148e9575f6148bb565b505050505f905f90565b50505050505f905f90565b876044916040519163d556b11160e01b835260048301526024820152fd5b505f85126148a2565b5082841461489c565b905088145f614895565b604489836040519163d556b11160e01b835260048301526024820152fd5b50806001600160ff1b0301821361487b565b95508087018613156149805786818703015b95614872565b5f61497a565b505f811361486d565b89985090920390506001600160ff1b03819003870182136149b35701860194614862565b5050505050505050505f905f90565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009650604b9250614849565b8115613e81570590565b8082601b82810b8314614bed577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000008405614b99575b8380820b03614b8857507b199999999999999999999999999999999999999999999999999999987b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc84011115614b39575b838060030b03614abd575b808413614aa15750506001600160e01b036001925b60e01b91161791565b8303600a0a8015613e81576001600160e01b0391071592614a98565b92915f841315614b0d575090614ad383836156c1565b614aef57637ffffffe1901600a0a810290637fffffff92614a83565b506044916040519163d556b11160e01b835260048301526024820152fd5b637fffffff1992830390604382136148f357614b2c91600a0a906149ee565b9182156148e95792614a83565b5f198401808060030b14614b4d5750614a78565b90506001600160e01b039293507b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff915060e01b9260ff1d181617905f90565b600190940193600a90930592614a2b565b937f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000840515614bda576305f5e100600894058094819201955b915050614a2b565b620186a060059405809481920195614bd2565b5082614a7857505050505f90600190565b919291600160ff1b9190801580614d8b575090614c1a91615473565b9490929091905f868585858282138015614d82575b614d65575b505050508682841860ff1c94860391039081604c038111614d4a5701600a0a808205919084614d30575b505081019182821860ff1c1115614d2857826001600160ff1b0314614d0a57905f600192135f14614cdb57600a9004915b01925b81158117614c9f57509190565b80614cb8575b508015614cb0579190565b505f91508190565b9192614cce9203600160ff1b01600a0a906149ee565b600160ff1b91905f614ca5565b600a60037fe6666666666666666666666666666666666666666666666666666666666666679201040191614c8f565b604490836040519163d556b11160e01b835260048301526024820152fd5b509092614c92565b8107614d3d575b80614c5e565b60ff1d600117015f614d37565b505050919350614d58579190565b60018160ff1d1790039190565b5f9a50909750909550600160ff1b94509250905086808080614c34565b50835f12614c2f565b15614d965750509190565b9350919050565b9392919384158115818117614eee57505090614db891615473565b9194908295614dc982958294615473565b8096929491969387868482138015614ee5575b614ecc575b5050505050508682841860ff1c94860391039081604c038111614d4a5701600a0a808205919084614eb2575b505081019182821860ff1c1115614eaa57826001600160ff1b0314614d0a57905f600192135f14614e7b57600a9004915b01925b81158117614e4e57509190565b80614e5e57508015614cb0579190565b600160ff1b93614e759291038401600a0a906149ee565b5f614ca5565b600a60037fe6666666666666666666666666666666666666666666666666666666666666679201040191614e3e565b509092614e41565b8107614ebf575b80614e0d565b60ff1d600117015f614eb9565b929b5098509196509450925090505f8080808080614de1565b50858412614ddc565b9395939092919015614f04575050614cb0579190565b945092915050565b919082604091031261032157815160048110156103215760209092015160ff811681036103215790565b9060ff165f03916001600160ff1b0382115f14614f5c57600a6001818404940192061590565b909190600190565b9091813b614f9f57614f769192615743565b50614f8081614130565b159182614f8c57505090565b6001600160a01b03918216911614919050565b6020918160645f935160405192630b135d3f60e11b9788855260048501526040602485015286820190604485015e8281018201859052601f01601f191601915afa905f5114601f3d11161690565b92915f9060018184145f87128715171717615067575f92808213615059575b03604c81135f82121761504d57600a0a908461502b83820293846149ee565b146150405750501561503c575f9190565b5f90565b90935090156119f4579190565b50501561503c575f9190565b5f956001945092509061500c565b5050505f90565b93929190918083145f83125f871218831587151717176150bd575f928082136150b05703604c81135f82121761504d57600a0a908461502b83820293846149ee565b919460019350919061500c565b50919050565b909291600160ff1b91828101615155575080841461514b57808413918215615143578185035b604c8111156151325750505f915b1561512357507f8000000000000000000000000000000000000000000000000000000000000001019190565b92506001600160ff1b03039190565b600a0a908115613e815704916150f7565b8482036150e9565b505090505f905f90565b9361516292945f03614bfe565b80939180928114615176575b50505f039190565b915092506001600160ff1b038314614d0a57600a600191059201915f8061516e565b91925f8312156151c0576044838360405191634a7d166b60e01b835260048301526024820152fd5b9192836151d257505090505f90600190565b60ff811682019180831261529a575f83121561520a575050604c198112614cb0575f03600a0a916152038382613e77565b9283021490565b909293915f81135f1461529057604d811361526557600a0a928315613e8157835f1904831161523c5750500290600190565b60405163c849483b60e01b815260048101849052602481019290925260ff166044820152606490fd5b5060405163c849483b60e01b81526004810192909252602482015260ff919091166044820152606490fd5b5050905090600190565b60405163c849483b60e01b815260048101869052602481019190915260ff82166044820152606490fd5b909392915f6152d49181846145f4565b9490945f8483019182019412159081615321575b8115615317575b506152f957505090565b604492506040519163d556b11160e01b835260048301526024820152fd5b905083125f6152ef565b82811291506152e8565b61534093600160fe1b908101939201906145f4565b9081815f821215615377575050604b1982126137de57615365915f03600a0a906149ee565b908161536f575f90565b600160ff1b90565b93600160ff1b90910192509050565b5f8112156119f457600160ff1b9080820361539f575090565b90505f0390565b905f198183099102908180821091030391565b92939291905f818418121561544e576001600160ff1b03928383111561543857600160ff1b938385036153ee57505050509190565b90919293508514615408575050600a600191045f03920190565b604051630ed8062160e21b8152600481019190915260248101919091526044810182905260648101849052608490fd5b5090915050600160ff1b8114613edd575f039190565b90916001600160ff1b0380841115613c32578514615408575050600a60019104920190565b919091801561561557827f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000080830515615523575b507f19999999999999999999999999999999999999999999999999999999999999997f0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc830110615514575b83136154fe5791905f90565b919060018060ff1b926001600160ff1b03030190565b9290600a02905f1901926154f2565b6f4b3b4ca85a86c47a098a22400000000080840515615603575b507728c87cb5c89a2571ebfdcb54864ada834a000000000000008305156155ec575b7b097edd871cfda3a5697758bf0e3cbb5ac5741c6400000000000000008305156155d8575b7e3899162693736ac531a5a58f1fbb4b746504382ca7e40000000000000000008305156155c8578205156155b9575b5f6154a7565b9290600a02905f1901926155b3565b9391606402916001190193615584565b93916402540be40002916009190193615584565b9391678ac7230489e800000291601219019361555f565b6025198301955092909202915f61553d565b505f915081908190565b90915f19838309928083029283808610950394808603958487101561569d5714615695579082910960018219018216809204600280826003021880830282030280830282030280830282030280830282030280830282030280920290030293600183805f03040190848311900302920304170290565b505091500490565b60648386866040519263362ced0960e11b8452600484015260248301526044820152fd5b6119f491905f8112156156d5575f0361577d565b61577d565b73200e12d10bb0c5e4a17e7018f0f1161919bb9389803b158015615718575b6157005750565b602490604051906373e6d7b360e01b82526004820152fd5b507f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d41813f14156156f9565b81519190604183036157735761576c9250602082015190606060408401519301515f1a9061580c565b9192909190565b50505f9160029190565b90637ffffff581131561580657637ffffffe19810190604382136157ff575f8212156157d357637fffffff91505f0301600a0a7b8000000000000000000000000000000000000000000000000000000202111590565b50600a0a8015613e81577b80000000000000000000000000000000000000000000000000000001041090565b5050151590565b50505f90565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411615883579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa15610441575f516001600160a01b0381161561587957905f905f90565b505f906001905f90565b5050505f916003919056"; + hex"6080806040523460395760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055615b84908161003e8239f35b5f80fdfe6080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a7146117d1575080632cb77e9f146117a557806341d1514f1461176e5780635343c1b7146116d35780635cffe9de146115775780635d003c44146113e3578063613255ab14611360578063687cf02a14611070578063ac9650d814610f22578063b0460f07146105cd578063b845b83e14610575578063ca9109ba14610400578063d9d98ce41461034f578063ddebc96f146102fb5763df6db3c2146100c1575f80fd5b346102d5576003196040368201126102d5576004359067ffffffffffffffff8083116102d5578260040160a0843603938401126102d5576024358281116102d557610110903690600401611c93565b90610119613236565b5f946001600160a01b03948561012e86612c8a565b1633036102d9576101476101423687611ac5565b613278565b91825f525f60205260405f2096600188541461018f575b60208960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556040519015158152f35b9091929394959697505f600198556040519133835284602084015260606040840152816101bb89611850565b16606084015260248a013590606219018112156102d55789019060a06080840152806101e960048401611850565b166101008401526101fc60248301611850565b166101208301526044810135602219823603018112156102d55701956024600488013597019287116102d55786360383136102d55760209860846102b884936102777f09d18501db0080ca2d6cd7c17fa7255daff4b2d503ea93b76ff68b6752ea8e63976102c89c6060610140890152610160880191612a3b565b6102a961029e61028a6044880185613021565b605f198a8603810160a08c01529491613056565b926064870190613021565b918784030160c0880152613056565b91013560e08301520390a16141c2565b5f8080808080808061015e565b5f80fd5b6024866102e587612c8a565b6040516335252be360e01b815291166004820152fd5b346102d5576003196020368201126102d5576004359067ffffffffffffffff82116102d55760809082360301126102d55761033a606091600401612cde565b90604051921515835260208301526040820152f35b346102d55760403660031901126102d5576001600160a01b03610370611824565b166040516370a0823160e01b8152306004820152602081602481855afa9081156103f5575f916103c3575b50156103ab5760206040515f8152f35b60249060405190633c5bf76960e21b82526004820152fd5b90506020813d6020116103ed575b816103de60209383611934565b810103126102d557518261039b565b3d91506103d1565b6040513d5f823e3d90fd5b346102d55761040e36611cc4565b8394939261041a613236565b610425848633613e0f565b61042e81613784565b15610543578061044261049192873361439d565b9590967f7f9dfa19cf1cc2f806f2f860fbc9c056b601fb1afc0e9b843dfe5c63616268e660806040513381526001600160a01b0384169a8b60208301528560408301526060820152a133613a6b565b959093826104c0575b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b610537966105319560ff936040519860068a5260208a01526040890152606088015260808701521660a08501523360c085015260e084019384604052610505856118fc565b600685526105166101008201612b8b565b61051f85611d71565b5261052984611d71565b503691612a5b565b90613f13565b8080808080808061049a565b6040516306dde9c360e41b81523360048201526001600160a01b038616602482015260448101859052606490fd5b0390fd5b346102d55760203660031901126102d55760043567ffffffffffffffff81116102d5576105316105ac61049a923690600401611c93565b91906105b6613236565b604051926105c384611918565b5f84523691612a5b565b346102d5576003196020368201126102d55767ffffffffffffffff600435116102d55760c090600435360301126102d557610606613236565b5f808061061b60048035608481019101612bc3565b905015610f1057602460043501359261063384613784565b15610efe57606080604051610647816118cc565b61064f612c18565b81525f60208201525f60408201520152610667612c18565b506106c76106c26106a161069761069161068b608460043501600435600401612bc3565b90612c4a565b80612c65565b6040810190612b55565b60206106ba61068b608460043501600435600401612bc3565b013591612c7a565b612c8a565b936001600160a01b036107166106c26106fd6106f361069161068b608460043501600435600401612bc3565b6060810190612b55565b60406106ba61068b608460043501600435600401612bc3565b816040519761072489611894565b1687521660208601526040850152610746608460043501600435600401612bc3565b9490506001604051955f87520160051b85016040525f905f5b610773608460043501600435600401612bc3565b9050811080610eeb575b15610d3857610796608460043501600435600401612bc3565b821015610d24578160051b810135607e19823603018112156102d55760808183013603126102d557604051916107cb836118cc565b8181013567ffffffffffffffff81116102d5576107ed90369084840101611ac5565b835280820160208181013590850152604080820135908501526060013567ffffffffffffffff81116102d5576108269236920101611c78565b606082015280516001600160a01b036108486040830151602085015190611d91565b5151166001600160a01b0385511614801590610cf0575b610cde5761087760208301516040840151908361429a565b61088081613278565b91825f525f60205260405f2054155f146108e4575051604080513381526001600160a01b039092166020830152810191909152600191907fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f390606090a15b0161075f565b919061091560208497959701516040850151906060860151906040519261090a84611918565b5f84523391866134e2565b5f949161097e57505051604080513381526001600160a01b03909216602083015281019190915260019291907f1e6fa9678edf81f9f25bbf308bde03ad3e110db1f429394b0915ba021532941490606090a15b8115610976575b50926108de565b90508861096f565b610993606082015160446004350135906137a7565b156109ed57505051604080513381526001600160a01b03909216602083015281019190915260019291907fe3151dc8cb7a54ffc4baabd28c1f241c94d510b5e5b502491ac3cad6c16316d59080606081015b0390a1610968565b6109fa6040820151613784565b158015610ccb575b15610a5857505051604080513381526001600160a01b03909216602083015281019190915260019291907f500b713857325f9e6dcb52ae832eca9109d107ed1aae9cb4928b4c1e13f051aa9080606081016109e5565b9250925050600196959691610a71606460043501612c9e565b15610c385796610ae197610af160408401516040880151610a9281836137f1565b15610c305750925b610aeb848592610ad4610ace60608a01516001600160e01b03601b918660e01d92828816810b928260e01d9216900b6148ea565b9061485f565b9d8e9260408d0151613818565b60408c0152614373565b99614373565b98610afc8484613842565b610b0684826138a0565b60405192338452608060208501526060610b2c8451608080880152610100870190611dec565b93602081015160a0870152604081015160c0870152015192607f198582030160e0860152835180825260208201906020808260051b8501019601925f5b828110610bc857505050505092806001979695937fbae4dbf76931c547f765e9def16d693d86daaa596f491de979008831789185ae93610bc396604084015260608301520390a180858c5101808d5260051b8c0152613b57565b610968565b9091929396602080610c23600193601f198782030189528b51906001600160a01b03825116815283820151848201526060610c126040840151608060408501526080840190612cab565b920151906060818403910152611d10565b9901950193929101610b69565b905092610a9a565b610ae190610af16060840151610aeb610c76610ace60408801516001600160e01b0394601b90868360e01d9316820b91878260e01d9216900b6148ea565b60408a0151610c8581836137f1565b15610cc35750915b829c8d916060890151908116155f14610cb4575060408801515b96879460408d0151613818565b610cbe90856142cf565b610ca7565b905091610c8d565b50610cd960608201516137ce565b610a02565b60405163936bb5ad60e01b8152600490fd5b506001600160a01b03610d0c6060830151604085015190611d91565b5151166001600160a01b03602086015116141561085f565b634e487b7160e01b5f52603260045260245ffd5b50919390610d4a606460043501612c9e565b15610ee557835b6004356004013590610d6382826137f1565b610ec75750508490610d83856001600160a01b0360208701511633613ea1565b505060a46004350190610d9b82600435600401612b22565b905015159081610ebf575b50610e1e575b506001600160a01b03610dc2929351163361439d565b50505b8351811015610dea5780610de4610dde60019387611d91565b516139cb565b01610dc5565b5060409160017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005582519182526020820152f35b90506001600160a01b03602084015116610e486001600160a01b0385511692600435600401612b22565b929091333b156102d557610e905f93604051958694859463691f9ed760e01b8652600486015260248501528960448501528a606485015260a0608485015260a4840191612a3b565b038183335af19081156103f557859115610dac579050610eb091506118e8565b5f836001600160a01b03610dac565b905088610da6565b604492506040519163573b6f4160e01b835260048301526024820152fd5b84610d51565b50610ef96040830151613784565b61077d565b60405163315f9e2360e21b8152600490fd5b604051639c95219f60e01b8152600490fd5b346102d5576020806003193601126102d55760043567ffffffffffffffff81116102d557610f54903690600401611c93565b919060405192610f6384611918565b5f8452828401610f7282611a18565b94610f806040519687611934565b828652610f8c83611a18565b93610f9e86880195601f190186612ba7565b5f5b84811061100257604080518881528951818a018190525f92600582901b83018101918a918c9085015b828710610fd65785850386f35b909192938280610ff2600193603f198a82030186528851611d10565b9601920196019592919092610fc9565b806110518861104b61101e60019560059d9c9d1b870187612b22565b929089846040519586938585013782018381015f81528b519283915e015f83820152038084520182611934565b30614209565b61105b828a611d91565b526110668189611d91565b5001969596610fa0565b346102d5576003196040368201126102d55760043567ffffffffffffffff8082116102d55760c0826004019383360301126102d5576024359081116102d5576110bd903690600401611c93565b6110c8929192613236565b6110f96110f46110ef6110e86110de8880612b0d565b6040810190612b22565b3691611956565b614144565b6141ad565b801561134e576001101561133c5760248201926111168486612b55565b90501561132a57604483019361112c8587612b55565b9050156113185761119261115a9561118661115161114a8a80612b0d565b948a612b55565b9890928a612b55565b9190926111776040519661116d88611864565b33885236906119ba565b9960209a8b8801523691611a30565b60408501523691611a30565b6060820152606484013560808201526111aa81613278565b90815f525f865260405f209485541595866111ee575b878760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055604051908152f35b6001905560a46001600160a01b03917f87491344dfbcf91f6cbbc610cbbeedc85313d37a02df0c93527f7ea5f8db717f83855116604051908152868b82015260606040820152806112426060820188611dec565b0390a10191611251838a612b22565b9050611274575b505050611267939495506141c2565b81908380808080806111c0565b6112816110e8848b612b22565b61128a816148c6565b156112f55750976112c87fd46c2c56b35c8210e9e712ec3f02242d5fc90187c0ac8ed80cc33626846ec369936112e893611267999a9b511692612b22565b92906040519384938452868c850152606060408501526060840191612a3b565b0390a18594938780611258565b88610571604051928392630c89984b60e31b845260048401526024830190611d10565b60405163540e5f0b60e01b8152600490fd5b604051636c44ef8f60e01b8152600490fd5b604051633c8270bd60e21b8152600490fd5b604051632cff108b60e21b8152600490fd5b346102d5576020806003193601126102d5576024816001600160a01b03611385611824565b16604051928380926370a0823160e01b82523060048301525afa9081156103f5575f916113b6575b50604051908152f35b90508181813d83116113dc575b6113cd8183611934565b810103126102d55751826113ad565b503d6113c3565b346102d5576113f136611cc4565b6113f9613236565b611404848633613e0f565b61140d83613784565b1561154a5761141d8486336130a6565b61142781856137f1565b15611544575082935b61143c85828833613e43565b9690947f8045c25080b0868951141ed0a91720bcad09a8364a2b3109ee1fd49c1f0bc8b860c061146d898533613ea1565b94906001600160a01b0360405192338452169a8b6020840152876040840152856060840152608083015260a0820152a1836114c85760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b611537976105319660ff946040519960078b5260208b015260408a01526060890152608088015260a08701521660c08501523360e085015261010084019384604052611513856118fc565b600685526115246101208201612b8b565b61152d85611d81565b5261052984611d81565b808080808080808061049a565b93611430565b604051623a3a4d60e21b81523360048201526001600160a01b038616602482015260448101859052606490fd5b346102d55760803660031901126102d5576004356001600160a01b03908181168091036102d5576115a661183a565b6044359167ffffffffffffffff916064358381116102d557366023820112156102d55780600401359384116102d55736602485830101116102d5576116339560209216936115f5868587613d30565b60405196879283926323e30c8b60e01b84523360048501528760248501528860448501525f606485015260a06084850152602460a485019201612a3b565b03815f855af19384156103f5575f9461169f575b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd984036116865761167b93503091613da9565b602060405160018152f35b604051630b6c58a960e31b815260048101859052602490fd5b9093506020813d6020116116cb575b816116bb60209383611934565b810103126102d557519284611647565b3d91506116ae565b346102d5576101403660031901126102d55767ffffffffffffffff6004358181116102d557611706903690600401611ac5565b6024358281116102d55761171e903690600401611ac5565b60c03660431901126102d557610104358381116102d557611743903690600401611c78565b90610124359384116102d55761176061049a943690600401611c78565b92611769613236565b611e9d565b346102d55760603660031901126102d557602061179d61178c611824565b61179461183a565b604435916130a6565b604051908152f35b346102d55760203660031901126102d5576004355f525f6020526020600160405f205414604051908152f35b346102d55760203660031901126102d5576004359063ffffffff60e01b82168092036102d55760209163e414309160e01b8114908115611813575b5015158152f35b6301ffc9a760e01b1490508361180c565b600435906001600160a01b03821682036102d557565b602435906001600160a01b03821682036102d557565b35906001600160a01b03821682036102d557565b60a0810190811067ffffffffffffffff82111761188057604052565b634e487b7160e01b5f52604160045260245ffd5b6060810190811067ffffffffffffffff82111761188057604052565b6040810190811067ffffffffffffffff82111761188057604052565b6080810190811067ffffffffffffffff82111761188057604052565b67ffffffffffffffff811161188057604052565b60e0810190811067ffffffffffffffff82111761188057604052565b6020810190811067ffffffffffffffff82111761188057604052565b90601f8019910116810190811067ffffffffffffffff82111761188057604052565b92919267ffffffffffffffff82116118805760405191611980601f8201601f191660200184611934565b8294818452818301116102d5578281602093845f960137010152565b9080601f830112156102d5578160206119b793359101611956565b90565b91906060838203126102d557604051906119d382611894565b81936119de81611850565b83526119ec60208201611850565b602084015260408101359167ffffffffffffffff83116102d557604092611a13920161199c565b910152565b67ffffffffffffffff81116118805760051b60200190565b929192611a3c82611a18565b604092611a4c6040519283611934565b819581835260208093019160061b8401938185116102d557915b848310611a7557505050505050565b85838303126102d5578386918251611a8c816118b0565b611a9586611850565b81528286013583820152815201920191611a66565b9080601f830112156102d5578160206119b793359101611a30565b91909160a0818403126102d55760405190611adf82611864565b8193611aea82611850565b835267ffffffffffffffff9160208101358381116102d55782611b0e9183016119ba565b602085015260408101358381116102d55782611b2b918301611aaa565b604085015260608101359283116102d557611b4c6080939284938301611aaa565b60608501520135910152565b90929192611b6581611a18565b91604094611b766040519485611934565b839583855260208095019160059460051b8401948186116102d55784935b868510611ba5575050505050505050565b67ffffffffffffffff9085358281116102d5578701906080828603126102d5578551611bd0816118cc565b611bd983611850565b81528a8301358b820152868301358481116102d557830186601f820112156102d557803590611c0782611a18565b91611c148a519384611934565b8083528d80840191891b830101918983116102d5578e809101915b838310611c685750505050878201526060808401359485116102d557611c59878d9687960161199c565b90820152815201940193611b94565b82358152918101918f9101611c2f565b9080601f830112156102d5578160206119b793359101611b58565b9181601f840112156102d55782359167ffffffffffffffff83116102d5576020808501948460051b0101116102d557565b9060806003198301126102d5576004356001600160a01b03811681036102d5579160243591604435916064359067ffffffffffffffff82116102d557611d0c91600401611c93565b9091565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b805115610d245760200190565b805160011015610d245760400190565b805160021015610d245760600190565b805160031015610d245760800190565b805160041015610d245760a00190565b805160051015610d245760c00190565b8051821015610d245760209160051b010190565b9081518082526020808093019301915f5b828110611dc4575050505090565b835180516001600160a01b031686528201518583015260409094019392810192600101611db6565b90608080611e62611e50611e3e60406001600160a01b0380895116885260208901519060a060208a01528082511660a08a015260208201511660c08901520151606060e0880152610100870190611d10565b60408701518682036040880152611da5565b60608601518582036060870152611da5565b93015191015290565b90611e7582611a18565b611e826040519182611934565b8281528092611e93601f1991611a18565b0190602036910137565b926001600160a01b038451166001600160a01b0383511614612a29576001600160a01b03611ed2606086015160643590611d91565b5151166001600160a01b03611eee604085015160843590611d91565b515116148015906129e9575b610cde576001600160a01b03611f17604086015160443590611d91565b5151166001600160a01b03611f326064356060880151611d91565b515116146129d757611f4384613278565b805f525f60205260405f2054156129875750611f5e82613278565b805f525f60205260405f20541561293757506122ce907f6fa7f4c28634b0a9d6831401c45ae468195fb63aed07308935c35374ff5d9e3960405180611fc1611fb361012033845280602085015283018a611dec565b828103604084015287611dec565b6044356060830152606435608083015260843560a083015260a43560c083015260c43560e083015260e4356101008301520390a161223a6001600160a01b03845116916040519261201184611918565b5f845261201c6132a9565b506040519061202a826118fc565b6006825261203a60208301612b8b565b61204389613278565b906001600160a01b038a511660405192600384526020840152604083015260608201526080810160405261207682611d34565b5261208081611d34565b5060405161208d81611894565b6002815260403660208301376120a282611d41565b526120ac81611d41565b506121806120d36001600160a01b036120cb60443560408d0151611d91565b515116614468565b6121196001600160a01b038b51168b60206121106001600160a01b036120ff6044356040860151611d91565b515116926040604435910151611d91565b510151916130a6565b908a60ff602061214b6001600160a01b0361213a6044356040870151611d91565b515116936040604435910151611d91565b51015192169093929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b61218982611d51565b5261219381611d51565b506122216121b26001600160a01b036120cb60643560608d0151611d91565b6121ef6001600160a01b038b51168b60206121106001600160a01b036121de6064356060860151611d91565b515116926060606435910151611d91565b908a60ff602061214b6001600160a01b036122106064356060870151611d91565b515116936060606435910151611d91565b61222a82611d61565b5261223481611d61565b50614546565b905f6001600160a01b038751169160208801516001600160a01b0360208183511692015116918484523060205260408420604060208c015101516040519161228183611918565b86835260405195612291876118fc565b86526020860152604085015284606085015286608085015260a084015260c0830152604051808097819463d04dfe2360e01b83526004830161342a565b03915afa92835f915f95612919575b506122ed576040513d5f823e3d90fd5b92918351600281106128d357506040602085015194015161231661231083611d71565b51611d61565b5161232181836137f1565b156129115750935b61234b8186919060405192600284526020840152604083015260608201604052565b61235483611d51565b5261235e82611d51565b506040519461236c866118fc565b888652606435602087015260408601526060850152608084015260a083015260c082015261256e6001600160a01b0385511693604051946123ac86611918565b5f86526123b76132a9565b50604051906123c5826118fc565b600682526123d560208301612b8b565b6123de86613278565b906001600160a01b0387511660405192600384526020840152604083015260608201526080810160405261241182611d34565b5261241b81611d34565b5060405161242881611894565b60028152604036602083013761243d82611d41565b5261244781611d41565b506124d16124666001600160a01b036120cb60843560408a0151611d91565b6124a16001600160a01b038851166001600160a01b0361248c60843560408c0151611d91565b515116602061211060843560408d0151611d91565b906001600160a01b036124ba60843560408b0151611d91565b51511660ff602061214b60843560408d0151611d91565b6124da82611d51565b526124e481611d51565b506122216125036001600160a01b036120cb60a43560608a0151611d91565b61253e6001600160a01b038851166001600160a01b0361252960a43560608c0151611d91565b515116602061211060a43560608d0151611d91565b906001600160a01b0361255760a43560608b0151611d91565b51511660ff602061214b60a43560608d0151611d91565b926126045f6001600160a01b038551169260208601908151906001600160a01b03602081845116930151169286855230602052604080862091510151604051916125b783611918565b868352604051956125c7876118fc565b86526020860152604085015284606085015289608085015260a084015260c0830152604051808095819463d04dfe2360e01b83526004830161342a565b03915afa90815f915f936128eb575b50612623576040513d5f823e3d90fd5b908151600281106128d357506040602083015192015161264561231088611d71565b5161265081836137f1565b156128cb5750925b61267a8385919060405192600284526020840152604083015260608201604052565b61268388611d51565b5261268d87611d51565b506040519661269b886118fc565b86885260a43560208901526040880194855260608801938452608088015260a087015260c08601526126d06040840151613784565b159182156128b7575b5081156128a2575b8115612891575b5061287f57604051916126fa836118cc565b5f83525f60208401525f60408401525f606084015261271984836147d7565b8452604084015261273f61272d83866147d7565b60208601528060608601528451613818565b946127536020850151604086015190613818565b9361275d876137ce565b8015612870575b61285e57612825612857957fd9fa84dd790c969daa5c33d8050dc06b4a9b59d5b42e2be5f5e8ae20447f618d9461280761285c9a60a0966127a68a8851613842565b6127b48c6020890151613842565b6127c28a60408901516138a0565b6127d08c60608901516138a0565b6127d98a6139cb565b6127e28c6139cb565b6001600160a01b036127fe60c435926060606435910151611d91565b51511633613a6b565b50506001600160a01b036127fe60e43592606060a435910151611d91565b5050606060405191338352805160208401526020810151604084015260408101518284015201516080820152a1613b57565b613b57565b565b604051630d86822160e01b8152600490fd5b5061287a856137ce565b612764565b6040516321badf1f60e01b8152600490fd5b61289c9150516137ce565b5f6126e8565b90506128b160608301516137ce565b906126e1565b6128c391925051613784565b15905f6126d9565b905092612658565b60249060405190630fbb8e5560e21b82526004820152fd5b90925061290a91503d805f833e6129028183611934565b8101906132e6565b915f612613565b905093612329565b90945061293091503d805f833e6129028183611934565b935f6122dd565b9151604080513381526001600160a01b039092166020830152810192909252507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f39250905080606081015b0390a1565b9351604080513381526001600160a01b039092166020830152810194909452507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f392915081905060608101612982565b604051631cd2f1c760e21b8152600490fd5b506001600160a01b03612a03606084015160a43590611d91565b5151166001600160a01b03612a1f604087015160443590611d91565b5151161415611efa565b604051630a98f1f360e21b8152600490fd5b908060209392818452848401375f828201840152601f01601f1916010190565b90929192612a6881611a18565b91604091612a796040519485611934565b839581855260208095019160051b8301938185116102d55783925b858410612aa45750505050505050565b67ffffffffffffffff9084358281116102d55786019083828603126102d5578351612ace816118b0565b82358481116102d55786612ae39185016119ba565b8152898301359384116102d557612afe868b95869501611c78565b83820152815201930192612a94565b903590605e19813603018212156102d5570190565b903590601e19813603018212156102d5570180359067ffffffffffffffff82116102d5576020019181360383136102d557565b903590601e19813603018212156102d5570180359067ffffffffffffffff82116102d557602001918160061b360383136102d557565b5f5b60c08110612b99575050565b606082820152602001612b8d565b5f5b828110612bb557505050565b606082820152602001612ba9565b903590601e19813603018212156102d5570180359067ffffffffffffffff82116102d557602001918160051b360383136102d557565b60405190612c0682611894565b60606040835f81525f60208201520152565b60405190612c2582611864565b5f608083828152612c34612bf9565b6020820152606060408201526060808201520152565b9015610d2457803590607e19813603018212156102d5570190565b903590609e19813603018212156102d5570190565b9190811015610d245760061b0190565b356001600160a01b03811681036102d55790565b3580151581036102d55790565b9081518082526020808093019301915f5b828110612cca575050505090565b835185529381019392810192600101612cbc565b90612cf6610142612cef8480612c65565b3690611ac5565b5f5260205f81526040926001845f2054036130165791612f1991612d7d85855f612e9e612d2683612d3d9a612c65565b612d42878501359182878701359c8d923690611ac5565b61429a565b612d5a612d4f8580612c65565b946060810190612bc3565b9690612d75875196612d6b88611918565b8688523690611ac5565b973691611b58565b90612d866132a9565b50612e67865191612d96836118fc565b60068352612da58a8401612b8b565b88612daf81613278565b988b6001600160a01b039a8b845116908351926003845283015282820152336060820152608081018252612de286611d34565b52612dec85611d34565b508051612df881611894565b6002815281368e830137612e0b86611d41565b52612e1585611d41565b50810160ff8c61214b612e508d80612e32816120cb8b8a51611d91565b97511690612e41898851611d91565b515116846121108a8951611d91565b958d612e5d828751611d91565b5151169451611d91565b612e7082611d51565b52612e7a81611d51565b506122218b886060810160ff8c61214b612e508d80612e32816120cb8b8a51611d91565b918385511693868601918b83519289818551169401511693878652308a52818087209151015190825192612ed184611918565b8784525195612edf876118fc565b86528a8601528d85015284606085015285608085015260a084015260c08301528a5180809a819463d04dfe2360e01b83526004830161342a565b03915afa95865f915f98612ff8575b50612f375788513d5f823e3d90fd5b9593865160028110612fe15750888798998260c09798990151990151612f5f61231085611d71565b51612f6a81836137f1565b15612fd75750998a925b612f968b85919060405192600284526020840152604083015260608201604052565b612f9f86611d51565b52612fa985611d51565b50825196612fb6886118fc565b8752860152840152866060840152608083015260a082015201526001929190565b9050998a92612f74565b6024908a5190630fbb8e5560e21b82526004820152fd5b90975061300f91503d805f833e6129028183611934565b965f612f28565b505f92508291829150565b9035601e19823603018112156102d557016020813591019167ffffffffffffffff82116102d5578160061b360383136102d557565b9190808252602080920192915f905b828210613073575050505090565b909192936001906001600160a01b0361308b87611850565b16815285830135838201526040908101950193920190613065565b82156130db576001600160a01b038091165f52600160205260405f2091165f5260205260405f20905f5260205260405f205490565b9091506130e782614468565b6001600160a01b03809316906040918251946370a0823160e01b86528416938460048701526020928387602481865afa9687156131fd575f97613207575b508361313e6131378361316e9a61522c565b5090614cee565b508651636eb1769f60e11b81526001600160a01b0390941660048501523060248501529297889081906044820190565b0381865afa9687156131fd575f976131cc575b50613137613192916119b79861522c565b5061319d81836137f1565b156131c45750935b5f5260018252825f20905f528152815f20905f8052525f205490614373565b9050936131a5565b96508387813d83116131f6575b6131e38183611934565b810103126102d557955195613137613181565b503d6131d9565b85513d5f823e3d90fd5b96508387813d831161322f575b61321e8183611934565b810103126102d55795519583613125565b503d613214565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0060028154146132665760029055565b604051633ee5aeb560e01b8152600490fd5b6040516132a3816132956020820194602086526040830190611dec565b03601f198101835282611934565b51902090565b604051906132b6826118fc565b606060c0836132c3612c18565b81525f60208201525f60408201525f838201528260808201525f60a08201520152565b91906040838203126102d557825167ffffffffffffffff908181116102d55784019082601f830112156102d557815160209261332182611a18565b9161332f6040519384611934565b808352848084019160051b830101918683116102d55785809101915b8383106133be575050505094828101519182116102d557019180601f840112156102d557825161337a81611a18565b936133886040519586611934565b818552838086019260051b8201019283116102d5578301905b8282106133af575050505090565b815181529083019083016133a1565b825181529181019186910161334b565b90808251908181526020809101926020808460051b8301019501935f915b8483106133fc5750505050505090565b909192939495848061341a600193601f198682030187528a51612cab565b98019301930191949392906133ec565b91906020928381526001600160a01b0382511684820152838201516040820152613464604083015160e06060840152610100830190611d10565b906060830151608082015261348b608084015192601f1993848483030160a08501526133ce565b9260a081015193838382030160c08401528680865192838152019501905f5b8181106134ce575050506119b794955060c060e09101519282850301910152612cab565b8251875295880195918801916001016134aa565b959491939086936134f16132a9565b505f92604061360c815192613505846118fc565b60068452602093613517858201612b8b565b6135d56135238b613278565b8b6001600160a01b03998a9283835116895191600383528b830152898201528360609b168b82015260808101895261355a86611d34565b5261356485611d34565b50875161357081611894565b6002815288368b83013761358386611d41565b5261358d85611d41565b5060ff8961214b8a8501936135c9876135ab816120cb858a51611d91565b975116886135ba848951611d91565b51511685612110858a51611d91565b96612e5d828751611d91565b6135de82611d51565b526135e881611d51565b50612221878b8d60ff8961214b8c8501936135c9876135ab816120cb858a51611d91565b9461368c5f868a511698869786889c0191825191888184511693015116928c8552308952878086209151015188519161364483611918565b868352895195613653876118fc565b86528a86015288850152848a8501528b608085015260a084015260c08301528551808095819463d04dfe2360e01b83526004830161342a565b03915afa90815f915f93613766575b50613759575050505f975b600285511098891599613746578284870151960151906136c861231089611d71565b51906136d482846137f1565b15905061373e5750925b6137008685919060405192600284526020840152604083015260608201604052565b61370988611d51565b5261371387611d51565b5082519b6137208d6118fc565b8c528b0152890152870152608086015260a085015260c08401529190565b9050926136de565b50505050505050505091506119b76132a9565b91999850945093966136a6565b90925061377d91503d805f833e6129028183611934565b915f61369b565b6137a3905f60e01d906001600160e01b038160e01d9116601b0b6152e3565b1290565b906137a3916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b615364565b6137ed905f60e01d906001600160e01b038160e01d9116601b0b6152e3565b1390565b906137ed916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b615364565b6119b791610ace916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b61483a565b61389c91608081018261385e6138588351611d71565b51611d71565b5261389561388f6001600160a01b038094515116936138866138808551611d71565b51611d34565b51169251611d71565b51611d51565b5191613e43565b5050565b906080810191806138b46138588551611d61565b526001600160a01b038092515116916138d06138808551611d61565b51166138df61388f8551611d61565b519081613993576138ef836137ce565b61397a579183917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a9593612982955f5260209060018252613945604094855f20835f528452855f20855f528452855f2054614373565b945f5260018252835f20905f528152825f20915f52525f20555b516040519182913383526040602084015260408301906133ce565b60405163793a8f5560e01b815260048101849052602490fd5b916139c4917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a959361298295613a6b565b505061395f565b608081016139dc61388f8251611d61565b519182156139e957505050565b613a036138806001600160a01b0380935151169351611d61565b5116815f5260209160018352604092835f20835f528152835f20855f528152835f2054936001600160e01b038516613a3e575b505050505050565b613a62955f9284845260018152828420868552815282842091845252812055613ea1565b5f808080613a36565b93929193613a78836137ce565b61397a5784613a9457613a8c939450613ea1565b50505f905f90565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f528152613ad1835f20549485614373565b95613adb876137ce565b613afe575f97885260018252838820908852815282872091875252909320829055565b835163c5e12af560e01b815260048101889052602490fd5b90604082019082526020606081936040838201528551809452019301915f5b828110613b43575050505090565b835185529381019392810192600101613b35565b60c0810151908151915f92613ccb575b50613c0c6020918281510151926001600160a01b039081818187511696015116928660a082019485518252308452604097888320898686510151015160808601518b5191613bb483611918565b8683528c5193613bc385611918565b8785528d5196613bd2886118fc565b8752898701528c86015260016060860152608085015260a084015260c08301528851808099819463d04dfe2360e01b83526004830161342a565b03915afa948515613cc1578795613ca3575b508451613c2f575b50505050505050565b81905101510151169051813b15613c9f57918491849383613c64965180978195829463012c676d60e21b845260048401613b16565b03925af1908115613c965750613c7f575b8080808080613c26565b613c8982916118e8565b613c935780613c75565b80fd5b513d84823e3d90fd5b8480fd5b613cb89195503d8089833e6129028183611934565b9050935f613c1e565b86513d89823e3d90fd5b6001600160a01b03602080845101510151169060a083015190823b156102d557613d0e925f928360405180968195829463012c676d60e21b845260048401613b16565b03925af180156103f55715613b6757613d289192506118e8565b5f905f613b67565b6040519263a9059cbb60e01b5f526001600160a01b0380931660045260245260205f60448180855af160015f5114811615613d8a575b8360405215613d7457505050565b635274afe760e01b835216600482015260249150fd5b6001811516613da057813b15153d151616613d66565b833d5f823e3d90fd5b9092604051936323b872dd60e01b5f526001600160a01b0393848092166004521660245260445260205f60648180855af160015f5114811615613df9575b836040525f60605215613d7457505050565b6001811516613da057813b15153d151616613de7565b909115613e1a575050565b6040516305dbdfd960e41b81526001600160a01b03918216600482015291166024820152604490fd5b93929193613e50836137ce565b61397a5784613e6457613a8c93945061439d565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f528152613ad1835f20549485613818565b90929192613eae81614869565b93613eb8816137ce565b613f015784816001600160e01b03613ed79360e01d9116601b0b61548e565b50809281613ee7575b5050509190565b6001600160a01b03613ef99316613d30565b5f8181613ee0565b604051632d1671a360e11b8152600490fd5b919091604092835192613f25846118fc565b60068452602094613f37868601612b8b565b5f5b8451811015613f6c5780613f4f60019287611d91565b51613f5a8289611d91565b52613f658188611d91565b5001613f39565b50925092939093335f52308252825f2091835195613f89876118b0565b613f91612bf9565b875260608281980152845190613fa682611918565b5f8252855190613fb582611918565b5f82525f3681375f5b815181101561411a57898688613fd48486611d91565b51888151948d80870151908151613ff6575b5050505050505050600101613fbe565b905f92916001600160a01b039661401b8887818d51169c015116998789015190614546565b958251996140288b6118fc565b8a5289015287015285015260808401528760a08401528660c08401525f8c51809563d04dfe2360e01b8252818061406360049889830161342a565b03915afa938415614110579089915f956140f2575b50845161408e575b50899250808e8c938e613fe6565b5101511691823b156102d5576140bc925f92838d5180968195829463012c676d60e21b845233908401613b16565b03925af180156140e85790600192916140d9575b81928782614080565b6140e2906118e8565b5f6140d0565b89513d5f823e3d90fd5b6141079195503d805f833e6129028183611934565b9050935f614078565b8c513d5f823e3d90fd5b50505050505050509050565b8115614130570490565b634e487b7160e01b5f52601260045260245ffd5b60408151106141a0576020810151908051603f19810190811161418c5760051c82116141785760016020920160051b010190565b505060405161418681611918565b5f815290565b634e487b7160e01b5f52601160045260245ffd5b5060405161418681611918565b8051156141bd57602001515f1a90565b505f90565b61285c92916141ed610531923390919060405192600284526020840152604083015260608201604052565b9260405193600185526020850152604084016040523691612a5b565b905f8091602081519101845af48080614287575b1561423d5750506040513d81523d5f602083013e60203d82010160405290565b1561426457604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b3d15614275576040513d5f823e3d90fd5b60405163d6bda27560e01b8152600490fd5b503d15158061421d5750813b151561421d565b916142c59060606142ba936001600160a01b039485916040880151611d91565b515116940151611d91565b515116146129d757565b6142f66001600160e01b0392838316601b0b9260e01d938160e01d9116601b0b8484614aa5565b90637ffffff58213614346575b9061430d91614cee565b929092158061433e575b61432057505090565b6044925060405191638eba4d0760e01b835260048301526024820152fd5b508215614317565b61435082826159b7565b1561430357604483856040519163d556b11160e01b835260048301526024820152fd5b6119b791610ace916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b615093565b9291926143a982614869565b936143b3816137ce565b6144145784816001600160e01b036143d29360e01d9116601b0b61548e565b92908093156143ff575b508290816143eb575050509190565b613ef9926001600160a01b03309216613da9565b9092505f19811461418c57600101915f6143dc565b604051632eaefac360e21b8152600490fd5b6004111561443057565b634e487b7160e01b5f52602160045260245ffd5b602090939291936001600160a01b03604082019516815261446483614426565b0152565b6144706159d0565b60408051630782d7e160e01b81526001600160a01b03831660048201529091828260248173200e12d10bb0c5e4a17e7018f0f1161919bb93895afa92831561453d575f925f94614508575b506144c583614426565b6001831415806144f6575b6144da5750505090565b5163ee07877f60e01b8152918291610571919060048401614444565b5061450083614426565b8215156144d0565b9080945061452c9293503d8511614536575b6145248183611934565b810190615202565b919091925f6144bb565b503d61451a565b513d5f823e3d90fd5b6145508251611e6b565b61455a8351611e6b565b9282519281518015155f146147cf57600201935b6001940184019061457e82611a18565b956145996040936145918551998a611934565b808952611a18565b6145ab602091601f1901828a01612ba7565b5f9584519389896002926002885233868901523089890152606097606081018a526145d584611d34565b526145df83611d34565b505f825b61478f575b5050505086516145ff575b50505050505050505090565b909192936002886146228c8661461b8e809c9d9e018093611d91565b528d611d91565b50018561462f828d611d91565b5261463a818c611d91565b505f965b614649575b506145f3565b885187101561478a576001600160a01b036146f5898b856146ec8c60428c886146728488611d91565b515116968582614682868a611d91565b51015192614690868a611d91565b51838d82511691015182815160051b910120908451927f6ec4dff745ec96dbde88c5d41f8aa5ac13aa1664afb47b8406b44fa945a650c88452830152838201522090519161190160f01b83528d83015260228201522093611d91565b5101519161525a565b1561477257876147618b8e8c8f9e9d9c9b9a999897968f61474e918d614744898f8f61473083889f614727828f611d91565b51511692611d91565b5261473b828b611d91565b51015192611d91565b52019c8d94611d91565b51015161475b8383611d91565b52611d91565b50019697989590919293949561463e565b8851630a57f30960e31b815260048101899052602490fd5b614643565b9091929a82518210156147c757906147bb84809301809d6147b08487611d91565b5161475b8383611d91565b50019082918d936145e3565b9a92916145e8565b505f9361456e565b9160408301926040614811610ace606087519401938451906001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6148ea565b945193016148208151866137a7565b614828575050565b9093506119b7919250519251836142cf565b919291600160ff1b840161485257611d0c93506153b9565b90611d0c935f0391615093565b61430d8282614cee565b6148716159d0565b6040805163b7bad1b160e01b81526001600160a01b0383166004820152909182826024815f73200e12d10bb0c5e4a17e7018f0f1161919bb93895af192831561453d575f925f9461450857506144c583614426565b60088151106141bd576008015167ffffffffffffffff1667ff0a89c674ee78741490565b9091939284158215175f146149045750505090505f905f90565b82810192600160fd1b8082019083011760fe1c614a3b575b50506149278161567c565b936149318161567c565b9461493c868261569c565b90918215614a2c575f9083986f0785ee10d5da46d900f436a000000000808611614a1e575b50670de0b6b3a7640000808b11614a0f575b50633b9aca00808b11614a00575b50612710808b116149f2575b5098805b6149e157508190611d0c989982600a0a9109960195817fcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccd0a93838211900382610100031b9203901c1702916156af565b60019290920191600a900480614991565b60049a04998a93019261498d565b600991939a049901915f614981565b601291939a049901915f614973565b85049950602592505f614961565b50929050611d0c9495506156af565b5f821215614a8f57808413614a81575b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb284131561491c57909250611d0c9394916155ba565b909250611d0c939491615621565b80841215614a4b57909250611d0c9394916155ba565b92909180614acb576044848460405191637a97930f60e01b835260048301526024820152fd5b90919280155f14614ae057505050505f905f90565b614af993614aed91615769565b92919490938492615769565b9093919284614b078861567c565b91614b118661567c565b947f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000094604c91868810614cb8575b030191600160ff1b98838a018112155f14614c85575050035b5f955f821280614c7c575b614c5e575b5f811280614c4c575b614c2e5786820103966001600160ff1b0388149081614c24575b5080614c1b575b80614c12575b614bf4575090614ba89291615915565b915f8113614bbb575b50611d0c936156af565b9091604c8213614be957614bd291600a0a90614126565b908115614bdf575f614bb1565b505050505f905f90565b50505050505f905f90565b876044916040519163d556b11160e01b835260048301526024820152fd5b505f8512614b98565b50828414614b92565b905088145f614b8b565b604489836040519163d556b11160e01b835260048301526024820152fd5b50806001600160ff1b03018213614b71565b9550808701861315614c765786818703015b95614b68565b5f614c70565b505f8113614b63565b89985090920390506001600160ff1b0381900387018213614ca95701860194614b58565b5050505050505050505f905f90565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009650604b9250614b3f565b8115614130570590565b8082601b82810b8314614ee3577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000008405614e8f575b8380820b03614e7e57507b199999999999999999999999999999999999999999999999999999987b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc84011115614e2f575b838060030b03614db3575b808413614d975750506001600160e01b036001925b60e01b91161791565b8303600a0a8015614130576001600160e01b0391071592614d8e565b92915f841315614e03575090614dc983836159b7565b614de557637ffffffe1901600a0a810290637fffffff92614d79565b506044916040519163d556b11160e01b835260048301526024820152fd5b637fffffff199283039060438213614be957614e2291600a0a90614ce4565b918215614bdf5792614d79565b5f198401808060030b14614e435750614d6e565b90506001600160e01b039293507b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff915060e01b9260ff1d181617905f90565b600190940193600a90930592614d21565b937f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000840515614ed0576305f5e100600894058094819201955b915050614d21565b620186a060059405809481920195614ec8565b5082614d6e57505050505f90600190565b919291600160ff1b9190801580615081575090614f1091615769565b9490929091905f868585858282138015615078575b61505b575b505050508682841860ff1c94860391039081604c0381116150405701600a0a808205919084615026575b505081019182821860ff1c111561501e57826001600160ff1b031461500057905f600192135f14614fd157600a9004915b01925b81158117614f9557509190565b80614fae575b508015614fa6579190565b505f91508190565b9192614fc49203600160ff1b01600a0a90614ce4565b600160ff1b91905f614f9b565b600a60037fe6666666666666666666666666666666666666666666666666666666666666679201040191614f85565b604490836040519163d556b11160e01b835260048301526024820152fd5b509092614f88565b8107615033575b80614f54565b60ff1d600117015f61502d565b50505091935061504e579190565b60018160ff1d1790039190565b5f9a50909750909550600160ff1b94509250905086808080614f2a565b50835f12614f25565b1561508c5750509190565b9350919050565b93929193841581158181176151e4575050906150ae91615769565b91949082956150bf82958294615769565b80969294919693878684821380156151db575b6151c2575b5050505050508682841860ff1c94860391039081604c0381116150405701600a0a8082059190846151a8575b505081019182821860ff1c11156151a057826001600160ff1b031461500057905f600192135f1461517157600a9004915b01925b8115811761514457509190565b8061515457508015614fa6579190565b600160ff1b9361516b9291038401600a0a90614ce4565b5f614f9b565b600a60037fe6666666666666666666666666666666666666666666666666666666666666679201040191615134565b509092615137565b81076151b5575b80615103565b60ff1d600117015f6151af565b929b5098509196509450925090505f80808080806150d7565b508584126150d2565b93959390929190156151fa575050614fa6579190565b945092915050565b91908260409103126102d557815160048110156102d55760209092015160ff811681036102d55790565b9060ff165f03916001600160ff1b0382115f1461525257600a6001818404940192061590565b909190600190565b9091813b6152955761526c9192615a39565b5061527681614426565b15918261528257505090565b6001600160a01b03918216911614919050565b6020918160645f935160405192630b135d3f60e11b9788855260048501526040602485015286820190604485015e8281018201859052601f01601f191601915afa905f5114601f3d11161690565b92915f9060018184145f8712871517171761535d575f9280821361534f575b03604c81135f82121761534357600a0a90846153218382029384614ce4565b1461533657505015615332575f9190565b5f90565b90935090156119b7579190565b505015615332575f9190565b5f9560019450925090615302565b5050505f90565b93929190918083145f83125f871218831587151717176153b3575f928082136153a65703604c81135f82121761534357600a0a90846153218382029384614ce4565b9194600193509190615302565b50919050565b909291600160ff1b9182810161544b575080841461544157808413918215615439578185035b604c8111156154285750505f915b1561541957507f8000000000000000000000000000000000000000000000000000000000000001019190565b92506001600160ff1b03039190565b600a0a9081156141305704916153ed565b8482036153df565b505090505f905f90565b9361545892945f03614ef4565b8093918092811461546c575b50505f039190565b915092506001600160ff1b03831461500057600a600191059201915f80615464565b91925f8312156154b6576044838360405191634a7d166b60e01b835260048301526024820152fd5b9192836154c857505090505f90600190565b60ff8116820191808312615590575f831215615500575050604c198112614fa6575f03600a0a916154f98382614126565b9283021490565b909293915f81135f1461558657604d811361555b57600a0a92831561413057835f190483116155325750500290600190565b60405163c849483b60e01b815260048101849052602481019290925260ff166044820152606490fd5b5060405163c849483b60e01b81526004810192909252602482015260ff919091166044820152606490fd5b5050905090600190565b60405163c849483b60e01b815260048101869052602481019190915260ff82166044820152606490fd5b909392915f6155ca9181846148ea565b9490945f8483019182019412159081615617575b811561560d575b506155ef57505090565b604492506040519163d556b11160e01b835260048301526024820152fd5b905083125f6155e5565b82811291506155de565b61563693600160fe1b908101939201906148ea565b9081815f82121561566d575050604b198212613a8c5761565b915f03600a0a90614ce4565b9081615665575f90565b600160ff1b90565b93600160ff1b90910192509050565b5f8112156119b757600160ff1b90808203615695575090565b90505f0390565b905f198183099102908180821091030391565b92939291905f8184181215615744576001600160ff1b03928383111561572e57600160ff1b938385036156e457505050509190565b909192935085146156fe575050600a600191045f03920190565b604051630ed8062160e21b8152600481019190915260248101919091526044810182905260648101849052608490fd5b5090915050600160ff1b811461418c575f039190565b90916001600160ff1b0380841115613ee05785146156fe575050600a60019104920190565b919091801561590b57827f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000080830515615819575b507f19999999999999999999999999999999999999999999999999999999999999997f0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc83011061580a575b83136157f45791905f90565b919060018060ff1b926001600160ff1b03030190565b9290600a02905f1901926157e8565b6f4b3b4ca85a86c47a098a224000000000808405156158f9575b507728c87cb5c89a2571ebfdcb54864ada834a000000000000008305156158e2575b7b097edd871cfda3a5697758bf0e3cbb5ac5741c6400000000000000008305156158ce575b7e3899162693736ac531a5a58f1fbb4b746504382ca7e40000000000000000008305156158be578205156158af575b5f61579d565b9290600a02905f1901926158a9565b939160640291600119019361587a565b93916402540be4000291600919019361587a565b9391678ac7230489e8000002916012190193615855565b6025198301955092909202915f615833565b505f915081908190565b90915f198383099280830292838086109503948086039584871015615993571461598b579082910960018219018216809204600280826003021880830282030280830282030280830282030280830282030280830282030280920290030293600183805f03040190848311900302920304170290565b505091500490565b60648386866040519263362ced0960e11b8452600484015260248301526044820152fd5b6119b791905f8112156159cb575f03615a73565b615a73565b73200e12d10bb0c5e4a17e7018f0f1161919bb9389803b158015615a0e575b6159f65750565b602490604051906373e6d7b360e01b82526004820152fd5b507f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d41813f14156159ef565b8151919060418303615a6957615a629250602082015190606060408401519301515f1a90615b02565b9192909190565b50505f9160029190565b90637ffffff5811315615afc57637ffffffe1981019060438213615af5575f821215615ac957637fffffff91505f0301600a0a7b8000000000000000000000000000000000000000000000000000000202111590565b50600a0a8015614130577b80000000000000000000000000000000000000000000000000000001041090565b5050151590565b50505f90565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411615b79579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa156103f5575f516001600160a01b03811615615b6f57905f905f90565b505f906001905f90565b5050505f916003919056"; /// @dev The runtime bytecode of the contract. bytes constant RUNTIME_CODE = - hex"6080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a71461180e575080632cb77e9f146117e257806341d1514f146117ab5780635343c1b7146117105780635cffe9de146115b45780635d003c4414611430578063613255ab146113ad578063687cf02a14611096578063ac9650d814610f48578063b0460f07146105f3578063b845b83e1461059b578063ca9109ba1461044c578063d9d98ce41461039b578063ddebc96f146103475763df6db3c2146100c1575f80fd5b34610321576003196040368201126103215767ffffffffffffffff9060043582811161032157806004019160a0823603918201126103215760243584811161032157610111903690600401611cd0565b909361011b612bf0565b5f946001600160a01b039485610130846125d7565b163303610325576101496101443685611b02565b612c32565b805f525f60205260405f20966001885414610190575b60208960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556040519015158152f35b9091929394959697505f600198556040519633885282602089015260606040890152816101bc8761188d565b166060890152602484013590606219018112156103215783019060a06080890152806101ea6004840161188d565b166101008901526101fd6024830161188d565b16610120880152604481013560221982360301811215610321570190602460048301359201988211610321578136038913610321577f09d18501db0080ca2d6cd7c17fa7255daff4b2d503ea93b76ff68b6752ea8e6387806103069560846102c561030e9a60209f610284906103149f9a60606101406102ef9d0152610160880191612388565b6102b66102ab61029760448801856129db565b605f198a8603810160a08c01529491612a10565b9260648701906129db565b918784030160c0880152612a10565b91013560e08301520390a13390919060405192600284526020840152604083015260608201604052565b906040519160018352602083015260408201604052565b9236916123a8565b90613c65565b5f8080808080808061015f565b5f80fd5b602486610331856125d7565b6040516335252be360e01b815291166004820152fd5b3461032157600319602036820112610321576004359067ffffffffffffffff82116103215760809082360301126103215761038660609160040161262b565b90604051921515835260208301526040820152f35b34610321576040366003190112610321576001600160a01b036103bc611861565b166040516370a0823160e01b8152306004820152602081602481855afa908115610441575f9161040f575b50156103f75760206040515f8152f35b60249060405190633c5bf76960e21b82526004820152fd5b90506020813d602011610439575b8161042a60209383611971565b810103126103215751826103e7565b3d915061041d565b6040513d5f823e3d90fd5b346103215761045a36611d01565b92809492610466612bf0565b610471828533613b61565b61047a816134d6565b15610567578061048e6104dd9286336140a7565b9790957f7f9dfa19cf1cc2f806f2f860fbc9c056b601fb1afc0e9b843dfe5c63616268e660806040513381526001600160a01b038416998a60208301528560408301526060820152a1336137bd565b9390918561050c575b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b61055b9661030e956103069460ff93604051956005875260208701526040860152606085015260808401521660a082015260c08101604052906040519160018352602083015260408201604052565b808080808080806104e6565b506040516306dde9c360e41b81523360048201526001600160a01b03841660248201526044810191909152606490fd5b0390fd5b346103215760203660031901126103215760043567ffffffffffffffff81116103215761030e6105d26104e6923690600401611cd0565b91906105dc612bf0565b604051926105e984611955565b5f845236916123a8565b34610321576003196020368201126103215767ffffffffffffffff600435116103215760c090600435360301126103215761062c612bf0565b5f808061064160048035608481019101612510565b905015610f36576024600435013592610659846134d6565b15610f245760608060405161066d81611909565b610675612565565b81525f60208201525f6040820152015261068d612565565b506106ed6106e86106c76106bd6106b76106b1608460043501600435600401612510565b90612597565b806125b2565b60408101906124a2565b60206106e06106b1608460043501600435600401612510565b0135916125c7565b6125d7565b936001600160a01b0361073c6106e86107236107196106b76106b1608460043501600435600401612510565b60608101906124a2565b60406106e06106b1608460043501600435600401612510565b816040519761074a896118d1565b168752166020860152604085015261076c608460043501600435600401612510565b9490506001604051955f87520160051b85016040525f905f5b610799608460043501600435600401612510565b9050811080610f11575b15610d5e576107bc608460043501600435600401612510565b821015610d4a578160051b810135607e198236030181121561032157608081830136031261032157604051916107f183611909565b8181013567ffffffffffffffff81116103215761081390369084840101611b02565b835280820160208181013590850152604080820135908501526060013567ffffffffffffffff81116103215761084c9236920101611cb5565b606082015280516001600160a01b0361086e6040830151602085015190611dbe565b5151166001600160a01b0385511614801590610d16575b610d045761089d602083015160408401519083613fa4565b6108a681612c32565b91825f525f60205260405f2054155f1461090a575051604080513381526001600160a01b039092166020830152810191909152600191907fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f390606090a15b01610785565b919061093b60208497959701516040850151906060860151906040519261093084611955565b5f8452339186613234565b5f94916109a457505051604080513381526001600160a01b03909216602083015281019190915260019291907f1e6fa9678edf81f9f25bbf308bde03ad3e110db1f429394b0915ba021532941490606090a15b811561099c575b5092610904565b905088610995565b6109b9606082015160446004350135906134f9565b15610a1357505051604080513381526001600160a01b03909216602083015281019190915260019291907fe3151dc8cb7a54ffc4baabd28c1f241c94d510b5e5b502491ac3cad6c16316d59080606081015b0390a161098e565b610a2060408201516134d6565b158015610cf1575b15610a7e57505051604080513381526001600160a01b03909216602083015281019190915260019291907f500b713857325f9e6dcb52ae832eca9109d107ed1aae9cb4928b4c1e13f051aa908060608101610a0b565b9250925050600196959691610a976064600435016125eb565b15610c5e5796610b0797610b1760408401516040880151610ab88183613543565b15610c565750925b610b11848592610afa610af460608a01516001600160e01b03601b918660e01d92828816810b928260e01d9216900b6145f4565b90614569565b9d8e9260408d015161356a565b60408c015261407d565b9961407d565b98610b228484613594565b610b2c84826135f2565b60405192338452608060208501526060610b528451608080880152610100870190611e19565b93602081015160a0870152604081015160c0870152015192607f198582030160e0860152835180825260208201906020808260051b8501019601925f5b828110610bee57505050505092806001979695937fbae4dbf76931c547f765e9def16d693d86daaa596f491de979008831789185ae93610be996604084015260608301520390a180858c5101808d5260051b8c01526138a9565b61098e565b9091929396602080610c49600193601f198782030189528b51906001600160a01b03825116815283820151848201526060610c3860408401516080604085015260808401906125f8565b920151906060818403910152611d4d565b9901950193929101610b8f565b905092610ac0565b610b0790610b176060840151610b11610c9c610af460408801516001600160e01b0394601b90868360e01d9316820b91878260e01d9216900b6145f4565b60408a0151610cab8183613543565b15610ce95750915b829c8d916060890151908116155f14610cda575060408801515b96879460408d015161356a565b610ce49085613fd9565b610ccd565b905091610cb3565b50610cff6060820151613520565b610a28565b60405163936bb5ad60e01b8152600490fd5b506001600160a01b03610d326060830151604085015190611dbe565b5151166001600160a01b036020860151161415610885565b634e487b7160e01b5f52603260045260245ffd5b50919390610d706064600435016125eb565b15610f0b57835b6004356004013590610d898282613543565b610eed5750508490610da9856001600160a01b0360208701511633613bf3565b505060a46004350190610dc18260043560040161246f565b905015159081610ee5575b50610e44575b506001600160a01b03610de892935116336140a7565b50505b8351811015610e105780610e0a610e0460019387611dbe565b5161371d565b01610deb565b5060409160017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005582519182526020820152f35b90506001600160a01b03602084015116610e6e6001600160a01b038551169260043560040161246f565b929091333b1561032157610eb65f93604051958694859463691f9ed760e01b8652600486015260248501528960448501528a606485015260a0608485015260a4840191612388565b038183335af190811561044157859115610dd2579050610ed69150611925565b5f836001600160a01b03610dd2565b905088610dcc565b604492506040519163573b6f4160e01b835260048301526024820152fd5b84610d77565b50610f1f60408301516134d6565b6107a3565b60405163315f9e2360e21b8152600490fd5b604051639c95219f60e01b8152600490fd5b34610321576020806003193601126103215760043567ffffffffffffffff811161032157610f7a903690600401611cd0565b919060405192610f8984611955565b5f8452828401610f9882611a55565b94610fa66040519687611971565b828652610fb283611a55565b93610fc486880195601f1901866124f4565b5f5b84811061102857604080518881528951818a018190525f92600582901b83018101918a918c9085015b828710610ffc5785850386f35b909192938280611018600193603f198a82030186528851611d4d565b9601920196019592919092610fef565b806110778861107161104460019560059d9c9d1b87018761246f565b929089846040519586938585013782018381015f81528b519283915e015f83820152038084520182611971565b30613f13565b611081828a611dbe565b5261108c8189611dbe565b5001969596610fc6565b34610321576003196040368201126103215760043567ffffffffffffffff8082116103215760c08260040193833603011261032157602435908111610321576110e3903690600401611cd0565b906110ec612bf0565b61111d61111861111361110c611102888061245a565b604081019061246f565b3691611993565b613e95565b613efe565b801561139b5760011015611389576024830161113981866124a2565b90501561137757604484019461114f86826124a2565b905015611365576111b561117d966111a961117461116d858061245a565b95856124a2565b999092856124a2565b91909261119a60405197611190896118a1565b33895236906119f7565b9a60209b8c8901523691611a6d565b60408601523691611a6d565b6060830152606485013560808301526111cd82612c32565b91825f525f875260405f20958654159687611211575b888860017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055604051908152f35b6001905560a46001600160a01b03917f87491344dfbcf91f6cbbc610cbbeedc85313d37a02df0c93527f7ea5f8db717f83855116604051908152878c82015260606040820152806112656060820188611e19565b0390a10191611274838561246f565b90506112b9575b505050506112ad92916103066102ef61030e933390919060405192600284526020840152604083015260608201604052565b828080808080806111e3565b6112c661110c848661246f565b6112cf816145d0565b156113425750937fd46c2c56b35c8210e9e712ec3f02242d5fc90187c0ac8ed80cc33626846ec369896112ad989795611335611318610306976102ef9761030e9b51169361246f565b866040519586958652850152606060408501526060840191612388565b0390a1938395965061127b565b89610597604051928392630c89984b60e31b845260048401526024830190611d4d565b60405163540e5f0b60e01b8152600490fd5b604051636c44ef8f60e01b8152600490fd5b604051633c8270bd60e21b8152600490fd5b604051632cff108b60e21b8152600490fd5b3461032157602080600319360112610321576024816001600160a01b036113d2611861565b16604051928380926370a0823160e01b82523060048301525afa908115610441575f91611403575b50604051908152f35b90508181813d8311611429575b61141a8183611971565b810103126103215751826113fa565b503d611410565b346103215761143e36611d01565b929161144b949194612bf0565b611456838333613b61565b61145f816134d6565b15611583578160ff916114778561153a969533612a60565b6114818183613543565b1561157d575080935b61149685828533613b95565b917f8045c25080b0868951141ed0a91720bcad09a8364a2b3109ee1fd49c1f0bc8b860c06114c5898833613bf3565b97906001600160a01b0360405192338452169a8b6020840152856040840152886060840152608083015260a0820152a16040519660068852602088015260408701526060860152608085015260a08401521660c082015260e08101604052906040519160018352602083015260408201604052565b90806115665760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b6115759261030e9136916123a8565b8080806104e6565b9361148a565b50604051623a3a4d60e21b81523360048201526001600160a01b039190911660248201526044810191909152606490fd5b34610321576080366003190112610321576004356001600160a01b0390818116809103610321576115e3611877565b6044359167ffffffffffffffff91606435838111610321573660238201121561032157806004013593841161032157366024858301011161032157611670956020921693611632868587613a82565b60405196879283926323e30c8b60e01b84523360048501528760248501528860448501525f606485015260a06084850152602460a485019201612388565b03815f855af1938415610441575f946116dc575b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd984036116c3576116b893503091613afb565b602060405160018152f35b604051630b6c58a960e31b815260048101859052602490fd5b9093506020813d602011611708575b816116f860209383611971565b8101031261032157519284611684565b3d91506116eb565b34610321576101403660031901126103215767ffffffffffffffff60043581811161032157611743903690600401611b02565b6024358281116103215761175b903690600401611b02565b60c0366043190112610321576101043583811161032157611780903690600401611cb5565b90610124359384116103215761179d6104e6943690600401611cb5565b926117a6612bf0565b611eca565b346103215760603660031901126103215760206117da6117c9611861565b6117d1611877565b60443591612a60565b604051908152f35b34610321576020366003190112610321576004355f525f6020526020600160405f205414604051908152f35b34610321576020366003190112610321576004359063ffffffff60e01b82168092036103215760209163e414309160e01b8114908115611850575b5015158152f35b6301ffc9a760e01b14905083611849565b600435906001600160a01b038216820361032157565b602435906001600160a01b038216820361032157565b35906001600160a01b038216820361032157565b60a0810190811067ffffffffffffffff8211176118bd57604052565b634e487b7160e01b5f52604160045260245ffd5b6060810190811067ffffffffffffffff8211176118bd57604052565b6040810190811067ffffffffffffffff8211176118bd57604052565b6080810190811067ffffffffffffffff8211176118bd57604052565b67ffffffffffffffff81116118bd57604052565b60e0810190811067ffffffffffffffff8211176118bd57604052565b6020810190811067ffffffffffffffff8211176118bd57604052565b90601f8019910116810190811067ffffffffffffffff8211176118bd57604052565b92919267ffffffffffffffff82116118bd57604051916119bd601f8201601f191660200184611971565b829481845281830111610321578281602093845f960137010152565b9080601f83011215610321578160206119f493359101611993565b90565b91906060838203126103215760405190611a10826118d1565b8193611a1b8161188d565b8352611a296020820161188d565b602084015260408101359167ffffffffffffffff831161032157604092611a5092016119d9565b910152565b67ffffffffffffffff81116118bd5760051b60200190565b929192611a7982611a55565b604092611a896040519283611971565b819581835260208093019160061b84019381851161032157915b848310611ab257505050505050565b8583830312610321578386918251611ac9816118ed565b611ad28661188d565b81528286013583820152815201920191611aa3565b9080601f83011215610321578160206119f493359101611a6d565b91909160a0818403126103215760405190611b1c826118a1565b8193611b278261188d565b835267ffffffffffffffff9160208101358381116103215782611b4b9183016119f7565b602085015260408101358381116103215782611b68918301611ae7565b6040850152606081013592831161032157611b896080939284938301611ae7565b60608501520135910152565b90929192611ba281611a55565b91604094611bb36040519485611971565b839583855260208095019160059460051b8401948186116103215784935b868510611be2575050505050505050565b67ffffffffffffffff90853582811161032157870190608082860312610321578551611c0d81611909565b611c168361188d565b81528a8301358b8201528683013584811161032157830186601f8201121561032157803590611c4482611a55565b91611c518a519384611971565b8083528d80840191891b83010191898311610321578e809101915b838310611ca557505050508782015260608084013594851161032157611c96878d968796016119d9565b90820152815201940193611bd1565b82358152918101918f9101611c6c565b9080601f83011215610321578160206119f493359101611b95565b9181601f840112156103215782359167ffffffffffffffff8311610321576020808501948460051b01011161032157565b906080600319830112610321576004356001600160a01b0381168103610321579160243591604435916064359067ffffffffffffffff821161032157611d4991600401611cd0565b9091565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b805115610d4a5760200190565b805160011015610d4a5760400190565b805160021015610d4a5760600190565b805160031015610d4a5760800190565b805160041015610d4a5760a00190565b8051821015610d4a5760209160051b010190565b9081518082526020808093019301915f5b828110611df1575050505090565b835180516001600160a01b031686528201518583015260409094019392810192600101611de3565b90608080611e8f611e7d611e6b60406001600160a01b0380895116885260208901519060a060208a01528082511660a08a015260208201511660c08901520151606060e0880152610100870190611d4d565b60408701518682036040880152611dd2565b60608601518582036060870152611dd2565b93015191015290565b90611ea282611a55565b611eaf6040519182611971565b8281528092611ec0601f1991611a55565b0190602036910137565b926001600160a01b038451166001600160a01b0383511614612376576001600160a01b03611eff606086015160643590611dbe565b515116906040830151916001600160a01b03611f1e6084358095611dbe565b51511614801590612336575b610d04576040850151906001600160a01b03611f496044358094611dbe565b5151166001600160a01b03611f6460643560608a0151611dbe565b5151161461232457611f7586612c32565b805f525f60205260405f2054156122d15750611f9084612c32565b805f525f60205260405f20541561227d5750612075929161204d917f6fa7f4c28634b0a9d6831401c45ae468195fb63aed07308935c35374ff5d9e3960405180611ff8611fea61012033845280602085015283018d611e19565b82810360408401528a611e19565b85606083015260643560808301528760a083015260a43560c083015260c43560e083015260e4356101008301520390a16001600160a01b038651166040519261204084611955565b5f8452606435908a612e9c565b9490506001600160a01b038651166040519261206884611955565b5f845260a4359086612e9c565b92905061208560408201516134d6565b158015612269575b8015612256575b8015612243575b61223157604051916120ac83611909565b5f83525f60208401525f60408401525f60608401526120cb84836144e1565b845260408401526120f16120df83866144e1565b6020860152806060860152845161356a565b94612105602085015160408601519061356a565b9361210f87613520565b8015612222575b612210576121d7612209957fd9fa84dd790c969daa5c33d8050dc06b4a9b59d5b42e2be5f5e8ae20447f618d946121b961220e9a60a0966121588a8851613594565b6121668c6020890151613594565b6121748a60408901516135f2565b6121828c60608901516135f2565b61218b8a61371d565b6121948c61371d565b6001600160a01b036121b060c435926060606435910151611dbe565b515116336137bd565b50506001600160a01b036121b060e43592606060a435910151611dbe565b5050606060405191338352805160208401526020810151604084015260408101518284015201516080820152a16138a9565b6138a9565b565b604051630d86822160e01b8152600490fd5b5061222c85613520565b612116565b6040516321badf1f60e01b8152600490fd5b506122516060840151613520565b61209b565b506122646060820151613520565b612094565b5061227760408401516134d6565b1561208d565b9351604080513381526001600160a01b039092166020830152810194909452507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f3945091925082915050606081015b0390a1565b9551604080513381526001600160a01b039092166020830152810196909652507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f3949350839250506060820190506122cc565b604051631cd2f1c760e21b8152600490fd5b506001600160a01b03612350606085015160a43590611dbe565b5151166001600160a01b0361236c604088015160443590611dbe565b5151161415611f2a565b604051630a98f1f360e21b8152600490fd5b908060209392818452848401375f828201840152601f01601f1916010190565b909291926123b581611a55565b916040916123c66040519485611971565b839581855260208095019160051b8301938185116103215783925b8584106123f15750505050505050565b67ffffffffffffffff90843582811161032157860190838286031261032157835161241b816118ed565b823584811161032157866124309185016119f7565b8152898301359384116103215761244b868b95869501611cb5565b838201528152019301926123e1565b903590605e1981360301821215610321570190565b903590601e1981360301821215610321570180359067ffffffffffffffff82116103215760200191813603831361032157565b903590601e1981360301821215610321570180359067ffffffffffffffff821161032157602001918160061b3603831361032157565b5f5b608081106124e6575050565b6060828201526020016124da565b5f5b82811061250257505050565b6060828201526020016124f6565b903590601e1981360301821215610321570180359067ffffffffffffffff821161032157602001918160051b3603831361032157565b60405190612553826118d1565b60606040835f81525f60208201520152565b60405190612572826118a1565b5f608083828152612581612546565b6020820152606060408201526060808201520152565b9015610d4a57803590607e1981360301821215610321570190565b903590609e1981360301821215610321570190565b9190811015610d4a5760061b0190565b356001600160a01b03811681036103215790565b3580151581036103215790565b9081518082526020808093019301915f5b828110612617575050505090565b835185529381019392810192600101612609565b9061264361014461263c84806125b2565b3690611b02565b5f5260205f81526040926001845f2054036129d057916128c5916126ca85855f61284a6126738361268a9a6125b2565b61268f878501359182878701359c8d923690611b02565b613fa4565b6126a761269c85806125b2565b946060810190612510565b96906126c28751966126b888611955565b8688523690611b02565b973691611b95565b906126d3612c63565b506127fa8651916126e3836118a1565b600483526126f28a84016124d8565b886126fc81612c32565b988b6001600160a01b039a8b84511690835192600384528301528282015233606082015260808101825261272f86611d71565b5261273985611d71565b508051612745816118d1565b6002815281368e83013761275886611d7e565b5261276285611d7e565b50810160ff8c6127c56127ae8d806127878161277f8b8a51611dbe565b515116614172565b97511690612796898851611dbe565b515116846127a58a8951611dbe565b51015191612a60565b958d6127bb828751611dbe565b5151169451611dbe565b51015192169093929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b61280382611d8e565b5261280d81611d8e565b506128318b886060810160ff8c6127c56127ae8d806127878161277f8b8a51611dbe565b61283a82611d9e565b5261284481611d9e565b50614250565b918385511693868601918b83519289818551169401511693878652308a5281808720915101519082519261287d84611955565b878452519561288b87611939565b86528a8601528d85015284606085015285608085015260a084015260c08301528a5180809a819463d04dfe2360e01b835260048301612de4565b03915afa95865f915f986129aa575b506128e35788513d5f823e3d90fd5b95938651600281106129935750888798998260c0979899015199015161291161290b85611dae565b51611d9e565b5161291c8183613543565b156129895750998a925b6129488b85919060405192600284526020840152604083015260608201604052565b61295186611d8e565b5261295b85611d8e565b5082519661296888611939565b8752860152840152866060840152608083015260a082015201526001929190565b9050998a92612926565b6024908a5190630fbb8e5560e21b82526004820152fd5b9097506129c991503d805f833e6129c18183611971565b810190612ca0565b965f6128d4565b505f92508291829150565b9035601e198236030181121561032157016020813591019167ffffffffffffffff8211610321578160061b3603831361032157565b9190808252602080920192915f905b828210612a2d575050505090565b909192936001906001600160a01b03612a458761188d565b16815285830135838201526040908101950193920190612a1f565b8215612a95576001600160a01b038091165f52600160205260405f2091165f5260205260405f20905f5260205260405f205490565b909150612aa182614172565b6001600160a01b03809316906040918251946370a0823160e01b86528416938460048701526020928387602481865afa968715612bb7575f97612bc1575b5083612af8612af183612b289a614f36565b50906149f8565b508651636eb1769f60e11b81526001600160a01b0390941660048501523060248501529297889081906044820190565b0381865afa968715612bb7575f97612b86575b50612af1612b4c916119f498614f36565b50612b578183613543565b15612b7e5750935b5f5260018252825f20905f528152815f20905f8052525f20549061407d565b905093612b5f565b96508387813d8311612bb0575b612b9d8183611971565b8101031261032157955195612af1612b3b565b503d612b93565b85513d5f823e3d90fd5b96508387813d8311612be9575b612bd88183611971565b810103126103215795519583612adf565b503d612bce565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f006002815414612c205760029055565b604051633ee5aeb560e01b8152600490fd5b604051612c5d81612c4f6020820194602086526040830190611e19565b03601f198101835282611971565b51902090565b60405190612c7082611939565b606060c083612c7d612565565b81525f60208201525f60408201525f838201528260808201525f60a08201520152565b919060408382031261032157825167ffffffffffffffff908181116103215784019082601f83011215610321578151602092612cdb82611a55565b91612ce96040519384611971565b808352848084019160051b830101918683116103215785809101915b838310612d785750505050948281015191821161032157019180601f84011215610321578251612d3481611a55565b93612d426040519586611971565b818552838086019260051b820101928311610321578301905b828210612d69575050505090565b81518152908301908301612d5b565b8251815291810191869101612d05565b90808251908181526020809101926020808460051b8301019501935f915b848310612db65750505050505090565b9091929394958480612dd4600193601f198682030187528a516125f8565b9801930193019194939290612da6565b91906020928381526001600160a01b0382511684820152838201516040820152612e1e604083015160e06060840152610100830190611d4d565b9060608301516080820152612e45608084015192601f1993848483030160a0850152612d88565b9260a081015193838382030160c08401528680865192838152019501905f5b818110612e88575050506119f494955060c060e091015192828503019101526125f8565b825187529588019591880191600101612e64565b94959395929192612eab612c63565b50604096875190612ebb826118a1565b60048252602093612ecd8584016124d8565b612ed689612c32565b6001600160a01b038097818c51168d519360038552898501528d840152166060820152608081018b52612f0884611d71565b52612f1283611d71565b508951612f1e816118d1565b600281528a3687830137612f3184611d7e565b52612f3b83611d7e565b50898901908681835190612f4e91611dbe565b515116612f5a90614172565b86888c51168984865190612f6d91611dbe565b5151168285875190612f7e91611dbe565b51015190612f8b92612a60565b928981865190612f9a91611dbe565b515116945190612fa991611dbe565b5101519060ff16612fe1929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b612fea83611d8e565b52612ff482611d8e565b5060608801858782519061300791611dbe565b51511661301390614172565b868a5116878984519061302591611dbe565b515116878a85519061303691611dbe565b5101519061304392612a60565b908689898186519061305491611dbe565b51511694519061306391611dbe565b5101519060ff1661309b929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b6130a483611d9e565b526130ae82611d9e565b506130b891614250565b9183875116938188019283519183818451169301511693865f523084528a805f20915101518b51916130e983611955565b5f83528c51966130f888611939565b8752858701528b8601525f60608601526080850186905260a085015260c0840152885163d04dfe2360e01b815292839081906131379060048301612de4565b03815a935f94fa91825f915f94613216575b506131585788513d5f823e3d90fd5b979495969791948251966002881097886131ff5750818385015194015161318161290b87611dae565b5161318c8183613543565b156131f75750925b6131b68585919060405192600284526020840152604083015260608201604052565b6131bf87611d8e565b526131c986611d8e565b5082519a6131d68c611939565b8b528a01528801526060870152608086015260a085015260c0840152159190565b905092613194565b602490835190630fbb8e5560e21b82526004820152fd5b90935061322d91503d805f833e6129c18183611971565b925f613149565b95949193908693613243612c63565b505f92604061335e815192613257846118a1565b600484526020936132698582016124d8565b6133276132758b612c32565b8b6001600160a01b03998a9283835116895191600383528b830152898201528360609b168b8201526080810189526132ac86611d71565b526132b685611d71565b5087516132c2816118d1565b6002815288368b8301376132d586611d7e565b526132df85611d7e565b5060ff896127c58a85019361331b876132fd8161277f858a51611dbe565b9751168861330c848951611dbe565b515116856127a5858a51611dbe565b966127bb828751611dbe565b61333082611d8e565b5261333a81611d8e565b50612831878b8d60ff896127c58c85019361331b876132fd8161277f858a51611dbe565b946133de5f868a511698869786889c0191825191888184511693015116928c8552308952878086209151015188519161339683611955565b8683528951956133a587611939565b86528a86015288850152848a8501528b608085015260a084015260c08301528551808095819463d04dfe2360e01b835260048301612de4565b03915afa90815f915f936134b8575b506134ab575050505f975b6002855110988915996134985782848701519601519061341a61290b89611dae565b51906134268284613543565b1590506134905750925b6134528685919060405192600284526020840152604083015260608201604052565b61345b88611d8e565b5261346587611d8e565b5082519b6134728d611939565b8c528b0152890152870152608086015260a085015260c08401529190565b905092613430565b50505050505050505091506119f4612c63565b91999850945093966133f8565b9092506134cf91503d805f833e6129c18183611971565b915f6133ed565b6134f5905f60e01d906001600160e01b038160e01d9116601b0b614fed565b1290565b906134f5916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b61506e565b61353f905f60e01d906001600160e01b038160e01d9116601b0b614fed565b1390565b9061353f916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b61506e565b6119f491610af4916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614544565b6135ee9160808101826135b06135aa8351611dae565b51611dae565b526135e76135e16001600160a01b038094515116936135d86135d28551611dae565b51611d71565b51169251611dae565b51611d8e565b5191613b95565b5050565b906080810191806136066135aa8551611d9e565b526001600160a01b038092515116916136226135d28551611d9e565b51166136316135e18551611d9e565b5190816136e55761364183613520565b6136cc579183917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a95936122cc955f5260209060018252613697604094855f20835f528452855f20855f528452855f205461407d565b945f5260018252835f20905f528152825f20915f52525f20555b51604051918291338352604060208401526040830190612d88565b60405163793a8f5560e01b815260048101849052602490fd5b91613716917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a95936122cc956137bd565b50506136b1565b6080810161372e6135e18251611d9e565b5191821561373b57505050565b6137556135d26001600160a01b0380935151169351611d9e565b5116815f5260209160018352604092835f20835f528152835f20855f528152835f2054936001600160e01b038516613790575b505050505050565b6137b4955f9284845260018152828420868552815282842091845252812055613bf3565b5f808080613788565b939291936137ca83613520565b6136cc57846137e6576137de939450613bf3565b50505f905f90565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f528152613823835f2054948561407d565b9561382d87613520565b613850575f97885260018252838820908852815282872091875252909320829055565b835163c5e12af560e01b815260048101889052602490fd5b90604082019082526020606081936040838201528551809452019301915f5b828110613895575050505090565b835185529381019392810192600101613887565b60c0810151908151915f92613a1d575b5061395e6020918281510151926001600160a01b039081818187511696015116928660a082019485518252308452604097888320898686510151015160808601518b519161390683611955565b8683528c519361391585611955565b8785528d519661392488611939565b8752898701528c86015260016060860152608085015260a084015260c08301528851808099819463d04dfe2360e01b835260048301612de4565b03915afa948515613a135787956139f5575b508451613981575b50505050505050565b81905101510151169051813b156139f1579184918493836139b6965180978195829463012c676d60e21b845260048401613868565b03925af19081156139e857506139d1575b8080808080613978565b6139db8291611925565b6139e557806139c7565b80fd5b513d84823e3d90fd5b8480fd5b613a0a9195503d8089833e6129c18183611971565b9050935f613970565b86513d89823e3d90fd5b6001600160a01b03602080845101510151169060a083015190823b1561032157613a60925f928360405180968195829463012c676d60e21b845260048401613868565b03925af1801561044157156138b957613a7a919250611925565b5f905f6138b9565b6040519263a9059cbb60e01b5f526001600160a01b0380931660045260245260205f60448180855af160015f5114811615613adc575b8360405215613ac657505050565b635274afe760e01b835216600482015260249150fd5b6001811516613af257813b15153d151616613ab8565b833d5f823e3d90fd5b9092604051936323b872dd60e01b5f526001600160a01b0393848092166004521660245260445260205f60648180855af160015f5114811615613b4b575b836040525f60605215613ac657505050565b6001811516613af257813b15153d151616613b39565b909115613b6c575050565b6040516305dbdfd960e41b81526001600160a01b03918216600482015291166024820152604490fd5b93929193613ba283613520565b6136cc5784613bb6576137de9394506140a7565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f528152613823835f2054948561356a565b90929192613c0081614573565b93613c0a81613520565b613c535784816001600160e01b03613c299360e01d9116601b0b615198565b50809281613c39575b5050509190565b6001600160a01b03613c4b9316613a82565b5f8181613c32565b604051632d1671a360e11b8152600490fd5b916040805191613c74836118a1565b60048084526020613c868186016124d8565b5f5b8751811015613cbb5780613c9e6001928a611dbe565b51613ca98289611dbe565b52613cb48188611dbe565b5001613c88565b5092955092939093335f52308352855f2091865190613cd9826118ed565b613ce1612546565b8252606085819301528751613cf581611955565b5f8152885191613d0483611955565b5f83525f3681375f5b8151811015613e6a57613d208183611dbe565b5190888c8b84519189818401518d8d8251613d48575b50505050505050506001915001613d0d565b5f613db797948197948c9794613d758c956001600160a01b039d8e81818d51169c0151169b015190614250565b94865199613d828b611939565b8a528901528488015286015260808501528a60a08501528b60c08501525180958194829363d04dfe2360e01b84528301612de4565b03915afa938415613e60578b915f95613e42575b508451613de0575b50908b8e89838d8d613d36565b51015116803b1561032157613e0f925f918c8f84905180978195829463012c676d60e21b845233908401613868565b03925af1918215613e3857600192613e29575b8981613dd3565b613e3290611925565b5f613e22565b8c513d5f823e3d90fd5b613e579195503d805f833e6129c18183611971565b9050935f613dcb565b8e513d5f823e3d90fd5b5050505050505050509050565b8115613e81570490565b634e487b7160e01b5f52601260045260245ffd5b6040815110613ef1576020810151908051603f198101908111613edd5760051c8211613ec95760016020920160051b010190565b5050604051613ed781611955565b5f815290565b634e487b7160e01b5f52601160045260245ffd5b50604051613ed781611955565b805115613f0e57602001515f1a90565b505f90565b905f8091602081519101845af48080613f91575b15613f475750506040513d81523d5f602083013e60203d82010160405290565b15613f6e57604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b3d15613f7f576040513d5f823e3d90fd5b60405163d6bda27560e01b8152600490fd5b503d151580613f275750813b1515613f27565b91613fcf906060613fc4936001600160a01b039485916040880151611dbe565b515116940151611dbe565b5151161461232457565b6140006001600160e01b0392838316601b0b9260e01d938160e01d9116601b0b84846147af565b90637ffffff58213614050575b90614017916149f8565b9290921580614048575b61402a57505090565b6044925060405191638eba4d0760e01b835260048301526024820152fd5b508215614021565b61405a82826156c1565b1561400d57604483856040519163d556b11160e01b835260048301526024820152fd5b6119f491610af4916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614d9d565b9291926140b382614573565b936140bd81613520565b61411e5784816001600160e01b036140dc9360e01d9116601b0b615198565b9290809315614109575b508290816140f5575050509190565b613c4b926001600160a01b03309216613afb565b9092505f198114613edd57600101915f6140e6565b604051632eaefac360e21b8152600490fd5b6004111561413a57565b634e487b7160e01b5f52602160045260245ffd5b602090939291936001600160a01b03604082019516815261416e83614130565b0152565b61417a6156da565b60408051630782d7e160e01b81526001600160a01b03831660048201529091828260248173200e12d10bb0c5e4a17e7018f0f1161919bb93895afa928315614247575f925f94614212575b506141cf83614130565b600183141580614200575b6141e45750505090565b5163ee07877f60e01b815291829161059791906004840161414e565b5061420a83614130565b8215156141da565b908094506142369293503d8511614240575b61422e8183611971565b810190614f0c565b919091925f6141c5565b503d614224565b513d5f823e3d90fd5b61425a8251611e98565b6142648351611e98565b9282519281518015155f146144d957600201935b6001940184019061428882611a55565b956142a360409361429b8551998a611971565b808952611a55565b6142b5602091601f1901828a016124f4565b5f9584519389896002926002885233868901523089890152606097606081018a526142df84611d71565b526142e983611d71565b505f825b614499575b505050508651614309575b50505050505050505090565b9091929360028861432c8c866143258e809c9d9e018093611dbe565b528d611dbe565b500185614339828d611dbe565b52614344818c611dbe565b505f965b614353575b506142fd565b8851871015614494576001600160a01b036143ff898b856143f68c60428c8861437c8488611dbe565b51511696858261438c868a611dbe565b5101519261439a868a611dbe565b51838d82511691015182815160051b910120908451927f6ec4dff745ec96dbde88c5d41f8aa5ac13aa1664afb47b8406b44fa945a650c88452830152838201522090519161190160f01b83528d83015260228201522093611dbe565b51015191614f64565b1561447c578761446b8b8e8c8f9e9d9c9b9a999897968f614458918d61444e898f8f61443a83889f614431828f611dbe565b51511692611dbe565b52614445828b611dbe565b51015192611dbe565b52019c8d94611dbe565b5101516144658383611dbe565b52611dbe565b500196979895909192939495614348565b8851630a57f30960e31b815260048101899052602490fd5b61434d565b9091929a82518210156144d157906144c584809301809d6144ba8487611dbe565b516144658383611dbe565b50019082918d936142ed565b9a92916142f2565b505f93614278565b916040830192604061451b610af4606087519401938451906001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6145f4565b9451930161452a8151866134f9565b614532575050565b9093506119f491925051925183613fd9565b919291600160ff1b840161455c57611d4993506150c3565b90611d49935f0391614d9d565b61401782826149f8565b61457b6156da565b6040805163b7bad1b160e01b81526001600160a01b0383166004820152909182826024815f73200e12d10bb0c5e4a17e7018f0f1161919bb93895af1928315614247575f925f9461421257506141cf83614130565b6008815110613f0e576008015167ffffffffffffffff1667ff0a89c674ee78741490565b9091939284158215175f1461460e5750505090505f905f90565b82810192600160fd1b8082019083011760fe1c614745575b505061463181615386565b9361463b81615386565b9461464686826153a6565b90918215614736575f9083986f0785ee10d5da46d900f436a000000000808611614728575b50670de0b6b3a7640000808b11614719575b50633b9aca00808b1161470a575b50612710808b116146fc575b5098805b6146eb57508190611d49989982600a0a9109960195817fcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccd0a93838211900382610100031b9203901c1702916153b9565b60019290920191600a90048061469b565b60049a04998a930192614697565b600991939a049901915f61468b565b601291939a049901915f61467d565b85049950602592505f61466b565b50929050611d499495506153b9565b5f8212156147995780841361478b575b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb284131561462657909250611d499394916152c4565b909250611d4993949161532b565b8084121561475557909250611d499394916152c4565b929091806147d5576044848460405191637a97930f60e01b835260048301526024820152fd5b90919280155f146147ea57505050505f905f90565b614803936147f791615473565b92919490938492615473565b909391928461481188615386565b9161481b86615386565b947f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000094604c918688106149c2575b030191600160ff1b98838a018112155f1461498f575050035b5f955f821280614986575b614968575b5f811280614956575b6149385786820103966001600160ff1b038814908161492e575b5080614925575b8061491c575b6148fe5750906148b2929161561f565b915f81136148c5575b50611d49936153b9565b9091604c82136148f3576148dc91600a0a90613e77565b9081156148e9575f6148bb565b505050505f905f90565b50505050505f905f90565b876044916040519163d556b11160e01b835260048301526024820152fd5b505f85126148a2565b5082841461489c565b905088145f614895565b604489836040519163d556b11160e01b835260048301526024820152fd5b50806001600160ff1b0301821361487b565b95508087018613156149805786818703015b95614872565b5f61497a565b505f811361486d565b89985090920390506001600160ff1b03819003870182136149b35701860194614862565b5050505050505050505f905f90565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009650604b9250614849565b8115613e81570590565b8082601b82810b8314614bed577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000008405614b99575b8380820b03614b8857507b199999999999999999999999999999999999999999999999999999987b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc84011115614b39575b838060030b03614abd575b808413614aa15750506001600160e01b036001925b60e01b91161791565b8303600a0a8015613e81576001600160e01b0391071592614a98565b92915f841315614b0d575090614ad383836156c1565b614aef57637ffffffe1901600a0a810290637fffffff92614a83565b506044916040519163d556b11160e01b835260048301526024820152fd5b637fffffff1992830390604382136148f357614b2c91600a0a906149ee565b9182156148e95792614a83565b5f198401808060030b14614b4d5750614a78565b90506001600160e01b039293507b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff915060e01b9260ff1d181617905f90565b600190940193600a90930592614a2b565b937f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000840515614bda576305f5e100600894058094819201955b915050614a2b565b620186a060059405809481920195614bd2565b5082614a7857505050505f90600190565b919291600160ff1b9190801580614d8b575090614c1a91615473565b9490929091905f868585858282138015614d82575b614d65575b505050508682841860ff1c94860391039081604c038111614d4a5701600a0a808205919084614d30575b505081019182821860ff1c1115614d2857826001600160ff1b0314614d0a57905f600192135f14614cdb57600a9004915b01925b81158117614c9f57509190565b80614cb8575b508015614cb0579190565b505f91508190565b9192614cce9203600160ff1b01600a0a906149ee565b600160ff1b91905f614ca5565b600a60037fe6666666666666666666666666666666666666666666666666666666666666679201040191614c8f565b604490836040519163d556b11160e01b835260048301526024820152fd5b509092614c92565b8107614d3d575b80614c5e565b60ff1d600117015f614d37565b505050919350614d58579190565b60018160ff1d1790039190565b5f9a50909750909550600160ff1b94509250905086808080614c34565b50835f12614c2f565b15614d965750509190565b9350919050565b9392919384158115818117614eee57505090614db891615473565b9194908295614dc982958294615473565b8096929491969387868482138015614ee5575b614ecc575b5050505050508682841860ff1c94860391039081604c038111614d4a5701600a0a808205919084614eb2575b505081019182821860ff1c1115614eaa57826001600160ff1b0314614d0a57905f600192135f14614e7b57600a9004915b01925b81158117614e4e57509190565b80614e5e57508015614cb0579190565b600160ff1b93614e759291038401600a0a906149ee565b5f614ca5565b600a60037fe6666666666666666666666666666666666666666666666666666666666666679201040191614e3e565b509092614e41565b8107614ebf575b80614e0d565b60ff1d600117015f614eb9565b929b5098509196509450925090505f8080808080614de1565b50858412614ddc565b9395939092919015614f04575050614cb0579190565b945092915050565b919082604091031261032157815160048110156103215760209092015160ff811681036103215790565b9060ff165f03916001600160ff1b0382115f14614f5c57600a6001818404940192061590565b909190600190565b9091813b614f9f57614f769192615743565b50614f8081614130565b159182614f8c57505090565b6001600160a01b03918216911614919050565b6020918160645f935160405192630b135d3f60e11b9788855260048501526040602485015286820190604485015e8281018201859052601f01601f191601915afa905f5114601f3d11161690565b92915f9060018184145f87128715171717615067575f92808213615059575b03604c81135f82121761504d57600a0a908461502b83820293846149ee565b146150405750501561503c575f9190565b5f90565b90935090156119f4579190565b50501561503c575f9190565b5f956001945092509061500c565b5050505f90565b93929190918083145f83125f871218831587151717176150bd575f928082136150b05703604c81135f82121761504d57600a0a908461502b83820293846149ee565b919460019350919061500c565b50919050565b909291600160ff1b91828101615155575080841461514b57808413918215615143578185035b604c8111156151325750505f915b1561512357507f8000000000000000000000000000000000000000000000000000000000000001019190565b92506001600160ff1b03039190565b600a0a908115613e815704916150f7565b8482036150e9565b505090505f905f90565b9361516292945f03614bfe565b80939180928114615176575b50505f039190565b915092506001600160ff1b038314614d0a57600a600191059201915f8061516e565b91925f8312156151c0576044838360405191634a7d166b60e01b835260048301526024820152fd5b9192836151d257505090505f90600190565b60ff811682019180831261529a575f83121561520a575050604c198112614cb0575f03600a0a916152038382613e77565b9283021490565b909293915f81135f1461529057604d811361526557600a0a928315613e8157835f1904831161523c5750500290600190565b60405163c849483b60e01b815260048101849052602481019290925260ff166044820152606490fd5b5060405163c849483b60e01b81526004810192909252602482015260ff919091166044820152606490fd5b5050905090600190565b60405163c849483b60e01b815260048101869052602481019190915260ff82166044820152606490fd5b909392915f6152d49181846145f4565b9490945f8483019182019412159081615321575b8115615317575b506152f957505090565b604492506040519163d556b11160e01b835260048301526024820152fd5b905083125f6152ef565b82811291506152e8565b61534093600160fe1b908101939201906145f4565b9081815f821215615377575050604b1982126137de57615365915f03600a0a906149ee565b908161536f575f90565b600160ff1b90565b93600160ff1b90910192509050565b5f8112156119f457600160ff1b9080820361539f575090565b90505f0390565b905f198183099102908180821091030391565b92939291905f818418121561544e576001600160ff1b03928383111561543857600160ff1b938385036153ee57505050509190565b90919293508514615408575050600a600191045f03920190565b604051630ed8062160e21b8152600481019190915260248101919091526044810182905260648101849052608490fd5b5090915050600160ff1b8114613edd575f039190565b90916001600160ff1b0380841115613c32578514615408575050600a60019104920190565b919091801561561557827f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000080830515615523575b507f19999999999999999999999999999999999999999999999999999999999999997f0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc830110615514575b83136154fe5791905f90565b919060018060ff1b926001600160ff1b03030190565b9290600a02905f1901926154f2565b6f4b3b4ca85a86c47a098a22400000000080840515615603575b507728c87cb5c89a2571ebfdcb54864ada834a000000000000008305156155ec575b7b097edd871cfda3a5697758bf0e3cbb5ac5741c6400000000000000008305156155d8575b7e3899162693736ac531a5a58f1fbb4b746504382ca7e40000000000000000008305156155c8578205156155b9575b5f6154a7565b9290600a02905f1901926155b3565b9391606402916001190193615584565b93916402540be40002916009190193615584565b9391678ac7230489e800000291601219019361555f565b6025198301955092909202915f61553d565b505f915081908190565b90915f19838309928083029283808610950394808603958487101561569d5714615695579082910960018219018216809204600280826003021880830282030280830282030280830282030280830282030280830282030280920290030293600183805f03040190848311900302920304170290565b505091500490565b60648386866040519263362ced0960e11b8452600484015260248301526044820152fd5b6119f491905f8112156156d5575f0361577d565b61577d565b73200e12d10bb0c5e4a17e7018f0f1161919bb9389803b158015615718575b6157005750565b602490604051906373e6d7b360e01b82526004820152fd5b507f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d41813f14156156f9565b81519190604183036157735761576c9250602082015190606060408401519301515f1a9061580c565b9192909190565b50505f9160029190565b90637ffffff581131561580657637ffffffe19810190604382136157ff575f8212156157d357637fffffff91505f0301600a0a7b8000000000000000000000000000000000000000000000000000000202111590565b50600a0a8015613e81577b80000000000000000000000000000000000000000000000000000001041090565b5050151590565b50505f90565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411615883579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa15610441575f516001600160a01b0381161561587957905f905f90565b505f906001905f90565b5050505f916003919056"; + hex"6080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a7146117d1575080632cb77e9f146117a557806341d1514f1461176e5780635343c1b7146116d35780635cffe9de146115775780635d003c44146113e3578063613255ab14611360578063687cf02a14611070578063ac9650d814610f22578063b0460f07146105cd578063b845b83e14610575578063ca9109ba14610400578063d9d98ce41461034f578063ddebc96f146102fb5763df6db3c2146100c1575f80fd5b346102d5576003196040368201126102d5576004359067ffffffffffffffff8083116102d5578260040160a0843603938401126102d5576024358281116102d557610110903690600401611c93565b90610119613236565b5f946001600160a01b03948561012e86612c8a565b1633036102d9576101476101423687611ac5565b613278565b91825f525f60205260405f2096600188541461018f575b60208960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556040519015158152f35b9091929394959697505f600198556040519133835284602084015260606040840152816101bb89611850565b16606084015260248a013590606219018112156102d55789019060a06080840152806101e960048401611850565b166101008401526101fc60248301611850565b166101208301526044810135602219823603018112156102d55701956024600488013597019287116102d55786360383136102d55760209860846102b884936102777f09d18501db0080ca2d6cd7c17fa7255daff4b2d503ea93b76ff68b6752ea8e63976102c89c6060610140890152610160880191612a3b565b6102a961029e61028a6044880185613021565b605f198a8603810160a08c01529491613056565b926064870190613021565b918784030160c0880152613056565b91013560e08301520390a16141c2565b5f8080808080808061015e565b5f80fd5b6024866102e587612c8a565b6040516335252be360e01b815291166004820152fd5b346102d5576003196020368201126102d5576004359067ffffffffffffffff82116102d55760809082360301126102d55761033a606091600401612cde565b90604051921515835260208301526040820152f35b346102d55760403660031901126102d5576001600160a01b03610370611824565b166040516370a0823160e01b8152306004820152602081602481855afa9081156103f5575f916103c3575b50156103ab5760206040515f8152f35b60249060405190633c5bf76960e21b82526004820152fd5b90506020813d6020116103ed575b816103de60209383611934565b810103126102d557518261039b565b3d91506103d1565b6040513d5f823e3d90fd5b346102d55761040e36611cc4565b8394939261041a613236565b610425848633613e0f565b61042e81613784565b15610543578061044261049192873361439d565b9590967f7f9dfa19cf1cc2f806f2f860fbc9c056b601fb1afc0e9b843dfe5c63616268e660806040513381526001600160a01b0384169a8b60208301528560408301526060820152a133613a6b565b959093826104c0575b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b610537966105319560ff936040519860068a5260208a01526040890152606088015260808701521660a08501523360c085015260e084019384604052610505856118fc565b600685526105166101008201612b8b565b61051f85611d71565b5261052984611d71565b503691612a5b565b90613f13565b8080808080808061049a565b6040516306dde9c360e41b81523360048201526001600160a01b038616602482015260448101859052606490fd5b0390fd5b346102d55760203660031901126102d55760043567ffffffffffffffff81116102d5576105316105ac61049a923690600401611c93565b91906105b6613236565b604051926105c384611918565b5f84523691612a5b565b346102d5576003196020368201126102d55767ffffffffffffffff600435116102d55760c090600435360301126102d557610606613236565b5f808061061b60048035608481019101612bc3565b905015610f1057602460043501359261063384613784565b15610efe57606080604051610647816118cc565b61064f612c18565b81525f60208201525f60408201520152610667612c18565b506106c76106c26106a161069761069161068b608460043501600435600401612bc3565b90612c4a565b80612c65565b6040810190612b55565b60206106ba61068b608460043501600435600401612bc3565b013591612c7a565b612c8a565b936001600160a01b036107166106c26106fd6106f361069161068b608460043501600435600401612bc3565b6060810190612b55565b60406106ba61068b608460043501600435600401612bc3565b816040519761072489611894565b1687521660208601526040850152610746608460043501600435600401612bc3565b9490506001604051955f87520160051b85016040525f905f5b610773608460043501600435600401612bc3565b9050811080610eeb575b15610d3857610796608460043501600435600401612bc3565b821015610d24578160051b810135607e19823603018112156102d55760808183013603126102d557604051916107cb836118cc565b8181013567ffffffffffffffff81116102d5576107ed90369084840101611ac5565b835280820160208181013590850152604080820135908501526060013567ffffffffffffffff81116102d5576108269236920101611c78565b606082015280516001600160a01b036108486040830151602085015190611d91565b5151166001600160a01b0385511614801590610cf0575b610cde5761087760208301516040840151908361429a565b61088081613278565b91825f525f60205260405f2054155f146108e4575051604080513381526001600160a01b039092166020830152810191909152600191907fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f390606090a15b0161075f565b919061091560208497959701516040850151906060860151906040519261090a84611918565b5f84523391866134e2565b5f949161097e57505051604080513381526001600160a01b03909216602083015281019190915260019291907f1e6fa9678edf81f9f25bbf308bde03ad3e110db1f429394b0915ba021532941490606090a15b8115610976575b50926108de565b90508861096f565b610993606082015160446004350135906137a7565b156109ed57505051604080513381526001600160a01b03909216602083015281019190915260019291907fe3151dc8cb7a54ffc4baabd28c1f241c94d510b5e5b502491ac3cad6c16316d59080606081015b0390a1610968565b6109fa6040820151613784565b158015610ccb575b15610a5857505051604080513381526001600160a01b03909216602083015281019190915260019291907f500b713857325f9e6dcb52ae832eca9109d107ed1aae9cb4928b4c1e13f051aa9080606081016109e5565b9250925050600196959691610a71606460043501612c9e565b15610c385796610ae197610af160408401516040880151610a9281836137f1565b15610c305750925b610aeb848592610ad4610ace60608a01516001600160e01b03601b918660e01d92828816810b928260e01d9216900b6148ea565b9061485f565b9d8e9260408d0151613818565b60408c0152614373565b99614373565b98610afc8484613842565b610b0684826138a0565b60405192338452608060208501526060610b2c8451608080880152610100870190611dec565b93602081015160a0870152604081015160c0870152015192607f198582030160e0860152835180825260208201906020808260051b8501019601925f5b828110610bc857505050505092806001979695937fbae4dbf76931c547f765e9def16d693d86daaa596f491de979008831789185ae93610bc396604084015260608301520390a180858c5101808d5260051b8c0152613b57565b610968565b9091929396602080610c23600193601f198782030189528b51906001600160a01b03825116815283820151848201526060610c126040840151608060408501526080840190612cab565b920151906060818403910152611d10565b9901950193929101610b69565b905092610a9a565b610ae190610af16060840151610aeb610c76610ace60408801516001600160e01b0394601b90868360e01d9316820b91878260e01d9216900b6148ea565b60408a0151610c8581836137f1565b15610cc35750915b829c8d916060890151908116155f14610cb4575060408801515b96879460408d0151613818565b610cbe90856142cf565b610ca7565b905091610c8d565b50610cd960608201516137ce565b610a02565b60405163936bb5ad60e01b8152600490fd5b506001600160a01b03610d0c6060830151604085015190611d91565b5151166001600160a01b03602086015116141561085f565b634e487b7160e01b5f52603260045260245ffd5b50919390610d4a606460043501612c9e565b15610ee557835b6004356004013590610d6382826137f1565b610ec75750508490610d83856001600160a01b0360208701511633613ea1565b505060a46004350190610d9b82600435600401612b22565b905015159081610ebf575b50610e1e575b506001600160a01b03610dc2929351163361439d565b50505b8351811015610dea5780610de4610dde60019387611d91565b516139cb565b01610dc5565b5060409160017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005582519182526020820152f35b90506001600160a01b03602084015116610e486001600160a01b0385511692600435600401612b22565b929091333b156102d557610e905f93604051958694859463691f9ed760e01b8652600486015260248501528960448501528a606485015260a0608485015260a4840191612a3b565b038183335af19081156103f557859115610dac579050610eb091506118e8565b5f836001600160a01b03610dac565b905088610da6565b604492506040519163573b6f4160e01b835260048301526024820152fd5b84610d51565b50610ef96040830151613784565b61077d565b60405163315f9e2360e21b8152600490fd5b604051639c95219f60e01b8152600490fd5b346102d5576020806003193601126102d55760043567ffffffffffffffff81116102d557610f54903690600401611c93565b919060405192610f6384611918565b5f8452828401610f7282611a18565b94610f806040519687611934565b828652610f8c83611a18565b93610f9e86880195601f190186612ba7565b5f5b84811061100257604080518881528951818a018190525f92600582901b83018101918a918c9085015b828710610fd65785850386f35b909192938280610ff2600193603f198a82030186528851611d10565b9601920196019592919092610fc9565b806110518861104b61101e60019560059d9c9d1b870187612b22565b929089846040519586938585013782018381015f81528b519283915e015f83820152038084520182611934565b30614209565b61105b828a611d91565b526110668189611d91565b5001969596610fa0565b346102d5576003196040368201126102d55760043567ffffffffffffffff8082116102d55760c0826004019383360301126102d5576024359081116102d5576110bd903690600401611c93565b6110c8929192613236565b6110f96110f46110ef6110e86110de8880612b0d565b6040810190612b22565b3691611956565b614144565b6141ad565b801561134e576001101561133c5760248201926111168486612b55565b90501561132a57604483019361112c8587612b55565b9050156113185761119261115a9561118661115161114a8a80612b0d565b948a612b55565b9890928a612b55565b9190926111776040519661116d88611864565b33885236906119ba565b9960209a8b8801523691611a30565b60408501523691611a30565b6060820152606484013560808201526111aa81613278565b90815f525f865260405f209485541595866111ee575b878760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055604051908152f35b6001905560a46001600160a01b03917f87491344dfbcf91f6cbbc610cbbeedc85313d37a02df0c93527f7ea5f8db717f83855116604051908152868b82015260606040820152806112426060820188611dec565b0390a10191611251838a612b22565b9050611274575b505050611267939495506141c2565b81908380808080806111c0565b6112816110e8848b612b22565b61128a816148c6565b156112f55750976112c87fd46c2c56b35c8210e9e712ec3f02242d5fc90187c0ac8ed80cc33626846ec369936112e893611267999a9b511692612b22565b92906040519384938452868c850152606060408501526060840191612a3b565b0390a18594938780611258565b88610571604051928392630c89984b60e31b845260048401526024830190611d10565b60405163540e5f0b60e01b8152600490fd5b604051636c44ef8f60e01b8152600490fd5b604051633c8270bd60e21b8152600490fd5b604051632cff108b60e21b8152600490fd5b346102d5576020806003193601126102d5576024816001600160a01b03611385611824565b16604051928380926370a0823160e01b82523060048301525afa9081156103f5575f916113b6575b50604051908152f35b90508181813d83116113dc575b6113cd8183611934565b810103126102d55751826113ad565b503d6113c3565b346102d5576113f136611cc4565b6113f9613236565b611404848633613e0f565b61140d83613784565b1561154a5761141d8486336130a6565b61142781856137f1565b15611544575082935b61143c85828833613e43565b9690947f8045c25080b0868951141ed0a91720bcad09a8364a2b3109ee1fd49c1f0bc8b860c061146d898533613ea1565b94906001600160a01b0360405192338452169a8b6020840152876040840152856060840152608083015260a0820152a1836114c85760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b611537976105319660ff946040519960078b5260208b015260408a01526060890152608088015260a08701521660c08501523360e085015261010084019384604052611513856118fc565b600685526115246101208201612b8b565b61152d85611d81565b5261052984611d81565b808080808080808061049a565b93611430565b604051623a3a4d60e21b81523360048201526001600160a01b038616602482015260448101859052606490fd5b346102d55760803660031901126102d5576004356001600160a01b03908181168091036102d5576115a661183a565b6044359167ffffffffffffffff916064358381116102d557366023820112156102d55780600401359384116102d55736602485830101116102d5576116339560209216936115f5868587613d30565b60405196879283926323e30c8b60e01b84523360048501528760248501528860448501525f606485015260a06084850152602460a485019201612a3b565b03815f855af19384156103f5575f9461169f575b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd984036116865761167b93503091613da9565b602060405160018152f35b604051630b6c58a960e31b815260048101859052602490fd5b9093506020813d6020116116cb575b816116bb60209383611934565b810103126102d557519284611647565b3d91506116ae565b346102d5576101403660031901126102d55767ffffffffffffffff6004358181116102d557611706903690600401611ac5565b6024358281116102d55761171e903690600401611ac5565b60c03660431901126102d557610104358381116102d557611743903690600401611c78565b90610124359384116102d55761176061049a943690600401611c78565b92611769613236565b611e9d565b346102d55760603660031901126102d557602061179d61178c611824565b61179461183a565b604435916130a6565b604051908152f35b346102d55760203660031901126102d5576004355f525f6020526020600160405f205414604051908152f35b346102d55760203660031901126102d5576004359063ffffffff60e01b82168092036102d55760209163e414309160e01b8114908115611813575b5015158152f35b6301ffc9a760e01b1490508361180c565b600435906001600160a01b03821682036102d557565b602435906001600160a01b03821682036102d557565b35906001600160a01b03821682036102d557565b60a0810190811067ffffffffffffffff82111761188057604052565b634e487b7160e01b5f52604160045260245ffd5b6060810190811067ffffffffffffffff82111761188057604052565b6040810190811067ffffffffffffffff82111761188057604052565b6080810190811067ffffffffffffffff82111761188057604052565b67ffffffffffffffff811161188057604052565b60e0810190811067ffffffffffffffff82111761188057604052565b6020810190811067ffffffffffffffff82111761188057604052565b90601f8019910116810190811067ffffffffffffffff82111761188057604052565b92919267ffffffffffffffff82116118805760405191611980601f8201601f191660200184611934565b8294818452818301116102d5578281602093845f960137010152565b9080601f830112156102d5578160206119b793359101611956565b90565b91906060838203126102d557604051906119d382611894565b81936119de81611850565b83526119ec60208201611850565b602084015260408101359167ffffffffffffffff83116102d557604092611a13920161199c565b910152565b67ffffffffffffffff81116118805760051b60200190565b929192611a3c82611a18565b604092611a4c6040519283611934565b819581835260208093019160061b8401938185116102d557915b848310611a7557505050505050565b85838303126102d5578386918251611a8c816118b0565b611a9586611850565b81528286013583820152815201920191611a66565b9080601f830112156102d5578160206119b793359101611a30565b91909160a0818403126102d55760405190611adf82611864565b8193611aea82611850565b835267ffffffffffffffff9160208101358381116102d55782611b0e9183016119ba565b602085015260408101358381116102d55782611b2b918301611aaa565b604085015260608101359283116102d557611b4c6080939284938301611aaa565b60608501520135910152565b90929192611b6581611a18565b91604094611b766040519485611934565b839583855260208095019160059460051b8401948186116102d55784935b868510611ba5575050505050505050565b67ffffffffffffffff9085358281116102d5578701906080828603126102d5578551611bd0816118cc565b611bd983611850565b81528a8301358b820152868301358481116102d557830186601f820112156102d557803590611c0782611a18565b91611c148a519384611934565b8083528d80840191891b830101918983116102d5578e809101915b838310611c685750505050878201526060808401359485116102d557611c59878d9687960161199c565b90820152815201940193611b94565b82358152918101918f9101611c2f565b9080601f830112156102d5578160206119b793359101611b58565b9181601f840112156102d55782359167ffffffffffffffff83116102d5576020808501948460051b0101116102d557565b9060806003198301126102d5576004356001600160a01b03811681036102d5579160243591604435916064359067ffffffffffffffff82116102d557611d0c91600401611c93565b9091565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b805115610d245760200190565b805160011015610d245760400190565b805160021015610d245760600190565b805160031015610d245760800190565b805160041015610d245760a00190565b805160051015610d245760c00190565b8051821015610d245760209160051b010190565b9081518082526020808093019301915f5b828110611dc4575050505090565b835180516001600160a01b031686528201518583015260409094019392810192600101611db6565b90608080611e62611e50611e3e60406001600160a01b0380895116885260208901519060a060208a01528082511660a08a015260208201511660c08901520151606060e0880152610100870190611d10565b60408701518682036040880152611da5565b60608601518582036060870152611da5565b93015191015290565b90611e7582611a18565b611e826040519182611934565b8281528092611e93601f1991611a18565b0190602036910137565b926001600160a01b038451166001600160a01b0383511614612a29576001600160a01b03611ed2606086015160643590611d91565b5151166001600160a01b03611eee604085015160843590611d91565b515116148015906129e9575b610cde576001600160a01b03611f17604086015160443590611d91565b5151166001600160a01b03611f326064356060880151611d91565b515116146129d757611f4384613278565b805f525f60205260405f2054156129875750611f5e82613278565b805f525f60205260405f20541561293757506122ce907f6fa7f4c28634b0a9d6831401c45ae468195fb63aed07308935c35374ff5d9e3960405180611fc1611fb361012033845280602085015283018a611dec565b828103604084015287611dec565b6044356060830152606435608083015260843560a083015260a43560c083015260c43560e083015260e4356101008301520390a161223a6001600160a01b03845116916040519261201184611918565b5f845261201c6132a9565b506040519061202a826118fc565b6006825261203a60208301612b8b565b61204389613278565b906001600160a01b038a511660405192600384526020840152604083015260608201526080810160405261207682611d34565b5261208081611d34565b5060405161208d81611894565b6002815260403660208301376120a282611d41565b526120ac81611d41565b506121806120d36001600160a01b036120cb60443560408d0151611d91565b515116614468565b6121196001600160a01b038b51168b60206121106001600160a01b036120ff6044356040860151611d91565b515116926040604435910151611d91565b510151916130a6565b908a60ff602061214b6001600160a01b0361213a6044356040870151611d91565b515116936040604435910151611d91565b51015192169093929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b61218982611d51565b5261219381611d51565b506122216121b26001600160a01b036120cb60643560608d0151611d91565b6121ef6001600160a01b038b51168b60206121106001600160a01b036121de6064356060860151611d91565b515116926060606435910151611d91565b908a60ff602061214b6001600160a01b036122106064356060870151611d91565b515116936060606435910151611d91565b61222a82611d61565b5261223481611d61565b50614546565b905f6001600160a01b038751169160208801516001600160a01b0360208183511692015116918484523060205260408420604060208c015101516040519161228183611918565b86835260405195612291876118fc565b86526020860152604085015284606085015286608085015260a084015260c0830152604051808097819463d04dfe2360e01b83526004830161342a565b03915afa92835f915f95612919575b506122ed576040513d5f823e3d90fd5b92918351600281106128d357506040602085015194015161231661231083611d71565b51611d61565b5161232181836137f1565b156129115750935b61234b8186919060405192600284526020840152604083015260608201604052565b61235483611d51565b5261235e82611d51565b506040519461236c866118fc565b888652606435602087015260408601526060850152608084015260a083015260c082015261256e6001600160a01b0385511693604051946123ac86611918565b5f86526123b76132a9565b50604051906123c5826118fc565b600682526123d560208301612b8b565b6123de86613278565b906001600160a01b0387511660405192600384526020840152604083015260608201526080810160405261241182611d34565b5261241b81611d34565b5060405161242881611894565b60028152604036602083013761243d82611d41565b5261244781611d41565b506124d16124666001600160a01b036120cb60843560408a0151611d91565b6124a16001600160a01b038851166001600160a01b0361248c60843560408c0151611d91565b515116602061211060843560408d0151611d91565b906001600160a01b036124ba60843560408b0151611d91565b51511660ff602061214b60843560408d0151611d91565b6124da82611d51565b526124e481611d51565b506122216125036001600160a01b036120cb60a43560608a0151611d91565b61253e6001600160a01b038851166001600160a01b0361252960a43560608c0151611d91565b515116602061211060a43560608d0151611d91565b906001600160a01b0361255760a43560608b0151611d91565b51511660ff602061214b60a43560608d0151611d91565b926126045f6001600160a01b038551169260208601908151906001600160a01b03602081845116930151169286855230602052604080862091510151604051916125b783611918565b868352604051956125c7876118fc565b86526020860152604085015284606085015289608085015260a084015260c0830152604051808095819463d04dfe2360e01b83526004830161342a565b03915afa90815f915f936128eb575b50612623576040513d5f823e3d90fd5b908151600281106128d357506040602083015192015161264561231088611d71565b5161265081836137f1565b156128cb5750925b61267a8385919060405192600284526020840152604083015260608201604052565b61268388611d51565b5261268d87611d51565b506040519661269b886118fc565b86885260a43560208901526040880194855260608801938452608088015260a087015260c08601526126d06040840151613784565b159182156128b7575b5081156128a2575b8115612891575b5061287f57604051916126fa836118cc565b5f83525f60208401525f60408401525f606084015261271984836147d7565b8452604084015261273f61272d83866147d7565b60208601528060608601528451613818565b946127536020850151604086015190613818565b9361275d876137ce565b8015612870575b61285e57612825612857957fd9fa84dd790c969daa5c33d8050dc06b4a9b59d5b42e2be5f5e8ae20447f618d9461280761285c9a60a0966127a68a8851613842565b6127b48c6020890151613842565b6127c28a60408901516138a0565b6127d08c60608901516138a0565b6127d98a6139cb565b6127e28c6139cb565b6001600160a01b036127fe60c435926060606435910151611d91565b51511633613a6b565b50506001600160a01b036127fe60e43592606060a435910151611d91565b5050606060405191338352805160208401526020810151604084015260408101518284015201516080820152a1613b57565b613b57565b565b604051630d86822160e01b8152600490fd5b5061287a856137ce565b612764565b6040516321badf1f60e01b8152600490fd5b61289c9150516137ce565b5f6126e8565b90506128b160608301516137ce565b906126e1565b6128c391925051613784565b15905f6126d9565b905092612658565b60249060405190630fbb8e5560e21b82526004820152fd5b90925061290a91503d805f833e6129028183611934565b8101906132e6565b915f612613565b905093612329565b90945061293091503d805f833e6129028183611934565b935f6122dd565b9151604080513381526001600160a01b039092166020830152810192909252507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f39250905080606081015b0390a1565b9351604080513381526001600160a01b039092166020830152810194909452507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f392915081905060608101612982565b604051631cd2f1c760e21b8152600490fd5b506001600160a01b03612a03606084015160a43590611d91565b5151166001600160a01b03612a1f604087015160443590611d91565b5151161415611efa565b604051630a98f1f360e21b8152600490fd5b908060209392818452848401375f828201840152601f01601f1916010190565b90929192612a6881611a18565b91604091612a796040519485611934565b839581855260208095019160051b8301938185116102d55783925b858410612aa45750505050505050565b67ffffffffffffffff9084358281116102d55786019083828603126102d5578351612ace816118b0565b82358481116102d55786612ae39185016119ba565b8152898301359384116102d557612afe868b95869501611c78565b83820152815201930192612a94565b903590605e19813603018212156102d5570190565b903590601e19813603018212156102d5570180359067ffffffffffffffff82116102d5576020019181360383136102d557565b903590601e19813603018212156102d5570180359067ffffffffffffffff82116102d557602001918160061b360383136102d557565b5f5b60c08110612b99575050565b606082820152602001612b8d565b5f5b828110612bb557505050565b606082820152602001612ba9565b903590601e19813603018212156102d5570180359067ffffffffffffffff82116102d557602001918160051b360383136102d557565b60405190612c0682611894565b60606040835f81525f60208201520152565b60405190612c2582611864565b5f608083828152612c34612bf9565b6020820152606060408201526060808201520152565b9015610d2457803590607e19813603018212156102d5570190565b903590609e19813603018212156102d5570190565b9190811015610d245760061b0190565b356001600160a01b03811681036102d55790565b3580151581036102d55790565b9081518082526020808093019301915f5b828110612cca575050505090565b835185529381019392810192600101612cbc565b90612cf6610142612cef8480612c65565b3690611ac5565b5f5260205f81526040926001845f2054036130165791612f1991612d7d85855f612e9e612d2683612d3d9a612c65565b612d42878501359182878701359c8d923690611ac5565b61429a565b612d5a612d4f8580612c65565b946060810190612bc3565b9690612d75875196612d6b88611918565b8688523690611ac5565b973691611b58565b90612d866132a9565b50612e67865191612d96836118fc565b60068352612da58a8401612b8b565b88612daf81613278565b988b6001600160a01b039a8b845116908351926003845283015282820152336060820152608081018252612de286611d34565b52612dec85611d34565b508051612df881611894565b6002815281368e830137612e0b86611d41565b52612e1585611d41565b50810160ff8c61214b612e508d80612e32816120cb8b8a51611d91565b97511690612e41898851611d91565b515116846121108a8951611d91565b958d612e5d828751611d91565b5151169451611d91565b612e7082611d51565b52612e7a81611d51565b506122218b886060810160ff8c61214b612e508d80612e32816120cb8b8a51611d91565b918385511693868601918b83519289818551169401511693878652308a52818087209151015190825192612ed184611918565b8784525195612edf876118fc565b86528a8601528d85015284606085015285608085015260a084015260c08301528a5180809a819463d04dfe2360e01b83526004830161342a565b03915afa95865f915f98612ff8575b50612f375788513d5f823e3d90fd5b9593865160028110612fe15750888798998260c09798990151990151612f5f61231085611d71565b51612f6a81836137f1565b15612fd75750998a925b612f968b85919060405192600284526020840152604083015260608201604052565b612f9f86611d51565b52612fa985611d51565b50825196612fb6886118fc565b8752860152840152866060840152608083015260a082015201526001929190565b9050998a92612f74565b6024908a5190630fbb8e5560e21b82526004820152fd5b90975061300f91503d805f833e6129028183611934565b965f612f28565b505f92508291829150565b9035601e19823603018112156102d557016020813591019167ffffffffffffffff82116102d5578160061b360383136102d557565b9190808252602080920192915f905b828210613073575050505090565b909192936001906001600160a01b0361308b87611850565b16815285830135838201526040908101950193920190613065565b82156130db576001600160a01b038091165f52600160205260405f2091165f5260205260405f20905f5260205260405f205490565b9091506130e782614468565b6001600160a01b03809316906040918251946370a0823160e01b86528416938460048701526020928387602481865afa9687156131fd575f97613207575b508361313e6131378361316e9a61522c565b5090614cee565b508651636eb1769f60e11b81526001600160a01b0390941660048501523060248501529297889081906044820190565b0381865afa9687156131fd575f976131cc575b50613137613192916119b79861522c565b5061319d81836137f1565b156131c45750935b5f5260018252825f20905f528152815f20905f8052525f205490614373565b9050936131a5565b96508387813d83116131f6575b6131e38183611934565b810103126102d557955195613137613181565b503d6131d9565b85513d5f823e3d90fd5b96508387813d831161322f575b61321e8183611934565b810103126102d55795519583613125565b503d613214565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0060028154146132665760029055565b604051633ee5aeb560e01b8152600490fd5b6040516132a3816132956020820194602086526040830190611dec565b03601f198101835282611934565b51902090565b604051906132b6826118fc565b606060c0836132c3612c18565b81525f60208201525f60408201525f838201528260808201525f60a08201520152565b91906040838203126102d557825167ffffffffffffffff908181116102d55784019082601f830112156102d557815160209261332182611a18565b9161332f6040519384611934565b808352848084019160051b830101918683116102d55785809101915b8383106133be575050505094828101519182116102d557019180601f840112156102d557825161337a81611a18565b936133886040519586611934565b818552838086019260051b8201019283116102d5578301905b8282106133af575050505090565b815181529083019083016133a1565b825181529181019186910161334b565b90808251908181526020809101926020808460051b8301019501935f915b8483106133fc5750505050505090565b909192939495848061341a600193601f198682030187528a51612cab565b98019301930191949392906133ec565b91906020928381526001600160a01b0382511684820152838201516040820152613464604083015160e06060840152610100830190611d10565b906060830151608082015261348b608084015192601f1993848483030160a08501526133ce565b9260a081015193838382030160c08401528680865192838152019501905f5b8181106134ce575050506119b794955060c060e09101519282850301910152612cab565b8251875295880195918801916001016134aa565b959491939086936134f16132a9565b505f92604061360c815192613505846118fc565b60068452602093613517858201612b8b565b6135d56135238b613278565b8b6001600160a01b03998a9283835116895191600383528b830152898201528360609b168b82015260808101895261355a86611d34565b5261356485611d34565b50875161357081611894565b6002815288368b83013761358386611d41565b5261358d85611d41565b5060ff8961214b8a8501936135c9876135ab816120cb858a51611d91565b975116886135ba848951611d91565b51511685612110858a51611d91565b96612e5d828751611d91565b6135de82611d51565b526135e881611d51565b50612221878b8d60ff8961214b8c8501936135c9876135ab816120cb858a51611d91565b9461368c5f868a511698869786889c0191825191888184511693015116928c8552308952878086209151015188519161364483611918565b868352895195613653876118fc565b86528a86015288850152848a8501528b608085015260a084015260c08301528551808095819463d04dfe2360e01b83526004830161342a565b03915afa90815f915f93613766575b50613759575050505f975b600285511098891599613746578284870151960151906136c861231089611d71565b51906136d482846137f1565b15905061373e5750925b6137008685919060405192600284526020840152604083015260608201604052565b61370988611d51565b5261371387611d51565b5082519b6137208d6118fc565b8c528b0152890152870152608086015260a085015260c08401529190565b9050926136de565b50505050505050505091506119b76132a9565b91999850945093966136a6565b90925061377d91503d805f833e6129028183611934565b915f61369b565b6137a3905f60e01d906001600160e01b038160e01d9116601b0b6152e3565b1290565b906137a3916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b615364565b6137ed905f60e01d906001600160e01b038160e01d9116601b0b6152e3565b1390565b906137ed916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b615364565b6119b791610ace916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b61483a565b61389c91608081018261385e6138588351611d71565b51611d71565b5261389561388f6001600160a01b038094515116936138866138808551611d71565b51611d34565b51169251611d71565b51611d51565b5191613e43565b5050565b906080810191806138b46138588551611d61565b526001600160a01b038092515116916138d06138808551611d61565b51166138df61388f8551611d61565b519081613993576138ef836137ce565b61397a579183917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a9593612982955f5260209060018252613945604094855f20835f528452855f20855f528452855f2054614373565b945f5260018252835f20905f528152825f20915f52525f20555b516040519182913383526040602084015260408301906133ce565b60405163793a8f5560e01b815260048101849052602490fd5b916139c4917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a959361298295613a6b565b505061395f565b608081016139dc61388f8251611d61565b519182156139e957505050565b613a036138806001600160a01b0380935151169351611d61565b5116815f5260209160018352604092835f20835f528152835f20855f528152835f2054936001600160e01b038516613a3e575b505050505050565b613a62955f9284845260018152828420868552815282842091845252812055613ea1565b5f808080613a36565b93929193613a78836137ce565b61397a5784613a9457613a8c939450613ea1565b50505f905f90565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f528152613ad1835f20549485614373565b95613adb876137ce565b613afe575f97885260018252838820908852815282872091875252909320829055565b835163c5e12af560e01b815260048101889052602490fd5b90604082019082526020606081936040838201528551809452019301915f5b828110613b43575050505090565b835185529381019392810192600101613b35565b60c0810151908151915f92613ccb575b50613c0c6020918281510151926001600160a01b039081818187511696015116928660a082019485518252308452604097888320898686510151015160808601518b5191613bb483611918565b8683528c5193613bc385611918565b8785528d5196613bd2886118fc565b8752898701528c86015260016060860152608085015260a084015260c08301528851808099819463d04dfe2360e01b83526004830161342a565b03915afa948515613cc1578795613ca3575b508451613c2f575b50505050505050565b81905101510151169051813b15613c9f57918491849383613c64965180978195829463012c676d60e21b845260048401613b16565b03925af1908115613c965750613c7f575b8080808080613c26565b613c8982916118e8565b613c935780613c75565b80fd5b513d84823e3d90fd5b8480fd5b613cb89195503d8089833e6129028183611934565b9050935f613c1e565b86513d89823e3d90fd5b6001600160a01b03602080845101510151169060a083015190823b156102d557613d0e925f928360405180968195829463012c676d60e21b845260048401613b16565b03925af180156103f55715613b6757613d289192506118e8565b5f905f613b67565b6040519263a9059cbb60e01b5f526001600160a01b0380931660045260245260205f60448180855af160015f5114811615613d8a575b8360405215613d7457505050565b635274afe760e01b835216600482015260249150fd5b6001811516613da057813b15153d151616613d66565b833d5f823e3d90fd5b9092604051936323b872dd60e01b5f526001600160a01b0393848092166004521660245260445260205f60648180855af160015f5114811615613df9575b836040525f60605215613d7457505050565b6001811516613da057813b15153d151616613de7565b909115613e1a575050565b6040516305dbdfd960e41b81526001600160a01b03918216600482015291166024820152604490fd5b93929193613e50836137ce565b61397a5784613e6457613a8c93945061439d565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f528152613ad1835f20549485613818565b90929192613eae81614869565b93613eb8816137ce565b613f015784816001600160e01b03613ed79360e01d9116601b0b61548e565b50809281613ee7575b5050509190565b6001600160a01b03613ef99316613d30565b5f8181613ee0565b604051632d1671a360e11b8152600490fd5b919091604092835192613f25846118fc565b60068452602094613f37868601612b8b565b5f5b8451811015613f6c5780613f4f60019287611d91565b51613f5a8289611d91565b52613f658188611d91565b5001613f39565b50925092939093335f52308252825f2091835195613f89876118b0565b613f91612bf9565b875260608281980152845190613fa682611918565b5f8252855190613fb582611918565b5f82525f3681375f5b815181101561411a57898688613fd48486611d91565b51888151948d80870151908151613ff6575b5050505050505050600101613fbe565b905f92916001600160a01b039661401b8887818d51169c015116998789015190614546565b958251996140288b6118fc565b8a5289015287015285015260808401528760a08401528660c08401525f8c51809563d04dfe2360e01b8252818061406360049889830161342a565b03915afa938415614110579089915f956140f2575b50845161408e575b50899250808e8c938e613fe6565b5101511691823b156102d5576140bc925f92838d5180968195829463012c676d60e21b845233908401613b16565b03925af180156140e85790600192916140d9575b81928782614080565b6140e2906118e8565b5f6140d0565b89513d5f823e3d90fd5b6141079195503d805f833e6129028183611934565b9050935f614078565b8c513d5f823e3d90fd5b50505050505050509050565b8115614130570490565b634e487b7160e01b5f52601260045260245ffd5b60408151106141a0576020810151908051603f19810190811161418c5760051c82116141785760016020920160051b010190565b505060405161418681611918565b5f815290565b634e487b7160e01b5f52601160045260245ffd5b5060405161418681611918565b8051156141bd57602001515f1a90565b505f90565b61285c92916141ed610531923390919060405192600284526020840152604083015260608201604052565b9260405193600185526020850152604084016040523691612a5b565b905f8091602081519101845af48080614287575b1561423d5750506040513d81523d5f602083013e60203d82010160405290565b1561426457604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b3d15614275576040513d5f823e3d90fd5b60405163d6bda27560e01b8152600490fd5b503d15158061421d5750813b151561421d565b916142c59060606142ba936001600160a01b039485916040880151611d91565b515116940151611d91565b515116146129d757565b6142f66001600160e01b0392838316601b0b9260e01d938160e01d9116601b0b8484614aa5565b90637ffffff58213614346575b9061430d91614cee565b929092158061433e575b61432057505090565b6044925060405191638eba4d0760e01b835260048301526024820152fd5b508215614317565b61435082826159b7565b1561430357604483856040519163d556b11160e01b835260048301526024820152fd5b6119b791610ace916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b615093565b9291926143a982614869565b936143b3816137ce565b6144145784816001600160e01b036143d29360e01d9116601b0b61548e565b92908093156143ff575b508290816143eb575050509190565b613ef9926001600160a01b03309216613da9565b9092505f19811461418c57600101915f6143dc565b604051632eaefac360e21b8152600490fd5b6004111561443057565b634e487b7160e01b5f52602160045260245ffd5b602090939291936001600160a01b03604082019516815261446483614426565b0152565b6144706159d0565b60408051630782d7e160e01b81526001600160a01b03831660048201529091828260248173200e12d10bb0c5e4a17e7018f0f1161919bb93895afa92831561453d575f925f94614508575b506144c583614426565b6001831415806144f6575b6144da5750505090565b5163ee07877f60e01b8152918291610571919060048401614444565b5061450083614426565b8215156144d0565b9080945061452c9293503d8511614536575b6145248183611934565b810190615202565b919091925f6144bb565b503d61451a565b513d5f823e3d90fd5b6145508251611e6b565b61455a8351611e6b565b9282519281518015155f146147cf57600201935b6001940184019061457e82611a18565b956145996040936145918551998a611934565b808952611a18565b6145ab602091601f1901828a01612ba7565b5f9584519389896002926002885233868901523089890152606097606081018a526145d584611d34565b526145df83611d34565b505f825b61478f575b5050505086516145ff575b50505050505050505090565b909192936002886146228c8661461b8e809c9d9e018093611d91565b528d611d91565b50018561462f828d611d91565b5261463a818c611d91565b505f965b614649575b506145f3565b885187101561478a576001600160a01b036146f5898b856146ec8c60428c886146728488611d91565b515116968582614682868a611d91565b51015192614690868a611d91565b51838d82511691015182815160051b910120908451927f6ec4dff745ec96dbde88c5d41f8aa5ac13aa1664afb47b8406b44fa945a650c88452830152838201522090519161190160f01b83528d83015260228201522093611d91565b5101519161525a565b1561477257876147618b8e8c8f9e9d9c9b9a999897968f61474e918d614744898f8f61473083889f614727828f611d91565b51511692611d91565b5261473b828b611d91565b51015192611d91565b52019c8d94611d91565b51015161475b8383611d91565b52611d91565b50019697989590919293949561463e565b8851630a57f30960e31b815260048101899052602490fd5b614643565b9091929a82518210156147c757906147bb84809301809d6147b08487611d91565b5161475b8383611d91565b50019082918d936145e3565b9a92916145e8565b505f9361456e565b9160408301926040614811610ace606087519401938451906001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6148ea565b945193016148208151866137a7565b614828575050565b9093506119b7919250519251836142cf565b919291600160ff1b840161485257611d0c93506153b9565b90611d0c935f0391615093565b61430d8282614cee565b6148716159d0565b6040805163b7bad1b160e01b81526001600160a01b0383166004820152909182826024815f73200e12d10bb0c5e4a17e7018f0f1161919bb93895af192831561453d575f925f9461450857506144c583614426565b60088151106141bd576008015167ffffffffffffffff1667ff0a89c674ee78741490565b9091939284158215175f146149045750505090505f905f90565b82810192600160fd1b8082019083011760fe1c614a3b575b50506149278161567c565b936149318161567c565b9461493c868261569c565b90918215614a2c575f9083986f0785ee10d5da46d900f436a000000000808611614a1e575b50670de0b6b3a7640000808b11614a0f575b50633b9aca00808b11614a00575b50612710808b116149f2575b5098805b6149e157508190611d0c989982600a0a9109960195817fcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccd0a93838211900382610100031b9203901c1702916156af565b60019290920191600a900480614991565b60049a04998a93019261498d565b600991939a049901915f614981565b601291939a049901915f614973565b85049950602592505f614961565b50929050611d0c9495506156af565b5f821215614a8f57808413614a81575b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb284131561491c57909250611d0c9394916155ba565b909250611d0c939491615621565b80841215614a4b57909250611d0c9394916155ba565b92909180614acb576044848460405191637a97930f60e01b835260048301526024820152fd5b90919280155f14614ae057505050505f905f90565b614af993614aed91615769565b92919490938492615769565b9093919284614b078861567c565b91614b118661567c565b947f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000094604c91868810614cb8575b030191600160ff1b98838a018112155f14614c85575050035b5f955f821280614c7c575b614c5e575b5f811280614c4c575b614c2e5786820103966001600160ff1b0388149081614c24575b5080614c1b575b80614c12575b614bf4575090614ba89291615915565b915f8113614bbb575b50611d0c936156af565b9091604c8213614be957614bd291600a0a90614126565b908115614bdf575f614bb1565b505050505f905f90565b50505050505f905f90565b876044916040519163d556b11160e01b835260048301526024820152fd5b505f8512614b98565b50828414614b92565b905088145f614b8b565b604489836040519163d556b11160e01b835260048301526024820152fd5b50806001600160ff1b03018213614b71565b9550808701861315614c765786818703015b95614b68565b5f614c70565b505f8113614b63565b89985090920390506001600160ff1b0381900387018213614ca95701860194614b58565b5050505050505050505f905f90565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009650604b9250614b3f565b8115614130570590565b8082601b82810b8314614ee3577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000008405614e8f575b8380820b03614e7e57507b199999999999999999999999999999999999999999999999999999987b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc84011115614e2f575b838060030b03614db3575b808413614d975750506001600160e01b036001925b60e01b91161791565b8303600a0a8015614130576001600160e01b0391071592614d8e565b92915f841315614e03575090614dc983836159b7565b614de557637ffffffe1901600a0a810290637fffffff92614d79565b506044916040519163d556b11160e01b835260048301526024820152fd5b637fffffff199283039060438213614be957614e2291600a0a90614ce4565b918215614bdf5792614d79565b5f198401808060030b14614e435750614d6e565b90506001600160e01b039293507b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff915060e01b9260ff1d181617905f90565b600190940193600a90930592614d21565b937f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000840515614ed0576305f5e100600894058094819201955b915050614d21565b620186a060059405809481920195614ec8565b5082614d6e57505050505f90600190565b919291600160ff1b9190801580615081575090614f1091615769565b9490929091905f868585858282138015615078575b61505b575b505050508682841860ff1c94860391039081604c0381116150405701600a0a808205919084615026575b505081019182821860ff1c111561501e57826001600160ff1b031461500057905f600192135f14614fd157600a9004915b01925b81158117614f9557509190565b80614fae575b508015614fa6579190565b505f91508190565b9192614fc49203600160ff1b01600a0a90614ce4565b600160ff1b91905f614f9b565b600a60037fe6666666666666666666666666666666666666666666666666666666666666679201040191614f85565b604490836040519163d556b11160e01b835260048301526024820152fd5b509092614f88565b8107615033575b80614f54565b60ff1d600117015f61502d565b50505091935061504e579190565b60018160ff1d1790039190565b5f9a50909750909550600160ff1b94509250905086808080614f2a565b50835f12614f25565b1561508c5750509190565b9350919050565b93929193841581158181176151e4575050906150ae91615769565b91949082956150bf82958294615769565b80969294919693878684821380156151db575b6151c2575b5050505050508682841860ff1c94860391039081604c0381116150405701600a0a8082059190846151a8575b505081019182821860ff1c11156151a057826001600160ff1b031461500057905f600192135f1461517157600a9004915b01925b8115811761514457509190565b8061515457508015614fa6579190565b600160ff1b9361516b9291038401600a0a90614ce4565b5f614f9b565b600a60037fe6666666666666666666666666666666666666666666666666666666666666679201040191615134565b509092615137565b81076151b5575b80615103565b60ff1d600117015f6151af565b929b5098509196509450925090505f80808080806150d7565b508584126150d2565b93959390929190156151fa575050614fa6579190565b945092915050565b91908260409103126102d557815160048110156102d55760209092015160ff811681036102d55790565b9060ff165f03916001600160ff1b0382115f1461525257600a6001818404940192061590565b909190600190565b9091813b6152955761526c9192615a39565b5061527681614426565b15918261528257505090565b6001600160a01b03918216911614919050565b6020918160645f935160405192630b135d3f60e11b9788855260048501526040602485015286820190604485015e8281018201859052601f01601f191601915afa905f5114601f3d11161690565b92915f9060018184145f8712871517171761535d575f9280821361534f575b03604c81135f82121761534357600a0a90846153218382029384614ce4565b1461533657505015615332575f9190565b5f90565b90935090156119b7579190565b505015615332575f9190565b5f9560019450925090615302565b5050505f90565b93929190918083145f83125f871218831587151717176153b3575f928082136153a65703604c81135f82121761534357600a0a90846153218382029384614ce4565b9194600193509190615302565b50919050565b909291600160ff1b9182810161544b575080841461544157808413918215615439578185035b604c8111156154285750505f915b1561541957507f8000000000000000000000000000000000000000000000000000000000000001019190565b92506001600160ff1b03039190565b600a0a9081156141305704916153ed565b8482036153df565b505090505f905f90565b9361545892945f03614ef4565b8093918092811461546c575b50505f039190565b915092506001600160ff1b03831461500057600a600191059201915f80615464565b91925f8312156154b6576044838360405191634a7d166b60e01b835260048301526024820152fd5b9192836154c857505090505f90600190565b60ff8116820191808312615590575f831215615500575050604c198112614fa6575f03600a0a916154f98382614126565b9283021490565b909293915f81135f1461558657604d811361555b57600a0a92831561413057835f190483116155325750500290600190565b60405163c849483b60e01b815260048101849052602481019290925260ff166044820152606490fd5b5060405163c849483b60e01b81526004810192909252602482015260ff919091166044820152606490fd5b5050905090600190565b60405163c849483b60e01b815260048101869052602481019190915260ff82166044820152606490fd5b909392915f6155ca9181846148ea565b9490945f8483019182019412159081615617575b811561560d575b506155ef57505090565b604492506040519163d556b11160e01b835260048301526024820152fd5b905083125f6155e5565b82811291506155de565b61563693600160fe1b908101939201906148ea565b9081815f82121561566d575050604b198212613a8c5761565b915f03600a0a90614ce4565b9081615665575f90565b600160ff1b90565b93600160ff1b90910192509050565b5f8112156119b757600160ff1b90808203615695575090565b90505f0390565b905f198183099102908180821091030391565b92939291905f8184181215615744576001600160ff1b03928383111561572e57600160ff1b938385036156e457505050509190565b909192935085146156fe575050600a600191045f03920190565b604051630ed8062160e21b8152600481019190915260248101919091526044810182905260648101849052608490fd5b5090915050600160ff1b811461418c575f039190565b90916001600160ff1b0380841115613ee05785146156fe575050600a60019104920190565b919091801561590b57827f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000080830515615819575b507f19999999999999999999999999999999999999999999999999999999999999997f0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc83011061580a575b83136157f45791905f90565b919060018060ff1b926001600160ff1b03030190565b9290600a02905f1901926157e8565b6f4b3b4ca85a86c47a098a224000000000808405156158f9575b507728c87cb5c89a2571ebfdcb54864ada834a000000000000008305156158e2575b7b097edd871cfda3a5697758bf0e3cbb5ac5741c6400000000000000008305156158ce575b7e3899162693736ac531a5a58f1fbb4b746504382ca7e40000000000000000008305156158be578205156158af575b5f61579d565b9290600a02905f1901926158a9565b939160640291600119019361587a565b93916402540be4000291600919019361587a565b9391678ac7230489e8000002916012190193615855565b6025198301955092909202915f615833565b505f915081908190565b90915f198383099280830292838086109503948086039584871015615993571461598b579082910960018219018216809204600280826003021880830282030280830282030280830282030280830282030280830282030280920290030293600183805f03040190848311900302920304170290565b505091500490565b60648386866040519263362ced0960e11b8452600484015260248301526044820152fd5b6119b791905f8112156159cb575f03615a73565b615a73565b73200e12d10bb0c5e4a17e7018f0f1161919bb9389803b158015615a0e575b6159f65750565b602490604051906373e6d7b360e01b82526004820152fd5b507f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d41813f14156159ef565b8151919060418303615a6957615a629250602082015190606060408401519301515f1a90615b02565b9192909190565b50505f9160029190565b90637ffffff5811315615afc57637ffffffe1981019060438213615af5575f821215615ac957637fffffff91505f0301600a0a7b8000000000000000000000000000000000000000000000000000000202111590565b50600a0a8015614130577b80000000000000000000000000000000000000000000000000000001041090565b5050151590565b50505f90565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411615b79579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa156103f5575f516001600160a01b03811615615b6f57905f905f90565b505f906001905f90565b5050505f916003919056"; /// @dev What MUST already be on a network before this release can be /// broadcast there: an address, and the runtime code that belongs at it. diff --git a/src/generated/candidate/RaindexV6SubParser.sol b/src/generated/candidate/RaindexV6SubParser.sol index b1844f37b8..64706d0568 100644 --- a/src/generated/candidate/RaindexV6SubParser.sol +++ b/src/generated/candidate/RaindexV6SubParser.sol @@ -5,19 +5,19 @@ pragma solidity ^0.8.25; // THIS FILE IS AUTOGENERATED BY THE BUILD SCRIPT. DO NOT EDIT BY HAND. /// @dev Hash of the known bytecode. -bytes32 constant BYTECODE_HASH = bytes32(0x94c0af1d573bd9d570edd410a30be087c13fd8269e6276721fa124bc160fb0ca); +bytes32 constant BYTECODE_HASH = bytes32(0x2bafaa417c2e9542a78321c186f293f581bb2a075bcdbfb03b2cf22fb4ecdabb); /// @dev The deterministic deploy address of the contract when deployed via /// the Zoltu factory. -address constant DEPLOYED_ADDRESS = address(0xff7E872256a17979B4207b2d39725330DEb78cA8); +address constant DEPLOYED_ADDRESS = address(0xAd8acc1488183aF9DB5C2Dc3e8fD2d6329dDE998); /// @dev The creation bytecode of the contract. bytes constant CREATION_CODE = - hex"6080604052348015600e575f80fd5b506127d08061001c5f395ff3fe608060405234801561000f575f80fd5b506004361061007a575f3560e01c80636f5aa28d116100585780636f5aa28d146100dd578063c6c0cbb61461010b578063ccf4477514610135578063d6d8c9a814610148575f80fd5b806301ffc9a71461007e578063336284d4146100a6578063570c7a63146100bb575b5f80fd5b61009161008c366004612483565b610150565b60405190151581526020015b60405180910390f35b6100ae6101d7565b60405161009d91906124df565b6100ce6100c9366004612505565b610c81565b60405161009d939291906125af565b6040517f828494fa15dec168f2372c71a11064dc163f7783fb7f3a9a84df40a87861a368815260200161009d565b61011e610119366004612505565b610dc5565b60408051921515835260208301919091520161009d565b60408051602081019091525f81526100ae565b6100ae610dfd565b5f6001600160e01b031982166391ccb1d560e01b148061018057506001600160e01b03198216636f5aa28d60e01b145b8061019b57506001600160e01b03198216631a2c8edd60e01b145b806101b657506001600160e01b03198216630cd8a13560e21b145b806101d157506301ffc9a760e01b6001600160e01b03198316145b92915050565b60605f6101e660056001612620565b6101f1906001612620565b6101fc906003612620565b6001600160401b03811115610213576102136124f1565b60405190808252806020026020018201604052801561024657816020015b60608152602001906001900390816102315790505b50604080516002808252606082019092529192505f9190816020015b61247981526020019060019003908161026257905050905061182d815f8151811061028f5761028f612633565b60200260200101906001600160401b031690816001600160401b03168152505061184a816001815181106102c5576102c5612633565b6001600160401b039290921660209283029190910190910152604080516003808252608082019092525f91816020015b6124798152602001906001900390816102f5579050509050611859815f8151811061032257610322612633565b60200260200101906001600160401b031690816001600160401b0316815250506118688160018151811061035857610358612633565b60200260200101906001600160401b031690816001600160401b0316815250506118778160028151811061038e5761038e612633565b6001600160401b039290921660209283029190910190910152604080516002808252606082019092525f91816020015b6124798152602001906001900390816103be579050509050611887815f815181106103eb576103eb612633565b60200260200101906001600160401b031690816001600160401b0316815250506118968160018151811061042157610421612633565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b6124798152602001906001900390816104515790505090506118a6815f8151811061047e5761047e612633565b60200260200101906001600160401b031690816001600160401b0316815250506118b5816001815181106104b4576104b4612633565b60200260200101906001600160401b031690816001600160401b0316815250506118c5816002815181106104ea576104ea612633565b60200260200101906001600160401b031690816001600160401b0316815250506118d58160038151811061052057610520612633565b60200260200101906001600160401b031690816001600160401b0316815250506118e48160048151811061055657610556612633565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b6124798152602001906001900390816105865790505090506118f4815f815181106105b3576105b3612633565b60200260200101906001600160401b031690816001600160401b031681525050611903816001815181106105e9576105e9612633565b60200260200101906001600160401b031690816001600160401b0316815250506119138160028151811061061f5761061f612633565b60200260200101906001600160401b031690816001600160401b0316815250506119238160038151811061065557610655612633565b60200260200101906001600160401b031690816001600160401b0316815250506119338160048151811061068b5761068b612633565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6124798152602001906001900390816106ba579050509050611942815f815181106106e7576106e7612633565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b612479815260200190600190039081610716579050509050611951815f8151811061074357610743612633565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b61247981526020019060019003908161077257905050905061196a815f8151811061079f5761079f612633565b60200260200101906001600160401b031690816001600160401b03168152505087895f815181106107d2576107d2612633565b602002602001018190525086896001815181106107f1576107f1612633565b6020026020010181905250858960028151811061081057610810612633565b6020026020010181905250848960038151811061082f5761082f612633565b6020026020010181905250838960048151811061084e5761084e612633565b6020026020010181905250828960058151811061086d5761086d612633565b6020908102919091010152818961088660056001612620565b8151811061089657610896612633565b602090810291909101015280896108af60056001612620565b6108ba906001612620565b815181106108ca576108ca612633565b602090810291909101015260408051600680825260e082019092525f91816020015b6124798152602001906001900390816108ec57905050905061182d815f8151811061091957610919612633565b60200260200101906001600160401b031690816001600160401b0316815250506118598160018151811061094f5761094f612633565b60200260200101906001600160401b031690816001600160401b0316815250506118688160028151811061098557610985612633565b60200260200101906001600160401b031690816001600160401b031681525050611877816003815181106109bb576109bb612633565b60200260200101906001600160401b031690816001600160401b0316815250506119b6816004815181106109f1576109f1612633565b60200260200101906001600160401b031690816001600160401b0316815250506119c681600581518110610a2757610a27612633565b6001600160401b0390921660209283029190910190910152808a610a4d60056001612620565b610a58906001612620565b610a63906001612620565b81518110610a7357610a73612633565b602090810291909101015260408051600780825261010082019092525f91816020015b612479815260200190600190039081610a9657905050905061182d815f81518110610ac357610ac3612633565b60200260200101906001600160401b031690816001600160401b03168152505061185981600181518110610af957610af9612633565b60200260200101906001600160401b031690816001600160401b03168152505061186881600281518110610b2f57610b2f612633565b60200260200101906001600160401b031690816001600160401b03168152505061187781600381518110610b6557610b65612633565b60200260200101906001600160401b031690816001600160401b0316815250506119b681600481518110610b9b57610b9b612633565b60200260200101906001600160401b031690816001600160401b0316815250506119c681600581518110610bd157610bd1612633565b60200260200101906001600160401b031690816001600160401b0316815250506119d681600681518110610c0757610c07612633565b6001600160401b0390921660209283029190910190910152808b610c2d60056001612620565b610c38906001612620565b610c43906002612620565b81518110610c5357610c53612633565b60209081029190910101528a610c70610c6b826119e6565b6119fb565b9c5050505050505050505050505090565b5f6060805f805f610ca187610c94611a8a565b610c9c611aaa565b611aca565b9250925092505f610cb782610220015160200190565b90505f8261022001515182610ccc9190612620565b90505f610cea83836f07fffffe0000000003ff200000000000611bbb565b80925081945050505f80610d0386610240015184611c57565b915091508115610d98575f610d188783611d2e565b90506124795f610d26611d5d565b90505f60028251610d37919061265b565b9050808510610d68576040516303bdd1b160e51b815260048101869052602481018290526044015b60405180910390fd5b6001850160020282015161ffff169250610d818c8c8686565b9e509e509e50505050505050505050505050610dbe565b5050604080515f80825281830190925260208101828152919a5090985096505050505050505b9193909250565b5f805f805f610ded866002810151815160228084019461ffff93909316840101920160200190565b505f988998509650505050505050565b60605f610e0c60056001612620565b610e17906001612620565b610e22906003612620565b6001600160401b03811115610e3957610e396124f1565b604051908082528060200260200182016040528015610e6c57816020015b6060815260200190600190039081610e575790505b50604080516002808252606082019092529192505f9190816020015b612479815260200190600190039081610e88579050509050611d7d815f81518110610eb557610eb5612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d81600181518110610eeb57610eeb612633565b6001600160401b039290921660209283029190910190910152604080516003808252608082019092525f91816020015b612479815260200190600190039081610f1b579050509050611d7d815f81518110610f4857610f48612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d81600181518110610f7e57610f7e612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d81600281518110610fb457610fb4612633565b6001600160401b039290921660209283029190910190910152604080516002808252606082019092525f91816020015b612479815260200190600190039081610fe4579050509050611d7d815f8151811061101157611011612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d8160018151811061104757611047612633565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b612479815260200190600190039081611077579050509050611d7d815f815181106110a4576110a4612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d816001815181106110da576110da612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d8160028151811061111057611110612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d8160038151811061114657611146612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d8160048151811061117c5761117c612633565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b6124798152602001906001900390816111ac579050509050611d7d815f815181106111d9576111d9612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d8160018151811061120f5761120f612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d8160028151811061124557611245612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d8160038151811061127b5761127b612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d816004815181106112b1576112b1612633565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6124798152602001906001900390816112e0579050509050611da6815f8151811061130d5761130d612633565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b61247981526020019060019003908161133c579050509050611da6815f8151811061136957611369612633565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b612479815260200190600190039081611398579050509050611e42815f815181106113c5576113c5612633565b60200260200101906001600160401b031690816001600160401b03168152505087895f815181106113f8576113f8612633565b6020026020010181905250868960018151811061141757611417612633565b6020026020010181905250858960028151811061143657611436612633565b6020026020010181905250848960038151811061145557611455612633565b6020026020010181905250838960048151811061147457611474612633565b6020026020010181905250828960058151811061149357611493612633565b602090810291909101015281896114ac60056001612620565b815181106114bc576114bc612633565b602090810291909101015280896114d560056001612620565b6114e0906001612620565b815181106114f0576114f0612633565b602090810291909101015260408051600680825260e082019092525f91816020015b612479815260200190600190039081611512579050509050611d7d815f8151811061153f5761153f612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d8160018151811061157557611575612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d816002815181106115ab576115ab612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d816003815181106115e1576115e1612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d8160048151811061161757611617612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d8160058151811061164d5761164d612633565b6001600160401b0390921660209283029190910190910152808a61167360056001612620565b61167e906001612620565b611689906001612620565b8151811061169957611699612633565b602090810291909101015260408051600780825261010082019092525f91816020015b6124798152602001906001900390816116bc579050509050611d7d815f815181106116e9576116e9612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d8160018151811061171f5761171f612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d8160028151811061175557611755612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d8160038151811061178b5761178b612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d816004815181106117c1576117c1612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d816005815181106117f7576117f7612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d81600681518110610c0757610c07612633565b5f60608061183b5f80611efa565b92509250925093509350939050565b5f60608061183b5f6001611efa565b5f60608061183b60015f611efa565b5f60608061183b600180611efa565b5f60608061183b60016002611efa565b5f60608061183b60025f611efa565b5f60608061183b60026001611efa565b5f60608061183b60035f611efa565b5f60608061183b60036001611efa565b5f60608061183b60036002611efa565b5f60608061183b600380611efa565b5f60608061183b60036004611efa565b5f60608061183b60045f611efa565b5f60608061183b60046001611efa565b5f60608061183b60046002611efa565b5f60608061183b60046003611efa565b5f60608061183b600480611efa565b5f60608061183b600585611efa565b5f60608061183b61196460056001612620565b85611efa565b5f60608060ff80851690600886901c166119a58261198a60056001612620565b611995906001612620565b61199f9190612620565b82611efa565b945094509450505093509350939050565b5f60608061183b60016003611efa565b5f60608061183b60016004611efa565b5f60608061183b60016005611efa565b6060815f6119f382611f7c565b949350505050565b60605f82516002026001600160401b03811115611a1a57611a1a6124f1565b6040519080825280601f01601f191660200182016040528015611a44576020820181803683370190505b50905061ffff80196020850160208651028101600285015b81831015611a7e57805183518616908516178152602090920191600201611a5c565b50939695505050505050565b60606040518060e0016040528060a681526020016126e860a69139905090565b606060405180608001604052806042815260200161278e60429139905090565b5f80611b596040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020016060815260200160608152602001606081526020015f815260200160608152602001606081525090565b606061ffff600288015116935060ff600388015116925061ffff600588015116600588019750808852602081018801915050611ba587878760405180602001604052805f815250611fea565b915080826101e001819052505093509350939050565b5f808060018187870360208111611bd25780611bd5565b60205b915050875192505b8519600184841a1b16158183101615611bfb57600182019150611bdd565b9681019660208290036008810293841c90931b92611c465760408051602081018590520160408051601f198184030181529082905263e47fe8b760e01b8252610d5f916004016124df565b50869350909150505b935093915050565b600182810180515f928392600560ff93909316602102870192830192909101835b81831015611d1c5760018301516021909301805190935f90819060ff168180611ca1838e61219b565b915091508186165f03611cc3575f809b509b5050505050505050505050611d27565b5f87611cd36001850389166121c6565b016004028b015195505062ffffff9081169350841683039150611d079050575060019750601c1a9550611d27945050505050565b611d10836121c6565b84019350505050611c78565b5f8095509550505050505b9250929050565b6101c08201516002828102820101516101e08401515f9261ffff9092169190611d549083565b95945050505050565b60606040518060800160405280604281526020016126a660429139905090565b5f81515f14611d9f576040516304f8b58160e51b815260040160405180910390fd5b505f919050565b5f8151600103611e03575060208101516001600160e01b038116601b0b60e082901d5f611dd483838361227f565b905061ffff811115611df957604051631e4e01d760e21b815260040160405180910390fd5b9250611e3d915050565b81515f03611e2457604051630f16066b60e41b815260040160405180910390fd5b604051630358cd2160e31b815260040160405180910390fd5b919050565b5f8151600203611ed757602082015160408301516001600160e01b038216601b0b60e083901d5f611e7483838361227f565b6001600160e01b038516601b0b935060e085901d925090505f611e9884848361227f565b905060ff821180611ea9575060ff81115b15611ec757604051631e4e01d760e21b815260040160405180910390fd5b60081b179450611e3d9350505050565b600282511015611e2457604051630f16066b60e41b815260040160405180910390fd5b5f60608060ff851180611f0d575060ff84115b15611f3557604051639b0f326160e01b81526004810186905260248101859052604401610d5f565b6040805160248101909152600386602383015385602283015360106021830153806020830153506004815260408051602081019091525f8152600197919650945092505050565b60605f611f88836122c1565b90505f611f9682602061267a565b9050606060405190508160200181016040528281526020850160208651028101602083015b81831015611fde57602083515102806020855101835e6020939093019201611fbb565b50919695505050505050565b6120776040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020016060815260200160608152602001606081526020015f815260200160608152602001606081525090565b5f6040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f801b81526020015f8152602001600481526020015f81526020015f81526020015f81526020015f801b815260200184815260200185815260200160046001600160401b038111156120fc576120fc6124f1565b604051908082528060200260200182016040528015612125578160200160208202803683370190505b5081525f602080830182905260408084018b905260609384018a90528051601f01601f19168281528083018252835161ffff191681178452855290840182905283018190529082018190526080820181905260a08201819052610120820181905261014082018190526102008201529050611d54565b5f80825f528360205360215f2090506001815f1a1b915062ffffff8116611d27575060019250929050565b5f5f1982036121d85750610100919050565b507f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f7f5555555555555555555555555555555555555555555555555555555555555555600183901c16909103600281901c7f3333333333333333333333333333333333333333333333333333333333333333908116911601600481901c01167f01010101010101010101010101010101010101010101010101010101010101010260f81c90565b5f805f61228d86868661230a565b91509150806122b85760405162bc8ecf60e31b81526004810187905260248101869052604401610d5f565b50949350505050565b5f60208201602083510281015b808210156123035781515192830192808410156122f757634e487b715f5260116020526024601cfd5b506020820191506122ce565b5050919050565b5f805f85121561233757604051634a7d166b60e01b81526004810186905260248101859052604401610d5f565b845f0361234957505f90506001611c4f565b8460ff84168501858112156123845760405163c849483b60e01b8152600481018890526024810187905260ff86166044820152606401610d5f565b5f805f8312156123d057604c198312156123a7575f809550955050505050611c4f565b825f03600a0a91508184816123be576123be612647565b0495505084029091149150611c4f9050565b5f83131561246957604d83131561240d5760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610d5f565b82600a0a9150815f198161242357612423612647565b048411156124575760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610d5f565b5091909102925060019150611c4f9050565b8360019550955050505050611c4f565b612481612691565b565b5f60208284031215612493575f80fd5b81356001600160e01b0319811681146124aa575f80fd5b9392505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6124aa60208301846124b1565b634e487b7160e01b5f52604160045260245ffd5b5f60208284031215612515575f80fd5b81356001600160401b038082111561252b575f80fd5b818401915084601f83011261253e575f80fd5b813581811115612550576125506124f1565b604051601f8201601f19908116603f01168101908382118183101715612578576125786124f1565b81604052828152876020848701011115612590575f80fd5b826020860160208301375f928101602001929092525095945050505050565b83151581525f6020606060208401526125cb60608401866124b1565b8381036040850152845180825260208087019201905f5b818110156125fe578351835292840192918401916001016125e2565b509098975050505050505050565b634e487b7160e01b5f52601160045260245ffd5b808201808211156101d1576101d161260c565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601260045260245ffd5b5f8261267557634e487b7160e01b5f52601260045260245ffd5b500490565b80820281158282048414176101d1576101d161260c565b634e487b7160e01b5f52605160045260245ffdfe182d184a1859186818771887189618a618b518c518d518e418f4190319131923193319421951196a182d18591868187719b619c6182d18591868187719b619c619d60101180010800082000100010480300038412a001810000010020004200005002038038ff54900cc66c620f3dcab0616592212c9ec8109895f0b17fec9301c02e0920c5bfe561e21609201e959460b1974270f844db208bcd3bf1f989376111049db14b934301b0ae9a00af82a7805c138f40d28083f0742ef2104d561fd1515a13318716a611ad260cc107b9bfc0eec7ade16cba2891d6b14a513792bdb02e0f147195655891d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1da61da61e421d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d"; + hex"6080604052348015600e575f80fd5b506128948061001c5f395ff3fe608060405234801561000f575f80fd5b506004361061007a575f3560e01c80636f5aa28d116100585780636f5aa28d146100dd578063c6c0cbb61461010b578063ccf4477514610135578063d6d8c9a814610148575f80fd5b806301ffc9a71461007e578063336284d4146100a6578063570c7a63146100bb575b5f80fd5b61009161008c366004612547565b610150565b60405190151581526020015b60405180910390f35b6100ae6101d7565b60405161009d91906125a3565b6100ce6100c93660046125c9565b610c7c565b60405161009d93929190612673565b6040517fe5f5c8b20782dd193ccec19353560b4bba9e69c36c2e6dbf45ef331a38d96dc9815260200161009d565b61011e6101193660046125c9565b610dc0565b60408051921515835260208301919091520161009d565b60408051602081019091525f81526100ae565b6100ae610df8565b5f6001600160e01b031982166391ccb1d560e01b148061018057506001600160e01b03198216636f5aa28d60e01b145b8061019b57506001600160e01b03198216631a2c8edd60e01b145b806101b657506001600160e01b03198216630cd8a13560e21b145b806101d157506301ffc9a760e01b6001600160e01b03198316145b92915050565b60605f6101e6600660016126e4565b6101f19060016126e4565b6101fc9060016126e4565b6102079060016126e4565b6001600160401b0381111561021e5761021e6125b5565b60405190808252806020026020018201604052801561025157816020015b606081526020019060019003908161023c5790505b50604080516002808252606082019092529192505f9190816020015b61253d81526020019060019003908161026d57905050905061183b815f8151811061029a5761029a6126f7565b60200260200101906001600160401b031690816001600160401b031681525050611858816001815181106102d0576102d06126f7565b6001600160401b039290921660209283029190910190910152604080516003808252608082019092525f91816020015b61253d815260200190600190039081610300579050509050611867815f8151811061032d5761032d6126f7565b60200260200101906001600160401b031690816001600160401b03168152505061187681600181518110610363576103636126f7565b60200260200101906001600160401b031690816001600160401b03168152505061188581600281518110610399576103996126f7565b6001600160401b039290921660209283029190910190910152604080516002808252606082019092525f91816020015b61253d8152602001906001900390816103c9579050509050611895815f815181106103f6576103f66126f7565b60200260200101906001600160401b031690816001600160401b0316815250506118a48160018151811061042c5761042c6126f7565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b61253d81526020019060019003908161045c5790505090506118b4815f81518110610489576104896126f7565b60200260200101906001600160401b031690816001600160401b0316815250506118c3816001815181106104bf576104bf6126f7565b60200260200101906001600160401b031690816001600160401b0316815250506118d3816002815181106104f5576104f56126f7565b60200260200101906001600160401b031690816001600160401b0316815250506118e38160038151811061052b5761052b6126f7565b60200260200101906001600160401b031690816001600160401b0316815250506118f281600481518110610561576105616126f7565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b61253d815260200190600190039081610591579050509050611902815f815181106105be576105be6126f7565b60200260200101906001600160401b031690816001600160401b031681525050611911816001815181106105f4576105f46126f7565b60200260200101906001600160401b031690816001600160401b0316815250506119218160028151811061062a5761062a6126f7565b60200260200101906001600160401b031690816001600160401b03168152505061193181600381518110610660576106606126f7565b60200260200101906001600160401b031690816001600160401b03168152505061194181600481518110610696576106966126f7565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b61253d8152602001906001900390816106c5579050509050611950815f815181106106f2576106f26126f7565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b61253d815260200190600190039081610721579050509050611969815f8151811061074e5761074e6126f7565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b61253d81526020019060019003908161077d579050509050611987815f815181106107aa576107aa6126f7565b60200260200101906001600160401b031690816001600160401b03168152505087895f815181106107dd576107dd6126f7565b602002602001018190525086896001815181106107fc576107fc6126f7565b6020026020010181905250858960028151811061081b5761081b6126f7565b6020026020010181905250848960038151811061083a5761083a6126f7565b60200260200101819052508389600481518110610859576108596126f7565b60209081029190910101528289610872600660016126e4565b81518110610882576108826126f7565b6020908102919091010152818961089b600660016126e4565b6108a69060016126e4565b815181106108b6576108b66126f7565b602090810291909101015280896108cf600660016126e4565b6108da9060016126e4565b6108e59060016126e4565b815181106108f5576108f56126f7565b602090810291909101015260408051600680825260e082019092525f91816020015b61253d8152602001906001900390816109175790505090506119de815f81518110610944576109446126f7565b60200260200101906001600160401b031690816001600160401b0316815250506119ed8160018151811061097a5761097a6126f7565b60200260200101906001600160401b031690816001600160401b0316815250506119fc816002815181106109b0576109b06126f7565b60200260200101906001600160401b031690816001600160401b031681525050611a0c816003815181106109e6576109e66126f7565b60200260200101906001600160401b031690816001600160401b031681525050611a1c81600481518110610a1c57610a1c6126f7565b60200260200101906001600160401b031690816001600160401b031681525050611a2c81600581518110610a5257610a526126f7565b60200260200101906001600160401b031690816001600160401b031681525050808a600581518110610a8657610a866126f7565b602090810291909101015260408051600780825261010082019092525f91816020015b61253d815260200190600190039081610aa9579050509050611a3c815f81518110610ad657610ad66126f7565b60200260200101906001600160401b031690816001600160401b031681525050611a4b81600181518110610b0c57610b0c6126f7565b60200260200101906001600160401b031690816001600160401b031681525050611a5a81600281518110610b4257610b426126f7565b60200260200101906001600160401b031690816001600160401b031681525050611a6a81600381518110610b7857610b786126f7565b60200260200101906001600160401b031690816001600160401b031681525050611a7a81600481518110610bae57610bae6126f7565b60200260200101906001600160401b031690816001600160401b031681525050611a8a81600581518110610be457610be46126f7565b60200260200101906001600160401b031690816001600160401b031681525050611a9a81600681518110610c1a57610c1a6126f7565b60200260200101906001600160401b031690816001600160401b031681525050808b600681518110610c4e57610c4e6126f7565b60209081029190910101528a610c6b610c6682611aaa565b611abf565b9c5050505050505050505050505090565b5f6060805f805f610c9c87610c8f611b4e565b610c97611b6e565b611b8e565b9250925092505f610cb282610220015160200190565b90505f8261022001515182610cc791906126e4565b90505f610ce583836f07fffffe0000000003ff200000000000611c7f565b80925081945050505f80610cfe86610240015184611d1b565b915091508115610d93575f610d138783611df2565b905061253d5f610d21611e21565b90505f60028251610d32919061271f565b9050808510610d63576040516303bdd1b160e51b815260048101869052602481018290526044015b60405180910390fd5b6001850160020282015161ffff169250610d7c8c8c8686565b9e509e509e50505050505050505050505050610db9565b5050604080515f80825281830190925260208101828152919a5090985096505050505050505b9193909250565b5f805f805f610de8866002810151815160228084019461ffff93909316840101920160200190565b505f988998509650505050505050565b60605f610e07600660016126e4565b610e129060016126e4565b610e1d9060016126e4565b610e289060016126e4565b6001600160401b03811115610e3f57610e3f6125b5565b604051908082528060200260200182016040528015610e7257816020015b6060815260200190600190039081610e5d5790505b50604080516002808252606082019092529192505f9190816020015b61253d815260200190600190039081610e8e579050509050611e41815f81518110610ebb57610ebb6126f7565b60200260200101906001600160401b031690816001600160401b031681525050611e4181600181518110610ef157610ef16126f7565b6001600160401b039290921660209283029190910190910152604080516003808252608082019092525f91816020015b61253d815260200190600190039081610f21579050509050611e41815f81518110610f4e57610f4e6126f7565b60200260200101906001600160401b031690816001600160401b031681525050611e4181600181518110610f8457610f846126f7565b60200260200101906001600160401b031690816001600160401b031681525050611e4181600281518110610fba57610fba6126f7565b6001600160401b039290921660209283029190910190910152604080516002808252606082019092525f91816020015b61253d815260200190600190039081610fea579050509050611e41815f81518110611017576110176126f7565b60200260200101906001600160401b031690816001600160401b031681525050611e418160018151811061104d5761104d6126f7565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b61253d81526020019060019003908161107d579050509050611e41815f815181106110aa576110aa6126f7565b60200260200101906001600160401b031690816001600160401b031681525050611e41816001815181106110e0576110e06126f7565b60200260200101906001600160401b031690816001600160401b031681525050611e4181600281518110611116576111166126f7565b60200260200101906001600160401b031690816001600160401b031681525050611e418160038151811061114c5761114c6126f7565b60200260200101906001600160401b031690816001600160401b031681525050611e4181600481518110611182576111826126f7565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b61253d8152602001906001900390816111b2579050509050611e41815f815181106111df576111df6126f7565b60200260200101906001600160401b031690816001600160401b031681525050611e4181600181518110611215576112156126f7565b60200260200101906001600160401b031690816001600160401b031681525050611e418160028151811061124b5761124b6126f7565b60200260200101906001600160401b031690816001600160401b031681525050611e4181600381518110611281576112816126f7565b60200260200101906001600160401b031690816001600160401b031681525050611e41816004815181106112b7576112b76126f7565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b61253d8152602001906001900390816112e6579050509050611e6a815f81518110611313576113136126f7565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b61253d815260200190600190039081611342579050509050611e6a815f8151811061136f5761136f6126f7565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b61253d81526020019060019003908161139e579050509050611f06815f815181106113cb576113cb6126f7565b60200260200101906001600160401b031690816001600160401b03168152505087895f815181106113fe576113fe6126f7565b6020026020010181905250868960018151811061141d5761141d6126f7565b6020026020010181905250858960028151811061143c5761143c6126f7565b6020026020010181905250848960038151811061145b5761145b6126f7565b6020026020010181905250838960048151811061147a5761147a6126f7565b60209081029190910101528289611493600660016126e4565b815181106114a3576114a36126f7565b602090810291909101015281896114bc600660016126e4565b6114c79060016126e4565b815181106114d7576114d76126f7565b602090810291909101015280896114f0600660016126e4565b6114fb9060016126e4565b6115069060016126e4565b81518110611516576115166126f7565b602090810291909101015260408051600680825260e082019092525f91816020015b61253d815260200190600190039081611538579050509050611e41815f81518110611565576115656126f7565b60200260200101906001600160401b031690816001600160401b031681525050611e418160018151811061159b5761159b6126f7565b60200260200101906001600160401b031690816001600160401b031681525050611e41816002815181106115d1576115d16126f7565b60200260200101906001600160401b031690816001600160401b031681525050611e4181600381518110611607576116076126f7565b60200260200101906001600160401b031690816001600160401b031681525050611e418160048151811061163d5761163d6126f7565b60200260200101906001600160401b031690816001600160401b031681525050611e4181600581518110611673576116736126f7565b60200260200101906001600160401b031690816001600160401b031681525050808a6005815181106116a7576116a76126f7565b602090810291909101015260408051600780825261010082019092525f91816020015b61253d8152602001906001900390816116ca579050509050611e41815f815181106116f7576116f76126f7565b60200260200101906001600160401b031690816001600160401b031681525050611e418160018151811061172d5761172d6126f7565b60200260200101906001600160401b031690816001600160401b031681525050611e4181600281518110611763576117636126f7565b60200260200101906001600160401b031690816001600160401b031681525050611e4181600381518110611799576117996126f7565b60200260200101906001600160401b031690816001600160401b031681525050611e41816004815181106117cf576117cf6126f7565b60200260200101906001600160401b031690816001600160401b031681525050611e4181600581518110611805576118056126f7565b60200260200101906001600160401b031690816001600160401b031681525050611e4181600681518110610c1a57610c1a6126f7565b5f6060806118495f80611fbe565b92509250925093509350939050565b5f6060806118495f6001611fbe565b5f60608061184960015f611fbe565b5f606080611849600180611fbe565b5f60608061184960016002611fbe565b5f60608061184960025f611fbe565b5f60608061184960026001611fbe565b5f60608061184960035f611fbe565b5f60608061184960036001611fbe565b5f60608061184960036002611fbe565b5f606080611849600380611fbe565b5f60608061184960036004611fbe565b5f60608061184960045f611fbe565b5f60608061184960046001611fbe565b5f60608061184960046002611fbe565b5f60608061184960046003611fbe565b5f606080611849600480611fbe565b5f606080611849611963600660016126e4565b85611fbe565b5f60608061184961197c600660016126e4565b6119639060016126e4565b5f60608060ff80851690600886901c166119cd826119a7600660016126e4565b6119b29060016126e4565b6119bd9060016126e4565b6119c791906126e4565b82611fbe565b945094509450505093509350939050565b5f606080611849600580611fbe565b5f60608061184960055f611fbe565b5f60608061184960056001611fbe565b5f60608061184960056002611fbe565b5f60608061184960056003611fbe565b5f60608061184960056004611fbe565b5f606080611849600680611fbe565b5f60608061184960065f611fbe565b5f60608061184960066001611fbe565b5f60608061184960066002611fbe565b5f60608061184960066003611fbe565b5f60608061184960066004611fbe565b5f60608061184960066005611fbe565b6060815f611ab782612040565b949350505050565b60605f82516002026001600160401b03811115611ade57611ade6125b5565b6040519080825280601f01601f191660200182016040528015611b08576020820181803683370190505b50905061ffff80196020850160208651028101600285015b81831015611b4257805183518616908516178152602090920191600201611b20565b50939695505050505050565b60606040518060e0016040528060a681526020016127ac60a69139905090565b606060405180608001604052806042815260200161276a60429139905090565b5f80611c1d6040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020016060815260200160608152602001606081526020015f815260200160608152602001606081525090565b606061ffff600288015116935060ff600388015116925061ffff600588015116600588019750808852602081018801915050611c6987878760405180602001604052805f8152506120ae565b915080826101e001819052505093509350939050565b5f808060018187870360208111611c965780611c99565b60205b915050875192505b8519600184841a1b16158183101615611cbf57600182019150611ca1565b9681019660208290036008810293841c90931b92611d0a5760408051602081018590520160408051601f198184030181529082905263e47fe8b760e01b8252610d5a916004016125a3565b50869350909150505b935093915050565b600182810180515f928392600560ff93909316602102870192830192909101835b81831015611de05760018301516021909301805190935f90819060ff168180611d65838e61225f565b915091508186165f03611d87575f809b509b5050505050505050505050611deb565b5f87611d9760018503891661228a565b016004028b015195505062ffffff9081169350841683039150611dcb9050575060019750601c1a9550611deb945050505050565b611dd48361228a565b84019350505050611d3c565b5f8095509550505050505b9250929050565b6101c08201516002828102820101516101e08401515f9261ffff9092169190611e189083565b95945050505050565b606060405180608001604052806042815260200161285260429139905090565b5f81515f14611e63576040516304f8b58160e51b815260040160405180910390fd5b505f919050565b5f8151600103611ec7575060208101516001600160e01b038116601b0b60e082901d5f611e98838383612343565b905061ffff811115611ebd57604051631e4e01d760e21b815260040160405180910390fd5b9250611f01915050565b81515f03611ee857604051630f16066b60e41b815260040160405180910390fd5b604051630358cd2160e31b815260040160405180910390fd5b919050565b5f8151600203611f9b57602082015160408301516001600160e01b038216601b0b60e083901d5f611f38838383612343565b6001600160e01b038516601b0b935060e085901d925090505f611f5c848483612343565b905060ff821180611f6d575060ff81115b15611f8b57604051631e4e01d760e21b815260040160405180910390fd5b60081b179450611f019350505050565b600282511015611ee857604051630f16066b60e41b815260040160405180910390fd5b5f60608060ff851180611fd1575060ff84115b15611ff957604051639b0f326160e01b81526004810186905260248101859052604401610d5a565b6040805160248101909152600386602383015385602283015360106021830153806020830153506004815260408051602081019091525f8152600197919650945092505050565b60605f61204c83612385565b90505f61205a82602061273e565b9050606060405190508160200181016040528281526020850160208651028101602083015b818310156120a257602083515102806020855101835e602093909301920161207f565b50919695505050505050565b61213b6040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020016060815260200160608152602001606081526020015f815260200160608152602001606081525090565b5f6040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f801b81526020015f8152602001600481526020015f81526020015f81526020015f81526020015f801b815260200184815260200185815260200160046001600160401b038111156121c0576121c06125b5565b6040519080825280602002602001820160405280156121e9578160200160208202803683370190505b5081525f602080830182905260408084018b905260609384018a90528051601f01601f19168281528083018252835161ffff191681178452855290840182905283018190529082018190526080820181905260a08201819052610120820181905261014082018190526102008201529050611e18565b5f80825f528360205360215f2090506001815f1a1b915062ffffff8116611deb575060019250929050565b5f5f19820361229c5750610100919050565b507f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f7f5555555555555555555555555555555555555555555555555555555555555555600183901c16909103600281901c7f3333333333333333333333333333333333333333333333333333333333333333908116911601600481901c01167f01010101010101010101010101010101010101010101010101010101010101010260f81c90565b5f805f6123518686866123ce565b915091508061237c5760405162bc8ecf60e31b81526004810187905260248101869052604401610d5a565b50949350505050565b5f60208201602083510281015b808210156123c75781515192830192808410156123bb57634e487b715f5260116020526024601cfd5b50602082019150612392565b5050919050565b5f805f8512156123fb57604051634a7d166b60e01b81526004810186905260248101859052604401610d5a565b845f0361240d57505f90506001611d13565b8460ff84168501858112156124485760405163c849483b60e01b8152600481018890526024810187905260ff86166044820152606401610d5a565b5f805f83121561249457604c1983121561246b575f809550955050505050611d13565b825f03600a0a91508184816124825761248261270b565b0495505084029091149150611d139050565b5f83131561252d57604d8313156124d15760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610d5a565b82600a0a9150815f19816124e7576124e761270b565b0484111561251b5760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610d5a565b5091909102925060019150611d139050565b8360019550955050505050611d13565b612545612755565b565b5f60208284031215612557575f80fd5b81356001600160e01b03198116811461256e575f80fd5b9392505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f61256e6020830184612575565b634e487b7160e01b5f52604160045260245ffd5b5f602082840312156125d9575f80fd5b81356001600160401b03808211156125ef575f80fd5b818401915084601f830112612602575f80fd5b813581811115612614576126146125b5565b604051601f8201601f19908116603f0116810190838211818310171561263c5761263c6125b5565b81604052828152876020848701011115612654575f80fd5b826020860160208301375f928101602001929092525095945050505050565b83151581525f60206060602084015261268f6060840186612575565b8381036040850152845180825260208087019201905f5b818110156126c2578351835292840192918401916001016126a6565b509098975050505050505050565b634e487b7160e01b5f52601160045260245ffd5b808201808211156101d1576101d16126d0565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601260045260245ffd5b5f8261273957634e487b7160e01b5f52601260045260245ffd5b500490565b80820281158282048414176101d1576101d16126d0565b634e487b7160e01b5f52605160045260245ffdfe1e411e411e411e411e411e411e411e411e411e411e411e411e411e411e411e411e411e411e411e411e411e411e411e411e411e411e411e411e411e411e6a1e6a1f060101180010800082000100010480300038412a001810000010020004200005002038038ff54900cc66c61df3dcab061659221fc9ec8109895f0b14fec9301902e0920c5bfe561b21609201e959460b1974270f844db208bcd3bf1c9893761e1049db11b93430180ae9a00af82a7805c138f40d28083f0742ef2104d561fd1215a13315716a6117d260cc107b9bfc0eec7ade13cba2891a6b14a520792bdb02e0f14716565589183b1858186718761885189518a418b418c318d318e318f21902191119211931194119de19ed19fc1a0c1a1c1a2c1a3c1a4b1a5a1a6a1a7a1a8a1a9a195019691987"; /// @dev The runtime bytecode of the contract. bytes constant RUNTIME_CODE = - hex"608060405234801561000f575f80fd5b506004361061007a575f3560e01c80636f5aa28d116100585780636f5aa28d146100dd578063c6c0cbb61461010b578063ccf4477514610135578063d6d8c9a814610148575f80fd5b806301ffc9a71461007e578063336284d4146100a6578063570c7a63146100bb575b5f80fd5b61009161008c366004612483565b610150565b60405190151581526020015b60405180910390f35b6100ae6101d7565b60405161009d91906124df565b6100ce6100c9366004612505565b610c81565b60405161009d939291906125af565b6040517f828494fa15dec168f2372c71a11064dc163f7783fb7f3a9a84df40a87861a368815260200161009d565b61011e610119366004612505565b610dc5565b60408051921515835260208301919091520161009d565b60408051602081019091525f81526100ae565b6100ae610dfd565b5f6001600160e01b031982166391ccb1d560e01b148061018057506001600160e01b03198216636f5aa28d60e01b145b8061019b57506001600160e01b03198216631a2c8edd60e01b145b806101b657506001600160e01b03198216630cd8a13560e21b145b806101d157506301ffc9a760e01b6001600160e01b03198316145b92915050565b60605f6101e660056001612620565b6101f1906001612620565b6101fc906003612620565b6001600160401b03811115610213576102136124f1565b60405190808252806020026020018201604052801561024657816020015b60608152602001906001900390816102315790505b50604080516002808252606082019092529192505f9190816020015b61247981526020019060019003908161026257905050905061182d815f8151811061028f5761028f612633565b60200260200101906001600160401b031690816001600160401b03168152505061184a816001815181106102c5576102c5612633565b6001600160401b039290921660209283029190910190910152604080516003808252608082019092525f91816020015b6124798152602001906001900390816102f5579050509050611859815f8151811061032257610322612633565b60200260200101906001600160401b031690816001600160401b0316815250506118688160018151811061035857610358612633565b60200260200101906001600160401b031690816001600160401b0316815250506118778160028151811061038e5761038e612633565b6001600160401b039290921660209283029190910190910152604080516002808252606082019092525f91816020015b6124798152602001906001900390816103be579050509050611887815f815181106103eb576103eb612633565b60200260200101906001600160401b031690816001600160401b0316815250506118968160018151811061042157610421612633565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b6124798152602001906001900390816104515790505090506118a6815f8151811061047e5761047e612633565b60200260200101906001600160401b031690816001600160401b0316815250506118b5816001815181106104b4576104b4612633565b60200260200101906001600160401b031690816001600160401b0316815250506118c5816002815181106104ea576104ea612633565b60200260200101906001600160401b031690816001600160401b0316815250506118d58160038151811061052057610520612633565b60200260200101906001600160401b031690816001600160401b0316815250506118e48160048151811061055657610556612633565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b6124798152602001906001900390816105865790505090506118f4815f815181106105b3576105b3612633565b60200260200101906001600160401b031690816001600160401b031681525050611903816001815181106105e9576105e9612633565b60200260200101906001600160401b031690816001600160401b0316815250506119138160028151811061061f5761061f612633565b60200260200101906001600160401b031690816001600160401b0316815250506119238160038151811061065557610655612633565b60200260200101906001600160401b031690816001600160401b0316815250506119338160048151811061068b5761068b612633565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6124798152602001906001900390816106ba579050509050611942815f815181106106e7576106e7612633565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b612479815260200190600190039081610716579050509050611951815f8151811061074357610743612633565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b61247981526020019060019003908161077257905050905061196a815f8151811061079f5761079f612633565b60200260200101906001600160401b031690816001600160401b03168152505087895f815181106107d2576107d2612633565b602002602001018190525086896001815181106107f1576107f1612633565b6020026020010181905250858960028151811061081057610810612633565b6020026020010181905250848960038151811061082f5761082f612633565b6020026020010181905250838960048151811061084e5761084e612633565b6020026020010181905250828960058151811061086d5761086d612633565b6020908102919091010152818961088660056001612620565b8151811061089657610896612633565b602090810291909101015280896108af60056001612620565b6108ba906001612620565b815181106108ca576108ca612633565b602090810291909101015260408051600680825260e082019092525f91816020015b6124798152602001906001900390816108ec57905050905061182d815f8151811061091957610919612633565b60200260200101906001600160401b031690816001600160401b0316815250506118598160018151811061094f5761094f612633565b60200260200101906001600160401b031690816001600160401b0316815250506118688160028151811061098557610985612633565b60200260200101906001600160401b031690816001600160401b031681525050611877816003815181106109bb576109bb612633565b60200260200101906001600160401b031690816001600160401b0316815250506119b6816004815181106109f1576109f1612633565b60200260200101906001600160401b031690816001600160401b0316815250506119c681600581518110610a2757610a27612633565b6001600160401b0390921660209283029190910190910152808a610a4d60056001612620565b610a58906001612620565b610a63906001612620565b81518110610a7357610a73612633565b602090810291909101015260408051600780825261010082019092525f91816020015b612479815260200190600190039081610a9657905050905061182d815f81518110610ac357610ac3612633565b60200260200101906001600160401b031690816001600160401b03168152505061185981600181518110610af957610af9612633565b60200260200101906001600160401b031690816001600160401b03168152505061186881600281518110610b2f57610b2f612633565b60200260200101906001600160401b031690816001600160401b03168152505061187781600381518110610b6557610b65612633565b60200260200101906001600160401b031690816001600160401b0316815250506119b681600481518110610b9b57610b9b612633565b60200260200101906001600160401b031690816001600160401b0316815250506119c681600581518110610bd157610bd1612633565b60200260200101906001600160401b031690816001600160401b0316815250506119d681600681518110610c0757610c07612633565b6001600160401b0390921660209283029190910190910152808b610c2d60056001612620565b610c38906001612620565b610c43906002612620565b81518110610c5357610c53612633565b60209081029190910101528a610c70610c6b826119e6565b6119fb565b9c5050505050505050505050505090565b5f6060805f805f610ca187610c94611a8a565b610c9c611aaa565b611aca565b9250925092505f610cb782610220015160200190565b90505f8261022001515182610ccc9190612620565b90505f610cea83836f07fffffe0000000003ff200000000000611bbb565b80925081945050505f80610d0386610240015184611c57565b915091508115610d98575f610d188783611d2e565b90506124795f610d26611d5d565b90505f60028251610d37919061265b565b9050808510610d68576040516303bdd1b160e51b815260048101869052602481018290526044015b60405180910390fd5b6001850160020282015161ffff169250610d818c8c8686565b9e509e509e50505050505050505050505050610dbe565b5050604080515f80825281830190925260208101828152919a5090985096505050505050505b9193909250565b5f805f805f610ded866002810151815160228084019461ffff93909316840101920160200190565b505f988998509650505050505050565b60605f610e0c60056001612620565b610e17906001612620565b610e22906003612620565b6001600160401b03811115610e3957610e396124f1565b604051908082528060200260200182016040528015610e6c57816020015b6060815260200190600190039081610e575790505b50604080516002808252606082019092529192505f9190816020015b612479815260200190600190039081610e88579050509050611d7d815f81518110610eb557610eb5612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d81600181518110610eeb57610eeb612633565b6001600160401b039290921660209283029190910190910152604080516003808252608082019092525f91816020015b612479815260200190600190039081610f1b579050509050611d7d815f81518110610f4857610f48612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d81600181518110610f7e57610f7e612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d81600281518110610fb457610fb4612633565b6001600160401b039290921660209283029190910190910152604080516002808252606082019092525f91816020015b612479815260200190600190039081610fe4579050509050611d7d815f8151811061101157611011612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d8160018151811061104757611047612633565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b612479815260200190600190039081611077579050509050611d7d815f815181106110a4576110a4612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d816001815181106110da576110da612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d8160028151811061111057611110612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d8160038151811061114657611146612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d8160048151811061117c5761117c612633565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b6124798152602001906001900390816111ac579050509050611d7d815f815181106111d9576111d9612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d8160018151811061120f5761120f612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d8160028151811061124557611245612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d8160038151811061127b5761127b612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d816004815181106112b1576112b1612633565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6124798152602001906001900390816112e0579050509050611da6815f8151811061130d5761130d612633565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b61247981526020019060019003908161133c579050509050611da6815f8151811061136957611369612633565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b612479815260200190600190039081611398579050509050611e42815f815181106113c5576113c5612633565b60200260200101906001600160401b031690816001600160401b03168152505087895f815181106113f8576113f8612633565b6020026020010181905250868960018151811061141757611417612633565b6020026020010181905250858960028151811061143657611436612633565b6020026020010181905250848960038151811061145557611455612633565b6020026020010181905250838960048151811061147457611474612633565b6020026020010181905250828960058151811061149357611493612633565b602090810291909101015281896114ac60056001612620565b815181106114bc576114bc612633565b602090810291909101015280896114d560056001612620565b6114e0906001612620565b815181106114f0576114f0612633565b602090810291909101015260408051600680825260e082019092525f91816020015b612479815260200190600190039081611512579050509050611d7d815f8151811061153f5761153f612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d8160018151811061157557611575612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d816002815181106115ab576115ab612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d816003815181106115e1576115e1612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d8160048151811061161757611617612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d8160058151811061164d5761164d612633565b6001600160401b0390921660209283029190910190910152808a61167360056001612620565b61167e906001612620565b611689906001612620565b8151811061169957611699612633565b602090810291909101015260408051600780825261010082019092525f91816020015b6124798152602001906001900390816116bc579050509050611d7d815f815181106116e9576116e9612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d8160018151811061171f5761171f612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d8160028151811061175557611755612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d8160038151811061178b5761178b612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d816004815181106117c1576117c1612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d816005815181106117f7576117f7612633565b60200260200101906001600160401b031690816001600160401b031681525050611d7d81600681518110610c0757610c07612633565b5f60608061183b5f80611efa565b92509250925093509350939050565b5f60608061183b5f6001611efa565b5f60608061183b60015f611efa565b5f60608061183b600180611efa565b5f60608061183b60016002611efa565b5f60608061183b60025f611efa565b5f60608061183b60026001611efa565b5f60608061183b60035f611efa565b5f60608061183b60036001611efa565b5f60608061183b60036002611efa565b5f60608061183b600380611efa565b5f60608061183b60036004611efa565b5f60608061183b60045f611efa565b5f60608061183b60046001611efa565b5f60608061183b60046002611efa565b5f60608061183b60046003611efa565b5f60608061183b600480611efa565b5f60608061183b600585611efa565b5f60608061183b61196460056001612620565b85611efa565b5f60608060ff80851690600886901c166119a58261198a60056001612620565b611995906001612620565b61199f9190612620565b82611efa565b945094509450505093509350939050565b5f60608061183b60016003611efa565b5f60608061183b60016004611efa565b5f60608061183b60016005611efa565b6060815f6119f382611f7c565b949350505050565b60605f82516002026001600160401b03811115611a1a57611a1a6124f1565b6040519080825280601f01601f191660200182016040528015611a44576020820181803683370190505b50905061ffff80196020850160208651028101600285015b81831015611a7e57805183518616908516178152602090920191600201611a5c565b50939695505050505050565b60606040518060e0016040528060a681526020016126e860a69139905090565b606060405180608001604052806042815260200161278e60429139905090565b5f80611b596040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020016060815260200160608152602001606081526020015f815260200160608152602001606081525090565b606061ffff600288015116935060ff600388015116925061ffff600588015116600588019750808852602081018801915050611ba587878760405180602001604052805f815250611fea565b915080826101e001819052505093509350939050565b5f808060018187870360208111611bd25780611bd5565b60205b915050875192505b8519600184841a1b16158183101615611bfb57600182019150611bdd565b9681019660208290036008810293841c90931b92611c465760408051602081018590520160408051601f198184030181529082905263e47fe8b760e01b8252610d5f916004016124df565b50869350909150505b935093915050565b600182810180515f928392600560ff93909316602102870192830192909101835b81831015611d1c5760018301516021909301805190935f90819060ff168180611ca1838e61219b565b915091508186165f03611cc3575f809b509b5050505050505050505050611d27565b5f87611cd36001850389166121c6565b016004028b015195505062ffffff9081169350841683039150611d079050575060019750601c1a9550611d27945050505050565b611d10836121c6565b84019350505050611c78565b5f8095509550505050505b9250929050565b6101c08201516002828102820101516101e08401515f9261ffff9092169190611d549083565b95945050505050565b60606040518060800160405280604281526020016126a660429139905090565b5f81515f14611d9f576040516304f8b58160e51b815260040160405180910390fd5b505f919050565b5f8151600103611e03575060208101516001600160e01b038116601b0b60e082901d5f611dd483838361227f565b905061ffff811115611df957604051631e4e01d760e21b815260040160405180910390fd5b9250611e3d915050565b81515f03611e2457604051630f16066b60e41b815260040160405180910390fd5b604051630358cd2160e31b815260040160405180910390fd5b919050565b5f8151600203611ed757602082015160408301516001600160e01b038216601b0b60e083901d5f611e7483838361227f565b6001600160e01b038516601b0b935060e085901d925090505f611e9884848361227f565b905060ff821180611ea9575060ff81115b15611ec757604051631e4e01d760e21b815260040160405180910390fd5b60081b179450611e3d9350505050565b600282511015611e2457604051630f16066b60e41b815260040160405180910390fd5b5f60608060ff851180611f0d575060ff84115b15611f3557604051639b0f326160e01b81526004810186905260248101859052604401610d5f565b6040805160248101909152600386602383015385602283015360106021830153806020830153506004815260408051602081019091525f8152600197919650945092505050565b60605f611f88836122c1565b90505f611f9682602061267a565b9050606060405190508160200181016040528281526020850160208651028101602083015b81831015611fde57602083515102806020855101835e6020939093019201611fbb565b50919695505050505050565b6120776040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020016060815260200160608152602001606081526020015f815260200160608152602001606081525090565b5f6040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f801b81526020015f8152602001600481526020015f81526020015f81526020015f81526020015f801b815260200184815260200185815260200160046001600160401b038111156120fc576120fc6124f1565b604051908082528060200260200182016040528015612125578160200160208202803683370190505b5081525f602080830182905260408084018b905260609384018a90528051601f01601f19168281528083018252835161ffff191681178452855290840182905283018190529082018190526080820181905260a08201819052610120820181905261014082018190526102008201529050611d54565b5f80825f528360205360215f2090506001815f1a1b915062ffffff8116611d27575060019250929050565b5f5f1982036121d85750610100919050565b507f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f7f5555555555555555555555555555555555555555555555555555555555555555600183901c16909103600281901c7f3333333333333333333333333333333333333333333333333333333333333333908116911601600481901c01167f01010101010101010101010101010101010101010101010101010101010101010260f81c90565b5f805f61228d86868661230a565b91509150806122b85760405162bc8ecf60e31b81526004810187905260248101869052604401610d5f565b50949350505050565b5f60208201602083510281015b808210156123035781515192830192808410156122f757634e487b715f5260116020526024601cfd5b506020820191506122ce565b5050919050565b5f805f85121561233757604051634a7d166b60e01b81526004810186905260248101859052604401610d5f565b845f0361234957505f90506001611c4f565b8460ff84168501858112156123845760405163c849483b60e01b8152600481018890526024810187905260ff86166044820152606401610d5f565b5f805f8312156123d057604c198312156123a7575f809550955050505050611c4f565b825f03600a0a91508184816123be576123be612647565b0495505084029091149150611c4f9050565b5f83131561246957604d83131561240d5760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610d5f565b82600a0a9150815f198161242357612423612647565b048411156124575760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610d5f565b5091909102925060019150611c4f9050565b8360019550955050505050611c4f565b612481612691565b565b5f60208284031215612493575f80fd5b81356001600160e01b0319811681146124aa575f80fd5b9392505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6124aa60208301846124b1565b634e487b7160e01b5f52604160045260245ffd5b5f60208284031215612515575f80fd5b81356001600160401b038082111561252b575f80fd5b818401915084601f83011261253e575f80fd5b813581811115612550576125506124f1565b604051601f8201601f19908116603f01168101908382118183101715612578576125786124f1565b81604052828152876020848701011115612590575f80fd5b826020860160208301375f928101602001929092525095945050505050565b83151581525f6020606060208401526125cb60608401866124b1565b8381036040850152845180825260208087019201905f5b818110156125fe578351835292840192918401916001016125e2565b509098975050505050505050565b634e487b7160e01b5f52601160045260245ffd5b808201808211156101d1576101d161260c565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601260045260245ffd5b5f8261267557634e487b7160e01b5f52601260045260245ffd5b500490565b80820281158282048414176101d1576101d161260c565b634e487b7160e01b5f52605160045260245ffdfe182d184a1859186818771887189618a618b518c518d518e418f4190319131923193319421951196a182d18591868187719b619c6182d18591868187719b619c619d60101180010800082000100010480300038412a001810000010020004200005002038038ff54900cc66c620f3dcab0616592212c9ec8109895f0b17fec9301c02e0920c5bfe561e21609201e959460b1974270f844db208bcd3bf1f989376111049db14b934301b0ae9a00af82a7805c138f40d28083f0742ef2104d561fd1515a13318716a611ad260cc107b9bfc0eec7ade16cba2891d6b14a513792bdb02e0f147195655891d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1da61da61e421d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d1d7d"; + hex"608060405234801561000f575f80fd5b506004361061007a575f3560e01c80636f5aa28d116100585780636f5aa28d146100dd578063c6c0cbb61461010b578063ccf4477514610135578063d6d8c9a814610148575f80fd5b806301ffc9a71461007e578063336284d4146100a6578063570c7a63146100bb575b5f80fd5b61009161008c366004612547565b610150565b60405190151581526020015b60405180910390f35b6100ae6101d7565b60405161009d91906125a3565b6100ce6100c93660046125c9565b610c7c565b60405161009d93929190612673565b6040517fe5f5c8b20782dd193ccec19353560b4bba9e69c36c2e6dbf45ef331a38d96dc9815260200161009d565b61011e6101193660046125c9565b610dc0565b60408051921515835260208301919091520161009d565b60408051602081019091525f81526100ae565b6100ae610df8565b5f6001600160e01b031982166391ccb1d560e01b148061018057506001600160e01b03198216636f5aa28d60e01b145b8061019b57506001600160e01b03198216631a2c8edd60e01b145b806101b657506001600160e01b03198216630cd8a13560e21b145b806101d157506301ffc9a760e01b6001600160e01b03198316145b92915050565b60605f6101e6600660016126e4565b6101f19060016126e4565b6101fc9060016126e4565b6102079060016126e4565b6001600160401b0381111561021e5761021e6125b5565b60405190808252806020026020018201604052801561025157816020015b606081526020019060019003908161023c5790505b50604080516002808252606082019092529192505f9190816020015b61253d81526020019060019003908161026d57905050905061183b815f8151811061029a5761029a6126f7565b60200260200101906001600160401b031690816001600160401b031681525050611858816001815181106102d0576102d06126f7565b6001600160401b039290921660209283029190910190910152604080516003808252608082019092525f91816020015b61253d815260200190600190039081610300579050509050611867815f8151811061032d5761032d6126f7565b60200260200101906001600160401b031690816001600160401b03168152505061187681600181518110610363576103636126f7565b60200260200101906001600160401b031690816001600160401b03168152505061188581600281518110610399576103996126f7565b6001600160401b039290921660209283029190910190910152604080516002808252606082019092525f91816020015b61253d8152602001906001900390816103c9579050509050611895815f815181106103f6576103f66126f7565b60200260200101906001600160401b031690816001600160401b0316815250506118a48160018151811061042c5761042c6126f7565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b61253d81526020019060019003908161045c5790505090506118b4815f81518110610489576104896126f7565b60200260200101906001600160401b031690816001600160401b0316815250506118c3816001815181106104bf576104bf6126f7565b60200260200101906001600160401b031690816001600160401b0316815250506118d3816002815181106104f5576104f56126f7565b60200260200101906001600160401b031690816001600160401b0316815250506118e38160038151811061052b5761052b6126f7565b60200260200101906001600160401b031690816001600160401b0316815250506118f281600481518110610561576105616126f7565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b61253d815260200190600190039081610591579050509050611902815f815181106105be576105be6126f7565b60200260200101906001600160401b031690816001600160401b031681525050611911816001815181106105f4576105f46126f7565b60200260200101906001600160401b031690816001600160401b0316815250506119218160028151811061062a5761062a6126f7565b60200260200101906001600160401b031690816001600160401b03168152505061193181600381518110610660576106606126f7565b60200260200101906001600160401b031690816001600160401b03168152505061194181600481518110610696576106966126f7565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b61253d8152602001906001900390816106c5579050509050611950815f815181106106f2576106f26126f7565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b61253d815260200190600190039081610721579050509050611969815f8151811061074e5761074e6126f7565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b61253d81526020019060019003908161077d579050509050611987815f815181106107aa576107aa6126f7565b60200260200101906001600160401b031690816001600160401b03168152505087895f815181106107dd576107dd6126f7565b602002602001018190525086896001815181106107fc576107fc6126f7565b6020026020010181905250858960028151811061081b5761081b6126f7565b6020026020010181905250848960038151811061083a5761083a6126f7565b60200260200101819052508389600481518110610859576108596126f7565b60209081029190910101528289610872600660016126e4565b81518110610882576108826126f7565b6020908102919091010152818961089b600660016126e4565b6108a69060016126e4565b815181106108b6576108b66126f7565b602090810291909101015280896108cf600660016126e4565b6108da9060016126e4565b6108e59060016126e4565b815181106108f5576108f56126f7565b602090810291909101015260408051600680825260e082019092525f91816020015b61253d8152602001906001900390816109175790505090506119de815f81518110610944576109446126f7565b60200260200101906001600160401b031690816001600160401b0316815250506119ed8160018151811061097a5761097a6126f7565b60200260200101906001600160401b031690816001600160401b0316815250506119fc816002815181106109b0576109b06126f7565b60200260200101906001600160401b031690816001600160401b031681525050611a0c816003815181106109e6576109e66126f7565b60200260200101906001600160401b031690816001600160401b031681525050611a1c81600481518110610a1c57610a1c6126f7565b60200260200101906001600160401b031690816001600160401b031681525050611a2c81600581518110610a5257610a526126f7565b60200260200101906001600160401b031690816001600160401b031681525050808a600581518110610a8657610a866126f7565b602090810291909101015260408051600780825261010082019092525f91816020015b61253d815260200190600190039081610aa9579050509050611a3c815f81518110610ad657610ad66126f7565b60200260200101906001600160401b031690816001600160401b031681525050611a4b81600181518110610b0c57610b0c6126f7565b60200260200101906001600160401b031690816001600160401b031681525050611a5a81600281518110610b4257610b426126f7565b60200260200101906001600160401b031690816001600160401b031681525050611a6a81600381518110610b7857610b786126f7565b60200260200101906001600160401b031690816001600160401b031681525050611a7a81600481518110610bae57610bae6126f7565b60200260200101906001600160401b031690816001600160401b031681525050611a8a81600581518110610be457610be46126f7565b60200260200101906001600160401b031690816001600160401b031681525050611a9a81600681518110610c1a57610c1a6126f7565b60200260200101906001600160401b031690816001600160401b031681525050808b600681518110610c4e57610c4e6126f7565b60209081029190910101528a610c6b610c6682611aaa565b611abf565b9c5050505050505050505050505090565b5f6060805f805f610c9c87610c8f611b4e565b610c97611b6e565b611b8e565b9250925092505f610cb282610220015160200190565b90505f8261022001515182610cc791906126e4565b90505f610ce583836f07fffffe0000000003ff200000000000611c7f565b80925081945050505f80610cfe86610240015184611d1b565b915091508115610d93575f610d138783611df2565b905061253d5f610d21611e21565b90505f60028251610d32919061271f565b9050808510610d63576040516303bdd1b160e51b815260048101869052602481018290526044015b60405180910390fd5b6001850160020282015161ffff169250610d7c8c8c8686565b9e509e509e50505050505050505050505050610db9565b5050604080515f80825281830190925260208101828152919a5090985096505050505050505b9193909250565b5f805f805f610de8866002810151815160228084019461ffff93909316840101920160200190565b505f988998509650505050505050565b60605f610e07600660016126e4565b610e129060016126e4565b610e1d9060016126e4565b610e289060016126e4565b6001600160401b03811115610e3f57610e3f6125b5565b604051908082528060200260200182016040528015610e7257816020015b6060815260200190600190039081610e5d5790505b50604080516002808252606082019092529192505f9190816020015b61253d815260200190600190039081610e8e579050509050611e41815f81518110610ebb57610ebb6126f7565b60200260200101906001600160401b031690816001600160401b031681525050611e4181600181518110610ef157610ef16126f7565b6001600160401b039290921660209283029190910190910152604080516003808252608082019092525f91816020015b61253d815260200190600190039081610f21579050509050611e41815f81518110610f4e57610f4e6126f7565b60200260200101906001600160401b031690816001600160401b031681525050611e4181600181518110610f8457610f846126f7565b60200260200101906001600160401b031690816001600160401b031681525050611e4181600281518110610fba57610fba6126f7565b6001600160401b039290921660209283029190910190910152604080516002808252606082019092525f91816020015b61253d815260200190600190039081610fea579050509050611e41815f81518110611017576110176126f7565b60200260200101906001600160401b031690816001600160401b031681525050611e418160018151811061104d5761104d6126f7565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b61253d81526020019060019003908161107d579050509050611e41815f815181106110aa576110aa6126f7565b60200260200101906001600160401b031690816001600160401b031681525050611e41816001815181106110e0576110e06126f7565b60200260200101906001600160401b031690816001600160401b031681525050611e4181600281518110611116576111166126f7565b60200260200101906001600160401b031690816001600160401b031681525050611e418160038151811061114c5761114c6126f7565b60200260200101906001600160401b031690816001600160401b031681525050611e4181600481518110611182576111826126f7565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b61253d8152602001906001900390816111b2579050509050611e41815f815181106111df576111df6126f7565b60200260200101906001600160401b031690816001600160401b031681525050611e4181600181518110611215576112156126f7565b60200260200101906001600160401b031690816001600160401b031681525050611e418160028151811061124b5761124b6126f7565b60200260200101906001600160401b031690816001600160401b031681525050611e4181600381518110611281576112816126f7565b60200260200101906001600160401b031690816001600160401b031681525050611e41816004815181106112b7576112b76126f7565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b61253d8152602001906001900390816112e6579050509050611e6a815f81518110611313576113136126f7565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b61253d815260200190600190039081611342579050509050611e6a815f8151811061136f5761136f6126f7565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b61253d81526020019060019003908161139e579050509050611f06815f815181106113cb576113cb6126f7565b60200260200101906001600160401b031690816001600160401b03168152505087895f815181106113fe576113fe6126f7565b6020026020010181905250868960018151811061141d5761141d6126f7565b6020026020010181905250858960028151811061143c5761143c6126f7565b6020026020010181905250848960038151811061145b5761145b6126f7565b6020026020010181905250838960048151811061147a5761147a6126f7565b60209081029190910101528289611493600660016126e4565b815181106114a3576114a36126f7565b602090810291909101015281896114bc600660016126e4565b6114c79060016126e4565b815181106114d7576114d76126f7565b602090810291909101015280896114f0600660016126e4565b6114fb9060016126e4565b6115069060016126e4565b81518110611516576115166126f7565b602090810291909101015260408051600680825260e082019092525f91816020015b61253d815260200190600190039081611538579050509050611e41815f81518110611565576115656126f7565b60200260200101906001600160401b031690816001600160401b031681525050611e418160018151811061159b5761159b6126f7565b60200260200101906001600160401b031690816001600160401b031681525050611e41816002815181106115d1576115d16126f7565b60200260200101906001600160401b031690816001600160401b031681525050611e4181600381518110611607576116076126f7565b60200260200101906001600160401b031690816001600160401b031681525050611e418160048151811061163d5761163d6126f7565b60200260200101906001600160401b031690816001600160401b031681525050611e4181600581518110611673576116736126f7565b60200260200101906001600160401b031690816001600160401b031681525050808a6005815181106116a7576116a76126f7565b602090810291909101015260408051600780825261010082019092525f91816020015b61253d8152602001906001900390816116ca579050509050611e41815f815181106116f7576116f76126f7565b60200260200101906001600160401b031690816001600160401b031681525050611e418160018151811061172d5761172d6126f7565b60200260200101906001600160401b031690816001600160401b031681525050611e4181600281518110611763576117636126f7565b60200260200101906001600160401b031690816001600160401b031681525050611e4181600381518110611799576117996126f7565b60200260200101906001600160401b031690816001600160401b031681525050611e41816004815181106117cf576117cf6126f7565b60200260200101906001600160401b031690816001600160401b031681525050611e4181600581518110611805576118056126f7565b60200260200101906001600160401b031690816001600160401b031681525050611e4181600681518110610c1a57610c1a6126f7565b5f6060806118495f80611fbe565b92509250925093509350939050565b5f6060806118495f6001611fbe565b5f60608061184960015f611fbe565b5f606080611849600180611fbe565b5f60608061184960016002611fbe565b5f60608061184960025f611fbe565b5f60608061184960026001611fbe565b5f60608061184960035f611fbe565b5f60608061184960036001611fbe565b5f60608061184960036002611fbe565b5f606080611849600380611fbe565b5f60608061184960036004611fbe565b5f60608061184960045f611fbe565b5f60608061184960046001611fbe565b5f60608061184960046002611fbe565b5f60608061184960046003611fbe565b5f606080611849600480611fbe565b5f606080611849611963600660016126e4565b85611fbe565b5f60608061184961197c600660016126e4565b6119639060016126e4565b5f60608060ff80851690600886901c166119cd826119a7600660016126e4565b6119b29060016126e4565b6119bd9060016126e4565b6119c791906126e4565b82611fbe565b945094509450505093509350939050565b5f606080611849600580611fbe565b5f60608061184960055f611fbe565b5f60608061184960056001611fbe565b5f60608061184960056002611fbe565b5f60608061184960056003611fbe565b5f60608061184960056004611fbe565b5f606080611849600680611fbe565b5f60608061184960065f611fbe565b5f60608061184960066001611fbe565b5f60608061184960066002611fbe565b5f60608061184960066003611fbe565b5f60608061184960066004611fbe565b5f60608061184960066005611fbe565b6060815f611ab782612040565b949350505050565b60605f82516002026001600160401b03811115611ade57611ade6125b5565b6040519080825280601f01601f191660200182016040528015611b08576020820181803683370190505b50905061ffff80196020850160208651028101600285015b81831015611b4257805183518616908516178152602090920191600201611b20565b50939695505050505050565b60606040518060e0016040528060a681526020016127ac60a69139905090565b606060405180608001604052806042815260200161276a60429139905090565b5f80611c1d6040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020016060815260200160608152602001606081526020015f815260200160608152602001606081525090565b606061ffff600288015116935060ff600388015116925061ffff600588015116600588019750808852602081018801915050611c6987878760405180602001604052805f8152506120ae565b915080826101e001819052505093509350939050565b5f808060018187870360208111611c965780611c99565b60205b915050875192505b8519600184841a1b16158183101615611cbf57600182019150611ca1565b9681019660208290036008810293841c90931b92611d0a5760408051602081018590520160408051601f198184030181529082905263e47fe8b760e01b8252610d5a916004016125a3565b50869350909150505b935093915050565b600182810180515f928392600560ff93909316602102870192830192909101835b81831015611de05760018301516021909301805190935f90819060ff168180611d65838e61225f565b915091508186165f03611d87575f809b509b5050505050505050505050611deb565b5f87611d9760018503891661228a565b016004028b015195505062ffffff9081169350841683039150611dcb9050575060019750601c1a9550611deb945050505050565b611dd48361228a565b84019350505050611d3c565b5f8095509550505050505b9250929050565b6101c08201516002828102820101516101e08401515f9261ffff9092169190611e189083565b95945050505050565b606060405180608001604052806042815260200161285260429139905090565b5f81515f14611e63576040516304f8b58160e51b815260040160405180910390fd5b505f919050565b5f8151600103611ec7575060208101516001600160e01b038116601b0b60e082901d5f611e98838383612343565b905061ffff811115611ebd57604051631e4e01d760e21b815260040160405180910390fd5b9250611f01915050565b81515f03611ee857604051630f16066b60e41b815260040160405180910390fd5b604051630358cd2160e31b815260040160405180910390fd5b919050565b5f8151600203611f9b57602082015160408301516001600160e01b038216601b0b60e083901d5f611f38838383612343565b6001600160e01b038516601b0b935060e085901d925090505f611f5c848483612343565b905060ff821180611f6d575060ff81115b15611f8b57604051631e4e01d760e21b815260040160405180910390fd5b60081b179450611f019350505050565b600282511015611ee857604051630f16066b60e41b815260040160405180910390fd5b5f60608060ff851180611fd1575060ff84115b15611ff957604051639b0f326160e01b81526004810186905260248101859052604401610d5a565b6040805160248101909152600386602383015385602283015360106021830153806020830153506004815260408051602081019091525f8152600197919650945092505050565b60605f61204c83612385565b90505f61205a82602061273e565b9050606060405190508160200181016040528281526020850160208651028101602083015b818310156120a257602083515102806020855101835e602093909301920161207f565b50919695505050505050565b61213b6040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020016060815260200160608152602001606081526020015f815260200160608152602001606081525090565b5f6040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f801b81526020015f8152602001600481526020015f81526020015f81526020015f81526020015f801b815260200184815260200185815260200160046001600160401b038111156121c0576121c06125b5565b6040519080825280602002602001820160405280156121e9578160200160208202803683370190505b5081525f602080830182905260408084018b905260609384018a90528051601f01601f19168281528083018252835161ffff191681178452855290840182905283018190529082018190526080820181905260a08201819052610120820181905261014082018190526102008201529050611e18565b5f80825f528360205360215f2090506001815f1a1b915062ffffff8116611deb575060019250929050565b5f5f19820361229c5750610100919050565b507f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f7f5555555555555555555555555555555555555555555555555555555555555555600183901c16909103600281901c7f3333333333333333333333333333333333333333333333333333333333333333908116911601600481901c01167f01010101010101010101010101010101010101010101010101010101010101010260f81c90565b5f805f6123518686866123ce565b915091508061237c5760405162bc8ecf60e31b81526004810187905260248101869052604401610d5a565b50949350505050565b5f60208201602083510281015b808210156123c75781515192830192808410156123bb57634e487b715f5260116020526024601cfd5b50602082019150612392565b5050919050565b5f805f8512156123fb57604051634a7d166b60e01b81526004810186905260248101859052604401610d5a565b845f0361240d57505f90506001611d13565b8460ff84168501858112156124485760405163c849483b60e01b8152600481018890526024810187905260ff86166044820152606401610d5a565b5f805f83121561249457604c1983121561246b575f809550955050505050611d13565b825f03600a0a91508184816124825761248261270b565b0495505084029091149150611d139050565b5f83131561252d57604d8313156124d15760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610d5a565b82600a0a9150815f19816124e7576124e761270b565b0484111561251b5760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610d5a565b5091909102925060019150611d139050565b8360019550955050505050611d13565b612545612755565b565b5f60208284031215612557575f80fd5b81356001600160e01b03198116811461256e575f80fd5b9392505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f61256e6020830184612575565b634e487b7160e01b5f52604160045260245ffd5b5f602082840312156125d9575f80fd5b81356001600160401b03808211156125ef575f80fd5b818401915084601f830112612602575f80fd5b813581811115612614576126146125b5565b604051601f8201601f19908116603f0116810190838211818310171561263c5761263c6125b5565b81604052828152876020848701011115612654575f80fd5b826020860160208301375f928101602001929092525095945050505050565b83151581525f60206060602084015261268f6060840186612575565b8381036040850152845180825260208087019201905f5b818110156126c2578351835292840192918401916001016126a6565b509098975050505050505050565b634e487b7160e01b5f52601160045260245ffd5b808201808211156101d1576101d16126d0565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601260045260245ffd5b5f8261273957634e487b7160e01b5f52601260045260245ffd5b500490565b80820281158282048414176101d1576101d16126d0565b634e487b7160e01b5f52605160045260245ffdfe1e411e411e411e411e411e411e411e411e411e411e411e411e411e411e411e411e411e411e411e411e411e411e411e411e411e411e411e411e411e411e6a1e6a1f060101180010800082000100010480300038412a001810000010020004200005002038038ff54900cc66c61df3dcab061659221fc9ec8109895f0b14fec9301902e0920c5bfe561b21609201e959460b1974270f844db208bcd3bf1c9893761e1049db11b93430180ae9a00af82a7805c138f40d28083f0742ef2104d561fd1215a13315716a6117d260cc107b9bfc0eec7ade13cba2891a6b14a520792bdb02e0f14716565589183b1858186718761885189518a418b418c318d318e318f21902191119211931194119de19ed19fc1a0c1a1c1a2c1a3c1a4b1a5a1a6a1a7a1a8a1a9a195019691987"; /// @dev What MUST already be on a network before this release can be /// broadcast there: an address, and the runtime code that belongs at it. diff --git a/src/generated/candidate/RouteProcessorRaindexV6ArbOrderTaker.sol b/src/generated/candidate/RouteProcessorRaindexV6ArbOrderTaker.sol index 9c4a538cf0..3be0cef664 100644 --- a/src/generated/candidate/RouteProcessorRaindexV6ArbOrderTaker.sol +++ b/src/generated/candidate/RouteProcessorRaindexV6ArbOrderTaker.sol @@ -5,23 +5,23 @@ pragma solidity ^0.8.25; // THIS FILE IS AUTOGENERATED BY THE BUILD SCRIPT. DO NOT EDIT BY HAND. /// @dev Hash of the known bytecode. -bytes32 constant BYTECODE_HASH = bytes32(0x39b8833d3404cf2dcc78fa2f094c6d1b9322fd2dd2a6e8abb480c1eda17c7846); +bytes32 constant BYTECODE_HASH = bytes32(0x9bdb9fcc67e61c4ec677070ecd23063dab34d5f700e7fb78701d0bf5ec8ca1c7); /// @dev The deterministic deploy address of the contract when deployed via /// the Zoltu factory. -address constant DEPLOYED_ADDRESS = address(0xaA28Ab43bb7D7610DFb3B051DD89Ab462d2F5Fa0); +address constant DEPLOYED_ADDRESS = address(0xcf634095C544103daF4258c99F78D86978C0c78d); /// @dev The creation bytecode of the contract. bytes constant CREATION_CODE = - hex"6080604052348015600e575f80fd5b5060017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055612605806100405f395ff3fe608060405260043610610034575f3560e01c806301ffc9a71461003d578063691f9ed714610070578063ea37cc511461008f57005b3661003b57005b005b348015610048575f80fd5b5061005c61005736600461186a565b6100a2565b604051901515815260200160405180910390f35b34801561007b575f80fd5b5061003b61008a3660046118a5565b6100f3565b61003b61009d366004611947565b61020e565b5f6001600160e01b0319821663691f9ed760e01b14806100d257506001600160e01b0319821663ea37cc5160e01b145b806100ed57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6101018686868686866104d0565b736e2d0e71d900474b262e545bc4c98b71ab368d2161012b6001600160a01b038816825f1961053d565b5f61013883850185611ae5565b90505f61014d876101488b6105b7565b61063b565b5090505f8061015f886101488c6105b7565b9150915080610176578161017281611b17565b9250505b604051632646478b60e01b81526001600160a01b03861690632646478b906101ac908e9087908f90889030908c90600401611b69565b6020604051808303815f875af11580156101c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101ec9190611bb4565b506102016001600160a01b038c16865f61053d565b5050505050505050505050565b610216610668565b61022561022282611d36565b50565b6102326080830183611df2565b90505f0361025357604051639c95219f60e01b815260040160405180910390fd5b6001600160a01b03831673531167691b4f37f0266e226d03412c77fb2977ce146102a05760405163516e822d60e01b81526001600160a01b03841660048201526024015b60405180910390fd5b5f6102ae6080840184611df2565b5f8181106102be576102be611e38565b90506020028101906102d09190611e4c565b6102da9080611e6a565b6102e8906040810190611e7e565b6102f56080860186611df2565b5f81811061030557610305611e38565b90506020028101906103179190611e4c565b6020013581811061032a5761032a611e38565b6103409260206040909202019081019150611ec4565b90505f6103506080850185611df2565b5f81811061036057610360611e38565b90506020028101906103729190611e4c565b61037c9080611e6a565b61038a906060810190611e7e565b6103976080870187611df2565b5f8181106103a7576103a7611e38565b90506020028101906103b99190611e4c565b604001358181106103cc576103cc611e38565b6103e29260206040909202019081019150611ec4565b90506103f96001600160a01b038316865f1961053d565b60405163b0460f0760e01b81526001600160a01b0386169063b0460f079061042590879060040161218c565b60408051808303815f875af1158015610440573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610464919061234e565b5061047b90506001600160a01b038316865f61053d565b6104a061048784611d36565b83610491856105b7565b8461049b866105b7565b610696565b50506104cb60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054600214801561051557503373531167691b4f37f0266e226d03412c77fb2977ce14155b156105355760405163f6688adf60e01b8152336004820152602401610297565b505050505050565b6105498383835f610935565b6104cb5761055a83835f6001610935565b61058257604051635274afe760e01b81526001600160a01b0384166004820152602401610297565b61058f8383836001610935565b6104cb57604051635274afe760e01b81526001600160a01b0384166004820152602401610297565b5f6105c0610997565b6040516354636d2b60e01b81526001600160a01b038316600482015273200e12d10bb0c5e4a17e7018f0f1161919bb9389906354636d2b906024016020604051808303815f875af1158015610617573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100ed9190612370565b5f806001600160e01b038416601b0b60e085901d61065a828287610a24565b9350935050505b9250929050565b610670610b96565b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b6040805160018082528183019092525f91816020015b60608152602001906001900390816106ac575050604080516003808252608082019092529192505f919060208201606080368337019050506040516370a0823160e01b81523060048201529091505f906001600160a01b038816906370a0823190602401602060405180830381865afa15801561072b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061074f9190611bb4565b9050801561076b5761076b6001600160a01b0388163383610bd8565b5f6107768288610be5565b50905080835f8151811061078c5761078c611e38565b602090810291909101015250506040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa1580156107dd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108019190611bb4565b9050801561081d5761081d6001600160a01b0386163383610bd8565b5f6108288286610be5565b509050808360018151811061083f5761083f611e38565b602090810291909101015250479050801561085e5761085e3382610c25565b5f61086a826012610be5565b509050808360028151811061088157610881611e38565b602002602001018181525050505080825f815181106108a2576108a2611e38565b60209081029190910101526040805160018082528183019092525f91816020015b6040805160a0810182525f91810182815260608083019390935260808201839052815260208101919091528152602001906001900390816108c357905050905087815f8151811061091657610916611e38565b602002602001018190525061092b8382610c9c565b5050505050505050565b60405163095ea7b360e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f5114831661098b57838315161561097f573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b73200e12d10bb0c5e4a17e7018f0f1161919bb93893b15806109ee575073200e12d10bb0c5e4a17e7018f0f1161919bb93893f7f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d4114155b15610a22576040516373e6d7b360e01b815273200e12d10bb0c5e4a17e7018f0f1161919bb93896004820152602401610297565b565b5f805f851215610a5157604051634a7d166b60e01b81526004810186905260248101859052604401610297565b845f03610a6357505f90506001610b8e565b8460ff8416850185811215610a9e5760405163c849483b60e01b8152600481018890526024810187905260ff86166044820152606401610297565b5f805f831215610aea57604c19831215610ac1575f809550955050505050610b8e565b825f03600a0a9150818481610ad857610ad8612390565b0495505084029091149150610b8e9050565b5f831315610b8357604d831315610b275760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610297565b82600a0a9150815f1981610b3d57610b3d612390565b04841115610b715760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610297565b5091909102925060019150610b8e9050565b509193506001925050505b935093915050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054600203610a2257604051633ee5aeb560e01b815260040160405180910390fd5b61058f8383836001610ee4565b5f805f805f610bf48787610f2e565b9250925092505f80610c068585610f8a565b9150915081838015610c155750815b9650965050505050509250929050565b80471015610c4f5760405163cf47918160e01b815247600482015260248101829052604401610297565b610c68828260405180602001604052805f8152506111d3565b15610c71575050565b3d15610c8357610c7f6111e8565b5050565b60405163d6bda27560e01b815260040160405180910390fd5b60408051600480825260a082019092525f91816020015b6060815260200190600190039081610cb35790505090505f5b8351811015610d1457838181518110610ce757610ce7611e38565b6020026020010151828281518110610d0157610d01611e38565b6020908102919091010152600101610ccc565b50335f8181523060209081526040808320815160a0810183528083018581526060808301879052608083018190529082528185015282518581529384018581528484019093529093909291905b8751811015610ed957878181518110610d7c57610d7c611e38565b602002602001015193505f845f015160400151511115610ed1575f845f01515f01516001600160a01b031663d04dfe236040518060e00160405280885f0151602001516001600160a01b03168152602001898152602001885f01516040015181526020015f8152602001610df48c8a602001516111f3565b8152602001878152602001868152506040518263ffffffff1660e01b8152600401610e1f919061242b565b5f60405180830381865afa158015610e39573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610e609190810190612523565b9150505f81511115610ecf5784516020015160405163012c676d60e21b81526001600160a01b03909116906304b19db490610ea1908a9085906004016125d9565b5f604051808303815f87803b158015610eb8575f80fd5b505af1158015610eca573d5f803e3d5ffd5b505050505b505b600101610d61565b505050505050505050565b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f5114831661098b57838315161561097f573d5f823e3d81fd5b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff861115610f7957600a860460018201600a88065f1493509350935050610f83565b8593509150600190505b9250925092565b5f808383601b82900b8214806110c0577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e100000000000000000087051561100b577f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000870515610ffc576305f5e1008705965060088601955061100b565b620186a0870596506005860195505b8687601b0b1461102657600a8705965085600101955061100b565b7b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc7b19999999999999999999999999999999999999999999999999999998888201116110ba575f600188039050808160030b036110b85760e01b6001600160e01b037b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff60ff8b901d18161795505f94506106619350505050565b505b506110d7565b865f036110d757505f935060019250610661915050565b858660030b1461118e575f821315611136576110f383836115c6565b1561111b5760405163d556b11160e01b81526004810184905260248101839052604401610297565b637ffffffe19909501600a0a82029550637fffffff9461118e565b637fffffff19869003604381131561115857505f945084935061066192505050565b80600a0a888161116a5761116a612390565b059750875f0361118457505f945084935061066192505050565b50637fffffff1995505b81861361119e57600193506111b7565b818603600a0a83816111b2576111b2612390565b071593505b5050506001600160e01b03841660e084901b1791509250929050565b5f805f83516020850186885af1949350505050565b6040513d5f823e3d81fd5b60605f825167ffffffffffffffff811115611210576112106119c5565b604051908082528060200260200182016040528015611239578160200160208202803683370190505b5090505f835167ffffffffffffffff811115611257576112576119c5565b604051908082528060200260200182016040528015611280578160200160208202803683370190505b5090505f80855111611292575f611298565b84516002015b86516001010190505f8167ffffffffffffffff8111156112ba576112ba6119c5565b6040519080825280602002602001820160405280156112ed57816020015b60608152602001906001900390816112d85790505b5090505f611311604080516002815233602082015230818301526060810190915290565b82828151811061132357611323611e38565b60200260200101819052505f5b885181101561138057818060010192505088818151811061135357611353611e38565b602002602001015183838151811061136d5761136d611e38565b6020908102919091010152600101611330565b508651156115bb578080600101915050848282815181106113a3576113a3611e38565b60200260200101819052508080600101915050838282815181106113c9576113c9611e38565b60200260200101819052505f5b87518110156115b9576114cc8882815181106113f4576113f4611e38565b60200260200101515f01516114a98a848151811061141457611414611e38565b60200260200101516020015161148a8c868151811061143557611435611e38565b60200260200101518051604091820151805160209081029181019190912083517f6ec4dff745ec96dbde88c5d41f8aa5ac13aa1664afb47b8406b44fa945a650c8815291820192909252918201526060902090565b60405161190160f01b8152600281019290925260228201526042902090565b8a84815181106114bb576114bb611e38565b6020026020010151606001516115e8565b6114ec57604051630a57f30960e31b815260048101829052602401610297565b8781815181106114fe576114fe611e38565b60200260200101515f01516001600160a01b03165f1b86828151811061152657611526611e38565b60200260200101818152505087818151811061154457611544611e38565b60200260200101516020015185828151811061156257611562611e38565b602002602001018181525050818060010192505087818151811061158857611588611e38565b6020026020010151604001518383815181106115a6576115a6611e38565b60209081029190910101526001016113d6565b505b509695505050505050565b5f6115e15f84126115d757836115db565b835f035b83611659565b9392505050565b5f836001600160a01b03163b5f03611646575f8061160685856116f7565b5090925090505f81600381111561161f5761161f6125f1565b14801561163d5750856001600160a01b0316826001600160a01b0316145b925050506115e1565b61165184848461173d565b949350505050565b5f637ffffff5821361166c57505f6100ed565b637ffffffe19820160438113156116875750508115156100ed565b5f81126116c75780600a0a7b80000000000000000000000000000000000000000000000000000001816116bc576116bc612390565b0484119150506100ed565b805f03600a0a7b800000000000000000000000000000000000000000000000000000020284101591505092915050565b5f805f835160410361172e576020840151604085015160608601515f1a611720888285856117a2565b955095509550505050610f83565b505081515f9150600290610f83565b805160408051630b135d3f60e11b8082526004820186905260248201929092525f92906020820185604483015e5f82606483010152601f820160051c60051b915060205f60648401838a5afa9050825f5114601f3d1116811693505050509392505050565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411156117db57505f91506003905082611860565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa15801561182c573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b03811661185757505f925060019150829050611860565b92505f91508190505b9450945094915050565b5f6020828403121561187a575f80fd5b81356001600160e01b0319811681146115e1575f80fd5b6001600160a01b0381168114610222575f80fd5b5f805f805f8060a087890312156118ba575f80fd5b86356118c581611891565b955060208701356118d581611891565b94506040870135935060608701359250608087013567ffffffffffffffff808211156118ff575f80fd5b818901915089601f830112611912575f80fd5b813581811115611920575f80fd5b8a6020828501011115611931575f80fd5b6020830194508093505050509295509295509295565b5f805f60608486031215611959575f80fd5b833561196481611891565b9250602084013567ffffffffffffffff80821115611980575f80fd5b9085019060c08288031215611993575f80fd5b909250604085013590808211156119a8575f80fd5b508401604081870312156119ba575f80fd5b809150509250925092565b634e487b7160e01b5f52604160045260245ffd5b6040516080810167ffffffffffffffff811182821017156119fc576119fc6119c5565b60405290565b6040805190810167ffffffffffffffff811182821017156119fc576119fc6119c5565b6040516060810167ffffffffffffffff811182821017156119fc576119fc6119c5565b604051601f8201601f1916810167ffffffffffffffff81118282101715611a7157611a716119c5565b604052919050565b5f82601f830112611a88575f80fd5b813567ffffffffffffffff811115611aa257611aa26119c5565b611ab5601f8201601f1916602001611a48565b818152846020838601011115611ac9575f80fd5b816020850160208301375f918101602001919091529392505050565b5f60208284031215611af5575f80fd5b813567ffffffffffffffff811115611b0b575f80fd5b61165184828501611a79565b5f60018201611b3457634e487b7160e01b5f52601160045260245ffd5b5060010190565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f6001600160a01b038089168352876020840152808716604084015285606084015280851660808401525060c060a0830152611ba860c0830184611b3b565b98975050505050505050565b5f60208284031215611bc4575f80fd5b5051919050565b5f67ffffffffffffffff821115611be457611be46119c5565b5060051b60200190565b5f82601f830112611bfd575f80fd5b81356020611c12611c0d83611bcb565b611a48565b82815260059290921b84018101918181019086841115611c30575f80fd5b8286015b848110156115bb57803567ffffffffffffffff80821115611c53575f80fd5b908801906080828b03601f19011215611c6a575f80fd5b611c726119d9565b86830135611c7f81611891565b815260408381013588830152606084013583811115611c9c575f80fd5b8401603f81018d13611cac575f80fd5b88810135611cbc611c0d82611bcb565b81815260059190911b82018301908a8101908f831115611cda575f80fd5b928401925b82841015611cf85783358252928b0192908b0190611cdf565b80858701525050505050608083013582811115611d13575f80fd5b611d218c8983870101611a79565b60608301525085525050918301918301611c34565b5f60408236031215611d46575f80fd5b611d4e611a02565b823567ffffffffffffffff80821115611d65575f80fd5b818501915060608236031215611d79575f80fd5b611d81611a25565b8235611d8c81611891565b81526020830135611d9c81611891565b6020820152604083013582811115611db2575f80fd5b611dbe36828601611a79565b60408301525083526020850135915080821115611dd9575f80fd5b50611de636828601611bee565b60208301525092915050565b5f808335601e19843603018112611e07575f80fd5b83018035915067ffffffffffffffff821115611e21575f80fd5b6020019150600581901b3603821315610661575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235607e19833603018112611e60575f80fd5b9190910192915050565b5f8235609e19833603018112611e60575f80fd5b5f808335601e19843603018112611e93575f80fd5b83018035915067ffffffffffffffff821115611ead575f80fd5b6020019150600681901b3603821315610661575f80fd5b5f60208284031215611ed4575f80fd5b81356115e181611891565b5f808335601e19843603018112611ef4575f80fd5b830160208101925035905067ffffffffffffffff811115611f13575f80fd5b8060051b3603821315610661575f80fd5b5f808335601e19843603018112611f39575f80fd5b830160208101925035905067ffffffffffffffff811115611f58575f80fd5b803603821315610661575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f8135611f9a81611891565b6001600160a01b039081168452602083013590611fb682611891565b166020840152611fc96040830183611f24565b60606040860152611fde606086018284611f66565b95945050505050565b5f808335601e19843603018112611ffc575f80fd5b830160208101925035905067ffffffffffffffff81111561201b575f80fd5b8060061b3603821315610661575f80fd5b8183525f60208085019450825f5b8581101561207257813561204d81611891565b6001600160a01b0316875281830135838801526040968701969091019060010161203a565b509495945050505050565b5f8235607e19833603018112612091575f80fd5b90910192915050565b8183526020808401935f91600585811b8301820185855b8881101561217e57858303601f19018a526120cc828961207d565b608081356120d981611891565b6001600160a01b03168552818701358786015260406120fa81840184611edf565b8383890152808489015260a093507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811115612134575f80fd5b881b9150818188850137508501606061214f84820185611f24565b94508388840301828901526121678484018683611f66565b9e8a019e97505050938701935050506001016120b1565b509098975050505050505050565b5f602080835260e0830184358285015281850135604085015260606040860135606086015260608601358015158082146121c4575f80fd5b60809150806080880152506121dc6080880188611edf565b60c060a08901529384905261010093848801600582901b89018601835f5b84811015612315578b830360ff19018452612215828761207d565b8035609e19823603018112612228575f80fd5b8885528101803561223881611891565b6001600160a01b0316858a0152808c013536829003605e1901811261225b575f80fd5b60a0808701526122716101208701838301611f8e565b90506122806040830183611fe7565b607f19808985030160c08a015261229884838561202c565b93506122a68e860186611fe7565b93509150808985030160e08a0152506122c083838361202c565b92505050898201358c8701528c8301358d870152604083013560408701526122ea8b840184611edf565b935091508581038b87015261230081848461209a565b968d019695505050918a0191506001016121fa565b505061232460a08c018c611f24565b8b8303601f190160c08d01529850965061233f818989611f66565b9b9a5050505050505050505050565b5f806040838503121561235f575f80fd5b505080516020909101519092909150565b5f60208284031215612380575f80fd5b815160ff811681146115e1575f80fd5b634e487b7160e01b5f52601260045260245ffd5b5f815180845260208085019450602084015f5b83811015612072578151875295820195908201906001016123b7565b5f8282518085526020808601955060208260051b840101602086015f5b8481101561241e57601f1986840301895261240c8383516123a4565b988401989250908301906001016123f0565b5090979650505050505050565b602081526001600160a01b038251166020820152602082015160408201525f604083015160e06060840152612464610100840182611b3b565b9050606084015160808401526080840151601f19808584030160a086015261248c83836123d3565b925060a08601519150808584030160c08601526124a983836123a4565b925060c08601519150808584030160e086015250611fde82826123a4565b5f82601f8301126124d6575f80fd5b815160206124e6611c0d83611bcb565b8083825260208201915060208460051b870101935086841115612507575f80fd5b602086015b848110156115bb578051835291830191830161250c565b5f8060408385031215612534575f80fd5b825167ffffffffffffffff8082111561254b575f80fd5b818501915085601f83011261255e575f80fd5b8151602061256e611c0d83611bcb565b82815260059290921b8401810191818101908984111561258c575f80fd5b948201945b838610156125aa57855182529482019490820190612591565b918801519196509093505050808211156125c2575f80fd5b506125cf858286016124c7565b9150509250929050565b828152604060208201525f61165160408301846123a4565b634e487b7160e01b5f52602160045260245ffd"; + hex"6080604052348015600e575f80fd5b5060017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055612605806100405f395ff3fe608060405260043610610034575f3560e01c806301ffc9a71461003d578063691f9ed714610070578063ea37cc511461008f57005b3661003b57005b005b348015610048575f80fd5b5061005c61005736600461186a565b6100a2565b604051901515815260200160405180910390f35b34801561007b575f80fd5b5061003b61008a3660046118a5565b6100f3565b61003b61009d366004611947565b61020e565b5f6001600160e01b0319821663691f9ed760e01b14806100d257506001600160e01b0319821663ea37cc5160e01b145b806100ed57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6101018686868686866104d0565b736e2d0e71d900474b262e545bc4c98b71ab368d2161012b6001600160a01b038816825f1961053d565b5f61013883850185611ae5565b90505f61014d876101488b6105b7565b61063b565b5090505f8061015f886101488c6105b7565b9150915080610176578161017281611b17565b9250505b604051632646478b60e01b81526001600160a01b03861690632646478b906101ac908e9087908f90889030908c90600401611b69565b6020604051808303815f875af11580156101c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101ec9190611bb4565b506102016001600160a01b038c16865f61053d565b5050505050505050505050565b610216610668565b61022561022282611d36565b50565b6102326080830183611df2565b90505f0361025357604051639c95219f60e01b815260040160405180910390fd5b6001600160a01b03831673d2cd1d4ad3bf3ecb581e4653c9c02a67ca44305c146102a05760405163516e822d60e01b81526001600160a01b03841660048201526024015b60405180910390fd5b5f6102ae6080840184611df2565b5f8181106102be576102be611e38565b90506020028101906102d09190611e4c565b6102da9080611e6a565b6102e8906040810190611e7e565b6102f56080860186611df2565b5f81811061030557610305611e38565b90506020028101906103179190611e4c565b6020013581811061032a5761032a611e38565b6103409260206040909202019081019150611ec4565b90505f6103506080850185611df2565b5f81811061036057610360611e38565b90506020028101906103729190611e4c565b61037c9080611e6a565b61038a906060810190611e7e565b6103976080870187611df2565b5f8181106103a7576103a7611e38565b90506020028101906103b99190611e4c565b604001358181106103cc576103cc611e38565b6103e29260206040909202019081019150611ec4565b90506103f96001600160a01b038316865f1961053d565b60405163b0460f0760e01b81526001600160a01b0386169063b0460f079061042590879060040161218c565b60408051808303815f875af1158015610440573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610464919061234e565b5061047b90506001600160a01b038316865f61053d565b6104a061048784611d36565b83610491856105b7565b8461049b866105b7565b610696565b50506104cb60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054600214801561051557503373d2cd1d4ad3bf3ecb581e4653c9c02a67ca44305c14155b156105355760405163f6688adf60e01b8152336004820152602401610297565b505050505050565b6105498383835f610935565b6104cb5761055a83835f6001610935565b61058257604051635274afe760e01b81526001600160a01b0384166004820152602401610297565b61058f8383836001610935565b6104cb57604051635274afe760e01b81526001600160a01b0384166004820152602401610297565b5f6105c0610997565b6040516354636d2b60e01b81526001600160a01b038316600482015273200e12d10bb0c5e4a17e7018f0f1161919bb9389906354636d2b906024016020604051808303815f875af1158015610617573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100ed9190612370565b5f806001600160e01b038416601b0b60e085901d61065a828287610a24565b9350935050505b9250929050565b610670610b96565b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b6040805160018082528183019092525f91816020015b60608152602001906001900390816106ac575050604080516003808252608082019092529192505f919060208201606080368337019050506040516370a0823160e01b81523060048201529091505f906001600160a01b038816906370a0823190602401602060405180830381865afa15801561072b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061074f9190611bb4565b9050801561076b5761076b6001600160a01b0388163383610bd8565b5f6107768288610be5565b50905080835f8151811061078c5761078c611e38565b602090810291909101015250506040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa1580156107dd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108019190611bb4565b9050801561081d5761081d6001600160a01b0386163383610bd8565b5f6108288286610be5565b509050808360018151811061083f5761083f611e38565b602090810291909101015250479050801561085e5761085e3382610c25565b5f61086a826012610be5565b509050808360028151811061088157610881611e38565b602002602001018181525050505080825f815181106108a2576108a2611e38565b60209081029190910101526040805160018082528183019092525f91816020015b6040805160a0810182525f91810182815260608083019390935260808201839052815260208101919091528152602001906001900390816108c357905050905087815f8151811061091657610916611e38565b602002602001018190525061092b8382610c9c565b5050505050505050565b60405163095ea7b360e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f5114831661098b57838315161561097f573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b73200e12d10bb0c5e4a17e7018f0f1161919bb93893b15806109ee575073200e12d10bb0c5e4a17e7018f0f1161919bb93893f7f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d4114155b15610a22576040516373e6d7b360e01b815273200e12d10bb0c5e4a17e7018f0f1161919bb93896004820152602401610297565b565b5f805f851215610a5157604051634a7d166b60e01b81526004810186905260248101859052604401610297565b845f03610a6357505f90506001610b8e565b8460ff8416850185811215610a9e5760405163c849483b60e01b8152600481018890526024810187905260ff86166044820152606401610297565b5f805f831215610aea57604c19831215610ac1575f809550955050505050610b8e565b825f03600a0a9150818481610ad857610ad8612390565b0495505084029091149150610b8e9050565b5f831315610b8357604d831315610b275760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610297565b82600a0a9150815f1981610b3d57610b3d612390565b04841115610b715760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610297565b5091909102925060019150610b8e9050565b509193506001925050505b935093915050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054600203610a2257604051633ee5aeb560e01b815260040160405180910390fd5b61058f8383836001610ee4565b5f805f805f610bf48787610f2e565b9250925092505f80610c068585610f8a565b9150915081838015610c155750815b9650965050505050509250929050565b80471015610c4f5760405163cf47918160e01b815247600482015260248101829052604401610297565b610c68828260405180602001604052805f8152506111d3565b15610c71575050565b3d15610c8357610c7f6111e8565b5050565b60405163d6bda27560e01b815260040160405180910390fd5b60408051600680825260e082019092525f91816020015b6060815260200190600190039081610cb35790505090505f5b8351811015610d1457838181518110610ce757610ce7611e38565b6020026020010151828281518110610d0157610d01611e38565b6020908102919091010152600101610ccc565b50335f8181523060209081526040808320815160a0810183528083018581526060808301879052608083018190529082528185015282518581529384018581528484019093529093909291905b8751811015610ed957878181518110610d7c57610d7c611e38565b602002602001015193505f845f015160400151511115610ed1575f845f01515f01516001600160a01b031663d04dfe236040518060e00160405280885f0151602001516001600160a01b03168152602001898152602001885f01516040015181526020015f8152602001610df48c8a602001516111f3565b8152602001878152602001868152506040518263ffffffff1660e01b8152600401610e1f919061242b565b5f60405180830381865afa158015610e39573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610e609190810190612523565b9150505f81511115610ecf5784516020015160405163012c676d60e21b81526001600160a01b03909116906304b19db490610ea1908a9085906004016125d9565b5f604051808303815f87803b158015610eb8575f80fd5b505af1158015610eca573d5f803e3d5ffd5b505050505b505b600101610d61565b505050505050505050565b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f5114831661098b57838315161561097f573d5f823e3d81fd5b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff861115610f7957600a860460018201600a88065f1493509350935050610f83565b8593509150600190505b9250925092565b5f808383601b82900b8214806110c0577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e100000000000000000087051561100b577f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000870515610ffc576305f5e1008705965060088601955061100b565b620186a0870596506005860195505b8687601b0b1461102657600a8705965085600101955061100b565b7b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc7b19999999999999999999999999999999999999999999999999999998888201116110ba575f600188039050808160030b036110b85760e01b6001600160e01b037b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff60ff8b901d18161795505f94506106619350505050565b505b506110d7565b865f036110d757505f935060019250610661915050565b858660030b1461118e575f821315611136576110f383836115c6565b1561111b5760405163d556b11160e01b81526004810184905260248101839052604401610297565b637ffffffe19909501600a0a82029550637fffffff9461118e565b637fffffff19869003604381131561115857505f945084935061066192505050565b80600a0a888161116a5761116a612390565b059750875f0361118457505f945084935061066192505050565b50637fffffff1995505b81861361119e57600193506111b7565b818603600a0a83816111b2576111b2612390565b071593505b5050506001600160e01b03841660e084901b1791509250929050565b5f805f83516020850186885af1949350505050565b6040513d5f823e3d81fd5b60605f825167ffffffffffffffff811115611210576112106119c5565b604051908082528060200260200182016040528015611239578160200160208202803683370190505b5090505f835167ffffffffffffffff811115611257576112576119c5565b604051908082528060200260200182016040528015611280578160200160208202803683370190505b5090505f80855111611292575f611298565b84516002015b86516001010190505f8167ffffffffffffffff8111156112ba576112ba6119c5565b6040519080825280602002602001820160405280156112ed57816020015b60608152602001906001900390816112d85790505b5090505f611311604080516002815233602082015230818301526060810190915290565b82828151811061132357611323611e38565b60200260200101819052505f5b885181101561138057818060010192505088818151811061135357611353611e38565b602002602001015183838151811061136d5761136d611e38565b6020908102919091010152600101611330565b508651156115bb578080600101915050848282815181106113a3576113a3611e38565b60200260200101819052508080600101915050838282815181106113c9576113c9611e38565b60200260200101819052505f5b87518110156115b9576114cc8882815181106113f4576113f4611e38565b60200260200101515f01516114a98a848151811061141457611414611e38565b60200260200101516020015161148a8c868151811061143557611435611e38565b60200260200101518051604091820151805160209081029181019190912083517f6ec4dff745ec96dbde88c5d41f8aa5ac13aa1664afb47b8406b44fa945a650c8815291820192909252918201526060902090565b60405161190160f01b8152600281019290925260228201526042902090565b8a84815181106114bb576114bb611e38565b6020026020010151606001516115e8565b6114ec57604051630a57f30960e31b815260048101829052602401610297565b8781815181106114fe576114fe611e38565b60200260200101515f01516001600160a01b03165f1b86828151811061152657611526611e38565b60200260200101818152505087818151811061154457611544611e38565b60200260200101516020015185828151811061156257611562611e38565b602002602001018181525050818060010192505087818151811061158857611588611e38565b6020026020010151604001518383815181106115a6576115a6611e38565b60209081029190910101526001016113d6565b505b509695505050505050565b5f6115e15f84126115d757836115db565b835f035b83611659565b9392505050565b5f836001600160a01b03163b5f03611646575f8061160685856116f7565b5090925090505f81600381111561161f5761161f6125f1565b14801561163d5750856001600160a01b0316826001600160a01b0316145b925050506115e1565b61165184848461173d565b949350505050565b5f637ffffff5821361166c57505f6100ed565b637ffffffe19820160438113156116875750508115156100ed565b5f81126116c75780600a0a7b80000000000000000000000000000000000000000000000000000001816116bc576116bc612390565b0484119150506100ed565b805f03600a0a7b800000000000000000000000000000000000000000000000000000020284101591505092915050565b5f805f835160410361172e576020840151604085015160608601515f1a611720888285856117a2565b955095509550505050610f83565b505081515f9150600290610f83565b805160408051630b135d3f60e11b8082526004820186905260248201929092525f92906020820185604483015e5f82606483010152601f820160051c60051b915060205f60648401838a5afa9050825f5114601f3d1116811693505050509392505050565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411156117db57505f91506003905082611860565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa15801561182c573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b03811661185757505f925060019150829050611860565b92505f91508190505b9450945094915050565b5f6020828403121561187a575f80fd5b81356001600160e01b0319811681146115e1575f80fd5b6001600160a01b0381168114610222575f80fd5b5f805f805f8060a087890312156118ba575f80fd5b86356118c581611891565b955060208701356118d581611891565b94506040870135935060608701359250608087013567ffffffffffffffff808211156118ff575f80fd5b818901915089601f830112611912575f80fd5b813581811115611920575f80fd5b8a6020828501011115611931575f80fd5b6020830194508093505050509295509295509295565b5f805f60608486031215611959575f80fd5b833561196481611891565b9250602084013567ffffffffffffffff80821115611980575f80fd5b9085019060c08288031215611993575f80fd5b909250604085013590808211156119a8575f80fd5b508401604081870312156119ba575f80fd5b809150509250925092565b634e487b7160e01b5f52604160045260245ffd5b6040516080810167ffffffffffffffff811182821017156119fc576119fc6119c5565b60405290565b6040805190810167ffffffffffffffff811182821017156119fc576119fc6119c5565b6040516060810167ffffffffffffffff811182821017156119fc576119fc6119c5565b604051601f8201601f1916810167ffffffffffffffff81118282101715611a7157611a716119c5565b604052919050565b5f82601f830112611a88575f80fd5b813567ffffffffffffffff811115611aa257611aa26119c5565b611ab5601f8201601f1916602001611a48565b818152846020838601011115611ac9575f80fd5b816020850160208301375f918101602001919091529392505050565b5f60208284031215611af5575f80fd5b813567ffffffffffffffff811115611b0b575f80fd5b61165184828501611a79565b5f60018201611b3457634e487b7160e01b5f52601160045260245ffd5b5060010190565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f6001600160a01b038089168352876020840152808716604084015285606084015280851660808401525060c060a0830152611ba860c0830184611b3b565b98975050505050505050565b5f60208284031215611bc4575f80fd5b5051919050565b5f67ffffffffffffffff821115611be457611be46119c5565b5060051b60200190565b5f82601f830112611bfd575f80fd5b81356020611c12611c0d83611bcb565b611a48565b82815260059290921b84018101918181019086841115611c30575f80fd5b8286015b848110156115bb57803567ffffffffffffffff80821115611c53575f80fd5b908801906080828b03601f19011215611c6a575f80fd5b611c726119d9565b86830135611c7f81611891565b815260408381013588830152606084013583811115611c9c575f80fd5b8401603f81018d13611cac575f80fd5b88810135611cbc611c0d82611bcb565b81815260059190911b82018301908a8101908f831115611cda575f80fd5b928401925b82841015611cf85783358252928b0192908b0190611cdf565b80858701525050505050608083013582811115611d13575f80fd5b611d218c8983870101611a79565b60608301525085525050918301918301611c34565b5f60408236031215611d46575f80fd5b611d4e611a02565b823567ffffffffffffffff80821115611d65575f80fd5b818501915060608236031215611d79575f80fd5b611d81611a25565b8235611d8c81611891565b81526020830135611d9c81611891565b6020820152604083013582811115611db2575f80fd5b611dbe36828601611a79565b60408301525083526020850135915080821115611dd9575f80fd5b50611de636828601611bee565b60208301525092915050565b5f808335601e19843603018112611e07575f80fd5b83018035915067ffffffffffffffff821115611e21575f80fd5b6020019150600581901b3603821315610661575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235607e19833603018112611e60575f80fd5b9190910192915050565b5f8235609e19833603018112611e60575f80fd5b5f808335601e19843603018112611e93575f80fd5b83018035915067ffffffffffffffff821115611ead575f80fd5b6020019150600681901b3603821315610661575f80fd5b5f60208284031215611ed4575f80fd5b81356115e181611891565b5f808335601e19843603018112611ef4575f80fd5b830160208101925035905067ffffffffffffffff811115611f13575f80fd5b8060051b3603821315610661575f80fd5b5f808335601e19843603018112611f39575f80fd5b830160208101925035905067ffffffffffffffff811115611f58575f80fd5b803603821315610661575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f8135611f9a81611891565b6001600160a01b039081168452602083013590611fb682611891565b166020840152611fc96040830183611f24565b60606040860152611fde606086018284611f66565b95945050505050565b5f808335601e19843603018112611ffc575f80fd5b830160208101925035905067ffffffffffffffff81111561201b575f80fd5b8060061b3603821315610661575f80fd5b8183525f60208085019450825f5b8581101561207257813561204d81611891565b6001600160a01b0316875281830135838801526040968701969091019060010161203a565b509495945050505050565b5f8235607e19833603018112612091575f80fd5b90910192915050565b8183526020808401935f91600585811b8301820185855b8881101561217e57858303601f19018a526120cc828961207d565b608081356120d981611891565b6001600160a01b03168552818701358786015260406120fa81840184611edf565b8383890152808489015260a093507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811115612134575f80fd5b881b9150818188850137508501606061214f84820185611f24565b94508388840301828901526121678484018683611f66565b9e8a019e97505050938701935050506001016120b1565b509098975050505050505050565b5f602080835260e0830184358285015281850135604085015260606040860135606086015260608601358015158082146121c4575f80fd5b60809150806080880152506121dc6080880188611edf565b60c060a08901529384905261010093848801600582901b89018601835f5b84811015612315578b830360ff19018452612215828761207d565b8035609e19823603018112612228575f80fd5b8885528101803561223881611891565b6001600160a01b0316858a0152808c013536829003605e1901811261225b575f80fd5b60a0808701526122716101208701838301611f8e565b90506122806040830183611fe7565b607f19808985030160c08a015261229884838561202c565b93506122a68e860186611fe7565b93509150808985030160e08a0152506122c083838361202c565b92505050898201358c8701528c8301358d870152604083013560408701526122ea8b840184611edf565b935091508581038b87015261230081848461209a565b968d019695505050918a0191506001016121fa565b505061232460a08c018c611f24565b8b8303601f190160c08d01529850965061233f818989611f66565b9b9a5050505050505050505050565b5f806040838503121561235f575f80fd5b505080516020909101519092909150565b5f60208284031215612380575f80fd5b815160ff811681146115e1575f80fd5b634e487b7160e01b5f52601260045260245ffd5b5f815180845260208085019450602084015f5b83811015612072578151875295820195908201906001016123b7565b5f8282518085526020808601955060208260051b840101602086015f5b8481101561241e57601f1986840301895261240c8383516123a4565b988401989250908301906001016123f0565b5090979650505050505050565b602081526001600160a01b038251166020820152602082015160408201525f604083015160e06060840152612464610100840182611b3b565b9050606084015160808401526080840151601f19808584030160a086015261248c83836123d3565b925060a08601519150808584030160c08601526124a983836123a4565b925060c08601519150808584030160e086015250611fde82826123a4565b5f82601f8301126124d6575f80fd5b815160206124e6611c0d83611bcb565b8083825260208201915060208460051b870101935086841115612507575f80fd5b602086015b848110156115bb578051835291830191830161250c565b5f8060408385031215612534575f80fd5b825167ffffffffffffffff8082111561254b575f80fd5b818501915085601f83011261255e575f80fd5b8151602061256e611c0d83611bcb565b82815260059290921b8401810191818101908984111561258c575f80fd5b948201945b838610156125aa57855182529482019490820190612591565b918801519196509093505050808211156125c2575f80fd5b506125cf858286016124c7565b9150509250929050565b828152604060208201525f61165160408301846123a4565b634e487b7160e01b5f52602160045260245ffd"; /// @dev The runtime bytecode of the contract. bytes constant RUNTIME_CODE = - hex"608060405260043610610034575f3560e01c806301ffc9a71461003d578063691f9ed714610070578063ea37cc511461008f57005b3661003b57005b005b348015610048575f80fd5b5061005c61005736600461186a565b6100a2565b604051901515815260200160405180910390f35b34801561007b575f80fd5b5061003b61008a3660046118a5565b6100f3565b61003b61009d366004611947565b61020e565b5f6001600160e01b0319821663691f9ed760e01b14806100d257506001600160e01b0319821663ea37cc5160e01b145b806100ed57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6101018686868686866104d0565b736e2d0e71d900474b262e545bc4c98b71ab368d2161012b6001600160a01b038816825f1961053d565b5f61013883850185611ae5565b90505f61014d876101488b6105b7565b61063b565b5090505f8061015f886101488c6105b7565b9150915080610176578161017281611b17565b9250505b604051632646478b60e01b81526001600160a01b03861690632646478b906101ac908e9087908f90889030908c90600401611b69565b6020604051808303815f875af11580156101c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101ec9190611bb4565b506102016001600160a01b038c16865f61053d565b5050505050505050505050565b610216610668565b61022561022282611d36565b50565b6102326080830183611df2565b90505f0361025357604051639c95219f60e01b815260040160405180910390fd5b6001600160a01b03831673531167691b4f37f0266e226d03412c77fb2977ce146102a05760405163516e822d60e01b81526001600160a01b03841660048201526024015b60405180910390fd5b5f6102ae6080840184611df2565b5f8181106102be576102be611e38565b90506020028101906102d09190611e4c565b6102da9080611e6a565b6102e8906040810190611e7e565b6102f56080860186611df2565b5f81811061030557610305611e38565b90506020028101906103179190611e4c565b6020013581811061032a5761032a611e38565b6103409260206040909202019081019150611ec4565b90505f6103506080850185611df2565b5f81811061036057610360611e38565b90506020028101906103729190611e4c565b61037c9080611e6a565b61038a906060810190611e7e565b6103976080870187611df2565b5f8181106103a7576103a7611e38565b90506020028101906103b99190611e4c565b604001358181106103cc576103cc611e38565b6103e29260206040909202019081019150611ec4565b90506103f96001600160a01b038316865f1961053d565b60405163b0460f0760e01b81526001600160a01b0386169063b0460f079061042590879060040161218c565b60408051808303815f875af1158015610440573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610464919061234e565b5061047b90506001600160a01b038316865f61053d565b6104a061048784611d36565b83610491856105b7565b8461049b866105b7565b610696565b50506104cb60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054600214801561051557503373531167691b4f37f0266e226d03412c77fb2977ce14155b156105355760405163f6688adf60e01b8152336004820152602401610297565b505050505050565b6105498383835f610935565b6104cb5761055a83835f6001610935565b61058257604051635274afe760e01b81526001600160a01b0384166004820152602401610297565b61058f8383836001610935565b6104cb57604051635274afe760e01b81526001600160a01b0384166004820152602401610297565b5f6105c0610997565b6040516354636d2b60e01b81526001600160a01b038316600482015273200e12d10bb0c5e4a17e7018f0f1161919bb9389906354636d2b906024016020604051808303815f875af1158015610617573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100ed9190612370565b5f806001600160e01b038416601b0b60e085901d61065a828287610a24565b9350935050505b9250929050565b610670610b96565b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b6040805160018082528183019092525f91816020015b60608152602001906001900390816106ac575050604080516003808252608082019092529192505f919060208201606080368337019050506040516370a0823160e01b81523060048201529091505f906001600160a01b038816906370a0823190602401602060405180830381865afa15801561072b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061074f9190611bb4565b9050801561076b5761076b6001600160a01b0388163383610bd8565b5f6107768288610be5565b50905080835f8151811061078c5761078c611e38565b602090810291909101015250506040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa1580156107dd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108019190611bb4565b9050801561081d5761081d6001600160a01b0386163383610bd8565b5f6108288286610be5565b509050808360018151811061083f5761083f611e38565b602090810291909101015250479050801561085e5761085e3382610c25565b5f61086a826012610be5565b509050808360028151811061088157610881611e38565b602002602001018181525050505080825f815181106108a2576108a2611e38565b60209081029190910101526040805160018082528183019092525f91816020015b6040805160a0810182525f91810182815260608083019390935260808201839052815260208101919091528152602001906001900390816108c357905050905087815f8151811061091657610916611e38565b602002602001018190525061092b8382610c9c565b5050505050505050565b60405163095ea7b360e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f5114831661098b57838315161561097f573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b73200e12d10bb0c5e4a17e7018f0f1161919bb93893b15806109ee575073200e12d10bb0c5e4a17e7018f0f1161919bb93893f7f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d4114155b15610a22576040516373e6d7b360e01b815273200e12d10bb0c5e4a17e7018f0f1161919bb93896004820152602401610297565b565b5f805f851215610a5157604051634a7d166b60e01b81526004810186905260248101859052604401610297565b845f03610a6357505f90506001610b8e565b8460ff8416850185811215610a9e5760405163c849483b60e01b8152600481018890526024810187905260ff86166044820152606401610297565b5f805f831215610aea57604c19831215610ac1575f809550955050505050610b8e565b825f03600a0a9150818481610ad857610ad8612390565b0495505084029091149150610b8e9050565b5f831315610b8357604d831315610b275760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610297565b82600a0a9150815f1981610b3d57610b3d612390565b04841115610b715760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610297565b5091909102925060019150610b8e9050565b509193506001925050505b935093915050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054600203610a2257604051633ee5aeb560e01b815260040160405180910390fd5b61058f8383836001610ee4565b5f805f805f610bf48787610f2e565b9250925092505f80610c068585610f8a565b9150915081838015610c155750815b9650965050505050509250929050565b80471015610c4f5760405163cf47918160e01b815247600482015260248101829052604401610297565b610c68828260405180602001604052805f8152506111d3565b15610c71575050565b3d15610c8357610c7f6111e8565b5050565b60405163d6bda27560e01b815260040160405180910390fd5b60408051600480825260a082019092525f91816020015b6060815260200190600190039081610cb35790505090505f5b8351811015610d1457838181518110610ce757610ce7611e38565b6020026020010151828281518110610d0157610d01611e38565b6020908102919091010152600101610ccc565b50335f8181523060209081526040808320815160a0810183528083018581526060808301879052608083018190529082528185015282518581529384018581528484019093529093909291905b8751811015610ed957878181518110610d7c57610d7c611e38565b602002602001015193505f845f015160400151511115610ed1575f845f01515f01516001600160a01b031663d04dfe236040518060e00160405280885f0151602001516001600160a01b03168152602001898152602001885f01516040015181526020015f8152602001610df48c8a602001516111f3565b8152602001878152602001868152506040518263ffffffff1660e01b8152600401610e1f919061242b565b5f60405180830381865afa158015610e39573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610e609190810190612523565b9150505f81511115610ecf5784516020015160405163012c676d60e21b81526001600160a01b03909116906304b19db490610ea1908a9085906004016125d9565b5f604051808303815f87803b158015610eb8575f80fd5b505af1158015610eca573d5f803e3d5ffd5b505050505b505b600101610d61565b505050505050505050565b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f5114831661098b57838315161561097f573d5f823e3d81fd5b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff861115610f7957600a860460018201600a88065f1493509350935050610f83565b8593509150600190505b9250925092565b5f808383601b82900b8214806110c0577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e100000000000000000087051561100b577f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000870515610ffc576305f5e1008705965060088601955061100b565b620186a0870596506005860195505b8687601b0b1461102657600a8705965085600101955061100b565b7b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc7b19999999999999999999999999999999999999999999999999999998888201116110ba575f600188039050808160030b036110b85760e01b6001600160e01b037b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff60ff8b901d18161795505f94506106619350505050565b505b506110d7565b865f036110d757505f935060019250610661915050565b858660030b1461118e575f821315611136576110f383836115c6565b1561111b5760405163d556b11160e01b81526004810184905260248101839052604401610297565b637ffffffe19909501600a0a82029550637fffffff9461118e565b637fffffff19869003604381131561115857505f945084935061066192505050565b80600a0a888161116a5761116a612390565b059750875f0361118457505f945084935061066192505050565b50637fffffff1995505b81861361119e57600193506111b7565b818603600a0a83816111b2576111b2612390565b071593505b5050506001600160e01b03841660e084901b1791509250929050565b5f805f83516020850186885af1949350505050565b6040513d5f823e3d81fd5b60605f825167ffffffffffffffff811115611210576112106119c5565b604051908082528060200260200182016040528015611239578160200160208202803683370190505b5090505f835167ffffffffffffffff811115611257576112576119c5565b604051908082528060200260200182016040528015611280578160200160208202803683370190505b5090505f80855111611292575f611298565b84516002015b86516001010190505f8167ffffffffffffffff8111156112ba576112ba6119c5565b6040519080825280602002602001820160405280156112ed57816020015b60608152602001906001900390816112d85790505b5090505f611311604080516002815233602082015230818301526060810190915290565b82828151811061132357611323611e38565b60200260200101819052505f5b885181101561138057818060010192505088818151811061135357611353611e38565b602002602001015183838151811061136d5761136d611e38565b6020908102919091010152600101611330565b508651156115bb578080600101915050848282815181106113a3576113a3611e38565b60200260200101819052508080600101915050838282815181106113c9576113c9611e38565b60200260200101819052505f5b87518110156115b9576114cc8882815181106113f4576113f4611e38565b60200260200101515f01516114a98a848151811061141457611414611e38565b60200260200101516020015161148a8c868151811061143557611435611e38565b60200260200101518051604091820151805160209081029181019190912083517f6ec4dff745ec96dbde88c5d41f8aa5ac13aa1664afb47b8406b44fa945a650c8815291820192909252918201526060902090565b60405161190160f01b8152600281019290925260228201526042902090565b8a84815181106114bb576114bb611e38565b6020026020010151606001516115e8565b6114ec57604051630a57f30960e31b815260048101829052602401610297565b8781815181106114fe576114fe611e38565b60200260200101515f01516001600160a01b03165f1b86828151811061152657611526611e38565b60200260200101818152505087818151811061154457611544611e38565b60200260200101516020015185828151811061156257611562611e38565b602002602001018181525050818060010192505087818151811061158857611588611e38565b6020026020010151604001518383815181106115a6576115a6611e38565b60209081029190910101526001016113d6565b505b509695505050505050565b5f6115e15f84126115d757836115db565b835f035b83611659565b9392505050565b5f836001600160a01b03163b5f03611646575f8061160685856116f7565b5090925090505f81600381111561161f5761161f6125f1565b14801561163d5750856001600160a01b0316826001600160a01b0316145b925050506115e1565b61165184848461173d565b949350505050565b5f637ffffff5821361166c57505f6100ed565b637ffffffe19820160438113156116875750508115156100ed565b5f81126116c75780600a0a7b80000000000000000000000000000000000000000000000000000001816116bc576116bc612390565b0484119150506100ed565b805f03600a0a7b800000000000000000000000000000000000000000000000000000020284101591505092915050565b5f805f835160410361172e576020840151604085015160608601515f1a611720888285856117a2565b955095509550505050610f83565b505081515f9150600290610f83565b805160408051630b135d3f60e11b8082526004820186905260248201929092525f92906020820185604483015e5f82606483010152601f820160051c60051b915060205f60648401838a5afa9050825f5114601f3d1116811693505050509392505050565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411156117db57505f91506003905082611860565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa15801561182c573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b03811661185757505f925060019150829050611860565b92505f91508190505b9450945094915050565b5f6020828403121561187a575f80fd5b81356001600160e01b0319811681146115e1575f80fd5b6001600160a01b0381168114610222575f80fd5b5f805f805f8060a087890312156118ba575f80fd5b86356118c581611891565b955060208701356118d581611891565b94506040870135935060608701359250608087013567ffffffffffffffff808211156118ff575f80fd5b818901915089601f830112611912575f80fd5b813581811115611920575f80fd5b8a6020828501011115611931575f80fd5b6020830194508093505050509295509295509295565b5f805f60608486031215611959575f80fd5b833561196481611891565b9250602084013567ffffffffffffffff80821115611980575f80fd5b9085019060c08288031215611993575f80fd5b909250604085013590808211156119a8575f80fd5b508401604081870312156119ba575f80fd5b809150509250925092565b634e487b7160e01b5f52604160045260245ffd5b6040516080810167ffffffffffffffff811182821017156119fc576119fc6119c5565b60405290565b6040805190810167ffffffffffffffff811182821017156119fc576119fc6119c5565b6040516060810167ffffffffffffffff811182821017156119fc576119fc6119c5565b604051601f8201601f1916810167ffffffffffffffff81118282101715611a7157611a716119c5565b604052919050565b5f82601f830112611a88575f80fd5b813567ffffffffffffffff811115611aa257611aa26119c5565b611ab5601f8201601f1916602001611a48565b818152846020838601011115611ac9575f80fd5b816020850160208301375f918101602001919091529392505050565b5f60208284031215611af5575f80fd5b813567ffffffffffffffff811115611b0b575f80fd5b61165184828501611a79565b5f60018201611b3457634e487b7160e01b5f52601160045260245ffd5b5060010190565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f6001600160a01b038089168352876020840152808716604084015285606084015280851660808401525060c060a0830152611ba860c0830184611b3b565b98975050505050505050565b5f60208284031215611bc4575f80fd5b5051919050565b5f67ffffffffffffffff821115611be457611be46119c5565b5060051b60200190565b5f82601f830112611bfd575f80fd5b81356020611c12611c0d83611bcb565b611a48565b82815260059290921b84018101918181019086841115611c30575f80fd5b8286015b848110156115bb57803567ffffffffffffffff80821115611c53575f80fd5b908801906080828b03601f19011215611c6a575f80fd5b611c726119d9565b86830135611c7f81611891565b815260408381013588830152606084013583811115611c9c575f80fd5b8401603f81018d13611cac575f80fd5b88810135611cbc611c0d82611bcb565b81815260059190911b82018301908a8101908f831115611cda575f80fd5b928401925b82841015611cf85783358252928b0192908b0190611cdf565b80858701525050505050608083013582811115611d13575f80fd5b611d218c8983870101611a79565b60608301525085525050918301918301611c34565b5f60408236031215611d46575f80fd5b611d4e611a02565b823567ffffffffffffffff80821115611d65575f80fd5b818501915060608236031215611d79575f80fd5b611d81611a25565b8235611d8c81611891565b81526020830135611d9c81611891565b6020820152604083013582811115611db2575f80fd5b611dbe36828601611a79565b60408301525083526020850135915080821115611dd9575f80fd5b50611de636828601611bee565b60208301525092915050565b5f808335601e19843603018112611e07575f80fd5b83018035915067ffffffffffffffff821115611e21575f80fd5b6020019150600581901b3603821315610661575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235607e19833603018112611e60575f80fd5b9190910192915050565b5f8235609e19833603018112611e60575f80fd5b5f808335601e19843603018112611e93575f80fd5b83018035915067ffffffffffffffff821115611ead575f80fd5b6020019150600681901b3603821315610661575f80fd5b5f60208284031215611ed4575f80fd5b81356115e181611891565b5f808335601e19843603018112611ef4575f80fd5b830160208101925035905067ffffffffffffffff811115611f13575f80fd5b8060051b3603821315610661575f80fd5b5f808335601e19843603018112611f39575f80fd5b830160208101925035905067ffffffffffffffff811115611f58575f80fd5b803603821315610661575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f8135611f9a81611891565b6001600160a01b039081168452602083013590611fb682611891565b166020840152611fc96040830183611f24565b60606040860152611fde606086018284611f66565b95945050505050565b5f808335601e19843603018112611ffc575f80fd5b830160208101925035905067ffffffffffffffff81111561201b575f80fd5b8060061b3603821315610661575f80fd5b8183525f60208085019450825f5b8581101561207257813561204d81611891565b6001600160a01b0316875281830135838801526040968701969091019060010161203a565b509495945050505050565b5f8235607e19833603018112612091575f80fd5b90910192915050565b8183526020808401935f91600585811b8301820185855b8881101561217e57858303601f19018a526120cc828961207d565b608081356120d981611891565b6001600160a01b03168552818701358786015260406120fa81840184611edf565b8383890152808489015260a093507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811115612134575f80fd5b881b9150818188850137508501606061214f84820185611f24565b94508388840301828901526121678484018683611f66565b9e8a019e97505050938701935050506001016120b1565b509098975050505050505050565b5f602080835260e0830184358285015281850135604085015260606040860135606086015260608601358015158082146121c4575f80fd5b60809150806080880152506121dc6080880188611edf565b60c060a08901529384905261010093848801600582901b89018601835f5b84811015612315578b830360ff19018452612215828761207d565b8035609e19823603018112612228575f80fd5b8885528101803561223881611891565b6001600160a01b0316858a0152808c013536829003605e1901811261225b575f80fd5b60a0808701526122716101208701838301611f8e565b90506122806040830183611fe7565b607f19808985030160c08a015261229884838561202c565b93506122a68e860186611fe7565b93509150808985030160e08a0152506122c083838361202c565b92505050898201358c8701528c8301358d870152604083013560408701526122ea8b840184611edf565b935091508581038b87015261230081848461209a565b968d019695505050918a0191506001016121fa565b505061232460a08c018c611f24565b8b8303601f190160c08d01529850965061233f818989611f66565b9b9a5050505050505050505050565b5f806040838503121561235f575f80fd5b505080516020909101519092909150565b5f60208284031215612380575f80fd5b815160ff811681146115e1575f80fd5b634e487b7160e01b5f52601260045260245ffd5b5f815180845260208085019450602084015f5b83811015612072578151875295820195908201906001016123b7565b5f8282518085526020808601955060208260051b840101602086015f5b8481101561241e57601f1986840301895261240c8383516123a4565b988401989250908301906001016123f0565b5090979650505050505050565b602081526001600160a01b038251166020820152602082015160408201525f604083015160e06060840152612464610100840182611b3b565b9050606084015160808401526080840151601f19808584030160a086015261248c83836123d3565b925060a08601519150808584030160c08601526124a983836123a4565b925060c08601519150808584030160e086015250611fde82826123a4565b5f82601f8301126124d6575f80fd5b815160206124e6611c0d83611bcb565b8083825260208201915060208460051b870101935086841115612507575f80fd5b602086015b848110156115bb578051835291830191830161250c565b5f8060408385031215612534575f80fd5b825167ffffffffffffffff8082111561254b575f80fd5b818501915085601f83011261255e575f80fd5b8151602061256e611c0d83611bcb565b82815260059290921b8401810191818101908984111561258c575f80fd5b948201945b838610156125aa57855182529482019490820190612591565b918801519196509093505050808211156125c2575f80fd5b506125cf858286016124c7565b9150509250929050565b828152604060208201525f61165160408301846123a4565b634e487b7160e01b5f52602160045260245ffd"; + hex"608060405260043610610034575f3560e01c806301ffc9a71461003d578063691f9ed714610070578063ea37cc511461008f57005b3661003b57005b005b348015610048575f80fd5b5061005c61005736600461186a565b6100a2565b604051901515815260200160405180910390f35b34801561007b575f80fd5b5061003b61008a3660046118a5565b6100f3565b61003b61009d366004611947565b61020e565b5f6001600160e01b0319821663691f9ed760e01b14806100d257506001600160e01b0319821663ea37cc5160e01b145b806100ed57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6101018686868686866104d0565b736e2d0e71d900474b262e545bc4c98b71ab368d2161012b6001600160a01b038816825f1961053d565b5f61013883850185611ae5565b90505f61014d876101488b6105b7565b61063b565b5090505f8061015f886101488c6105b7565b9150915080610176578161017281611b17565b9250505b604051632646478b60e01b81526001600160a01b03861690632646478b906101ac908e9087908f90889030908c90600401611b69565b6020604051808303815f875af11580156101c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101ec9190611bb4565b506102016001600160a01b038c16865f61053d565b5050505050505050505050565b610216610668565b61022561022282611d36565b50565b6102326080830183611df2565b90505f0361025357604051639c95219f60e01b815260040160405180910390fd5b6001600160a01b03831673d2cd1d4ad3bf3ecb581e4653c9c02a67ca44305c146102a05760405163516e822d60e01b81526001600160a01b03841660048201526024015b60405180910390fd5b5f6102ae6080840184611df2565b5f8181106102be576102be611e38565b90506020028101906102d09190611e4c565b6102da9080611e6a565b6102e8906040810190611e7e565b6102f56080860186611df2565b5f81811061030557610305611e38565b90506020028101906103179190611e4c565b6020013581811061032a5761032a611e38565b6103409260206040909202019081019150611ec4565b90505f6103506080850185611df2565b5f81811061036057610360611e38565b90506020028101906103729190611e4c565b61037c9080611e6a565b61038a906060810190611e7e565b6103976080870187611df2565b5f8181106103a7576103a7611e38565b90506020028101906103b99190611e4c565b604001358181106103cc576103cc611e38565b6103e29260206040909202019081019150611ec4565b90506103f96001600160a01b038316865f1961053d565b60405163b0460f0760e01b81526001600160a01b0386169063b0460f079061042590879060040161218c565b60408051808303815f875af1158015610440573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610464919061234e565b5061047b90506001600160a01b038316865f61053d565b6104a061048784611d36565b83610491856105b7565b8461049b866105b7565b610696565b50506104cb60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054600214801561051557503373d2cd1d4ad3bf3ecb581e4653c9c02a67ca44305c14155b156105355760405163f6688adf60e01b8152336004820152602401610297565b505050505050565b6105498383835f610935565b6104cb5761055a83835f6001610935565b61058257604051635274afe760e01b81526001600160a01b0384166004820152602401610297565b61058f8383836001610935565b6104cb57604051635274afe760e01b81526001600160a01b0384166004820152602401610297565b5f6105c0610997565b6040516354636d2b60e01b81526001600160a01b038316600482015273200e12d10bb0c5e4a17e7018f0f1161919bb9389906354636d2b906024016020604051808303815f875af1158015610617573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100ed9190612370565b5f806001600160e01b038416601b0b60e085901d61065a828287610a24565b9350935050505b9250929050565b610670610b96565b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b6040805160018082528183019092525f91816020015b60608152602001906001900390816106ac575050604080516003808252608082019092529192505f919060208201606080368337019050506040516370a0823160e01b81523060048201529091505f906001600160a01b038816906370a0823190602401602060405180830381865afa15801561072b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061074f9190611bb4565b9050801561076b5761076b6001600160a01b0388163383610bd8565b5f6107768288610be5565b50905080835f8151811061078c5761078c611e38565b602090810291909101015250506040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa1580156107dd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108019190611bb4565b9050801561081d5761081d6001600160a01b0386163383610bd8565b5f6108288286610be5565b509050808360018151811061083f5761083f611e38565b602090810291909101015250479050801561085e5761085e3382610c25565b5f61086a826012610be5565b509050808360028151811061088157610881611e38565b602002602001018181525050505080825f815181106108a2576108a2611e38565b60209081029190910101526040805160018082528183019092525f91816020015b6040805160a0810182525f91810182815260608083019390935260808201839052815260208101919091528152602001906001900390816108c357905050905087815f8151811061091657610916611e38565b602002602001018190525061092b8382610c9c565b5050505050505050565b60405163095ea7b360e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f5114831661098b57838315161561097f573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b73200e12d10bb0c5e4a17e7018f0f1161919bb93893b15806109ee575073200e12d10bb0c5e4a17e7018f0f1161919bb93893f7f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d4114155b15610a22576040516373e6d7b360e01b815273200e12d10bb0c5e4a17e7018f0f1161919bb93896004820152602401610297565b565b5f805f851215610a5157604051634a7d166b60e01b81526004810186905260248101859052604401610297565b845f03610a6357505f90506001610b8e565b8460ff8416850185811215610a9e5760405163c849483b60e01b8152600481018890526024810187905260ff86166044820152606401610297565b5f805f831215610aea57604c19831215610ac1575f809550955050505050610b8e565b825f03600a0a9150818481610ad857610ad8612390565b0495505084029091149150610b8e9050565b5f831315610b8357604d831315610b275760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610297565b82600a0a9150815f1981610b3d57610b3d612390565b04841115610b715760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610297565b5091909102925060019150610b8e9050565b509193506001925050505b935093915050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054600203610a2257604051633ee5aeb560e01b815260040160405180910390fd5b61058f8383836001610ee4565b5f805f805f610bf48787610f2e565b9250925092505f80610c068585610f8a565b9150915081838015610c155750815b9650965050505050509250929050565b80471015610c4f5760405163cf47918160e01b815247600482015260248101829052604401610297565b610c68828260405180602001604052805f8152506111d3565b15610c71575050565b3d15610c8357610c7f6111e8565b5050565b60405163d6bda27560e01b815260040160405180910390fd5b60408051600680825260e082019092525f91816020015b6060815260200190600190039081610cb35790505090505f5b8351811015610d1457838181518110610ce757610ce7611e38565b6020026020010151828281518110610d0157610d01611e38565b6020908102919091010152600101610ccc565b50335f8181523060209081526040808320815160a0810183528083018581526060808301879052608083018190529082528185015282518581529384018581528484019093529093909291905b8751811015610ed957878181518110610d7c57610d7c611e38565b602002602001015193505f845f015160400151511115610ed1575f845f01515f01516001600160a01b031663d04dfe236040518060e00160405280885f0151602001516001600160a01b03168152602001898152602001885f01516040015181526020015f8152602001610df48c8a602001516111f3565b8152602001878152602001868152506040518263ffffffff1660e01b8152600401610e1f919061242b565b5f60405180830381865afa158015610e39573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610e609190810190612523565b9150505f81511115610ecf5784516020015160405163012c676d60e21b81526001600160a01b03909116906304b19db490610ea1908a9085906004016125d9565b5f604051808303815f87803b158015610eb8575f80fd5b505af1158015610eca573d5f803e3d5ffd5b505050505b505b600101610d61565b505050505050505050565b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f5114831661098b57838315161561097f573d5f823e3d81fd5b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff861115610f7957600a860460018201600a88065f1493509350935050610f83565b8593509150600190505b9250925092565b5f808383601b82900b8214806110c0577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e100000000000000000087051561100b577f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000870515610ffc576305f5e1008705965060088601955061100b565b620186a0870596506005860195505b8687601b0b1461102657600a8705965085600101955061100b565b7b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc7b19999999999999999999999999999999999999999999999999999998888201116110ba575f600188039050808160030b036110b85760e01b6001600160e01b037b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff60ff8b901d18161795505f94506106619350505050565b505b506110d7565b865f036110d757505f935060019250610661915050565b858660030b1461118e575f821315611136576110f383836115c6565b1561111b5760405163d556b11160e01b81526004810184905260248101839052604401610297565b637ffffffe19909501600a0a82029550637fffffff9461118e565b637fffffff19869003604381131561115857505f945084935061066192505050565b80600a0a888161116a5761116a612390565b059750875f0361118457505f945084935061066192505050565b50637fffffff1995505b81861361119e57600193506111b7565b818603600a0a83816111b2576111b2612390565b071593505b5050506001600160e01b03841660e084901b1791509250929050565b5f805f83516020850186885af1949350505050565b6040513d5f823e3d81fd5b60605f825167ffffffffffffffff811115611210576112106119c5565b604051908082528060200260200182016040528015611239578160200160208202803683370190505b5090505f835167ffffffffffffffff811115611257576112576119c5565b604051908082528060200260200182016040528015611280578160200160208202803683370190505b5090505f80855111611292575f611298565b84516002015b86516001010190505f8167ffffffffffffffff8111156112ba576112ba6119c5565b6040519080825280602002602001820160405280156112ed57816020015b60608152602001906001900390816112d85790505b5090505f611311604080516002815233602082015230818301526060810190915290565b82828151811061132357611323611e38565b60200260200101819052505f5b885181101561138057818060010192505088818151811061135357611353611e38565b602002602001015183838151811061136d5761136d611e38565b6020908102919091010152600101611330565b508651156115bb578080600101915050848282815181106113a3576113a3611e38565b60200260200101819052508080600101915050838282815181106113c9576113c9611e38565b60200260200101819052505f5b87518110156115b9576114cc8882815181106113f4576113f4611e38565b60200260200101515f01516114a98a848151811061141457611414611e38565b60200260200101516020015161148a8c868151811061143557611435611e38565b60200260200101518051604091820151805160209081029181019190912083517f6ec4dff745ec96dbde88c5d41f8aa5ac13aa1664afb47b8406b44fa945a650c8815291820192909252918201526060902090565b60405161190160f01b8152600281019290925260228201526042902090565b8a84815181106114bb576114bb611e38565b6020026020010151606001516115e8565b6114ec57604051630a57f30960e31b815260048101829052602401610297565b8781815181106114fe576114fe611e38565b60200260200101515f01516001600160a01b03165f1b86828151811061152657611526611e38565b60200260200101818152505087818151811061154457611544611e38565b60200260200101516020015185828151811061156257611562611e38565b602002602001018181525050818060010192505087818151811061158857611588611e38565b6020026020010151604001518383815181106115a6576115a6611e38565b60209081029190910101526001016113d6565b505b509695505050505050565b5f6115e15f84126115d757836115db565b835f035b83611659565b9392505050565b5f836001600160a01b03163b5f03611646575f8061160685856116f7565b5090925090505f81600381111561161f5761161f6125f1565b14801561163d5750856001600160a01b0316826001600160a01b0316145b925050506115e1565b61165184848461173d565b949350505050565b5f637ffffff5821361166c57505f6100ed565b637ffffffe19820160438113156116875750508115156100ed565b5f81126116c75780600a0a7b80000000000000000000000000000000000000000000000000000001816116bc576116bc612390565b0484119150506100ed565b805f03600a0a7b800000000000000000000000000000000000000000000000000000020284101591505092915050565b5f805f835160410361172e576020840151604085015160608601515f1a611720888285856117a2565b955095509550505050610f83565b505081515f9150600290610f83565b805160408051630b135d3f60e11b8082526004820186905260248201929092525f92906020820185604483015e5f82606483010152601f820160051c60051b915060205f60648401838a5afa9050825f5114601f3d1116811693505050509392505050565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411156117db57505f91506003905082611860565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa15801561182c573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b03811661185757505f925060019150829050611860565b92505f91508190505b9450945094915050565b5f6020828403121561187a575f80fd5b81356001600160e01b0319811681146115e1575f80fd5b6001600160a01b0381168114610222575f80fd5b5f805f805f8060a087890312156118ba575f80fd5b86356118c581611891565b955060208701356118d581611891565b94506040870135935060608701359250608087013567ffffffffffffffff808211156118ff575f80fd5b818901915089601f830112611912575f80fd5b813581811115611920575f80fd5b8a6020828501011115611931575f80fd5b6020830194508093505050509295509295509295565b5f805f60608486031215611959575f80fd5b833561196481611891565b9250602084013567ffffffffffffffff80821115611980575f80fd5b9085019060c08288031215611993575f80fd5b909250604085013590808211156119a8575f80fd5b508401604081870312156119ba575f80fd5b809150509250925092565b634e487b7160e01b5f52604160045260245ffd5b6040516080810167ffffffffffffffff811182821017156119fc576119fc6119c5565b60405290565b6040805190810167ffffffffffffffff811182821017156119fc576119fc6119c5565b6040516060810167ffffffffffffffff811182821017156119fc576119fc6119c5565b604051601f8201601f1916810167ffffffffffffffff81118282101715611a7157611a716119c5565b604052919050565b5f82601f830112611a88575f80fd5b813567ffffffffffffffff811115611aa257611aa26119c5565b611ab5601f8201601f1916602001611a48565b818152846020838601011115611ac9575f80fd5b816020850160208301375f918101602001919091529392505050565b5f60208284031215611af5575f80fd5b813567ffffffffffffffff811115611b0b575f80fd5b61165184828501611a79565b5f60018201611b3457634e487b7160e01b5f52601160045260245ffd5b5060010190565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f6001600160a01b038089168352876020840152808716604084015285606084015280851660808401525060c060a0830152611ba860c0830184611b3b565b98975050505050505050565b5f60208284031215611bc4575f80fd5b5051919050565b5f67ffffffffffffffff821115611be457611be46119c5565b5060051b60200190565b5f82601f830112611bfd575f80fd5b81356020611c12611c0d83611bcb565b611a48565b82815260059290921b84018101918181019086841115611c30575f80fd5b8286015b848110156115bb57803567ffffffffffffffff80821115611c53575f80fd5b908801906080828b03601f19011215611c6a575f80fd5b611c726119d9565b86830135611c7f81611891565b815260408381013588830152606084013583811115611c9c575f80fd5b8401603f81018d13611cac575f80fd5b88810135611cbc611c0d82611bcb565b81815260059190911b82018301908a8101908f831115611cda575f80fd5b928401925b82841015611cf85783358252928b0192908b0190611cdf565b80858701525050505050608083013582811115611d13575f80fd5b611d218c8983870101611a79565b60608301525085525050918301918301611c34565b5f60408236031215611d46575f80fd5b611d4e611a02565b823567ffffffffffffffff80821115611d65575f80fd5b818501915060608236031215611d79575f80fd5b611d81611a25565b8235611d8c81611891565b81526020830135611d9c81611891565b6020820152604083013582811115611db2575f80fd5b611dbe36828601611a79565b60408301525083526020850135915080821115611dd9575f80fd5b50611de636828601611bee565b60208301525092915050565b5f808335601e19843603018112611e07575f80fd5b83018035915067ffffffffffffffff821115611e21575f80fd5b6020019150600581901b3603821315610661575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235607e19833603018112611e60575f80fd5b9190910192915050565b5f8235609e19833603018112611e60575f80fd5b5f808335601e19843603018112611e93575f80fd5b83018035915067ffffffffffffffff821115611ead575f80fd5b6020019150600681901b3603821315610661575f80fd5b5f60208284031215611ed4575f80fd5b81356115e181611891565b5f808335601e19843603018112611ef4575f80fd5b830160208101925035905067ffffffffffffffff811115611f13575f80fd5b8060051b3603821315610661575f80fd5b5f808335601e19843603018112611f39575f80fd5b830160208101925035905067ffffffffffffffff811115611f58575f80fd5b803603821315610661575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f8135611f9a81611891565b6001600160a01b039081168452602083013590611fb682611891565b166020840152611fc96040830183611f24565b60606040860152611fde606086018284611f66565b95945050505050565b5f808335601e19843603018112611ffc575f80fd5b830160208101925035905067ffffffffffffffff81111561201b575f80fd5b8060061b3603821315610661575f80fd5b8183525f60208085019450825f5b8581101561207257813561204d81611891565b6001600160a01b0316875281830135838801526040968701969091019060010161203a565b509495945050505050565b5f8235607e19833603018112612091575f80fd5b90910192915050565b8183526020808401935f91600585811b8301820185855b8881101561217e57858303601f19018a526120cc828961207d565b608081356120d981611891565b6001600160a01b03168552818701358786015260406120fa81840184611edf565b8383890152808489015260a093507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811115612134575f80fd5b881b9150818188850137508501606061214f84820185611f24565b94508388840301828901526121678484018683611f66565b9e8a019e97505050938701935050506001016120b1565b509098975050505050505050565b5f602080835260e0830184358285015281850135604085015260606040860135606086015260608601358015158082146121c4575f80fd5b60809150806080880152506121dc6080880188611edf565b60c060a08901529384905261010093848801600582901b89018601835f5b84811015612315578b830360ff19018452612215828761207d565b8035609e19823603018112612228575f80fd5b8885528101803561223881611891565b6001600160a01b0316858a0152808c013536829003605e1901811261225b575f80fd5b60a0808701526122716101208701838301611f8e565b90506122806040830183611fe7565b607f19808985030160c08a015261229884838561202c565b93506122a68e860186611fe7565b93509150808985030160e08a0152506122c083838361202c565b92505050898201358c8701528c8301358d870152604083013560408701526122ea8b840184611edf565b935091508581038b87015261230081848461209a565b968d019695505050918a0191506001016121fa565b505061232460a08c018c611f24565b8b8303601f190160c08d01529850965061233f818989611f66565b9b9a5050505050505050505050565b5f806040838503121561235f575f80fd5b505080516020909101519092909150565b5f60208284031215612380575f80fd5b815160ff811681146115e1575f80fd5b634e487b7160e01b5f52601260045260245ffd5b5f815180845260208085019450602084015f5b83811015612072578151875295820195908201906001016123b7565b5f8282518085526020808601955060208260051b840101602086015f5b8481101561241e57601f1986840301895261240c8383516123a4565b988401989250908301906001016123f0565b5090979650505050505050565b602081526001600160a01b038251166020820152602082015160408201525f604083015160e06060840152612464610100840182611b3b565b9050606084015160808401526080840151601f19808584030160a086015261248c83836123d3565b925060a08601519150808584030160c08601526124a983836123a4565b925060c08601519150808584030160e086015250611fde82826123a4565b5f82601f8301126124d6575f80fd5b815160206124e6611c0d83611bcb565b8083825260208201915060208460051b870101935086841115612507575f80fd5b602086015b848110156115bb578051835291830191830161250c565b5f8060408385031215612534575f80fd5b825167ffffffffffffffff8082111561254b575f80fd5b818501915085601f83011261255e575f80fd5b8151602061256e611c0d83611bcb565b82815260059290921b8401810191818101908984111561258c575f80fd5b948201945b838610156125aa57855182529482019490820190612591565b918801519196509093505050808211156125c2575f80fd5b506125cf858286016124c7565b9150509250929050565b828152604060208201525f61165160408301846123a4565b634e487b7160e01b5f52602160045260245ffd"; /// @dev What MUST already be on a network before this release can be /// broadcast there: an address, and the runtime code that belongs at it. /// `abi.encode`d as a `DeployDependency[]` because Solidity has no /// file-scope constant of dynamic array type. bytes constant DEPENDENCIES = - hex"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000059600000000000000000000000000000000000000000000000000000000000005e20000000000000000000000000531167691b4f37f0266e226d03412c77fb2977ce0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000588e6080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a71461180e575080632cb77e9f146117e257806341d1514f146117ab5780635343c1b7146117105780635cffe9de146115b45780635d003c4414611430578063613255ab146113ad578063687cf02a14611096578063ac9650d814610f48578063b0460f07146105f3578063b845b83e1461059b578063ca9109ba1461044c578063d9d98ce41461039b578063ddebc96f146103475763df6db3c2146100c1575f80fd5b34610321576003196040368201126103215767ffffffffffffffff9060043582811161032157806004019160a0823603918201126103215760243584811161032157610111903690600401611cd0565b909361011b612bf0565b5f946001600160a01b039485610130846125d7565b163303610325576101496101443685611b02565b612c32565b805f525f60205260405f20966001885414610190575b60208960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556040519015158152f35b9091929394959697505f600198556040519633885282602089015260606040890152816101bc8761188d565b166060890152602484013590606219018112156103215783019060a06080890152806101ea6004840161188d565b166101008901526101fd6024830161188d565b16610120880152604481013560221982360301811215610321570190602460048301359201988211610321578136038913610321577f09d18501db0080ca2d6cd7c17fa7255daff4b2d503ea93b76ff68b6752ea8e6387806103069560846102c561030e9a60209f610284906103149f9a60606101406102ef9d0152610160880191612388565b6102b66102ab61029760448801856129db565b605f198a8603810160a08c01529491612a10565b9260648701906129db565b918784030160c0880152612a10565b91013560e08301520390a13390919060405192600284526020840152604083015260608201604052565b906040519160018352602083015260408201604052565b9236916123a8565b90613c65565b5f8080808080808061015f565b5f80fd5b602486610331856125d7565b6040516335252be360e01b815291166004820152fd5b3461032157600319602036820112610321576004359067ffffffffffffffff82116103215760809082360301126103215761038660609160040161262b565b90604051921515835260208301526040820152f35b34610321576040366003190112610321576001600160a01b036103bc611861565b166040516370a0823160e01b8152306004820152602081602481855afa908115610441575f9161040f575b50156103f75760206040515f8152f35b60249060405190633c5bf76960e21b82526004820152fd5b90506020813d602011610439575b8161042a60209383611971565b810103126103215751826103e7565b3d915061041d565b6040513d5f823e3d90fd5b346103215761045a36611d01565b92809492610466612bf0565b610471828533613b61565b61047a816134d6565b15610567578061048e6104dd9286336140a7565b9790957f7f9dfa19cf1cc2f806f2f860fbc9c056b601fb1afc0e9b843dfe5c63616268e660806040513381526001600160a01b038416998a60208301528560408301526060820152a1336137bd565b9390918561050c575b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b61055b9661030e956103069460ff93604051956005875260208701526040860152606085015260808401521660a082015260c08101604052906040519160018352602083015260408201604052565b808080808080806104e6565b506040516306dde9c360e41b81523360048201526001600160a01b03841660248201526044810191909152606490fd5b0390fd5b346103215760203660031901126103215760043567ffffffffffffffff81116103215761030e6105d26104e6923690600401611cd0565b91906105dc612bf0565b604051926105e984611955565b5f845236916123a8565b34610321576003196020368201126103215767ffffffffffffffff600435116103215760c090600435360301126103215761062c612bf0565b5f808061064160048035608481019101612510565b905015610f36576024600435013592610659846134d6565b15610f245760608060405161066d81611909565b610675612565565b81525f60208201525f6040820152015261068d612565565b506106ed6106e86106c76106bd6106b76106b1608460043501600435600401612510565b90612597565b806125b2565b60408101906124a2565b60206106e06106b1608460043501600435600401612510565b0135916125c7565b6125d7565b936001600160a01b0361073c6106e86107236107196106b76106b1608460043501600435600401612510565b60608101906124a2565b60406106e06106b1608460043501600435600401612510565b816040519761074a896118d1565b168752166020860152604085015261076c608460043501600435600401612510565b9490506001604051955f87520160051b85016040525f905f5b610799608460043501600435600401612510565b9050811080610f11575b15610d5e576107bc608460043501600435600401612510565b821015610d4a578160051b810135607e198236030181121561032157608081830136031261032157604051916107f183611909565b8181013567ffffffffffffffff81116103215761081390369084840101611b02565b835280820160208181013590850152604080820135908501526060013567ffffffffffffffff81116103215761084c9236920101611cb5565b606082015280516001600160a01b0361086e6040830151602085015190611dbe565b5151166001600160a01b0385511614801590610d16575b610d045761089d602083015160408401519083613fa4565b6108a681612c32565b91825f525f60205260405f2054155f1461090a575051604080513381526001600160a01b039092166020830152810191909152600191907fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f390606090a15b01610785565b919061093b60208497959701516040850151906060860151906040519261093084611955565b5f8452339186613234565b5f94916109a457505051604080513381526001600160a01b03909216602083015281019190915260019291907f1e6fa9678edf81f9f25bbf308bde03ad3e110db1f429394b0915ba021532941490606090a15b811561099c575b5092610904565b905088610995565b6109b9606082015160446004350135906134f9565b15610a1357505051604080513381526001600160a01b03909216602083015281019190915260019291907fe3151dc8cb7a54ffc4baabd28c1f241c94d510b5e5b502491ac3cad6c16316d59080606081015b0390a161098e565b610a2060408201516134d6565b158015610cf1575b15610a7e57505051604080513381526001600160a01b03909216602083015281019190915260019291907f500b713857325f9e6dcb52ae832eca9109d107ed1aae9cb4928b4c1e13f051aa908060608101610a0b565b9250925050600196959691610a976064600435016125eb565b15610c5e5796610b0797610b1760408401516040880151610ab88183613543565b15610c565750925b610b11848592610afa610af460608a01516001600160e01b03601b918660e01d92828816810b928260e01d9216900b6145f4565b90614569565b9d8e9260408d015161356a565b60408c015261407d565b9961407d565b98610b228484613594565b610b2c84826135f2565b60405192338452608060208501526060610b528451608080880152610100870190611e19565b93602081015160a0870152604081015160c0870152015192607f198582030160e0860152835180825260208201906020808260051b8501019601925f5b828110610bee57505050505092806001979695937fbae4dbf76931c547f765e9def16d693d86daaa596f491de979008831789185ae93610be996604084015260608301520390a180858c5101808d5260051b8c01526138a9565b61098e565b9091929396602080610c49600193601f198782030189528b51906001600160a01b03825116815283820151848201526060610c3860408401516080604085015260808401906125f8565b920151906060818403910152611d4d565b9901950193929101610b8f565b905092610ac0565b610b0790610b176060840151610b11610c9c610af460408801516001600160e01b0394601b90868360e01d9316820b91878260e01d9216900b6145f4565b60408a0151610cab8183613543565b15610ce95750915b829c8d916060890151908116155f14610cda575060408801515b96879460408d015161356a565b610ce49085613fd9565b610ccd565b905091610cb3565b50610cff6060820151613520565b610a28565b60405163936bb5ad60e01b8152600490fd5b506001600160a01b03610d326060830151604085015190611dbe565b5151166001600160a01b036020860151161415610885565b634e487b7160e01b5f52603260045260245ffd5b50919390610d706064600435016125eb565b15610f0b57835b6004356004013590610d898282613543565b610eed5750508490610da9856001600160a01b0360208701511633613bf3565b505060a46004350190610dc18260043560040161246f565b905015159081610ee5575b50610e44575b506001600160a01b03610de892935116336140a7565b50505b8351811015610e105780610e0a610e0460019387611dbe565b5161371d565b01610deb565b5060409160017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005582519182526020820152f35b90506001600160a01b03602084015116610e6e6001600160a01b038551169260043560040161246f565b929091333b1561032157610eb65f93604051958694859463691f9ed760e01b8652600486015260248501528960448501528a606485015260a0608485015260a4840191612388565b038183335af190811561044157859115610dd2579050610ed69150611925565b5f836001600160a01b03610dd2565b905088610dcc565b604492506040519163573b6f4160e01b835260048301526024820152fd5b84610d77565b50610f1f60408301516134d6565b6107a3565b60405163315f9e2360e21b8152600490fd5b604051639c95219f60e01b8152600490fd5b34610321576020806003193601126103215760043567ffffffffffffffff811161032157610f7a903690600401611cd0565b919060405192610f8984611955565b5f8452828401610f9882611a55565b94610fa66040519687611971565b828652610fb283611a55565b93610fc486880195601f1901866124f4565b5f5b84811061102857604080518881528951818a018190525f92600582901b83018101918a918c9085015b828710610ffc5785850386f35b909192938280611018600193603f198a82030186528851611d4d565b9601920196019592919092610fef565b806110778861107161104460019560059d9c9d1b87018761246f565b929089846040519586938585013782018381015f81528b519283915e015f83820152038084520182611971565b30613f13565b611081828a611dbe565b5261108c8189611dbe565b5001969596610fc6565b34610321576003196040368201126103215760043567ffffffffffffffff8082116103215760c08260040193833603011261032157602435908111610321576110e3903690600401611cd0565b906110ec612bf0565b61111d61111861111361110c611102888061245a565b604081019061246f565b3691611993565b613e95565b613efe565b801561139b5760011015611389576024830161113981866124a2565b90501561137757604484019461114f86826124a2565b905015611365576111b561117d966111a961117461116d858061245a565b95856124a2565b999092856124a2565b91909261119a60405197611190896118a1565b33895236906119f7565b9a60209b8c8901523691611a6d565b60408601523691611a6d565b6060830152606485013560808301526111cd82612c32565b91825f525f875260405f20958654159687611211575b888860017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055604051908152f35b6001905560a46001600160a01b03917f87491344dfbcf91f6cbbc610cbbeedc85313d37a02df0c93527f7ea5f8db717f83855116604051908152878c82015260606040820152806112656060820188611e19565b0390a10191611274838561246f565b90506112b9575b505050506112ad92916103066102ef61030e933390919060405192600284526020840152604083015260608201604052565b828080808080806111e3565b6112c661110c848661246f565b6112cf816145d0565b156113425750937fd46c2c56b35c8210e9e712ec3f02242d5fc90187c0ac8ed80cc33626846ec369896112ad989795611335611318610306976102ef9761030e9b51169361246f565b866040519586958652850152606060408501526060840191612388565b0390a1938395965061127b565b89610597604051928392630c89984b60e31b845260048401526024830190611d4d565b60405163540e5f0b60e01b8152600490fd5b604051636c44ef8f60e01b8152600490fd5b604051633c8270bd60e21b8152600490fd5b604051632cff108b60e21b8152600490fd5b3461032157602080600319360112610321576024816001600160a01b036113d2611861565b16604051928380926370a0823160e01b82523060048301525afa908115610441575f91611403575b50604051908152f35b90508181813d8311611429575b61141a8183611971565b810103126103215751826113fa565b503d611410565b346103215761143e36611d01565b929161144b949194612bf0565b611456838333613b61565b61145f816134d6565b15611583578160ff916114778561153a969533612a60565b6114818183613543565b1561157d575080935b61149685828533613b95565b917f8045c25080b0868951141ed0a91720bcad09a8364a2b3109ee1fd49c1f0bc8b860c06114c5898833613bf3565b97906001600160a01b0360405192338452169a8b6020840152856040840152886060840152608083015260a0820152a16040519660068852602088015260408701526060860152608085015260a08401521660c082015260e08101604052906040519160018352602083015260408201604052565b90806115665760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b6115759261030e9136916123a8565b8080806104e6565b9361148a565b50604051623a3a4d60e21b81523360048201526001600160a01b039190911660248201526044810191909152606490fd5b34610321576080366003190112610321576004356001600160a01b0390818116809103610321576115e3611877565b6044359167ffffffffffffffff91606435838111610321573660238201121561032157806004013593841161032157366024858301011161032157611670956020921693611632868587613a82565b60405196879283926323e30c8b60e01b84523360048501528760248501528860448501525f606485015260a06084850152602460a485019201612388565b03815f855af1938415610441575f946116dc575b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd984036116c3576116b893503091613afb565b602060405160018152f35b604051630b6c58a960e31b815260048101859052602490fd5b9093506020813d602011611708575b816116f860209383611971565b8101031261032157519284611684565b3d91506116eb565b34610321576101403660031901126103215767ffffffffffffffff60043581811161032157611743903690600401611b02565b6024358281116103215761175b903690600401611b02565b60c0366043190112610321576101043583811161032157611780903690600401611cb5565b90610124359384116103215761179d6104e6943690600401611cb5565b926117a6612bf0565b611eca565b346103215760603660031901126103215760206117da6117c9611861565b6117d1611877565b60443591612a60565b604051908152f35b34610321576020366003190112610321576004355f525f6020526020600160405f205414604051908152f35b34610321576020366003190112610321576004359063ffffffff60e01b82168092036103215760209163e414309160e01b8114908115611850575b5015158152f35b6301ffc9a760e01b14905083611849565b600435906001600160a01b038216820361032157565b602435906001600160a01b038216820361032157565b35906001600160a01b038216820361032157565b60a0810190811067ffffffffffffffff8211176118bd57604052565b634e487b7160e01b5f52604160045260245ffd5b6060810190811067ffffffffffffffff8211176118bd57604052565b6040810190811067ffffffffffffffff8211176118bd57604052565b6080810190811067ffffffffffffffff8211176118bd57604052565b67ffffffffffffffff81116118bd57604052565b60e0810190811067ffffffffffffffff8211176118bd57604052565b6020810190811067ffffffffffffffff8211176118bd57604052565b90601f8019910116810190811067ffffffffffffffff8211176118bd57604052565b92919267ffffffffffffffff82116118bd57604051916119bd601f8201601f191660200184611971565b829481845281830111610321578281602093845f960137010152565b9080601f83011215610321578160206119f493359101611993565b90565b91906060838203126103215760405190611a10826118d1565b8193611a1b8161188d565b8352611a296020820161188d565b602084015260408101359167ffffffffffffffff831161032157604092611a5092016119d9565b910152565b67ffffffffffffffff81116118bd5760051b60200190565b929192611a7982611a55565b604092611a896040519283611971565b819581835260208093019160061b84019381851161032157915b848310611ab257505050505050565b8583830312610321578386918251611ac9816118ed565b611ad28661188d565b81528286013583820152815201920191611aa3565b9080601f83011215610321578160206119f493359101611a6d565b91909160a0818403126103215760405190611b1c826118a1565b8193611b278261188d565b835267ffffffffffffffff9160208101358381116103215782611b4b9183016119f7565b602085015260408101358381116103215782611b68918301611ae7565b6040850152606081013592831161032157611b896080939284938301611ae7565b60608501520135910152565b90929192611ba281611a55565b91604094611bb36040519485611971565b839583855260208095019160059460051b8401948186116103215784935b868510611be2575050505050505050565b67ffffffffffffffff90853582811161032157870190608082860312610321578551611c0d81611909565b611c168361188d565b81528a8301358b8201528683013584811161032157830186601f8201121561032157803590611c4482611a55565b91611c518a519384611971565b8083528d80840191891b83010191898311610321578e809101915b838310611ca557505050508782015260608084013594851161032157611c96878d968796016119d9565b90820152815201940193611bd1565b82358152918101918f9101611c6c565b9080601f83011215610321578160206119f493359101611b95565b9181601f840112156103215782359167ffffffffffffffff8311610321576020808501948460051b01011161032157565b906080600319830112610321576004356001600160a01b0381168103610321579160243591604435916064359067ffffffffffffffff821161032157611d4991600401611cd0565b9091565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b805115610d4a5760200190565b805160011015610d4a5760400190565b805160021015610d4a5760600190565b805160031015610d4a5760800190565b805160041015610d4a5760a00190565b8051821015610d4a5760209160051b010190565b9081518082526020808093019301915f5b828110611df1575050505090565b835180516001600160a01b031686528201518583015260409094019392810192600101611de3565b90608080611e8f611e7d611e6b60406001600160a01b0380895116885260208901519060a060208a01528082511660a08a015260208201511660c08901520151606060e0880152610100870190611d4d565b60408701518682036040880152611dd2565b60608601518582036060870152611dd2565b93015191015290565b90611ea282611a55565b611eaf6040519182611971565b8281528092611ec0601f1991611a55565b0190602036910137565b926001600160a01b038451166001600160a01b0383511614612376576001600160a01b03611eff606086015160643590611dbe565b515116906040830151916001600160a01b03611f1e6084358095611dbe565b51511614801590612336575b610d04576040850151906001600160a01b03611f496044358094611dbe565b5151166001600160a01b03611f6460643560608a0151611dbe565b5151161461232457611f7586612c32565b805f525f60205260405f2054156122d15750611f9084612c32565b805f525f60205260405f20541561227d5750612075929161204d917f6fa7f4c28634b0a9d6831401c45ae468195fb63aed07308935c35374ff5d9e3960405180611ff8611fea61012033845280602085015283018d611e19565b82810360408401528a611e19565b85606083015260643560808301528760a083015260a43560c083015260c43560e083015260e4356101008301520390a16001600160a01b038651166040519261204084611955565b5f8452606435908a612e9c565b9490506001600160a01b038651166040519261206884611955565b5f845260a4359086612e9c565b92905061208560408201516134d6565b158015612269575b8015612256575b8015612243575b61223157604051916120ac83611909565b5f83525f60208401525f60408401525f60608401526120cb84836144e1565b845260408401526120f16120df83866144e1565b6020860152806060860152845161356a565b94612105602085015160408601519061356a565b9361210f87613520565b8015612222575b612210576121d7612209957fd9fa84dd790c969daa5c33d8050dc06b4a9b59d5b42e2be5f5e8ae20447f618d946121b961220e9a60a0966121588a8851613594565b6121668c6020890151613594565b6121748a60408901516135f2565b6121828c60608901516135f2565b61218b8a61371d565b6121948c61371d565b6001600160a01b036121b060c435926060606435910151611dbe565b515116336137bd565b50506001600160a01b036121b060e43592606060a435910151611dbe565b5050606060405191338352805160208401526020810151604084015260408101518284015201516080820152a16138a9565b6138a9565b565b604051630d86822160e01b8152600490fd5b5061222c85613520565b612116565b6040516321badf1f60e01b8152600490fd5b506122516060840151613520565b61209b565b506122646060820151613520565b612094565b5061227760408401516134d6565b1561208d565b9351604080513381526001600160a01b039092166020830152810194909452507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f3945091925082915050606081015b0390a1565b9551604080513381526001600160a01b039092166020830152810196909652507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f3949350839250506060820190506122cc565b604051631cd2f1c760e21b8152600490fd5b506001600160a01b03612350606085015160a43590611dbe565b5151166001600160a01b0361236c604088015160443590611dbe565b5151161415611f2a565b604051630a98f1f360e21b8152600490fd5b908060209392818452848401375f828201840152601f01601f1916010190565b909291926123b581611a55565b916040916123c66040519485611971565b839581855260208095019160051b8301938185116103215783925b8584106123f15750505050505050565b67ffffffffffffffff90843582811161032157860190838286031261032157835161241b816118ed565b823584811161032157866124309185016119f7565b8152898301359384116103215761244b868b95869501611cb5565b838201528152019301926123e1565b903590605e1981360301821215610321570190565b903590601e1981360301821215610321570180359067ffffffffffffffff82116103215760200191813603831361032157565b903590601e1981360301821215610321570180359067ffffffffffffffff821161032157602001918160061b3603831361032157565b5f5b608081106124e6575050565b6060828201526020016124da565b5f5b82811061250257505050565b6060828201526020016124f6565b903590601e1981360301821215610321570180359067ffffffffffffffff821161032157602001918160051b3603831361032157565b60405190612553826118d1565b60606040835f81525f60208201520152565b60405190612572826118a1565b5f608083828152612581612546565b6020820152606060408201526060808201520152565b9015610d4a57803590607e1981360301821215610321570190565b903590609e1981360301821215610321570190565b9190811015610d4a5760061b0190565b356001600160a01b03811681036103215790565b3580151581036103215790565b9081518082526020808093019301915f5b828110612617575050505090565b835185529381019392810192600101612609565b9061264361014461263c84806125b2565b3690611b02565b5f5260205f81526040926001845f2054036129d057916128c5916126ca85855f61284a6126738361268a9a6125b2565b61268f878501359182878701359c8d923690611b02565b613fa4565b6126a761269c85806125b2565b946060810190612510565b96906126c28751966126b888611955565b8688523690611b02565b973691611b95565b906126d3612c63565b506127fa8651916126e3836118a1565b600483526126f28a84016124d8565b886126fc81612c32565b988b6001600160a01b039a8b84511690835192600384528301528282015233606082015260808101825261272f86611d71565b5261273985611d71565b508051612745816118d1565b6002815281368e83013761275886611d7e565b5261276285611d7e565b50810160ff8c6127c56127ae8d806127878161277f8b8a51611dbe565b515116614172565b97511690612796898851611dbe565b515116846127a58a8951611dbe565b51015191612a60565b958d6127bb828751611dbe565b5151169451611dbe565b51015192169093929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b61280382611d8e565b5261280d81611d8e565b506128318b886060810160ff8c6127c56127ae8d806127878161277f8b8a51611dbe565b61283a82611d9e565b5261284481611d9e565b50614250565b918385511693868601918b83519289818551169401511693878652308a5281808720915101519082519261287d84611955565b878452519561288b87611939565b86528a8601528d85015284606085015285608085015260a084015260c08301528a5180809a819463d04dfe2360e01b835260048301612de4565b03915afa95865f915f986129aa575b506128e35788513d5f823e3d90fd5b95938651600281106129935750888798998260c0979899015199015161291161290b85611dae565b51611d9e565b5161291c8183613543565b156129895750998a925b6129488b85919060405192600284526020840152604083015260608201604052565b61295186611d8e565b5261295b85611d8e565b5082519661296888611939565b8752860152840152866060840152608083015260a082015201526001929190565b9050998a92612926565b6024908a5190630fbb8e5560e21b82526004820152fd5b9097506129c991503d805f833e6129c18183611971565b810190612ca0565b965f6128d4565b505f92508291829150565b9035601e198236030181121561032157016020813591019167ffffffffffffffff8211610321578160061b3603831361032157565b9190808252602080920192915f905b828210612a2d575050505090565b909192936001906001600160a01b03612a458761188d565b16815285830135838201526040908101950193920190612a1f565b8215612a95576001600160a01b038091165f52600160205260405f2091165f5260205260405f20905f5260205260405f205490565b909150612aa182614172565b6001600160a01b03809316906040918251946370a0823160e01b86528416938460048701526020928387602481865afa968715612bb7575f97612bc1575b5083612af8612af183612b289a614f36565b50906149f8565b508651636eb1769f60e11b81526001600160a01b0390941660048501523060248501529297889081906044820190565b0381865afa968715612bb7575f97612b86575b50612af1612b4c916119f498614f36565b50612b578183613543565b15612b7e5750935b5f5260018252825f20905f528152815f20905f8052525f20549061407d565b905093612b5f565b96508387813d8311612bb0575b612b9d8183611971565b8101031261032157955195612af1612b3b565b503d612b93565b85513d5f823e3d90fd5b96508387813d8311612be9575b612bd88183611971565b810103126103215795519583612adf565b503d612bce565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f006002815414612c205760029055565b604051633ee5aeb560e01b8152600490fd5b604051612c5d81612c4f6020820194602086526040830190611e19565b03601f198101835282611971565b51902090565b60405190612c7082611939565b606060c083612c7d612565565b81525f60208201525f60408201525f838201528260808201525f60a08201520152565b919060408382031261032157825167ffffffffffffffff908181116103215784019082601f83011215610321578151602092612cdb82611a55565b91612ce96040519384611971565b808352848084019160051b830101918683116103215785809101915b838310612d785750505050948281015191821161032157019180601f84011215610321578251612d3481611a55565b93612d426040519586611971565b818552838086019260051b820101928311610321578301905b828210612d69575050505090565b81518152908301908301612d5b565b8251815291810191869101612d05565b90808251908181526020809101926020808460051b8301019501935f915b848310612db65750505050505090565b9091929394958480612dd4600193601f198682030187528a516125f8565b9801930193019194939290612da6565b91906020928381526001600160a01b0382511684820152838201516040820152612e1e604083015160e06060840152610100830190611d4d565b9060608301516080820152612e45608084015192601f1993848483030160a0850152612d88565b9260a081015193838382030160c08401528680865192838152019501905f5b818110612e88575050506119f494955060c060e091015192828503019101526125f8565b825187529588019591880191600101612e64565b94959395929192612eab612c63565b50604096875190612ebb826118a1565b60048252602093612ecd8584016124d8565b612ed689612c32565b6001600160a01b038097818c51168d519360038552898501528d840152166060820152608081018b52612f0884611d71565b52612f1283611d71565b508951612f1e816118d1565b600281528a3687830137612f3184611d7e565b52612f3b83611d7e565b50898901908681835190612f4e91611dbe565b515116612f5a90614172565b86888c51168984865190612f6d91611dbe565b5151168285875190612f7e91611dbe565b51015190612f8b92612a60565b928981865190612f9a91611dbe565b515116945190612fa991611dbe565b5101519060ff16612fe1929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b612fea83611d8e565b52612ff482611d8e565b5060608801858782519061300791611dbe565b51511661301390614172565b868a5116878984519061302591611dbe565b515116878a85519061303691611dbe565b5101519061304392612a60565b908689898186519061305491611dbe565b51511694519061306391611dbe565b5101519060ff1661309b929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b6130a483611d9e565b526130ae82611d9e565b506130b891614250565b9183875116938188019283519183818451169301511693865f523084528a805f20915101518b51916130e983611955565b5f83528c51966130f888611939565b8752858701528b8601525f60608601526080850186905260a085015260c0840152885163d04dfe2360e01b815292839081906131379060048301612de4565b03815a935f94fa91825f915f94613216575b506131585788513d5f823e3d90fd5b979495969791948251966002881097886131ff5750818385015194015161318161290b87611dae565b5161318c8183613543565b156131f75750925b6131b68585919060405192600284526020840152604083015260608201604052565b6131bf87611d8e565b526131c986611d8e565b5082519a6131d68c611939565b8b528a01528801526060870152608086015260a085015260c0840152159190565b905092613194565b602490835190630fbb8e5560e21b82526004820152fd5b90935061322d91503d805f833e6129c18183611971565b925f613149565b95949193908693613243612c63565b505f92604061335e815192613257846118a1565b600484526020936132698582016124d8565b6133276132758b612c32565b8b6001600160a01b03998a9283835116895191600383528b830152898201528360609b168b8201526080810189526132ac86611d71565b526132b685611d71565b5087516132c2816118d1565b6002815288368b8301376132d586611d7e565b526132df85611d7e565b5060ff896127c58a85019361331b876132fd8161277f858a51611dbe565b9751168861330c848951611dbe565b515116856127a5858a51611dbe565b966127bb828751611dbe565b61333082611d8e565b5261333a81611d8e565b50612831878b8d60ff896127c58c85019361331b876132fd8161277f858a51611dbe565b946133de5f868a511698869786889c0191825191888184511693015116928c8552308952878086209151015188519161339683611955565b8683528951956133a587611939565b86528a86015288850152848a8501528b608085015260a084015260c08301528551808095819463d04dfe2360e01b835260048301612de4565b03915afa90815f915f936134b8575b506134ab575050505f975b6002855110988915996134985782848701519601519061341a61290b89611dae565b51906134268284613543565b1590506134905750925b6134528685919060405192600284526020840152604083015260608201604052565b61345b88611d8e565b5261346587611d8e565b5082519b6134728d611939565b8c528b0152890152870152608086015260a085015260c08401529190565b905092613430565b50505050505050505091506119f4612c63565b91999850945093966133f8565b9092506134cf91503d805f833e6129c18183611971565b915f6133ed565b6134f5905f60e01d906001600160e01b038160e01d9116601b0b614fed565b1290565b906134f5916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b61506e565b61353f905f60e01d906001600160e01b038160e01d9116601b0b614fed565b1390565b9061353f916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b61506e565b6119f491610af4916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614544565b6135ee9160808101826135b06135aa8351611dae565b51611dae565b526135e76135e16001600160a01b038094515116936135d86135d28551611dae565b51611d71565b51169251611dae565b51611d8e565b5191613b95565b5050565b906080810191806136066135aa8551611d9e565b526001600160a01b038092515116916136226135d28551611d9e565b51166136316135e18551611d9e565b5190816136e55761364183613520565b6136cc579183917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a95936122cc955f5260209060018252613697604094855f20835f528452855f20855f528452855f205461407d565b945f5260018252835f20905f528152825f20915f52525f20555b51604051918291338352604060208401526040830190612d88565b60405163793a8f5560e01b815260048101849052602490fd5b91613716917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a95936122cc956137bd565b50506136b1565b6080810161372e6135e18251611d9e565b5191821561373b57505050565b6137556135d26001600160a01b0380935151169351611d9e565b5116815f5260209160018352604092835f20835f528152835f20855f528152835f2054936001600160e01b038516613790575b505050505050565b6137b4955f9284845260018152828420868552815282842091845252812055613bf3565b5f808080613788565b939291936137ca83613520565b6136cc57846137e6576137de939450613bf3565b50505f905f90565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f528152613823835f2054948561407d565b9561382d87613520565b613850575f97885260018252838820908852815282872091875252909320829055565b835163c5e12af560e01b815260048101889052602490fd5b90604082019082526020606081936040838201528551809452019301915f5b828110613895575050505090565b835185529381019392810192600101613887565b60c0810151908151915f92613a1d575b5061395e6020918281510151926001600160a01b039081818187511696015116928660a082019485518252308452604097888320898686510151015160808601518b519161390683611955565b8683528c519361391585611955565b8785528d519661392488611939565b8752898701528c86015260016060860152608085015260a084015260c08301528851808099819463d04dfe2360e01b835260048301612de4565b03915afa948515613a135787956139f5575b508451613981575b50505050505050565b81905101510151169051813b156139f1579184918493836139b6965180978195829463012c676d60e21b845260048401613868565b03925af19081156139e857506139d1575b8080808080613978565b6139db8291611925565b6139e557806139c7565b80fd5b513d84823e3d90fd5b8480fd5b613a0a9195503d8089833e6129c18183611971565b9050935f613970565b86513d89823e3d90fd5b6001600160a01b03602080845101510151169060a083015190823b1561032157613a60925f928360405180968195829463012c676d60e21b845260048401613868565b03925af1801561044157156138b957613a7a919250611925565b5f905f6138b9565b6040519263a9059cbb60e01b5f526001600160a01b0380931660045260245260205f60448180855af160015f5114811615613adc575b8360405215613ac657505050565b635274afe760e01b835216600482015260249150fd5b6001811516613af257813b15153d151616613ab8565b833d5f823e3d90fd5b9092604051936323b872dd60e01b5f526001600160a01b0393848092166004521660245260445260205f60648180855af160015f5114811615613b4b575b836040525f60605215613ac657505050565b6001811516613af257813b15153d151616613b39565b909115613b6c575050565b6040516305dbdfd960e41b81526001600160a01b03918216600482015291166024820152604490fd5b93929193613ba283613520565b6136cc5784613bb6576137de9394506140a7565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f528152613823835f2054948561356a565b90929192613c0081614573565b93613c0a81613520565b613c535784816001600160e01b03613c299360e01d9116601b0b615198565b50809281613c39575b5050509190565b6001600160a01b03613c4b9316613a82565b5f8181613c32565b604051632d1671a360e11b8152600490fd5b916040805191613c74836118a1565b60048084526020613c868186016124d8565b5f5b8751811015613cbb5780613c9e6001928a611dbe565b51613ca98289611dbe565b52613cb48188611dbe565b5001613c88565b5092955092939093335f52308352855f2091865190613cd9826118ed565b613ce1612546565b8252606085819301528751613cf581611955565b5f8152885191613d0483611955565b5f83525f3681375f5b8151811015613e6a57613d208183611dbe565b5190888c8b84519189818401518d8d8251613d48575b50505050505050506001915001613d0d565b5f613db797948197948c9794613d758c956001600160a01b039d8e81818d51169c0151169b015190614250565b94865199613d828b611939565b8a528901528488015286015260808501528a60a08501528b60c08501525180958194829363d04dfe2360e01b84528301612de4565b03915afa938415613e60578b915f95613e42575b508451613de0575b50908b8e89838d8d613d36565b51015116803b1561032157613e0f925f918c8f84905180978195829463012c676d60e21b845233908401613868565b03925af1918215613e3857600192613e29575b8981613dd3565b613e3290611925565b5f613e22565b8c513d5f823e3d90fd5b613e579195503d805f833e6129c18183611971565b9050935f613dcb565b8e513d5f823e3d90fd5b5050505050505050509050565b8115613e81570490565b634e487b7160e01b5f52601260045260245ffd5b6040815110613ef1576020810151908051603f198101908111613edd5760051c8211613ec95760016020920160051b010190565b5050604051613ed781611955565b5f815290565b634e487b7160e01b5f52601160045260245ffd5b50604051613ed781611955565b805115613f0e57602001515f1a90565b505f90565b905f8091602081519101845af48080613f91575b15613f475750506040513d81523d5f602083013e60203d82010160405290565b15613f6e57604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b3d15613f7f576040513d5f823e3d90fd5b60405163d6bda27560e01b8152600490fd5b503d151580613f275750813b1515613f27565b91613fcf906060613fc4936001600160a01b039485916040880151611dbe565b515116940151611dbe565b5151161461232457565b6140006001600160e01b0392838316601b0b9260e01d938160e01d9116601b0b84846147af565b90637ffffff58213614050575b90614017916149f8565b9290921580614048575b61402a57505090565b6044925060405191638eba4d0760e01b835260048301526024820152fd5b508215614021565b61405a82826156c1565b1561400d57604483856040519163d556b11160e01b835260048301526024820152fd5b6119f491610af4916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614d9d565b9291926140b382614573565b936140bd81613520565b61411e5784816001600160e01b036140dc9360e01d9116601b0b615198565b9290809315614109575b508290816140f5575050509190565b613c4b926001600160a01b03309216613afb565b9092505f198114613edd57600101915f6140e6565b604051632eaefac360e21b8152600490fd5b6004111561413a57565b634e487b7160e01b5f52602160045260245ffd5b602090939291936001600160a01b03604082019516815261416e83614130565b0152565b61417a6156da565b60408051630782d7e160e01b81526001600160a01b03831660048201529091828260248173200e12d10bb0c5e4a17e7018f0f1161919bb93895afa928315614247575f925f94614212575b506141cf83614130565b600183141580614200575b6141e45750505090565b5163ee07877f60e01b815291829161059791906004840161414e565b5061420a83614130565b8215156141da565b908094506142369293503d8511614240575b61422e8183611971565b810190614f0c565b919091925f6141c5565b503d614224565b513d5f823e3d90fd5b61425a8251611e98565b6142648351611e98565b9282519281518015155f146144d957600201935b6001940184019061428882611a55565b956142a360409361429b8551998a611971565b808952611a55565b6142b5602091601f1901828a016124f4565b5f9584519389896002926002885233868901523089890152606097606081018a526142df84611d71565b526142e983611d71565b505f825b614499575b505050508651614309575b50505050505050505090565b9091929360028861432c8c866143258e809c9d9e018093611dbe565b528d611dbe565b500185614339828d611dbe565b52614344818c611dbe565b505f965b614353575b506142fd565b8851871015614494576001600160a01b036143ff898b856143f68c60428c8861437c8488611dbe565b51511696858261438c868a611dbe565b5101519261439a868a611dbe565b51838d82511691015182815160051b910120908451927f6ec4dff745ec96dbde88c5d41f8aa5ac13aa1664afb47b8406b44fa945a650c88452830152838201522090519161190160f01b83528d83015260228201522093611dbe565b51015191614f64565b1561447c578761446b8b8e8c8f9e9d9c9b9a999897968f614458918d61444e898f8f61443a83889f614431828f611dbe565b51511692611dbe565b52614445828b611dbe565b51015192611dbe565b52019c8d94611dbe565b5101516144658383611dbe565b52611dbe565b500196979895909192939495614348565b8851630a57f30960e31b815260048101899052602490fd5b61434d565b9091929a82518210156144d157906144c584809301809d6144ba8487611dbe565b516144658383611dbe565b50019082918d936142ed565b9a92916142f2565b505f93614278565b916040830192604061451b610af4606087519401938451906001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6145f4565b9451930161452a8151866134f9565b614532575050565b9093506119f491925051925183613fd9565b919291600160ff1b840161455c57611d4993506150c3565b90611d49935f0391614d9d565b61401782826149f8565b61457b6156da565b6040805163b7bad1b160e01b81526001600160a01b0383166004820152909182826024815f73200e12d10bb0c5e4a17e7018f0f1161919bb93895af1928315614247575f925f9461421257506141cf83614130565b6008815110613f0e576008015167ffffffffffffffff1667ff0a89c674ee78741490565b9091939284158215175f1461460e5750505090505f905f90565b82810192600160fd1b8082019083011760fe1c614745575b505061463181615386565b9361463b81615386565b9461464686826153a6565b90918215614736575f9083986f0785ee10d5da46d900f436a000000000808611614728575b50670de0b6b3a7640000808b11614719575b50633b9aca00808b1161470a575b50612710808b116146fc575b5098805b6146eb57508190611d49989982600a0a9109960195817fcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccd0a93838211900382610100031b9203901c1702916153b9565b60019290920191600a90048061469b565b60049a04998a930192614697565b600991939a049901915f61468b565b601291939a049901915f61467d565b85049950602592505f61466b565b50929050611d499495506153b9565b5f8212156147995780841361478b575b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb284131561462657909250611d499394916152c4565b909250611d4993949161532b565b8084121561475557909250611d499394916152c4565b929091806147d5576044848460405191637a97930f60e01b835260048301526024820152fd5b90919280155f146147ea57505050505f905f90565b614803936147f791615473565b92919490938492615473565b909391928461481188615386565b9161481b86615386565b947f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000094604c918688106149c2575b030191600160ff1b98838a018112155f1461498f575050035b5f955f821280614986575b614968575b5f811280614956575b6149385786820103966001600160ff1b038814908161492e575b5080614925575b8061491c575b6148fe5750906148b2929161561f565b915f81136148c5575b50611d49936153b9565b9091604c82136148f3576148dc91600a0a90613e77565b9081156148e9575f6148bb565b505050505f905f90565b50505050505f905f90565b876044916040519163d556b11160e01b835260048301526024820152fd5b505f85126148a2565b5082841461489c565b905088145f614895565b604489836040519163d556b11160e01b835260048301526024820152fd5b50806001600160ff1b0301821361487b565b95508087018613156149805786818703015b95614872565b5f61497a565b505f811361486d565b89985090920390506001600160ff1b03819003870182136149b35701860194614862565b5050505050505050505f905f90565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009650604b9250614849565b8115613e81570590565b8082601b82810b8314614bed577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000008405614b99575b8380820b03614b8857507b199999999999999999999999999999999999999999999999999999987b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc84011115614b39575b838060030b03614abd575b808413614aa15750506001600160e01b036001925b60e01b91161791565b8303600a0a8015613e81576001600160e01b0391071592614a98565b92915f841315614b0d575090614ad383836156c1565b614aef57637ffffffe1901600a0a810290637fffffff92614a83565b506044916040519163d556b11160e01b835260048301526024820152fd5b637fffffff1992830390604382136148f357614b2c91600a0a906149ee565b9182156148e95792614a83565b5f198401808060030b14614b4d5750614a78565b90506001600160e01b039293507b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff915060e01b9260ff1d181617905f90565b600190940193600a90930592614a2b565b937f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000840515614bda576305f5e100600894058094819201955b915050614a2b565b620186a060059405809481920195614bd2565b5082614a7857505050505f90600190565b919291600160ff1b9190801580614d8b575090614c1a91615473565b9490929091905f868585858282138015614d82575b614d65575b505050508682841860ff1c94860391039081604c038111614d4a5701600a0a808205919084614d30575b505081019182821860ff1c1115614d2857826001600160ff1b0314614d0a57905f600192135f14614cdb57600a9004915b01925b81158117614c9f57509190565b80614cb8575b508015614cb0579190565b505f91508190565b9192614cce9203600160ff1b01600a0a906149ee565b600160ff1b91905f614ca5565b600a60037fe6666666666666666666666666666666666666666666666666666666666666679201040191614c8f565b604490836040519163d556b11160e01b835260048301526024820152fd5b509092614c92565b8107614d3d575b80614c5e565b60ff1d600117015f614d37565b505050919350614d58579190565b60018160ff1d1790039190565b5f9a50909750909550600160ff1b94509250905086808080614c34565b50835f12614c2f565b15614d965750509190565b9350919050565b9392919384158115818117614eee57505090614db891615473565b9194908295614dc982958294615473565b8096929491969387868482138015614ee5575b614ecc575b5050505050508682841860ff1c94860391039081604c038111614d4a5701600a0a808205919084614eb2575b505081019182821860ff1c1115614eaa57826001600160ff1b0314614d0a57905f600192135f14614e7b57600a9004915b01925b81158117614e4e57509190565b80614e5e57508015614cb0579190565b600160ff1b93614e759291038401600a0a906149ee565b5f614ca5565b600a60037fe6666666666666666666666666666666666666666666666666666666666666679201040191614e3e565b509092614e41565b8107614ebf575b80614e0d565b60ff1d600117015f614eb9565b929b5098509196509450925090505f8080808080614de1565b50858412614ddc565b9395939092919015614f04575050614cb0579190565b945092915050565b919082604091031261032157815160048110156103215760209092015160ff811681036103215790565b9060ff165f03916001600160ff1b0382115f14614f5c57600a6001818404940192061590565b909190600190565b9091813b614f9f57614f769192615743565b50614f8081614130565b159182614f8c57505090565b6001600160a01b03918216911614919050565b6020918160645f935160405192630b135d3f60e11b9788855260048501526040602485015286820190604485015e8281018201859052601f01601f191601915afa905f5114601f3d11161690565b92915f9060018184145f87128715171717615067575f92808213615059575b03604c81135f82121761504d57600a0a908461502b83820293846149ee565b146150405750501561503c575f9190565b5f90565b90935090156119f4579190565b50501561503c575f9190565b5f956001945092509061500c565b5050505f90565b93929190918083145f83125f871218831587151717176150bd575f928082136150b05703604c81135f82121761504d57600a0a908461502b83820293846149ee565b919460019350919061500c565b50919050565b909291600160ff1b91828101615155575080841461514b57808413918215615143578185035b604c8111156151325750505f915b1561512357507f8000000000000000000000000000000000000000000000000000000000000001019190565b92506001600160ff1b03039190565b600a0a908115613e815704916150f7565b8482036150e9565b505090505f905f90565b9361516292945f03614bfe565b80939180928114615176575b50505f039190565b915092506001600160ff1b038314614d0a57600a600191059201915f8061516e565b91925f8312156151c0576044838360405191634a7d166b60e01b835260048301526024820152fd5b9192836151d257505090505f90600190565b60ff811682019180831261529a575f83121561520a575050604c198112614cb0575f03600a0a916152038382613e77565b9283021490565b909293915f81135f1461529057604d811361526557600a0a928315613e8157835f1904831161523c5750500290600190565b60405163c849483b60e01b815260048101849052602481019290925260ff166044820152606490fd5b5060405163c849483b60e01b81526004810192909252602482015260ff919091166044820152606490fd5b5050905090600190565b60405163c849483b60e01b815260048101869052602481019190915260ff82166044820152606490fd5b909392915f6152d49181846145f4565b9490945f8483019182019412159081615321575b8115615317575b506152f957505090565b604492506040519163d556b11160e01b835260048301526024820152fd5b905083125f6152ef565b82811291506152e8565b61534093600160fe1b908101939201906145f4565b9081815f821215615377575050604b1982126137de57615365915f03600a0a906149ee565b908161536f575f90565b600160ff1b90565b93600160ff1b90910192509050565b5f8112156119f457600160ff1b9080820361539f575090565b90505f0390565b905f198183099102908180821091030391565b92939291905f818418121561544e576001600160ff1b03928383111561543857600160ff1b938385036153ee57505050509190565b90919293508514615408575050600a600191045f03920190565b604051630ed8062160e21b8152600481019190915260248101919091526044810182905260648101849052608490fd5b5090915050600160ff1b8114613edd575f039190565b90916001600160ff1b0380841115613c32578514615408575050600a60019104920190565b919091801561561557827f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000080830515615523575b507f19999999999999999999999999999999999999999999999999999999999999997f0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc830110615514575b83136154fe5791905f90565b919060018060ff1b926001600160ff1b03030190565b9290600a02905f1901926154f2565b6f4b3b4ca85a86c47a098a22400000000080840515615603575b507728c87cb5c89a2571ebfdcb54864ada834a000000000000008305156155ec575b7b097edd871cfda3a5697758bf0e3cbb5ac5741c6400000000000000008305156155d8575b7e3899162693736ac531a5a58f1fbb4b746504382ca7e40000000000000000008305156155c8578205156155b9575b5f6154a7565b9290600a02905f1901926155b3565b9391606402916001190193615584565b93916402540be40002916009190193615584565b9391678ac7230489e800000291601219019361555f565b6025198301955092909202915f61553d565b505f915081908190565b90915f19838309928083029283808610950394808603958487101561569d5714615695579082910960018219018216809204600280826003021880830282030280830282030280830282030280830282030280830282030280920290030293600183805f03040190848311900302920304170290565b505091500490565b60648386866040519263362ced0960e11b8452600484015260248301526044820152fd5b6119f491905f8112156156d5575f0361577d565b61577d565b73200e12d10bb0c5e4a17e7018f0f1161919bb9389803b158015615718575b6157005750565b602490604051906373e6d7b360e01b82526004820152fd5b507f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d41813f14156156f9565b81519190604183036157735761576c9250602082015190606060408401519301515f1a9061580c565b9192909190565b50505f9160029190565b90637ffffff581131561580657637ffffffe19810190604382136157ff575f8212156157d357637fffffff91505f0301600a0a7b8000000000000000000000000000000000000000000000000000000202111590565b50600a0a8015613e81577b80000000000000000000000000000000000000000000000000000001041090565b5050151590565b50505f90565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411615883579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa15610441575f516001600160a01b0381161561587957905f905f90565b505f906001905f90565b5050505f916003919056000000000000000000000000000000000000000000000000000000000000200e12d10bb0c5e4a17e7018f0f1161919bb93890000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000044b608060405234801561000f575f80fd5b506004361061004a575f3560e01c80630782d7e11461004e57806354636d2b14610078578063b7bad1b11461009d578063f5c36eaf146100b0575b5f80fd5b61006161005c366004610363565b6100c3565b60405161006f929190610403565b60405180910390f35b61008b610086366004610363565b6100d8565b60405160ff909116815260200161006f565b6100616100ab366004610363565b6100e9565b61008b6100be366004610363565b6100f5565b5f806100cf5f84610100565b91509150915091565b5f6100e35f836101f0565b92915050565b5f806100cf5f84610281565b5f6100e35f83610356565b73ffffffffffffffffffffffffffffffffffffffff81165f9081526020838152604080832081518083019092525460ff8082161515835261010090910416818301527f313ce56700000000000000000000000000000000000000000000000000000000808452839283908190816004818a5afa915060203d1015610182575f91505b811561019857505f5160ff811115610198575f91505b816101af57505050602001516003925090506101e9565b83516101c3575f955093506101e992505050565b836020015160ff1681146101d85760026101db565b60015b846020015195509550505050505b9250929050565b5f805f6101fd8585610281565b909250905060018260038111156102165761021661039d565b1415801561023557505f8260038111156102325761023261039d565b14155b156102795783826040517fee07877f000000000000000000000000000000000000000000000000000000008152600401610270929190610421565b60405180910390fd5b949350505050565b5f805f8061028f8686610100565b90925090505f8260038111156102a7576102a761039d565b0361034b576040805180820182526001815260ff838116602080840191825273ffffffffffffffffffffffffffffffffffffffff8a165f908152908b9052939093209151825493517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009094169015157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff161761010093909116929092029190911790555b909590945092505050565b5f805f6101fd8585610100565b5f60208284031215610373575f80fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114610396575f80fd5b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b600481106103ff577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b9052565b6040810161041182856103ca565b60ff831660208301529392505050565b73ffffffffffffffffffffffffffffffffffffffff831681526040810161039660208301846103ca560000000000000000000000000000000000000000000000000000000000000000006e2d0e71d900474b262e545bc4c98b71ab368d2100000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000003d486080604052600436106100d65760003560e01c80638456cb591161007f5780639a1f3406116100595780639a1f340614610200578063cd0fb7a714610220578063f2fde38b14610260578063fa461e331461028057600080fd5b80638456cb59146101ad5780638da5cb5b146101c257806393b3774c146101ed57600080fd5b80632c8958f6116100b05780632c8958f6146100f95780636b2ace871461013f578063715018a61461019857600080fd5b8063046f7da2146100e257806323a69e75146100f95780632646478b1461011957600080fd5b366100dd57005b600080fd5b3480156100ee57600080fd5b506100f76102a0565b005b34801561010557600080fd5b506100f7610114366004613579565b6103a8565b61012c6101273660046136f5565b6103ba565b6040519081526020015b60405180910390f35b34801561014b57600080fd5b506101737f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610136565b3480156101a457600080fd5b506100f7610564565b3480156101b957600080fd5b506100f7610578565b3480156101ce57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff16610173565b61012c6101fb36600461377c565b61067b565b34801561020c57600080fd5b506100f761021b36600461382f565b61089a565b34801561022c57600080fd5b5061025061023b366004613868565b60016020526000908152604090205460ff1681565b6040519015158152602001610136565b34801561026c57600080fd5b506100f761027b366004613868565b6108f8565b34801561028c57600080fd5b506100f761029b366004613579565b6109af565b60005473ffffffffffffffffffffffffffffffffffffffff163314806102d557503360009081526001602052604090205460ff165b610366576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f52503a2063616c6c6572206973206e6f7420746865206f776e6572206f72206160448201527f2070726976696c6567656420757365720000000000000000000000000000000060648201526084015b60405180910390fd5b600280547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff167501000000000000000000000000000000000000000000179055565b6103b4848484846109af565b50505050565b60025460009074010000000000000000000000000000000000000000900460ff16600114610444576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f526f75746550726f636573736f72206973206c6f636b65640000000000000000604482015260640161035d565b6002547501000000000000000000000000000000000000000000900460ff166001146104cc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f526f75746550726f636573736f72206973207061757365640000000000000000604482015260640161035d565b600280547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1674020000000000000000000000000000000000000000179055610519878787878787610b5d565b9050600280547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790559695505050505050565b61056c6111a3565b6105766000611224565b565b60005473ffffffffffffffffffffffffffffffffffffffff163314806105ad57503360009081526001602052604090205460ff165b610639576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f52503a2063616c6c6572206973206e6f7420746865206f776e6572206f72206160448201527f2070726976696c65676564207573657200000000000000000000000000000000606482015260840161035d565b600280547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff167502000000000000000000000000000000000000000000179055565b60025460009074010000000000000000000000000000000000000000900460ff16600114610705576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f526f75746550726f636573736f72206973206c6f636b65640000000000000000604482015260640161035d565b6002547501000000000000000000000000000000000000000000900460ff1660011461078d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f526f75746550726f636573736f72206973207061757365640000000000000000604482015260640161035d565b600280547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1674020000000000000000000000000000000000000000179055604051600090819073ffffffffffffffffffffffffffffffffffffffff8c16908b908381818185875af1925050503d8060008114610826576040519150601f19603f3d011682016040523d82523d6000602084013e61082b565b606091505b50915091508161083d57805181602001fd5b61084b898989898989610b5d565b92505050600280547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000017905598975050505050505050565b6108a26111a3565b73ffffffffffffffffffffffffffffffffffffffff91909116600090815260016020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b6109006111a3565b73ffffffffffffffffffffffffffffffffffffffff81166109a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161035d565b6109ac81611224565b50565b60025473ffffffffffffffffffffffffffffffffffffffff163314610a56576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f526f75746550726f636573736f722e756e697377617056335377617043616c6c60448201527f6261636b3a2063616c6c2066726f6d20756e6b6e6f776e20736f757263650000606482015260840161035d565b6000808513610a655783610a67565b845b905060008113610af9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f526f75746550726f636573736f722e756e697377617056335377617043616c6c60448201527f6261636b3a206e6f7420706f73697469766520616d6f756e7400000000000000606482015260840161035d565b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001660011790556000610b3283850185613868565b9050610b5573ffffffffffffffffffffffffffffffffffffffff82163384611299565b505050505050565b60008073ffffffffffffffffffffffffffffffffffffffff881673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14610c24576040517f70a0823100000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff8916906370a0823190602401602060405180830381865afa158015610bfb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c1f919061388c565b610c27565b60005b9050600073ffffffffffffffffffffffffffffffffffffffff871673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14610cf1576040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301528816906370a0823190602401602060405180830381865afa158015610cc8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cec919061388c565b610d0a565b8473ffffffffffffffffffffffffffffffffffffffff16315b905087600080610d2e87604080518082019091528181528151909101602082015290565b90505b805160208201511115610e84576000610d508280516001018051915290565b90508060ff1660011415610d7a576000610d6983611372565b905083610d74578094505b50610e73565b8060ff1660021415610d9557610d90828d611437565b610e73565b8060ff1660031415610dac576000610d6983611457565b8060ff1660041415610dc157610d908261147d565b8060ff1660051415610dd657610d90826114a3565b8060ff1660061415610dec57610d908d836115a8565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f526f75746550726f636573736f723a20556e6b6e6f776e20636f6d6d616e642060448201527f636f646500000000000000000000000000000000000000000000000000000000606482015260840161035d565b610e7c836138d4565b925050610d31565b506000905073ffffffffffffffffffffffffffffffffffffffff8b1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14610f4d576040517f70a0823100000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff8c16906370a0823190602401602060405180830381865afa158015610f24573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f48919061388c565b610f50565b60005b905083610f5d8b8361390d565b1015610feb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f526f75746550726f636573736f723a204d696e696d616c20696e70757420626160448201527f6c616e63652076696f6c6174696f6e0000000000000000000000000000000000606482015260840161035d565b600073ffffffffffffffffffffffffffffffffffffffff8a1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee146110b3576040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff89811660048301528b16906370a0823190602401602060405180830381865afa15801561108a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110ae919061388c565b6110cc565b8773ffffffffffffffffffffffffffffffffffffffff16315b90506110d8898561390d565b81101561111e576110e98482613925565b6040517f963b34a500000000000000000000000000000000000000000000000000000000815260040161035d91815260200190565b6111288482613925565b6040805173ffffffffffffffffffffffffffffffffffffffff8b81168252602082018790529181018c905260608101839052919750808c1691908e169033907f2db5ddd0b42bdbca0d69ea16f234a870a485854ae0d91f16643d6f317d8b89949060800160405180910390a450505050509695505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610576576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161035d565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905261136d9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915261163b565b505050565b6000806113858380516014018051915290565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290915073ffffffffffffffffffffffffffffffffffffffff8216906370a0823190602401602060405180830381865afa1580156113f2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611416919061388c565b91508115611425576001820391505b61143183308385611747565b50919050565b60006114498380516014018051915290565b905061136d83338385611747565b47611478823073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee84611747565b919050565b600061148f8280516014018051915290565b905061149f8260008360006117a2565b5050565b60006114b58280516014018051915290565b6040517ff7888aec00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff80831660048301523060248301529192506000917f0000000000000000000000000000000000000000000000000000000000000000169063f7888aec90604401602060405180830381865afa15801561154d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611571919061388c565b9050801561159c577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff015b61136d83308484611747565b60006115ba8280516020018051915290565b905060006115ce8380516020018051915290565b905060006115e28480516001018051915290565b905060006115f68580516020018051915290565b9050600061160a8680516020018051915290565b905061163273ffffffffffffffffffffffffffffffffffffffff8816333088888888886118d6565b50505050505050565b600061169d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16611b569092919063ffffffff16565b80519091501561136d57808060200190518101906116bb919061393c565b61136d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840161035d565b60006117598580516001018051915290565b905060005b8160ff16811015610b5557600061177b8780516002018051915290565b61ffff8082168602049485900394909150611798888888846117a2565b505060010161175e565b60006117b48580516001018051915290565b905060ff81166117cf576117ca85858585611b6d565b6118cf565b8060ff16600114156117e7576117ca85858585611f22565b8060ff16600214156117ff576117ca85858585612162565b8060ff1660031415611817576117ca85858585612410565b8060ff166004141561182f576117ca85858585612a98565b8060ff1660051415611847576117ca85858585612c26565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f526f75746550726f636573736f723a20556e6b6e6f776e20706f6f6c2074797060448201527f6500000000000000000000000000000000000000000000000000000000000000606482015260840161035d565b5050505050565b6040517f7ecebe0000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8881166004830152600091908a1690637ecebe0090602401602060405180830381865afa158015611946573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061196a919061388c565b6040517fd505accf00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a811660048301528981166024830152604482018990526064820188905260ff8716608483015260a4820186905260c48201859052919250908a169063d505accf9060e401600060405180830381600087803b158015611a0457600080fd5b505af1158015611a18573d6000803e3d6000fd5b50506040517f7ecebe0000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8b81166004830152600093508c169150637ecebe0090602401602060405180830381865afa158015611a8b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aaf919061388c565b9050611abc82600161390d565b8114611b4a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f5361666545524332303a207065726d697420646964206e6f742073756363656560448201527f6400000000000000000000000000000000000000000000000000000000000000606482015260840161035d565b50505050505050505050565b6060611b6584846000856131e1565b949350505050565b6000611b7f8580516014018051915290565b90506000611b938680516001018051915290565b90506000611ba78780516014018051915290565b90506000611bbb8880516003018051915290565b905073ffffffffffffffffffffffffffffffffffffffff8716301415611c0157611bfc73ffffffffffffffffffffffffffffffffffffffff87168587611299565b611c41565b73ffffffffffffffffffffffffffffffffffffffff8716331415611c4157611c4173ffffffffffffffffffffffffffffffffffffffff87163386886132fa565b6000808573ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015611c8f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cb39190613977565b506dffffffffffffffffffffffffffff1691506dffffffffffffffffffffffffffff169150600082118015611ce85750600081115b611d4e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f57726f6e6720706f6f6c20726573657276657300000000000000000000000000604482015260640161035d565b6000808660ff16600114611d63578284611d66565b83835b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8b8116600483015292945090925083918c16906370a0823190602401602060405180830381865afa158015611dda573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dfe919061388c565b611e089190613925565b98506000611e1986620f42406139c7565b611e289062ffffff168b6139eb565b9050600081611e3a85620f42406139eb565b611e44919061390d565b611e4e84846139eb565b611e589190613a28565b90506000808a60ff16600114611e7057826000611e74565b6000835b604080516000815260208101918290527f022c0d9f00000000000000000000000000000000000000000000000000000000909152919350915073ffffffffffffffffffffffffffffffffffffffff8d169063022c0d9f90611ede90859085908f9060248101613ad9565b600060405180830381600087803b158015611ef857600080fd5b505af1158015611f0c573d6000803e3d6000fd5b5050505050505050505050505050505050505050565b6000611f348580516014018051915290565b9050600080611f498780516001018051915290565b60ff161190506000611f618780516014018051915290565b905073ffffffffffffffffffffffffffffffffffffffff8616331415611fa357611fa373ffffffffffffffffffffffffffffffffffffffff86163330876132fa565b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff851690811790915563128acb088284878161201757612012600173fffd8963efd1fc6a506488495d951d5263988d26613b14565b612027565b6120276401000276a36001613b41565b6040805173ffffffffffffffffffffffffffffffffffffffff8d166020820152016040516020818303038152906040526040518663ffffffff1660e01b8152600401612077959493929190613b79565b60408051808303816000875af1158015612095573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120b99190613bc0565b505060025473ffffffffffffffffffffffffffffffffffffffff16600114611632576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f526f75746550726f636573736f722e73776170556e6956333a20756e6578706560448201527f6374656400000000000000000000000000000000000000000000000000000000606482015260840161035d565b60006121748580516001018051915290565b905060006121888680516014018051915290565b9050600180831614156122575760006121a78780516014018051915290565b905060028316612213578073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b1580156121f957600080fd5b505af115801561220d573d6000803e3d6000fd5b50505050505b73ffffffffffffffffffffffffffffffffffffffff821630146122515761225173ffffffffffffffffffffffffffffffffffffffff82168386611299565b50610b55565b600282166123205773ffffffffffffffffffffffffffffffffffffffff851633141561229f5761229f73ffffffffffffffffffffffffffffffffffffffff85163330866132fa565b6040517f2e1a7d4d0000000000000000000000000000000000000000000000000000000081526004810184905273ffffffffffffffffffffffffffffffffffffffff851690632e1a7d4d90602401600060405180830381600087803b15801561230757600080fd5b505af115801561231b573d6000803e3d6000fd5b505050505b60008173ffffffffffffffffffffffffffffffffffffffff168460405160006040518083038185875af1925050503d806000811461237a576040519150601f19603f3d011682016040523d82523d6000602084013e61237f565b606091505b5050905080611632576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f526f75746550726f636573736f722e777261704e61746976653a204e6174697660448201527f6520746f6b656e207472616e73666572206661696c6564000000000000000000606482015260840161035d565b60006124228580516001018051915290565b905060006124368680516014018051915290565b905060ff8216156128315773ffffffffffffffffffffffffffffffffffffffff85163014156124a5576124a073ffffffffffffffffffffffffffffffffffffffff85167f000000000000000000000000000000000000000000000000000000000000000085611299565b61275b565b73ffffffffffffffffffffffffffffffffffffffff8516331415612505576124a073ffffffffffffffffffffffffffffffffffffffff8516337f0000000000000000000000000000000000000000000000000000000000000000866132fa565b6040517f4ffe34db00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85811660048301527f00000000000000000000000000000000000000000000000000000000000000001690634ffe34db906024016040805180830381865afa158015612590573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125b49190613c04565b516040517fdf23b45b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301526fffffffffffffffffffffffffffffffff909216917f0000000000000000000000000000000000000000000000000000000000000000169063df23b45b90602401606060405180830381865afa158015612656573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061267a9190613c77565b60409081015190517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811660048301526fffffffffffffffffffffffffffffffff909216918716906370a0823190602401602060405180830381865afa158015612720573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612744919061388c565b61274e919061390d565b6127589190613925565b92505b6040517f02b9446c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85811660048301527f000000000000000000000000000000000000000000000000000000000000000081166024830181905290831660448301526064820185905260006084830152906302b9446c9060a40160408051808303816000875af1158015612806573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061282a9190613bc0565b5050610b55565b73ffffffffffffffffffffffffffffffffffffffff851615612908576040517ff18d03cc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85811660048301528681166024830152306044830152606482018590527f0000000000000000000000000000000000000000000000000000000000000000169063f18d03cc90608401600060405180830381600087803b1580156128eb57600080fd5b505af11580156128ff573d6000803e3d6000fd5b505050506129c1565b6040517ff7888aec00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85811660048301523060248301527f0000000000000000000000000000000000000000000000000000000000000000169063f7888aec90604401602060405180830381865afa15801561299a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129be919061388c565b92505b6040517f97da6d3000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152306024830152828116604483015260006064830152608482018590527f000000000000000000000000000000000000000000000000000000000000000016906397da6d309060a40160408051808303816000875af1158015612a6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a8e9190613bc0565b5050505050505050565b6000612aaa8580516014018051915290565b85516020808201805190920101875290915073ffffffffffffffffffffffffffffffffffffffff851615612b91576040517ff18d03cc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff858116600483015286811660248301528381166044830152606482018590527f0000000000000000000000000000000000000000000000000000000000000000169063f18d03cc90608401600060405180830381600087803b158015612b7857600080fd5b505af1158015612b8c573d6000803e3d6000fd5b505050505b6040517f627dd56a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83169063627dd56a90612be3908490600401613ce3565b6020604051808303816000875af1158015612c02573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611632919061388c565b6000612c388580516014018051915290565b90506000612c4c8680516001018051915290565b90506000612c608780516001018051915290565b60000b90506000612c778880516001018051915290565b60000b90506000612c8e8980516014018051915290565b90506000612ca28a80516014018051915290565b9050600073ffffffffffffffffffffffffffffffffffffffff891673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1415612d8b576040517f3df02124000000000000000000000000000000000000000000000000000000008152600f86810b600483015285900b6024820152604481018990526000606482015273ffffffffffffffffffffffffffffffffffffffff881690633df02124908a9060840160206040518083038185885af1158015612d5f573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612d84919061388c565b905061306e565b73ffffffffffffffffffffffffffffffffffffffff8a16331415612dcb57612dcb73ffffffffffffffffffffffffffffffffffffffff8a1633308b6132fa565b612dec73ffffffffffffffffffffffffffffffffffffffff8a16888a613358565b5060ff8616612e9f576040517f3df02124000000000000000000000000000000000000000000000000000000008152600f86810b600483015285900b6024820152604481018990526000606482015273ffffffffffffffffffffffffffffffffffffffff881690633df02124906084016020604051808303816000875af1158015612e7b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d84919061388c565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8416906370a0823190602401602060405180830381865afa158015612f0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f30919061388c565b6040517f3df02124000000000000000000000000000000000000000000000000000000008152600f88810b600483015287900b6024820152604481018b90526000606482015290915073ffffffffffffffffffffffffffffffffffffffff891690633df0212490608401600060405180830381600087803b158015612fb457600080fd5b505af1158015612fc8573d6000803e3d6000fd5b50506040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000925073ffffffffffffffffffffffffffffffffffffffff861691506370a0823190602401602060405180830381865afa158015613039573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061305d919061388c565b90506130698282613925565b925050505b73ffffffffffffffffffffffffffffffffffffffff831630146131d45773ffffffffffffffffffffffffffffffffffffffff821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14156131b35760008373ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114613117576040519150601f19603f3d011682016040523d82523d6000602084013e61311c565b606091505b50509050806131ad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f526f75746550726f636573736f722e7377617043757276653a204e617469766560448201527f20746f6b656e207472616e73666572206661696c656400000000000000000000606482015260840161035d565b506131d4565b6131d473ffffffffffffffffffffffffffffffffffffffff83168483611299565b5050505050505050505050565b606082471015613273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c0000000000000000000000000000000000000000000000000000606482015260840161035d565b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161329c9190613cf6565b60006040518083038185875af1925050503d80600081146132d9576040519150601f19603f3d011682016040523d82523d6000602084013e6132de565b606091505b50915091506132ef87838387613389565b979650505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526103b49085907f23b872dd00000000000000000000000000000000000000000000000000000000906084016112eb565b6000613365848484613426565b80611b65575061337784846000613426565b8015611b655750611b65848484613426565b6060831561341c5782516134155773ffffffffffffffffffffffffffffffffffffffff85163b613415576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161035d565b5081611b65565b611b658383613535565b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f095ea7b300000000000000000000000000000000000000000000000000000000179052915160009283928392918816916134bf9190613cf6565b6000604051808303816000865af19150503d80600081146134fc576040519150601f19603f3d011682016040523d82523d6000602084013e613501565b606091505b509150915081801561352b57508051158061352b57508080602001905181019061352b919061393c565b9695505050505050565b8151156135455781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161035d9190613ce3565b6000806000806060858703121561358f57600080fd5b8435935060208501359250604085013567ffffffffffffffff808211156135b557600080fd5b818701915087601f8301126135c957600080fd5b8135818111156135d857600080fd5b8860208285010111156135ea57600080fd5b95989497505060200194505050565b73ffffffffffffffffffffffffffffffffffffffff811681146109ac57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f83011261365b57600080fd5b813567ffffffffffffffff808211156136765761367661361b565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156136bc576136bc61361b565b816040528381528660208588010111156136d557600080fd5b836020870160208301376000602085830101528094505050505092915050565b60008060008060008060c0878903121561370e57600080fd5b8635613719816135f9565b9550602087013594506040870135613730816135f9565b9350606087013592506080870135613747816135f9565b915060a087013567ffffffffffffffff81111561376357600080fd5b61376f89828a0161364a565b9150509295509295509295565b600080600080600080600080610100898b03121561379957600080fd5b88356137a4816135f9565b97506020890135965060408901356137bb816135f9565b95506060890135945060808901356137d2816135f9565b935060a0890135925060c08901356137e9816135f9565b915060e089013567ffffffffffffffff81111561380557600080fd5b6138118b828c0161364a565b9150509295985092959890939650565b80151581146109ac57600080fd5b6000806040838503121561384257600080fd5b823561384d816135f9565b9150602083013561385d81613821565b809150509250929050565b60006020828403121561387a57600080fd5b8135613885816135f9565b9392505050565b60006020828403121561389e57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613906576139066138a5565b5060010190565b60008219821115613920576139206138a5565b500190565b600082821015613937576139376138a5565b500390565b60006020828403121561394e57600080fd5b815161388581613821565b80516dffffffffffffffffffffffffffff8116811461147857600080fd5b60008060006060848603121561398c57600080fd5b61399584613959565b92506139a360208501613959565b9150604084015163ffffffff811681146139bc57600080fd5b809150509250925092565b600062ffffff838116908316818110156139e3576139e36138a5565b039392505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613a2357613a236138a5565b500290565b600082613a5e577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60005b83811015613a7e578181015183820152602001613a66565b838111156103b45750506000910152565b60008151808452613aa7816020860160208601613a63565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b84815283602082015273ffffffffffffffffffffffffffffffffffffffff8316604082015260806060820152600061352b6080830184613a8f565b600073ffffffffffffffffffffffffffffffffffffffff838116908316818110156139e3576139e36138a5565b600073ffffffffffffffffffffffffffffffffffffffff808316818516808303821115613b7057613b706138a5565b01949350505050565b600073ffffffffffffffffffffffffffffffffffffffff8088168352861515602084015285604084015280851660608401525060a060808301526132ef60a0830184613a8f565b60008060408385031215613bd357600080fd5b505080516020909101519092909150565b80516fffffffffffffffffffffffffffffffff8116811461147857600080fd5b600060408284031215613c1657600080fd5b6040516040810181811067ffffffffffffffff82111715613c3957613c3961361b565b604052613c4583613be4565b8152613c5360208401613be4565b60208201529392505050565b805167ffffffffffffffff8116811461147857600080fd5b600060608284031215613c8957600080fd5b6040516060810181811067ffffffffffffffff82111715613cac57613cac61361b565b604052613cb883613c5f565b8152613cc660208401613c5f565b6020820152613cd760408401613be4565b60408201529392505050565b6020815260006138856020830184613a8f565b60008251613d08818460208701613a63565b919091019291505056fea26469706673582212201ff294929b57776d43429e47ba13e7bb550e4a27be6afbadf8c8a0d6ad6324b364736f6c634300080a0033000000000000000000000000000000000000000000000000"; + hex"0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000005c600000000000000000000000000000000000000000000000000000000000006120000000000000000000000000d2cd1d4ad3bf3ecb581e4653c9c02a67ca44305c00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000005b846080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a7146117d1575080632cb77e9f146117a557806341d1514f1461176e5780635343c1b7146116d35780635cffe9de146115775780635d003c44146113e3578063613255ab14611360578063687cf02a14611070578063ac9650d814610f22578063b0460f07146105cd578063b845b83e14610575578063ca9109ba14610400578063d9d98ce41461034f578063ddebc96f146102fb5763df6db3c2146100c1575f80fd5b346102d5576003196040368201126102d5576004359067ffffffffffffffff8083116102d5578260040160a0843603938401126102d5576024358281116102d557610110903690600401611c93565b90610119613236565b5f946001600160a01b03948561012e86612c8a565b1633036102d9576101476101423687611ac5565b613278565b91825f525f60205260405f2096600188541461018f575b60208960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556040519015158152f35b9091929394959697505f600198556040519133835284602084015260606040840152816101bb89611850565b16606084015260248a013590606219018112156102d55789019060a06080840152806101e960048401611850565b166101008401526101fc60248301611850565b166101208301526044810135602219823603018112156102d55701956024600488013597019287116102d55786360383136102d55760209860846102b884936102777f09d18501db0080ca2d6cd7c17fa7255daff4b2d503ea93b76ff68b6752ea8e63976102c89c6060610140890152610160880191612a3b565b6102a961029e61028a6044880185613021565b605f198a8603810160a08c01529491613056565b926064870190613021565b918784030160c0880152613056565b91013560e08301520390a16141c2565b5f8080808080808061015e565b5f80fd5b6024866102e587612c8a565b6040516335252be360e01b815291166004820152fd5b346102d5576003196020368201126102d5576004359067ffffffffffffffff82116102d55760809082360301126102d55761033a606091600401612cde565b90604051921515835260208301526040820152f35b346102d55760403660031901126102d5576001600160a01b03610370611824565b166040516370a0823160e01b8152306004820152602081602481855afa9081156103f5575f916103c3575b50156103ab5760206040515f8152f35b60249060405190633c5bf76960e21b82526004820152fd5b90506020813d6020116103ed575b816103de60209383611934565b810103126102d557518261039b565b3d91506103d1565b6040513d5f823e3d90fd5b346102d55761040e36611cc4565b8394939261041a613236565b610425848633613e0f565b61042e81613784565b15610543578061044261049192873361439d565b9590967f7f9dfa19cf1cc2f806f2f860fbc9c056b601fb1afc0e9b843dfe5c63616268e660806040513381526001600160a01b0384169a8b60208301528560408301526060820152a133613a6b565b959093826104c0575b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b610537966105319560ff936040519860068a5260208a01526040890152606088015260808701521660a08501523360c085015260e084019384604052610505856118fc565b600685526105166101008201612b8b565b61051f85611d71565b5261052984611d71565b503691612a5b565b90613f13565b8080808080808061049a565b6040516306dde9c360e41b81523360048201526001600160a01b038616602482015260448101859052606490fd5b0390fd5b346102d55760203660031901126102d55760043567ffffffffffffffff81116102d5576105316105ac61049a923690600401611c93565b91906105b6613236565b604051926105c384611918565b5f84523691612a5b565b346102d5576003196020368201126102d55767ffffffffffffffff600435116102d55760c090600435360301126102d557610606613236565b5f808061061b60048035608481019101612bc3565b905015610f1057602460043501359261063384613784565b15610efe57606080604051610647816118cc565b61064f612c18565b81525f60208201525f60408201520152610667612c18565b506106c76106c26106a161069761069161068b608460043501600435600401612bc3565b90612c4a565b80612c65565b6040810190612b55565b60206106ba61068b608460043501600435600401612bc3565b013591612c7a565b612c8a565b936001600160a01b036107166106c26106fd6106f361069161068b608460043501600435600401612bc3565b6060810190612b55565b60406106ba61068b608460043501600435600401612bc3565b816040519761072489611894565b1687521660208601526040850152610746608460043501600435600401612bc3565b9490506001604051955f87520160051b85016040525f905f5b610773608460043501600435600401612bc3565b9050811080610eeb575b15610d3857610796608460043501600435600401612bc3565b821015610d24578160051b810135607e19823603018112156102d55760808183013603126102d557604051916107cb836118cc565b8181013567ffffffffffffffff81116102d5576107ed90369084840101611ac5565b835280820160208181013590850152604080820135908501526060013567ffffffffffffffff81116102d5576108269236920101611c78565b606082015280516001600160a01b036108486040830151602085015190611d91565b5151166001600160a01b0385511614801590610cf0575b610cde5761087760208301516040840151908361429a565b61088081613278565b91825f525f60205260405f2054155f146108e4575051604080513381526001600160a01b039092166020830152810191909152600191907fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f390606090a15b0161075f565b919061091560208497959701516040850151906060860151906040519261090a84611918565b5f84523391866134e2565b5f949161097e57505051604080513381526001600160a01b03909216602083015281019190915260019291907f1e6fa9678edf81f9f25bbf308bde03ad3e110db1f429394b0915ba021532941490606090a15b8115610976575b50926108de565b90508861096f565b610993606082015160446004350135906137a7565b156109ed57505051604080513381526001600160a01b03909216602083015281019190915260019291907fe3151dc8cb7a54ffc4baabd28c1f241c94d510b5e5b502491ac3cad6c16316d59080606081015b0390a1610968565b6109fa6040820151613784565b158015610ccb575b15610a5857505051604080513381526001600160a01b03909216602083015281019190915260019291907f500b713857325f9e6dcb52ae832eca9109d107ed1aae9cb4928b4c1e13f051aa9080606081016109e5565b9250925050600196959691610a71606460043501612c9e565b15610c385796610ae197610af160408401516040880151610a9281836137f1565b15610c305750925b610aeb848592610ad4610ace60608a01516001600160e01b03601b918660e01d92828816810b928260e01d9216900b6148ea565b9061485f565b9d8e9260408d0151613818565b60408c0152614373565b99614373565b98610afc8484613842565b610b0684826138a0565b60405192338452608060208501526060610b2c8451608080880152610100870190611dec565b93602081015160a0870152604081015160c0870152015192607f198582030160e0860152835180825260208201906020808260051b8501019601925f5b828110610bc857505050505092806001979695937fbae4dbf76931c547f765e9def16d693d86daaa596f491de979008831789185ae93610bc396604084015260608301520390a180858c5101808d5260051b8c0152613b57565b610968565b9091929396602080610c23600193601f198782030189528b51906001600160a01b03825116815283820151848201526060610c126040840151608060408501526080840190612cab565b920151906060818403910152611d10565b9901950193929101610b69565b905092610a9a565b610ae190610af16060840151610aeb610c76610ace60408801516001600160e01b0394601b90868360e01d9316820b91878260e01d9216900b6148ea565b60408a0151610c8581836137f1565b15610cc35750915b829c8d916060890151908116155f14610cb4575060408801515b96879460408d0151613818565b610cbe90856142cf565b610ca7565b905091610c8d565b50610cd960608201516137ce565b610a02565b60405163936bb5ad60e01b8152600490fd5b506001600160a01b03610d0c6060830151604085015190611d91565b5151166001600160a01b03602086015116141561085f565b634e487b7160e01b5f52603260045260245ffd5b50919390610d4a606460043501612c9e565b15610ee557835b6004356004013590610d6382826137f1565b610ec75750508490610d83856001600160a01b0360208701511633613ea1565b505060a46004350190610d9b82600435600401612b22565b905015159081610ebf575b50610e1e575b506001600160a01b03610dc2929351163361439d565b50505b8351811015610dea5780610de4610dde60019387611d91565b516139cb565b01610dc5565b5060409160017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005582519182526020820152f35b90506001600160a01b03602084015116610e486001600160a01b0385511692600435600401612b22565b929091333b156102d557610e905f93604051958694859463691f9ed760e01b8652600486015260248501528960448501528a606485015260a0608485015260a4840191612a3b565b038183335af19081156103f557859115610dac579050610eb091506118e8565b5f836001600160a01b03610dac565b905088610da6565b604492506040519163573b6f4160e01b835260048301526024820152fd5b84610d51565b50610ef96040830151613784565b61077d565b60405163315f9e2360e21b8152600490fd5b604051639c95219f60e01b8152600490fd5b346102d5576020806003193601126102d55760043567ffffffffffffffff81116102d557610f54903690600401611c93565b919060405192610f6384611918565b5f8452828401610f7282611a18565b94610f806040519687611934565b828652610f8c83611a18565b93610f9e86880195601f190186612ba7565b5f5b84811061100257604080518881528951818a018190525f92600582901b83018101918a918c9085015b828710610fd65785850386f35b909192938280610ff2600193603f198a82030186528851611d10565b9601920196019592919092610fc9565b806110518861104b61101e60019560059d9c9d1b870187612b22565b929089846040519586938585013782018381015f81528b519283915e015f83820152038084520182611934565b30614209565b61105b828a611d91565b526110668189611d91565b5001969596610fa0565b346102d5576003196040368201126102d55760043567ffffffffffffffff8082116102d55760c0826004019383360301126102d5576024359081116102d5576110bd903690600401611c93565b6110c8929192613236565b6110f96110f46110ef6110e86110de8880612b0d565b6040810190612b22565b3691611956565b614144565b6141ad565b801561134e576001101561133c5760248201926111168486612b55565b90501561132a57604483019361112c8587612b55565b9050156113185761119261115a9561118661115161114a8a80612b0d565b948a612b55565b9890928a612b55565b9190926111776040519661116d88611864565b33885236906119ba565b9960209a8b8801523691611a30565b60408501523691611a30565b6060820152606484013560808201526111aa81613278565b90815f525f865260405f209485541595866111ee575b878760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055604051908152f35b6001905560a46001600160a01b03917f87491344dfbcf91f6cbbc610cbbeedc85313d37a02df0c93527f7ea5f8db717f83855116604051908152868b82015260606040820152806112426060820188611dec565b0390a10191611251838a612b22565b9050611274575b505050611267939495506141c2565b81908380808080806111c0565b6112816110e8848b612b22565b61128a816148c6565b156112f55750976112c87fd46c2c56b35c8210e9e712ec3f02242d5fc90187c0ac8ed80cc33626846ec369936112e893611267999a9b511692612b22565b92906040519384938452868c850152606060408501526060840191612a3b565b0390a18594938780611258565b88610571604051928392630c89984b60e31b845260048401526024830190611d10565b60405163540e5f0b60e01b8152600490fd5b604051636c44ef8f60e01b8152600490fd5b604051633c8270bd60e21b8152600490fd5b604051632cff108b60e21b8152600490fd5b346102d5576020806003193601126102d5576024816001600160a01b03611385611824565b16604051928380926370a0823160e01b82523060048301525afa9081156103f5575f916113b6575b50604051908152f35b90508181813d83116113dc575b6113cd8183611934565b810103126102d55751826113ad565b503d6113c3565b346102d5576113f136611cc4565b6113f9613236565b611404848633613e0f565b61140d83613784565b1561154a5761141d8486336130a6565b61142781856137f1565b15611544575082935b61143c85828833613e43565b9690947f8045c25080b0868951141ed0a91720bcad09a8364a2b3109ee1fd49c1f0bc8b860c061146d898533613ea1565b94906001600160a01b0360405192338452169a8b6020840152876040840152856060840152608083015260a0820152a1836114c85760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b611537976105319660ff946040519960078b5260208b015260408a01526060890152608088015260a08701521660c08501523360e085015261010084019384604052611513856118fc565b600685526115246101208201612b8b565b61152d85611d81565b5261052984611d81565b808080808080808061049a565b93611430565b604051623a3a4d60e21b81523360048201526001600160a01b038616602482015260448101859052606490fd5b346102d55760803660031901126102d5576004356001600160a01b03908181168091036102d5576115a661183a565b6044359167ffffffffffffffff916064358381116102d557366023820112156102d55780600401359384116102d55736602485830101116102d5576116339560209216936115f5868587613d30565b60405196879283926323e30c8b60e01b84523360048501528760248501528860448501525f606485015260a06084850152602460a485019201612a3b565b03815f855af19384156103f5575f9461169f575b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd984036116865761167b93503091613da9565b602060405160018152f35b604051630b6c58a960e31b815260048101859052602490fd5b9093506020813d6020116116cb575b816116bb60209383611934565b810103126102d557519284611647565b3d91506116ae565b346102d5576101403660031901126102d55767ffffffffffffffff6004358181116102d557611706903690600401611ac5565b6024358281116102d55761171e903690600401611ac5565b60c03660431901126102d557610104358381116102d557611743903690600401611c78565b90610124359384116102d55761176061049a943690600401611c78565b92611769613236565b611e9d565b346102d55760603660031901126102d557602061179d61178c611824565b61179461183a565b604435916130a6565b604051908152f35b346102d55760203660031901126102d5576004355f525f6020526020600160405f205414604051908152f35b346102d55760203660031901126102d5576004359063ffffffff60e01b82168092036102d55760209163e414309160e01b8114908115611813575b5015158152f35b6301ffc9a760e01b1490508361180c565b600435906001600160a01b03821682036102d557565b602435906001600160a01b03821682036102d557565b35906001600160a01b03821682036102d557565b60a0810190811067ffffffffffffffff82111761188057604052565b634e487b7160e01b5f52604160045260245ffd5b6060810190811067ffffffffffffffff82111761188057604052565b6040810190811067ffffffffffffffff82111761188057604052565b6080810190811067ffffffffffffffff82111761188057604052565b67ffffffffffffffff811161188057604052565b60e0810190811067ffffffffffffffff82111761188057604052565b6020810190811067ffffffffffffffff82111761188057604052565b90601f8019910116810190811067ffffffffffffffff82111761188057604052565b92919267ffffffffffffffff82116118805760405191611980601f8201601f191660200184611934565b8294818452818301116102d5578281602093845f960137010152565b9080601f830112156102d5578160206119b793359101611956565b90565b91906060838203126102d557604051906119d382611894565b81936119de81611850565b83526119ec60208201611850565b602084015260408101359167ffffffffffffffff83116102d557604092611a13920161199c565b910152565b67ffffffffffffffff81116118805760051b60200190565b929192611a3c82611a18565b604092611a4c6040519283611934565b819581835260208093019160061b8401938185116102d557915b848310611a7557505050505050565b85838303126102d5578386918251611a8c816118b0565b611a9586611850565b81528286013583820152815201920191611a66565b9080601f830112156102d5578160206119b793359101611a30565b91909160a0818403126102d55760405190611adf82611864565b8193611aea82611850565b835267ffffffffffffffff9160208101358381116102d55782611b0e9183016119ba565b602085015260408101358381116102d55782611b2b918301611aaa565b604085015260608101359283116102d557611b4c6080939284938301611aaa565b60608501520135910152565b90929192611b6581611a18565b91604094611b766040519485611934565b839583855260208095019160059460051b8401948186116102d55784935b868510611ba5575050505050505050565b67ffffffffffffffff9085358281116102d5578701906080828603126102d5578551611bd0816118cc565b611bd983611850565b81528a8301358b820152868301358481116102d557830186601f820112156102d557803590611c0782611a18565b91611c148a519384611934565b8083528d80840191891b830101918983116102d5578e809101915b838310611c685750505050878201526060808401359485116102d557611c59878d9687960161199c565b90820152815201940193611b94565b82358152918101918f9101611c2f565b9080601f830112156102d5578160206119b793359101611b58565b9181601f840112156102d55782359167ffffffffffffffff83116102d5576020808501948460051b0101116102d557565b9060806003198301126102d5576004356001600160a01b03811681036102d5579160243591604435916064359067ffffffffffffffff82116102d557611d0c91600401611c93565b9091565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b805115610d245760200190565b805160011015610d245760400190565b805160021015610d245760600190565b805160031015610d245760800190565b805160041015610d245760a00190565b805160051015610d245760c00190565b8051821015610d245760209160051b010190565b9081518082526020808093019301915f5b828110611dc4575050505090565b835180516001600160a01b031686528201518583015260409094019392810192600101611db6565b90608080611e62611e50611e3e60406001600160a01b0380895116885260208901519060a060208a01528082511660a08a015260208201511660c08901520151606060e0880152610100870190611d10565b60408701518682036040880152611da5565b60608601518582036060870152611da5565b93015191015290565b90611e7582611a18565b611e826040519182611934565b8281528092611e93601f1991611a18565b0190602036910137565b926001600160a01b038451166001600160a01b0383511614612a29576001600160a01b03611ed2606086015160643590611d91565b5151166001600160a01b03611eee604085015160843590611d91565b515116148015906129e9575b610cde576001600160a01b03611f17604086015160443590611d91565b5151166001600160a01b03611f326064356060880151611d91565b515116146129d757611f4384613278565b805f525f60205260405f2054156129875750611f5e82613278565b805f525f60205260405f20541561293757506122ce907f6fa7f4c28634b0a9d6831401c45ae468195fb63aed07308935c35374ff5d9e3960405180611fc1611fb361012033845280602085015283018a611dec565b828103604084015287611dec565b6044356060830152606435608083015260843560a083015260a43560c083015260c43560e083015260e4356101008301520390a161223a6001600160a01b03845116916040519261201184611918565b5f845261201c6132a9565b506040519061202a826118fc565b6006825261203a60208301612b8b565b61204389613278565b906001600160a01b038a511660405192600384526020840152604083015260608201526080810160405261207682611d34565b5261208081611d34565b5060405161208d81611894565b6002815260403660208301376120a282611d41565b526120ac81611d41565b506121806120d36001600160a01b036120cb60443560408d0151611d91565b515116614468565b6121196001600160a01b038b51168b60206121106001600160a01b036120ff6044356040860151611d91565b515116926040604435910151611d91565b510151916130a6565b908a60ff602061214b6001600160a01b0361213a6044356040870151611d91565b515116936040604435910151611d91565b51015192169093929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b61218982611d51565b5261219381611d51565b506122216121b26001600160a01b036120cb60643560608d0151611d91565b6121ef6001600160a01b038b51168b60206121106001600160a01b036121de6064356060860151611d91565b515116926060606435910151611d91565b908a60ff602061214b6001600160a01b036122106064356060870151611d91565b515116936060606435910151611d91565b61222a82611d61565b5261223481611d61565b50614546565b905f6001600160a01b038751169160208801516001600160a01b0360208183511692015116918484523060205260408420604060208c015101516040519161228183611918565b86835260405195612291876118fc565b86526020860152604085015284606085015286608085015260a084015260c0830152604051808097819463d04dfe2360e01b83526004830161342a565b03915afa92835f915f95612919575b506122ed576040513d5f823e3d90fd5b92918351600281106128d357506040602085015194015161231661231083611d71565b51611d61565b5161232181836137f1565b156129115750935b61234b8186919060405192600284526020840152604083015260608201604052565b61235483611d51565b5261235e82611d51565b506040519461236c866118fc565b888652606435602087015260408601526060850152608084015260a083015260c082015261256e6001600160a01b0385511693604051946123ac86611918565b5f86526123b76132a9565b50604051906123c5826118fc565b600682526123d560208301612b8b565b6123de86613278565b906001600160a01b0387511660405192600384526020840152604083015260608201526080810160405261241182611d34565b5261241b81611d34565b5060405161242881611894565b60028152604036602083013761243d82611d41565b5261244781611d41565b506124d16124666001600160a01b036120cb60843560408a0151611d91565b6124a16001600160a01b038851166001600160a01b0361248c60843560408c0151611d91565b515116602061211060843560408d0151611d91565b906001600160a01b036124ba60843560408b0151611d91565b51511660ff602061214b60843560408d0151611d91565b6124da82611d51565b526124e481611d51565b506122216125036001600160a01b036120cb60a43560608a0151611d91565b61253e6001600160a01b038851166001600160a01b0361252960a43560608c0151611d91565b515116602061211060a43560608d0151611d91565b906001600160a01b0361255760a43560608b0151611d91565b51511660ff602061214b60a43560608d0151611d91565b926126045f6001600160a01b038551169260208601908151906001600160a01b03602081845116930151169286855230602052604080862091510151604051916125b783611918565b868352604051956125c7876118fc565b86526020860152604085015284606085015289608085015260a084015260c0830152604051808095819463d04dfe2360e01b83526004830161342a565b03915afa90815f915f936128eb575b50612623576040513d5f823e3d90fd5b908151600281106128d357506040602083015192015161264561231088611d71565b5161265081836137f1565b156128cb5750925b61267a8385919060405192600284526020840152604083015260608201604052565b61268388611d51565b5261268d87611d51565b506040519661269b886118fc565b86885260a43560208901526040880194855260608801938452608088015260a087015260c08601526126d06040840151613784565b159182156128b7575b5081156128a2575b8115612891575b5061287f57604051916126fa836118cc565b5f83525f60208401525f60408401525f606084015261271984836147d7565b8452604084015261273f61272d83866147d7565b60208601528060608601528451613818565b946127536020850151604086015190613818565b9361275d876137ce565b8015612870575b61285e57612825612857957fd9fa84dd790c969daa5c33d8050dc06b4a9b59d5b42e2be5f5e8ae20447f618d9461280761285c9a60a0966127a68a8851613842565b6127b48c6020890151613842565b6127c28a60408901516138a0565b6127d08c60608901516138a0565b6127d98a6139cb565b6127e28c6139cb565b6001600160a01b036127fe60c435926060606435910151611d91565b51511633613a6b565b50506001600160a01b036127fe60e43592606060a435910151611d91565b5050606060405191338352805160208401526020810151604084015260408101518284015201516080820152a1613b57565b613b57565b565b604051630d86822160e01b8152600490fd5b5061287a856137ce565b612764565b6040516321badf1f60e01b8152600490fd5b61289c9150516137ce565b5f6126e8565b90506128b160608301516137ce565b906126e1565b6128c391925051613784565b15905f6126d9565b905092612658565b60249060405190630fbb8e5560e21b82526004820152fd5b90925061290a91503d805f833e6129028183611934565b8101906132e6565b915f612613565b905093612329565b90945061293091503d805f833e6129028183611934565b935f6122dd565b9151604080513381526001600160a01b039092166020830152810192909252507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f39250905080606081015b0390a1565b9351604080513381526001600160a01b039092166020830152810194909452507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f392915081905060608101612982565b604051631cd2f1c760e21b8152600490fd5b506001600160a01b03612a03606084015160a43590611d91565b5151166001600160a01b03612a1f604087015160443590611d91565b5151161415611efa565b604051630a98f1f360e21b8152600490fd5b908060209392818452848401375f828201840152601f01601f1916010190565b90929192612a6881611a18565b91604091612a796040519485611934565b839581855260208095019160051b8301938185116102d55783925b858410612aa45750505050505050565b67ffffffffffffffff9084358281116102d55786019083828603126102d5578351612ace816118b0565b82358481116102d55786612ae39185016119ba565b8152898301359384116102d557612afe868b95869501611c78565b83820152815201930192612a94565b903590605e19813603018212156102d5570190565b903590601e19813603018212156102d5570180359067ffffffffffffffff82116102d5576020019181360383136102d557565b903590601e19813603018212156102d5570180359067ffffffffffffffff82116102d557602001918160061b360383136102d557565b5f5b60c08110612b99575050565b606082820152602001612b8d565b5f5b828110612bb557505050565b606082820152602001612ba9565b903590601e19813603018212156102d5570180359067ffffffffffffffff82116102d557602001918160051b360383136102d557565b60405190612c0682611894565b60606040835f81525f60208201520152565b60405190612c2582611864565b5f608083828152612c34612bf9565b6020820152606060408201526060808201520152565b9015610d2457803590607e19813603018212156102d5570190565b903590609e19813603018212156102d5570190565b9190811015610d245760061b0190565b356001600160a01b03811681036102d55790565b3580151581036102d55790565b9081518082526020808093019301915f5b828110612cca575050505090565b835185529381019392810192600101612cbc565b90612cf6610142612cef8480612c65565b3690611ac5565b5f5260205f81526040926001845f2054036130165791612f1991612d7d85855f612e9e612d2683612d3d9a612c65565b612d42878501359182878701359c8d923690611ac5565b61429a565b612d5a612d4f8580612c65565b946060810190612bc3565b9690612d75875196612d6b88611918565b8688523690611ac5565b973691611b58565b90612d866132a9565b50612e67865191612d96836118fc565b60068352612da58a8401612b8b565b88612daf81613278565b988b6001600160a01b039a8b845116908351926003845283015282820152336060820152608081018252612de286611d34565b52612dec85611d34565b508051612df881611894565b6002815281368e830137612e0b86611d41565b52612e1585611d41565b50810160ff8c61214b612e508d80612e32816120cb8b8a51611d91565b97511690612e41898851611d91565b515116846121108a8951611d91565b958d612e5d828751611d91565b5151169451611d91565b612e7082611d51565b52612e7a81611d51565b506122218b886060810160ff8c61214b612e508d80612e32816120cb8b8a51611d91565b918385511693868601918b83519289818551169401511693878652308a52818087209151015190825192612ed184611918565b8784525195612edf876118fc565b86528a8601528d85015284606085015285608085015260a084015260c08301528a5180809a819463d04dfe2360e01b83526004830161342a565b03915afa95865f915f98612ff8575b50612f375788513d5f823e3d90fd5b9593865160028110612fe15750888798998260c09798990151990151612f5f61231085611d71565b51612f6a81836137f1565b15612fd75750998a925b612f968b85919060405192600284526020840152604083015260608201604052565b612f9f86611d51565b52612fa985611d51565b50825196612fb6886118fc565b8752860152840152866060840152608083015260a082015201526001929190565b9050998a92612f74565b6024908a5190630fbb8e5560e21b82526004820152fd5b90975061300f91503d805f833e6129028183611934565b965f612f28565b505f92508291829150565b9035601e19823603018112156102d557016020813591019167ffffffffffffffff82116102d5578160061b360383136102d557565b9190808252602080920192915f905b828210613073575050505090565b909192936001906001600160a01b0361308b87611850565b16815285830135838201526040908101950193920190613065565b82156130db576001600160a01b038091165f52600160205260405f2091165f5260205260405f20905f5260205260405f205490565b9091506130e782614468565b6001600160a01b03809316906040918251946370a0823160e01b86528416938460048701526020928387602481865afa9687156131fd575f97613207575b508361313e6131378361316e9a61522c565b5090614cee565b508651636eb1769f60e11b81526001600160a01b0390941660048501523060248501529297889081906044820190565b0381865afa9687156131fd575f976131cc575b50613137613192916119b79861522c565b5061319d81836137f1565b156131c45750935b5f5260018252825f20905f528152815f20905f8052525f205490614373565b9050936131a5565b96508387813d83116131f6575b6131e38183611934565b810103126102d557955195613137613181565b503d6131d9565b85513d5f823e3d90fd5b96508387813d831161322f575b61321e8183611934565b810103126102d55795519583613125565b503d613214565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0060028154146132665760029055565b604051633ee5aeb560e01b8152600490fd5b6040516132a3816132956020820194602086526040830190611dec565b03601f198101835282611934565b51902090565b604051906132b6826118fc565b606060c0836132c3612c18565b81525f60208201525f60408201525f838201528260808201525f60a08201520152565b91906040838203126102d557825167ffffffffffffffff908181116102d55784019082601f830112156102d557815160209261332182611a18565b9161332f6040519384611934565b808352848084019160051b830101918683116102d55785809101915b8383106133be575050505094828101519182116102d557019180601f840112156102d557825161337a81611a18565b936133886040519586611934565b818552838086019260051b8201019283116102d5578301905b8282106133af575050505090565b815181529083019083016133a1565b825181529181019186910161334b565b90808251908181526020809101926020808460051b8301019501935f915b8483106133fc5750505050505090565b909192939495848061341a600193601f198682030187528a51612cab565b98019301930191949392906133ec565b91906020928381526001600160a01b0382511684820152838201516040820152613464604083015160e06060840152610100830190611d10565b906060830151608082015261348b608084015192601f1993848483030160a08501526133ce565b9260a081015193838382030160c08401528680865192838152019501905f5b8181106134ce575050506119b794955060c060e09101519282850301910152612cab565b8251875295880195918801916001016134aa565b959491939086936134f16132a9565b505f92604061360c815192613505846118fc565b60068452602093613517858201612b8b565b6135d56135238b613278565b8b6001600160a01b03998a9283835116895191600383528b830152898201528360609b168b82015260808101895261355a86611d34565b5261356485611d34565b50875161357081611894565b6002815288368b83013761358386611d41565b5261358d85611d41565b5060ff8961214b8a8501936135c9876135ab816120cb858a51611d91565b975116886135ba848951611d91565b51511685612110858a51611d91565b96612e5d828751611d91565b6135de82611d51565b526135e881611d51565b50612221878b8d60ff8961214b8c8501936135c9876135ab816120cb858a51611d91565b9461368c5f868a511698869786889c0191825191888184511693015116928c8552308952878086209151015188519161364483611918565b868352895195613653876118fc565b86528a86015288850152848a8501528b608085015260a084015260c08301528551808095819463d04dfe2360e01b83526004830161342a565b03915afa90815f915f93613766575b50613759575050505f975b600285511098891599613746578284870151960151906136c861231089611d71565b51906136d482846137f1565b15905061373e5750925b6137008685919060405192600284526020840152604083015260608201604052565b61370988611d51565b5261371387611d51565b5082519b6137208d6118fc565b8c528b0152890152870152608086015260a085015260c08401529190565b9050926136de565b50505050505050505091506119b76132a9565b91999850945093966136a6565b90925061377d91503d805f833e6129028183611934565b915f61369b565b6137a3905f60e01d906001600160e01b038160e01d9116601b0b6152e3565b1290565b906137a3916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b615364565b6137ed905f60e01d906001600160e01b038160e01d9116601b0b6152e3565b1390565b906137ed916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b615364565b6119b791610ace916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b61483a565b61389c91608081018261385e6138588351611d71565b51611d71565b5261389561388f6001600160a01b038094515116936138866138808551611d71565b51611d34565b51169251611d71565b51611d51565b5191613e43565b5050565b906080810191806138b46138588551611d61565b526001600160a01b038092515116916138d06138808551611d61565b51166138df61388f8551611d61565b519081613993576138ef836137ce565b61397a579183917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a9593612982955f5260209060018252613945604094855f20835f528452855f20855f528452855f2054614373565b945f5260018252835f20905f528152825f20915f52525f20555b516040519182913383526040602084015260408301906133ce565b60405163793a8f5560e01b815260048101849052602490fd5b916139c4917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a959361298295613a6b565b505061395f565b608081016139dc61388f8251611d61565b519182156139e957505050565b613a036138806001600160a01b0380935151169351611d61565b5116815f5260209160018352604092835f20835f528152835f20855f528152835f2054936001600160e01b038516613a3e575b505050505050565b613a62955f9284845260018152828420868552815282842091845252812055613ea1565b5f808080613a36565b93929193613a78836137ce565b61397a5784613a9457613a8c939450613ea1565b50505f905f90565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f528152613ad1835f20549485614373565b95613adb876137ce565b613afe575f97885260018252838820908852815282872091875252909320829055565b835163c5e12af560e01b815260048101889052602490fd5b90604082019082526020606081936040838201528551809452019301915f5b828110613b43575050505090565b835185529381019392810192600101613b35565b60c0810151908151915f92613ccb575b50613c0c6020918281510151926001600160a01b039081818187511696015116928660a082019485518252308452604097888320898686510151015160808601518b5191613bb483611918565b8683528c5193613bc385611918565b8785528d5196613bd2886118fc565b8752898701528c86015260016060860152608085015260a084015260c08301528851808099819463d04dfe2360e01b83526004830161342a565b03915afa948515613cc1578795613ca3575b508451613c2f575b50505050505050565b81905101510151169051813b15613c9f57918491849383613c64965180978195829463012c676d60e21b845260048401613b16565b03925af1908115613c965750613c7f575b8080808080613c26565b613c8982916118e8565b613c935780613c75565b80fd5b513d84823e3d90fd5b8480fd5b613cb89195503d8089833e6129028183611934565b9050935f613c1e565b86513d89823e3d90fd5b6001600160a01b03602080845101510151169060a083015190823b156102d557613d0e925f928360405180968195829463012c676d60e21b845260048401613b16565b03925af180156103f55715613b6757613d289192506118e8565b5f905f613b67565b6040519263a9059cbb60e01b5f526001600160a01b0380931660045260245260205f60448180855af160015f5114811615613d8a575b8360405215613d7457505050565b635274afe760e01b835216600482015260249150fd5b6001811516613da057813b15153d151616613d66565b833d5f823e3d90fd5b9092604051936323b872dd60e01b5f526001600160a01b0393848092166004521660245260445260205f60648180855af160015f5114811615613df9575b836040525f60605215613d7457505050565b6001811516613da057813b15153d151616613de7565b909115613e1a575050565b6040516305dbdfd960e41b81526001600160a01b03918216600482015291166024820152604490fd5b93929193613e50836137ce565b61397a5784613e6457613a8c93945061439d565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f528152613ad1835f20549485613818565b90929192613eae81614869565b93613eb8816137ce565b613f015784816001600160e01b03613ed79360e01d9116601b0b61548e565b50809281613ee7575b5050509190565b6001600160a01b03613ef99316613d30565b5f8181613ee0565b604051632d1671a360e11b8152600490fd5b919091604092835192613f25846118fc565b60068452602094613f37868601612b8b565b5f5b8451811015613f6c5780613f4f60019287611d91565b51613f5a8289611d91565b52613f658188611d91565b5001613f39565b50925092939093335f52308252825f2091835195613f89876118b0565b613f91612bf9565b875260608281980152845190613fa682611918565b5f8252855190613fb582611918565b5f82525f3681375f5b815181101561411a57898688613fd48486611d91565b51888151948d80870151908151613ff6575b5050505050505050600101613fbe565b905f92916001600160a01b039661401b8887818d51169c015116998789015190614546565b958251996140288b6118fc565b8a5289015287015285015260808401528760a08401528660c08401525f8c51809563d04dfe2360e01b8252818061406360049889830161342a565b03915afa938415614110579089915f956140f2575b50845161408e575b50899250808e8c938e613fe6565b5101511691823b156102d5576140bc925f92838d5180968195829463012c676d60e21b845233908401613b16565b03925af180156140e85790600192916140d9575b81928782614080565b6140e2906118e8565b5f6140d0565b89513d5f823e3d90fd5b6141079195503d805f833e6129028183611934565b9050935f614078565b8c513d5f823e3d90fd5b50505050505050509050565b8115614130570490565b634e487b7160e01b5f52601260045260245ffd5b60408151106141a0576020810151908051603f19810190811161418c5760051c82116141785760016020920160051b010190565b505060405161418681611918565b5f815290565b634e487b7160e01b5f52601160045260245ffd5b5060405161418681611918565b8051156141bd57602001515f1a90565b505f90565b61285c92916141ed610531923390919060405192600284526020840152604083015260608201604052565b9260405193600185526020850152604084016040523691612a5b565b905f8091602081519101845af48080614287575b1561423d5750506040513d81523d5f602083013e60203d82010160405290565b1561426457604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b3d15614275576040513d5f823e3d90fd5b60405163d6bda27560e01b8152600490fd5b503d15158061421d5750813b151561421d565b916142c59060606142ba936001600160a01b039485916040880151611d91565b515116940151611d91565b515116146129d757565b6142f66001600160e01b0392838316601b0b9260e01d938160e01d9116601b0b8484614aa5565b90637ffffff58213614346575b9061430d91614cee565b929092158061433e575b61432057505090565b6044925060405191638eba4d0760e01b835260048301526024820152fd5b508215614317565b61435082826159b7565b1561430357604483856040519163d556b11160e01b835260048301526024820152fd5b6119b791610ace916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b615093565b9291926143a982614869565b936143b3816137ce565b6144145784816001600160e01b036143d29360e01d9116601b0b61548e565b92908093156143ff575b508290816143eb575050509190565b613ef9926001600160a01b03309216613da9565b9092505f19811461418c57600101915f6143dc565b604051632eaefac360e21b8152600490fd5b6004111561443057565b634e487b7160e01b5f52602160045260245ffd5b602090939291936001600160a01b03604082019516815261446483614426565b0152565b6144706159d0565b60408051630782d7e160e01b81526001600160a01b03831660048201529091828260248173200e12d10bb0c5e4a17e7018f0f1161919bb93895afa92831561453d575f925f94614508575b506144c583614426565b6001831415806144f6575b6144da5750505090565b5163ee07877f60e01b8152918291610571919060048401614444565b5061450083614426565b8215156144d0565b9080945061452c9293503d8511614536575b6145248183611934565b810190615202565b919091925f6144bb565b503d61451a565b513d5f823e3d90fd5b6145508251611e6b565b61455a8351611e6b565b9282519281518015155f146147cf57600201935b6001940184019061457e82611a18565b956145996040936145918551998a611934565b808952611a18565b6145ab602091601f1901828a01612ba7565b5f9584519389896002926002885233868901523089890152606097606081018a526145d584611d34565b526145df83611d34565b505f825b61478f575b5050505086516145ff575b50505050505050505090565b909192936002886146228c8661461b8e809c9d9e018093611d91565b528d611d91565b50018561462f828d611d91565b5261463a818c611d91565b505f965b614649575b506145f3565b885187101561478a576001600160a01b036146f5898b856146ec8c60428c886146728488611d91565b515116968582614682868a611d91565b51015192614690868a611d91565b51838d82511691015182815160051b910120908451927f6ec4dff745ec96dbde88c5d41f8aa5ac13aa1664afb47b8406b44fa945a650c88452830152838201522090519161190160f01b83528d83015260228201522093611d91565b5101519161525a565b1561477257876147618b8e8c8f9e9d9c9b9a999897968f61474e918d614744898f8f61473083889f614727828f611d91565b51511692611d91565b5261473b828b611d91565b51015192611d91565b52019c8d94611d91565b51015161475b8383611d91565b52611d91565b50019697989590919293949561463e565b8851630a57f30960e31b815260048101899052602490fd5b614643565b9091929a82518210156147c757906147bb84809301809d6147b08487611d91565b5161475b8383611d91565b50019082918d936145e3565b9a92916145e8565b505f9361456e565b9160408301926040614811610ace606087519401938451906001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6148ea565b945193016148208151866137a7565b614828575050565b9093506119b7919250519251836142cf565b919291600160ff1b840161485257611d0c93506153b9565b90611d0c935f0391615093565b61430d8282614cee565b6148716159d0565b6040805163b7bad1b160e01b81526001600160a01b0383166004820152909182826024815f73200e12d10bb0c5e4a17e7018f0f1161919bb93895af192831561453d575f925f9461450857506144c583614426565b60088151106141bd576008015167ffffffffffffffff1667ff0a89c674ee78741490565b9091939284158215175f146149045750505090505f905f90565b82810192600160fd1b8082019083011760fe1c614a3b575b50506149278161567c565b936149318161567c565b9461493c868261569c565b90918215614a2c575f9083986f0785ee10d5da46d900f436a000000000808611614a1e575b50670de0b6b3a7640000808b11614a0f575b50633b9aca00808b11614a00575b50612710808b116149f2575b5098805b6149e157508190611d0c989982600a0a9109960195817fcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccd0a93838211900382610100031b9203901c1702916156af565b60019290920191600a900480614991565b60049a04998a93019261498d565b600991939a049901915f614981565b601291939a049901915f614973565b85049950602592505f614961565b50929050611d0c9495506156af565b5f821215614a8f57808413614a81575b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb284131561491c57909250611d0c9394916155ba565b909250611d0c939491615621565b80841215614a4b57909250611d0c9394916155ba565b92909180614acb576044848460405191637a97930f60e01b835260048301526024820152fd5b90919280155f14614ae057505050505f905f90565b614af993614aed91615769565b92919490938492615769565b9093919284614b078861567c565b91614b118661567c565b947f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000094604c91868810614cb8575b030191600160ff1b98838a018112155f14614c85575050035b5f955f821280614c7c575b614c5e575b5f811280614c4c575b614c2e5786820103966001600160ff1b0388149081614c24575b5080614c1b575b80614c12575b614bf4575090614ba89291615915565b915f8113614bbb575b50611d0c936156af565b9091604c8213614be957614bd291600a0a90614126565b908115614bdf575f614bb1565b505050505f905f90565b50505050505f905f90565b876044916040519163d556b11160e01b835260048301526024820152fd5b505f8512614b98565b50828414614b92565b905088145f614b8b565b604489836040519163d556b11160e01b835260048301526024820152fd5b50806001600160ff1b03018213614b71565b9550808701861315614c765786818703015b95614b68565b5f614c70565b505f8113614b63565b89985090920390506001600160ff1b0381900387018213614ca95701860194614b58565b5050505050505050505f905f90565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009650604b9250614b3f565b8115614130570590565b8082601b82810b8314614ee3577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000008405614e8f575b8380820b03614e7e57507b199999999999999999999999999999999999999999999999999999987b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc84011115614e2f575b838060030b03614db3575b808413614d975750506001600160e01b036001925b60e01b91161791565b8303600a0a8015614130576001600160e01b0391071592614d8e565b92915f841315614e03575090614dc983836159b7565b614de557637ffffffe1901600a0a810290637fffffff92614d79565b506044916040519163d556b11160e01b835260048301526024820152fd5b637fffffff199283039060438213614be957614e2291600a0a90614ce4565b918215614bdf5792614d79565b5f198401808060030b14614e435750614d6e565b90506001600160e01b039293507b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff915060e01b9260ff1d181617905f90565b600190940193600a90930592614d21565b937f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000840515614ed0576305f5e100600894058094819201955b915050614d21565b620186a060059405809481920195614ec8565b5082614d6e57505050505f90600190565b919291600160ff1b9190801580615081575090614f1091615769565b9490929091905f868585858282138015615078575b61505b575b505050508682841860ff1c94860391039081604c0381116150405701600a0a808205919084615026575b505081019182821860ff1c111561501e57826001600160ff1b031461500057905f600192135f14614fd157600a9004915b01925b81158117614f9557509190565b80614fae575b508015614fa6579190565b505f91508190565b9192614fc49203600160ff1b01600a0a90614ce4565b600160ff1b91905f614f9b565b600a60037fe6666666666666666666666666666666666666666666666666666666666666679201040191614f85565b604490836040519163d556b11160e01b835260048301526024820152fd5b509092614f88565b8107615033575b80614f54565b60ff1d600117015f61502d565b50505091935061504e579190565b60018160ff1d1790039190565b5f9a50909750909550600160ff1b94509250905086808080614f2a565b50835f12614f25565b1561508c5750509190565b9350919050565b93929193841581158181176151e4575050906150ae91615769565b91949082956150bf82958294615769565b80969294919693878684821380156151db575b6151c2575b5050505050508682841860ff1c94860391039081604c0381116150405701600a0a8082059190846151a8575b505081019182821860ff1c11156151a057826001600160ff1b031461500057905f600192135f1461517157600a9004915b01925b8115811761514457509190565b8061515457508015614fa6579190565b600160ff1b9361516b9291038401600a0a90614ce4565b5f614f9b565b600a60037fe6666666666666666666666666666666666666666666666666666666666666679201040191615134565b509092615137565b81076151b5575b80615103565b60ff1d600117015f6151af565b929b5098509196509450925090505f80808080806150d7565b508584126150d2565b93959390929190156151fa575050614fa6579190565b945092915050565b91908260409103126102d557815160048110156102d55760209092015160ff811681036102d55790565b9060ff165f03916001600160ff1b0382115f1461525257600a6001818404940192061590565b909190600190565b9091813b6152955761526c9192615a39565b5061527681614426565b15918261528257505090565b6001600160a01b03918216911614919050565b6020918160645f935160405192630b135d3f60e11b9788855260048501526040602485015286820190604485015e8281018201859052601f01601f191601915afa905f5114601f3d11161690565b92915f9060018184145f8712871517171761535d575f9280821361534f575b03604c81135f82121761534357600a0a90846153218382029384614ce4565b1461533657505015615332575f9190565b5f90565b90935090156119b7579190565b505015615332575f9190565b5f9560019450925090615302565b5050505f90565b93929190918083145f83125f871218831587151717176153b3575f928082136153a65703604c81135f82121761534357600a0a90846153218382029384614ce4565b9194600193509190615302565b50919050565b909291600160ff1b9182810161544b575080841461544157808413918215615439578185035b604c8111156154285750505f915b1561541957507f8000000000000000000000000000000000000000000000000000000000000001019190565b92506001600160ff1b03039190565b600a0a9081156141305704916153ed565b8482036153df565b505090505f905f90565b9361545892945f03614ef4565b8093918092811461546c575b50505f039190565b915092506001600160ff1b03831461500057600a600191059201915f80615464565b91925f8312156154b6576044838360405191634a7d166b60e01b835260048301526024820152fd5b9192836154c857505090505f90600190565b60ff8116820191808312615590575f831215615500575050604c198112614fa6575f03600a0a916154f98382614126565b9283021490565b909293915f81135f1461558657604d811361555b57600a0a92831561413057835f190483116155325750500290600190565b60405163c849483b60e01b815260048101849052602481019290925260ff166044820152606490fd5b5060405163c849483b60e01b81526004810192909252602482015260ff919091166044820152606490fd5b5050905090600190565b60405163c849483b60e01b815260048101869052602481019190915260ff82166044820152606490fd5b909392915f6155ca9181846148ea565b9490945f8483019182019412159081615617575b811561560d575b506155ef57505090565b604492506040519163d556b11160e01b835260048301526024820152fd5b905083125f6155e5565b82811291506155de565b61563693600160fe1b908101939201906148ea565b9081815f82121561566d575050604b198212613a8c5761565b915f03600a0a90614ce4565b9081615665575f90565b600160ff1b90565b93600160ff1b90910192509050565b5f8112156119b757600160ff1b90808203615695575090565b90505f0390565b905f198183099102908180821091030391565b92939291905f8184181215615744576001600160ff1b03928383111561572e57600160ff1b938385036156e457505050509190565b909192935085146156fe575050600a600191045f03920190565b604051630ed8062160e21b8152600481019190915260248101919091526044810182905260648101849052608490fd5b5090915050600160ff1b811461418c575f039190565b90916001600160ff1b0380841115613ee05785146156fe575050600a60019104920190565b919091801561590b57827f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000080830515615819575b507f19999999999999999999999999999999999999999999999999999999999999997f0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc83011061580a575b83136157f45791905f90565b919060018060ff1b926001600160ff1b03030190565b9290600a02905f1901926157e8565b6f4b3b4ca85a86c47a098a224000000000808405156158f9575b507728c87cb5c89a2571ebfdcb54864ada834a000000000000008305156158e2575b7b097edd871cfda3a5697758bf0e3cbb5ac5741c6400000000000000008305156158ce575b7e3899162693736ac531a5a58f1fbb4b746504382ca7e40000000000000000008305156158be578205156158af575b5f61579d565b9290600a02905f1901926158a9565b939160640291600119019361587a565b93916402540be4000291600919019361587a565b9391678ac7230489e8000002916012190193615855565b6025198301955092909202915f615833565b505f915081908190565b90915f198383099280830292838086109503948086039584871015615993571461598b579082910960018219018216809204600280826003021880830282030280830282030280830282030280830282030280830282030280920290030293600183805f03040190848311900302920304170290565b505091500490565b60648386866040519263362ced0960e11b8452600484015260248301526044820152fd5b6119b791905f8112156159cb575f03615a73565b615a73565b73200e12d10bb0c5e4a17e7018f0f1161919bb9389803b158015615a0e575b6159f65750565b602490604051906373e6d7b360e01b82526004820152fd5b507f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d41813f14156159ef565b8151919060418303615a6957615a629250602082015190606060408401519301515f1a90615b02565b9192909190565b50505f9160029190565b90637ffffff5811315615afc57637ffffffe1981019060438213615af5575f821215615ac957637fffffff91505f0301600a0a7b8000000000000000000000000000000000000000000000000000000202111590565b50600a0a8015614130577b80000000000000000000000000000000000000000000000000000001041090565b5050151590565b50505f90565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411615b79579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa156103f5575f516001600160a01b03811615615b6f57905f905f90565b505f906001905f90565b5050505f91600391905600000000000000000000000000000000000000000000000000000000000000000000000000000000200e12d10bb0c5e4a17e7018f0f1161919bb93890000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000044b608060405234801561000f575f80fd5b506004361061004a575f3560e01c80630782d7e11461004e57806354636d2b14610078578063b7bad1b11461009d578063f5c36eaf146100b0575b5f80fd5b61006161005c366004610363565b6100c3565b60405161006f929190610403565b60405180910390f35b61008b610086366004610363565b6100d8565b60405160ff909116815260200161006f565b6100616100ab366004610363565b6100e9565b61008b6100be366004610363565b6100f5565b5f806100cf5f84610100565b91509150915091565b5f6100e35f836101f0565b92915050565b5f806100cf5f84610281565b5f6100e35f83610356565b73ffffffffffffffffffffffffffffffffffffffff81165f9081526020838152604080832081518083019092525460ff8082161515835261010090910416818301527f313ce56700000000000000000000000000000000000000000000000000000000808452839283908190816004818a5afa915060203d1015610182575f91505b811561019857505f5160ff811115610198575f91505b816101af57505050602001516003925090506101e9565b83516101c3575f955093506101e992505050565b836020015160ff1681146101d85760026101db565b60015b846020015195509550505050505b9250929050565b5f805f6101fd8585610281565b909250905060018260038111156102165761021661039d565b1415801561023557505f8260038111156102325761023261039d565b14155b156102795783826040517fee07877f000000000000000000000000000000000000000000000000000000008152600401610270929190610421565b60405180910390fd5b949350505050565b5f805f8061028f8686610100565b90925090505f8260038111156102a7576102a761039d565b0361034b576040805180820182526001815260ff838116602080840191825273ffffffffffffffffffffffffffffffffffffffff8a165f908152908b9052939093209151825493517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009094169015157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff161761010093909116929092029190911790555b909590945092505050565b5f805f6101fd8585610100565b5f60208284031215610373575f80fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114610396575f80fd5b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b600481106103ff577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b9052565b6040810161041182856103ca565b60ff831660208301529392505050565b73ffffffffffffffffffffffffffffffffffffffff831681526040810161039660208301846103ca560000000000000000000000000000000000000000000000000000000000000000006e2d0e71d900474b262e545bc4c98b71ab368d2100000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000003d486080604052600436106100d65760003560e01c80638456cb591161007f5780639a1f3406116100595780639a1f340614610200578063cd0fb7a714610220578063f2fde38b14610260578063fa461e331461028057600080fd5b80638456cb59146101ad5780638da5cb5b146101c257806393b3774c146101ed57600080fd5b80632c8958f6116100b05780632c8958f6146100f95780636b2ace871461013f578063715018a61461019857600080fd5b8063046f7da2146100e257806323a69e75146100f95780632646478b1461011957600080fd5b366100dd57005b600080fd5b3480156100ee57600080fd5b506100f76102a0565b005b34801561010557600080fd5b506100f7610114366004613579565b6103a8565b61012c6101273660046136f5565b6103ba565b6040519081526020015b60405180910390f35b34801561014b57600080fd5b506101737f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610136565b3480156101a457600080fd5b506100f7610564565b3480156101b957600080fd5b506100f7610578565b3480156101ce57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff16610173565b61012c6101fb36600461377c565b61067b565b34801561020c57600080fd5b506100f761021b36600461382f565b61089a565b34801561022c57600080fd5b5061025061023b366004613868565b60016020526000908152604090205460ff1681565b6040519015158152602001610136565b34801561026c57600080fd5b506100f761027b366004613868565b6108f8565b34801561028c57600080fd5b506100f761029b366004613579565b6109af565b60005473ffffffffffffffffffffffffffffffffffffffff163314806102d557503360009081526001602052604090205460ff165b610366576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f52503a2063616c6c6572206973206e6f7420746865206f776e6572206f72206160448201527f2070726976696c6567656420757365720000000000000000000000000000000060648201526084015b60405180910390fd5b600280547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff167501000000000000000000000000000000000000000000179055565b6103b4848484846109af565b50505050565b60025460009074010000000000000000000000000000000000000000900460ff16600114610444576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f526f75746550726f636573736f72206973206c6f636b65640000000000000000604482015260640161035d565b6002547501000000000000000000000000000000000000000000900460ff166001146104cc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f526f75746550726f636573736f72206973207061757365640000000000000000604482015260640161035d565b600280547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1674020000000000000000000000000000000000000000179055610519878787878787610b5d565b9050600280547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790559695505050505050565b61056c6111a3565b6105766000611224565b565b60005473ffffffffffffffffffffffffffffffffffffffff163314806105ad57503360009081526001602052604090205460ff165b610639576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f52503a2063616c6c6572206973206e6f7420746865206f776e6572206f72206160448201527f2070726976696c65676564207573657200000000000000000000000000000000606482015260840161035d565b600280547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff167502000000000000000000000000000000000000000000179055565b60025460009074010000000000000000000000000000000000000000900460ff16600114610705576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f526f75746550726f636573736f72206973206c6f636b65640000000000000000604482015260640161035d565b6002547501000000000000000000000000000000000000000000900460ff1660011461078d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f526f75746550726f636573736f72206973207061757365640000000000000000604482015260640161035d565b600280547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1674020000000000000000000000000000000000000000179055604051600090819073ffffffffffffffffffffffffffffffffffffffff8c16908b908381818185875af1925050503d8060008114610826576040519150601f19603f3d011682016040523d82523d6000602084013e61082b565b606091505b50915091508161083d57805181602001fd5b61084b898989898989610b5d565b92505050600280547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000017905598975050505050505050565b6108a26111a3565b73ffffffffffffffffffffffffffffffffffffffff91909116600090815260016020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b6109006111a3565b73ffffffffffffffffffffffffffffffffffffffff81166109a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161035d565b6109ac81611224565b50565b60025473ffffffffffffffffffffffffffffffffffffffff163314610a56576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f526f75746550726f636573736f722e756e697377617056335377617043616c6c60448201527f6261636b3a2063616c6c2066726f6d20756e6b6e6f776e20736f757263650000606482015260840161035d565b6000808513610a655783610a67565b845b905060008113610af9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f526f75746550726f636573736f722e756e697377617056335377617043616c6c60448201527f6261636b3a206e6f7420706f73697469766520616d6f756e7400000000000000606482015260840161035d565b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001660011790556000610b3283850185613868565b9050610b5573ffffffffffffffffffffffffffffffffffffffff82163384611299565b505050505050565b60008073ffffffffffffffffffffffffffffffffffffffff881673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14610c24576040517f70a0823100000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff8916906370a0823190602401602060405180830381865afa158015610bfb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c1f919061388c565b610c27565b60005b9050600073ffffffffffffffffffffffffffffffffffffffff871673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14610cf1576040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301528816906370a0823190602401602060405180830381865afa158015610cc8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cec919061388c565b610d0a565b8473ffffffffffffffffffffffffffffffffffffffff16315b905087600080610d2e87604080518082019091528181528151909101602082015290565b90505b805160208201511115610e84576000610d508280516001018051915290565b90508060ff1660011415610d7a576000610d6983611372565b905083610d74578094505b50610e73565b8060ff1660021415610d9557610d90828d611437565b610e73565b8060ff1660031415610dac576000610d6983611457565b8060ff1660041415610dc157610d908261147d565b8060ff1660051415610dd657610d90826114a3565b8060ff1660061415610dec57610d908d836115a8565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f526f75746550726f636573736f723a20556e6b6e6f776e20636f6d6d616e642060448201527f636f646500000000000000000000000000000000000000000000000000000000606482015260840161035d565b610e7c836138d4565b925050610d31565b506000905073ffffffffffffffffffffffffffffffffffffffff8b1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14610f4d576040517f70a0823100000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff8c16906370a0823190602401602060405180830381865afa158015610f24573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f48919061388c565b610f50565b60005b905083610f5d8b8361390d565b1015610feb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f526f75746550726f636573736f723a204d696e696d616c20696e70757420626160448201527f6c616e63652076696f6c6174696f6e0000000000000000000000000000000000606482015260840161035d565b600073ffffffffffffffffffffffffffffffffffffffff8a1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee146110b3576040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff89811660048301528b16906370a0823190602401602060405180830381865afa15801561108a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110ae919061388c565b6110cc565b8773ffffffffffffffffffffffffffffffffffffffff16315b90506110d8898561390d565b81101561111e576110e98482613925565b6040517f963b34a500000000000000000000000000000000000000000000000000000000815260040161035d91815260200190565b6111288482613925565b6040805173ffffffffffffffffffffffffffffffffffffffff8b81168252602082018790529181018c905260608101839052919750808c1691908e169033907f2db5ddd0b42bdbca0d69ea16f234a870a485854ae0d91f16643d6f317d8b89949060800160405180910390a450505050509695505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610576576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161035d565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905261136d9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915261163b565b505050565b6000806113858380516014018051915290565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290915073ffffffffffffffffffffffffffffffffffffffff8216906370a0823190602401602060405180830381865afa1580156113f2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611416919061388c565b91508115611425576001820391505b61143183308385611747565b50919050565b60006114498380516014018051915290565b905061136d83338385611747565b47611478823073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee84611747565b919050565b600061148f8280516014018051915290565b905061149f8260008360006117a2565b5050565b60006114b58280516014018051915290565b6040517ff7888aec00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff80831660048301523060248301529192506000917f0000000000000000000000000000000000000000000000000000000000000000169063f7888aec90604401602060405180830381865afa15801561154d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611571919061388c565b9050801561159c577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff015b61136d83308484611747565b60006115ba8280516020018051915290565b905060006115ce8380516020018051915290565b905060006115e28480516001018051915290565b905060006115f68580516020018051915290565b9050600061160a8680516020018051915290565b905061163273ffffffffffffffffffffffffffffffffffffffff8816333088888888886118d6565b50505050505050565b600061169d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16611b569092919063ffffffff16565b80519091501561136d57808060200190518101906116bb919061393c565b61136d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840161035d565b60006117598580516001018051915290565b905060005b8160ff16811015610b5557600061177b8780516002018051915290565b61ffff8082168602049485900394909150611798888888846117a2565b505060010161175e565b60006117b48580516001018051915290565b905060ff81166117cf576117ca85858585611b6d565b6118cf565b8060ff16600114156117e7576117ca85858585611f22565b8060ff16600214156117ff576117ca85858585612162565b8060ff1660031415611817576117ca85858585612410565b8060ff166004141561182f576117ca85858585612a98565b8060ff1660051415611847576117ca85858585612c26565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f526f75746550726f636573736f723a20556e6b6e6f776e20706f6f6c2074797060448201527f6500000000000000000000000000000000000000000000000000000000000000606482015260840161035d565b5050505050565b6040517f7ecebe0000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8881166004830152600091908a1690637ecebe0090602401602060405180830381865afa158015611946573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061196a919061388c565b6040517fd505accf00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a811660048301528981166024830152604482018990526064820188905260ff8716608483015260a4820186905260c48201859052919250908a169063d505accf9060e401600060405180830381600087803b158015611a0457600080fd5b505af1158015611a18573d6000803e3d6000fd5b50506040517f7ecebe0000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8b81166004830152600093508c169150637ecebe0090602401602060405180830381865afa158015611a8b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aaf919061388c565b9050611abc82600161390d565b8114611b4a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f5361666545524332303a207065726d697420646964206e6f742073756363656560448201527f6400000000000000000000000000000000000000000000000000000000000000606482015260840161035d565b50505050505050505050565b6060611b6584846000856131e1565b949350505050565b6000611b7f8580516014018051915290565b90506000611b938680516001018051915290565b90506000611ba78780516014018051915290565b90506000611bbb8880516003018051915290565b905073ffffffffffffffffffffffffffffffffffffffff8716301415611c0157611bfc73ffffffffffffffffffffffffffffffffffffffff87168587611299565b611c41565b73ffffffffffffffffffffffffffffffffffffffff8716331415611c4157611c4173ffffffffffffffffffffffffffffffffffffffff87163386886132fa565b6000808573ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015611c8f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cb39190613977565b506dffffffffffffffffffffffffffff1691506dffffffffffffffffffffffffffff169150600082118015611ce85750600081115b611d4e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f57726f6e6720706f6f6c20726573657276657300000000000000000000000000604482015260640161035d565b6000808660ff16600114611d63578284611d66565b83835b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8b8116600483015292945090925083918c16906370a0823190602401602060405180830381865afa158015611dda573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dfe919061388c565b611e089190613925565b98506000611e1986620f42406139c7565b611e289062ffffff168b6139eb565b9050600081611e3a85620f42406139eb565b611e44919061390d565b611e4e84846139eb565b611e589190613a28565b90506000808a60ff16600114611e7057826000611e74565b6000835b604080516000815260208101918290527f022c0d9f00000000000000000000000000000000000000000000000000000000909152919350915073ffffffffffffffffffffffffffffffffffffffff8d169063022c0d9f90611ede90859085908f9060248101613ad9565b600060405180830381600087803b158015611ef857600080fd5b505af1158015611f0c573d6000803e3d6000fd5b5050505050505050505050505050505050505050565b6000611f348580516014018051915290565b9050600080611f498780516001018051915290565b60ff161190506000611f618780516014018051915290565b905073ffffffffffffffffffffffffffffffffffffffff8616331415611fa357611fa373ffffffffffffffffffffffffffffffffffffffff86163330876132fa565b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff851690811790915563128acb088284878161201757612012600173fffd8963efd1fc6a506488495d951d5263988d26613b14565b612027565b6120276401000276a36001613b41565b6040805173ffffffffffffffffffffffffffffffffffffffff8d166020820152016040516020818303038152906040526040518663ffffffff1660e01b8152600401612077959493929190613b79565b60408051808303816000875af1158015612095573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120b99190613bc0565b505060025473ffffffffffffffffffffffffffffffffffffffff16600114611632576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f526f75746550726f636573736f722e73776170556e6956333a20756e6578706560448201527f6374656400000000000000000000000000000000000000000000000000000000606482015260840161035d565b60006121748580516001018051915290565b905060006121888680516014018051915290565b9050600180831614156122575760006121a78780516014018051915290565b905060028316612213578073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b1580156121f957600080fd5b505af115801561220d573d6000803e3d6000fd5b50505050505b73ffffffffffffffffffffffffffffffffffffffff821630146122515761225173ffffffffffffffffffffffffffffffffffffffff82168386611299565b50610b55565b600282166123205773ffffffffffffffffffffffffffffffffffffffff851633141561229f5761229f73ffffffffffffffffffffffffffffffffffffffff85163330866132fa565b6040517f2e1a7d4d0000000000000000000000000000000000000000000000000000000081526004810184905273ffffffffffffffffffffffffffffffffffffffff851690632e1a7d4d90602401600060405180830381600087803b15801561230757600080fd5b505af115801561231b573d6000803e3d6000fd5b505050505b60008173ffffffffffffffffffffffffffffffffffffffff168460405160006040518083038185875af1925050503d806000811461237a576040519150601f19603f3d011682016040523d82523d6000602084013e61237f565b606091505b5050905080611632576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f526f75746550726f636573736f722e777261704e61746976653a204e6174697660448201527f6520746f6b656e207472616e73666572206661696c6564000000000000000000606482015260840161035d565b60006124228580516001018051915290565b905060006124368680516014018051915290565b905060ff8216156128315773ffffffffffffffffffffffffffffffffffffffff85163014156124a5576124a073ffffffffffffffffffffffffffffffffffffffff85167f000000000000000000000000000000000000000000000000000000000000000085611299565b61275b565b73ffffffffffffffffffffffffffffffffffffffff8516331415612505576124a073ffffffffffffffffffffffffffffffffffffffff8516337f0000000000000000000000000000000000000000000000000000000000000000866132fa565b6040517f4ffe34db00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85811660048301527f00000000000000000000000000000000000000000000000000000000000000001690634ffe34db906024016040805180830381865afa158015612590573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125b49190613c04565b516040517fdf23b45b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301526fffffffffffffffffffffffffffffffff909216917f0000000000000000000000000000000000000000000000000000000000000000169063df23b45b90602401606060405180830381865afa158015612656573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061267a9190613c77565b60409081015190517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811660048301526fffffffffffffffffffffffffffffffff909216918716906370a0823190602401602060405180830381865afa158015612720573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612744919061388c565b61274e919061390d565b6127589190613925565b92505b6040517f02b9446c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85811660048301527f000000000000000000000000000000000000000000000000000000000000000081166024830181905290831660448301526064820185905260006084830152906302b9446c9060a40160408051808303816000875af1158015612806573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061282a9190613bc0565b5050610b55565b73ffffffffffffffffffffffffffffffffffffffff851615612908576040517ff18d03cc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85811660048301528681166024830152306044830152606482018590527f0000000000000000000000000000000000000000000000000000000000000000169063f18d03cc90608401600060405180830381600087803b1580156128eb57600080fd5b505af11580156128ff573d6000803e3d6000fd5b505050506129c1565b6040517ff7888aec00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85811660048301523060248301527f0000000000000000000000000000000000000000000000000000000000000000169063f7888aec90604401602060405180830381865afa15801561299a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129be919061388c565b92505b6040517f97da6d3000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152306024830152828116604483015260006064830152608482018590527f000000000000000000000000000000000000000000000000000000000000000016906397da6d309060a40160408051808303816000875af1158015612a6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a8e9190613bc0565b5050505050505050565b6000612aaa8580516014018051915290565b85516020808201805190920101875290915073ffffffffffffffffffffffffffffffffffffffff851615612b91576040517ff18d03cc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff858116600483015286811660248301528381166044830152606482018590527f0000000000000000000000000000000000000000000000000000000000000000169063f18d03cc90608401600060405180830381600087803b158015612b7857600080fd5b505af1158015612b8c573d6000803e3d6000fd5b505050505b6040517f627dd56a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83169063627dd56a90612be3908490600401613ce3565b6020604051808303816000875af1158015612c02573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611632919061388c565b6000612c388580516014018051915290565b90506000612c4c8680516001018051915290565b90506000612c608780516001018051915290565b60000b90506000612c778880516001018051915290565b60000b90506000612c8e8980516014018051915290565b90506000612ca28a80516014018051915290565b9050600073ffffffffffffffffffffffffffffffffffffffff891673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1415612d8b576040517f3df02124000000000000000000000000000000000000000000000000000000008152600f86810b600483015285900b6024820152604481018990526000606482015273ffffffffffffffffffffffffffffffffffffffff881690633df02124908a9060840160206040518083038185885af1158015612d5f573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612d84919061388c565b905061306e565b73ffffffffffffffffffffffffffffffffffffffff8a16331415612dcb57612dcb73ffffffffffffffffffffffffffffffffffffffff8a1633308b6132fa565b612dec73ffffffffffffffffffffffffffffffffffffffff8a16888a613358565b5060ff8616612e9f576040517f3df02124000000000000000000000000000000000000000000000000000000008152600f86810b600483015285900b6024820152604481018990526000606482015273ffffffffffffffffffffffffffffffffffffffff881690633df02124906084016020604051808303816000875af1158015612e7b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d84919061388c565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8416906370a0823190602401602060405180830381865afa158015612f0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f30919061388c565b6040517f3df02124000000000000000000000000000000000000000000000000000000008152600f88810b600483015287900b6024820152604481018b90526000606482015290915073ffffffffffffffffffffffffffffffffffffffff891690633df0212490608401600060405180830381600087803b158015612fb457600080fd5b505af1158015612fc8573d6000803e3d6000fd5b50506040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000925073ffffffffffffffffffffffffffffffffffffffff861691506370a0823190602401602060405180830381865afa158015613039573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061305d919061388c565b90506130698282613925565b925050505b73ffffffffffffffffffffffffffffffffffffffff831630146131d45773ffffffffffffffffffffffffffffffffffffffff821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14156131b35760008373ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114613117576040519150601f19603f3d011682016040523d82523d6000602084013e61311c565b606091505b50509050806131ad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f526f75746550726f636573736f722e7377617043757276653a204e617469766560448201527f20746f6b656e207472616e73666572206661696c656400000000000000000000606482015260840161035d565b506131d4565b6131d473ffffffffffffffffffffffffffffffffffffffff83168483611299565b5050505050505050505050565b606082471015613273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c0000000000000000000000000000000000000000000000000000606482015260840161035d565b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161329c9190613cf6565b60006040518083038185875af1925050503d80600081146132d9576040519150601f19603f3d011682016040523d82523d6000602084013e6132de565b606091505b50915091506132ef87838387613389565b979650505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526103b49085907f23b872dd00000000000000000000000000000000000000000000000000000000906084016112eb565b6000613365848484613426565b80611b65575061337784846000613426565b8015611b655750611b65848484613426565b6060831561341c5782516134155773ffffffffffffffffffffffffffffffffffffffff85163b613415576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161035d565b5081611b65565b611b658383613535565b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f095ea7b300000000000000000000000000000000000000000000000000000000179052915160009283928392918816916134bf9190613cf6565b6000604051808303816000865af19150503d80600081146134fc576040519150601f19603f3d011682016040523d82523d6000602084013e613501565b606091505b509150915081801561352b57508051158061352b57508080602001905181019061352b919061393c565b9695505050505050565b8151156135455781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161035d9190613ce3565b6000806000806060858703121561358f57600080fd5b8435935060208501359250604085013567ffffffffffffffff808211156135b557600080fd5b818701915087601f8301126135c957600080fd5b8135818111156135d857600080fd5b8860208285010111156135ea57600080fd5b95989497505060200194505050565b73ffffffffffffffffffffffffffffffffffffffff811681146109ac57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f83011261365b57600080fd5b813567ffffffffffffffff808211156136765761367661361b565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156136bc576136bc61361b565b816040528381528660208588010111156136d557600080fd5b836020870160208301376000602085830101528094505050505092915050565b60008060008060008060c0878903121561370e57600080fd5b8635613719816135f9565b9550602087013594506040870135613730816135f9565b9350606087013592506080870135613747816135f9565b915060a087013567ffffffffffffffff81111561376357600080fd5b61376f89828a0161364a565b9150509295509295509295565b600080600080600080600080610100898b03121561379957600080fd5b88356137a4816135f9565b97506020890135965060408901356137bb816135f9565b95506060890135945060808901356137d2816135f9565b935060a0890135925060c08901356137e9816135f9565b915060e089013567ffffffffffffffff81111561380557600080fd5b6138118b828c0161364a565b9150509295985092959890939650565b80151581146109ac57600080fd5b6000806040838503121561384257600080fd5b823561384d816135f9565b9150602083013561385d81613821565b809150509250929050565b60006020828403121561387a57600080fd5b8135613885816135f9565b9392505050565b60006020828403121561389e57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613906576139066138a5565b5060010190565b60008219821115613920576139206138a5565b500190565b600082821015613937576139376138a5565b500390565b60006020828403121561394e57600080fd5b815161388581613821565b80516dffffffffffffffffffffffffffff8116811461147857600080fd5b60008060006060848603121561398c57600080fd5b61399584613959565b92506139a360208501613959565b9150604084015163ffffffff811681146139bc57600080fd5b809150509250925092565b600062ffffff838116908316818110156139e3576139e36138a5565b039392505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613a2357613a236138a5565b500290565b600082613a5e577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60005b83811015613a7e578181015183820152602001613a66565b838111156103b45750506000910152565b60008151808452613aa7816020860160208601613a63565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b84815283602082015273ffffffffffffffffffffffffffffffffffffffff8316604082015260806060820152600061352b6080830184613a8f565b600073ffffffffffffffffffffffffffffffffffffffff838116908316818110156139e3576139e36138a5565b600073ffffffffffffffffffffffffffffffffffffffff808316818516808303821115613b7057613b706138a5565b01949350505050565b600073ffffffffffffffffffffffffffffffffffffffff8088168352861515602084015285604084015280851660608401525060a060808301526132ef60a0830184613a8f565b60008060408385031215613bd357600080fd5b505080516020909101519092909150565b80516fffffffffffffffffffffffffffffffff8116811461147857600080fd5b600060408284031215613c1657600080fd5b6040516040810181811067ffffffffffffffff82111715613c3957613c3961361b565b604052613c4583613be4565b8152613c5360208401613be4565b60208201529392505050565b805167ffffffffffffffff8116811461147857600080fd5b600060608284031215613c8957600080fd5b6040516060810181811067ffffffffffffffff82111715613cac57613cac61361b565b604052613cb883613c5f565b8152613cc660208401613c5f565b6020820152613cd760408401613be4565b60408201529392505050565b6020815260006138856020830184613a8f565b60008251613d08818460208701613a63565b919091019291505056fea26469706673582212201ff294929b57776d43429e47ba13e7bb550e4a27be6afbadf8c8a0d6ad6324b364736f6c634300080a0033000000000000000000000000000000000000000000000000"; From 4391e0363ac91c02e4ef675198a39891f1932e57 Mon Sep 17 00:00:00 2001 From: David Meister Date: Mon, 26 Oct 2026 22:49:49 +0000 Subject: [PATCH 15/15] Rename JS takeOrders calldata export to getTakeOrders5Calldata; fix rainlang version comment Co-Authored-By: Claude Opus 5.5 --- crates/js_api/ARCHITECTURE.md | 2 +- crates/js_api/src/bindings/mod.rs | 10 +++++----- foundry.toml | 2 +- packages/raindex/ARCHITECTURE.md | 2 +- packages/raindex/README.md | 4 ++-- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/crates/js_api/ARCHITECTURE.md b/crates/js_api/ARCHITECTURE.md index 164e9aa79d..a91fb9547c 100644 --- a/crates/js_api/ARCHITECTURE.md +++ b/crates/js_api/ARCHITECTURE.md @@ -58,7 +58,7 @@ - `TakeOrdersCalldata(Bytes)` as an opaque JS type for encoded calldata. - `getOrderHash(order: OrderV4) -> string`: ABI-encodes `OrderV4` and returns `keccak256` with `0x` prefix. - - `getTakeOrders4Calldata(config: TakeOrdersConfigV6) -> TakeOrdersCalldata`: + - `getTakeOrders5Calldata(config: TakeOrdersConfigV6) -> TakeOrdersCalldata`: ABI-encodes a `takeOrders5` call for the on-chain Raindex. - `keccak256(bytes: Uint8Array) -> string` and `keccak256HexString(hex: string) -> string`. diff --git a/crates/js_api/src/bindings/mod.rs b/crates/js_api/src/bindings/mod.rs index 8d7a22a061..38cc334a30 100644 --- a/crates/js_api/src/bindings/mod.rs +++ b/crates/js_api/src/bindings/mod.rs @@ -43,12 +43,12 @@ pub fn get_order_hash( Ok(encode_prefixed(main_keccak256(order.abi_encode()))) } -/// Generates ABI-encoded calldata for the `takeOrders3()` function on the Raindex smart contract. +/// Generates ABI-encoded calldata for the `takeOrders5()` function on the Raindex smart contract. /// /// ## Examples /// /// ```javascript -/// const result = await getTakeOrders3Calldata(config); +/// const result = await getTakeOrders5Calldata(config); /// if (result.error) { /// console.error("Calldata generation failed:", result.error.readableMsg); /// } @@ -56,11 +56,11 @@ pub fn get_order_hash( /// // Do something with the calldata /// ``` #[wasm_export( - js_name = "getTakeOrders3Calldata", + js_name = "getTakeOrders5Calldata", unchecked_return_type = "TakeOrdersCalldata", return_description = "Encoded calldata ready for blockchain submission" )] -pub fn get_take_orders4_calldata( +pub fn get_take_orders5_calldata( #[wasm_export( param_description = "Complete configuration for order execution including minimumIO, maximumIO, maximumIORatio, orders array, IOIsInput, and additional data" )] @@ -170,7 +170,7 @@ mod tests { #[wasm_bindgen_test] fn test_take_orders_calldata() { let take_orders_config = TakeOrdersConfigV6::default(); - let result = get_take_orders4_calldata(take_orders_config.clone()).unwrap(); + let result = get_take_orders5_calldata(take_orders_config.clone()).unwrap(); let expected = takeOrders5Call { config: take_orders_config, } diff --git a/foundry.toml b/foundry.toml index 85b5c8143f..7bca54f965 100644 --- a/foundry.toml +++ b/foundry.toml @@ -82,7 +82,7 @@ rainlang = "0.2.26" # rainlanguage/rainlang.interface; its Soldeer registry name moved from # `rain-interpreter-interface` (0.1.x) to `rainlang-interface` (0.2.x). rainlang-interface = "0.2.14" -# `rainlang` 0.2.19 imports `rainlang-interface-0.2.13/`; flat resolution keeps +# `rainlang` 0.2.26 imports `rainlang-interface-0.2.13/`; flat resolution keeps # that version alongside until `rainlang` republishes against 0.2.14. rainlang-interface-rainlang = { version = "0.2.13", url = "https://soldeer-revisions.s3.amazonaws.com/rainlang-interface/0_2_13_11-10-2026_17:54:59_rainlang.zip" } # rainlanguage/rain.raindex.interface was renamed to diff --git a/packages/raindex/ARCHITECTURE.md b/packages/raindex/ARCHITECTURE.md index 4a45023958..d76b5bafff 100644 --- a/packages/raindex/ARCHITECTURE.md +++ b/packages/raindex/ARCHITECTURE.md @@ -108,7 +108,7 @@ The package re-exports the WASM-bound API from the Rust crates. Representative items: - Functions - - `parseYaml`, `getOrderHash`, `getTakeOrders3Calldata`, `keccak256`, + - `parseYaml`, `getOrderHash`, `getTakeOrders5Calldata`, `keccak256`, `keccak256HexString`. - High-level classes (selected) - `RaindexClient` — raindex queries (orders, trades, vaults, quotes, diff --git a/packages/raindex/README.md b/packages/raindex/README.md index 20581d00fa..75b16ba047 100644 --- a/packages/raindex/README.md +++ b/packages/raindex/README.md @@ -441,12 +441,12 @@ take-orders calldata, asks an order for its removal calldata, and fetches quotes—mirroring the usual "inspect -> prepare transaction -> submit" flow. ```ts -import { getOrderHash, getTakeOrders3Calldata } from "@rainlanguage/raindex"; +import { getOrderHash, getTakeOrders5Calldata } from "@rainlanguage/raindex"; const orderHashResult = getOrderHash(orderV4Struct); if (orderHashResult.error) throw new Error(orderHashResult.error.readableMsg); -const takeOrdersResult = getTakeOrders3Calldata(takeOrdersConfig); +const takeOrdersResult = getTakeOrders5Calldata(takeOrdersConfig); if (takeOrdersResult.error) throw new Error(takeOrdersResult.error.readableMsg); const takeOrdersCalldata = takeOrdersResult.value; // hex string ready for the contract