From 72e843a3f82224e91693bc3d2b07dfb9332baf86 Mon Sep 17 00:00:00 2001 From: Roshan Date: Sat, 11 May 2024 15:18:25 +0800 Subject: [PATCH] feat: add support for bsc parlia consensus --- Cargo.lock | 96 +- Cargo.toml | 12 + bin/reth/src/commands/db/diff.rs | 11 +- bin/reth/src/commands/db/stats.rs | 3 +- crates/bsc/consensus/Cargo.toml | 47 + crates/bsc/consensus/res/slash.json | 958 +++++++++ crates/bsc/consensus/res/stake_hub.json | 1812 +++++++++++++++++ crates/bsc/consensus/res/validator_set.json | 1687 +++++++++++++++ .../res/validator_set_before_luban.json | 1388 +++++++++++++ crates/bsc/consensus/src/constants.rs | 34 + crates/bsc/consensus/src/contract_upgrade.rs | 276 +++ crates/bsc/consensus/src/error.rs | 51 + crates/bsc/consensus/src/feynman_fork.rs | 67 + crates/bsc/consensus/src/go_rng.rs | 858 ++++++++ crates/bsc/consensus/src/lib.rs | 878 ++++++++ crates/bsc/consensus/src/util.rs | 181 ++ crates/bsc/evm/Cargo.toml | 46 + crates/bsc/evm/src/error.rs | 141 ++ crates/bsc/evm/src/execute.rs | 1299 ++++++++++++ crates/bsc/evm/src/lib.rs | 105 + crates/bsc/evm/src/verify.rs | 53 + crates/bsc/node/Cargo.toml | 20 + crates/bsc/node/src/lib.rs | 0 crates/consensus/consensus/src/lib.rs | 11 + crates/ethereum-forks/src/hardfork.rs | 18 + crates/evm/src/execute.rs | 16 + crates/interfaces/src/executor.rs | 3 +- crates/primitives/src/chain/spec.rs | 14 + crates/primitives/src/constants/mod.rs | 4 + crates/stages/Cargo.toml | 5 + crates/stages/src/stages/execution.rs | 8 +- crates/storage/db/Cargo.toml | 2 + crates/storage/db/src/tables/mod.rs | 4 + crates/storage/db/src/tables/models/mod.rs | 1 + .../db/src/tables/models/parlia/mod.rs | 7 + .../db/src/tables/models/parlia/snapshot.rs | 203 ++ .../db/src/tables/models/parlia/vote.rs | 87 + .../provider/src/providers/database/mod.rs | 14 +- .../src/providers/database/provider.rs | 24 +- crates/storage/provider/src/providers/mod.rs | 18 +- .../storage/provider/src/test_utils/noop.rs | 16 +- crates/storage/provider/src/traits/mod.rs | 3 + .../provider/src/traits/parlia_snapshot.rs | 17 + 43 files changed, 10465 insertions(+), 33 deletions(-) create mode 100644 crates/bsc/consensus/Cargo.toml create mode 100644 crates/bsc/consensus/res/slash.json create mode 100644 crates/bsc/consensus/res/stake_hub.json create mode 100644 crates/bsc/consensus/res/validator_set.json create mode 100644 crates/bsc/consensus/res/validator_set_before_luban.json create mode 100644 crates/bsc/consensus/src/constants.rs create mode 100644 crates/bsc/consensus/src/contract_upgrade.rs create mode 100644 crates/bsc/consensus/src/error.rs create mode 100644 crates/bsc/consensus/src/feynman_fork.rs create mode 100644 crates/bsc/consensus/src/go_rng.rs create mode 100644 crates/bsc/consensus/src/lib.rs create mode 100644 crates/bsc/consensus/src/util.rs create mode 100644 crates/bsc/evm/Cargo.toml create mode 100644 crates/bsc/evm/src/error.rs create mode 100644 crates/bsc/evm/src/execute.rs create mode 100644 crates/bsc/evm/src/lib.rs create mode 100644 crates/bsc/evm/src/verify.rs create mode 100644 crates/bsc/node/Cargo.toml create mode 100644 crates/bsc/node/src/lib.rs create mode 100644 crates/storage/db/src/tables/models/parlia/mod.rs create mode 100644 crates/storage/db/src/tables/models/parlia/snapshot.rs create mode 100644 crates/storage/db/src/tables/models/parlia/vote.rs create mode 100644 crates/storage/provider/src/traits/parlia_snapshot.rs diff --git a/Cargo.lock b/Cargo.lock index 6d9252332..c9e231a7e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1201,6 +1201,12 @@ dependencies = [ "dyn_size_of", ] +[[package]] +name = "bitset" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd450435a044ff3a192c9b0063e9f612ee3e2b2e23388332bc3aada13e3f7f6b" + [[package]] name = "bitvec" version = "1.0.1" @@ -1621,7 +1627,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57663b653d948a338bfb3eeba9bb2fd5fcfaecb9e199e87e1eda4d9e8b240fd9" dependencies = [ "ciborium-io", - "half", + "half 2.4.1", ] [[package]] @@ -3439,6 +3445,12 @@ dependencies = [ "tracing", ] +[[package]] +name = "half" +version = "1.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b43ede17f21864e81be2fa654110bf1e793774238d86ef8555c37e6519c0403" + [[package]] name = "half" version = "2.4.1" @@ -6568,6 +6580,33 @@ dependencies = [ "tracing", ] +[[package]] +name = "reth-bsc-consensus" +version = "0.2.0-beta.7" +dependencies = [ + "alloy-dyn-abi", + "alloy-json-abi", + "alloy-rlp", + "bitset", + "blst", + "lazy_static", + "lru", + "mockall", + "parking_lot 0.12.2", + "reth-consensus", + "reth-consensus-common", + "reth-db", + "reth-interfaces", + "reth-primitives", + "reth-provider", + "reth-rpc-types", + "secp256k1", + "serde_json", + "sha3", + "thiserror", + "tracing", +] + [[package]] name = "reth-cli-runner" version = "0.2.0-beta.7" @@ -6646,6 +6685,7 @@ dependencies = [ name = "reth-db" version = "0.2.0-beta.7" dependencies = [ + "alloy-rlp", "arbitrary", "assert_matches", "bytes", @@ -6672,6 +6712,7 @@ dependencies = [ "reth-tracing", "rustc-hash", "serde", + "serde_cbor", "serde_json", "strum", "tempfile", @@ -6988,6 +7029,28 @@ dependencies = [ "revm-primitives", ] +[[package]] +name = "reth-evm-bsc" +version = "0.2.0-beta.7" +dependencies = [ + "bitset", + "blst", + "lazy_static", + "lru", + "parking_lot 0.12.2", + "reth-bsc-consensus", + "reth-db", + "reth-evm", + "reth-interfaces", + "reth-primitives", + "reth-provider", + "reth-revm", + "revm", + "revm-primitives", + "thiserror", + "tracing", +] + [[package]] name = "reth-evm-ethereum" version = "0.2.0-beta.7" @@ -7278,6 +7341,13 @@ dependencies = [ "reth-transaction-pool", ] +[[package]] +name = "reth-node-bsc" +version = "0.2.0-beta.7" +dependencies = [ + "reth-evm-bsc", +] + [[package]] name = "reth-node-builder" version = "0.2.0-beta.7" @@ -7842,6 +7912,7 @@ version = "0.2.0-beta.7" dependencies = [ "alloy-rlp", "assert_matches", + "cfg-if", "criterion", "futures-util", "itertools 0.12.1", @@ -7857,6 +7928,7 @@ dependencies = [ "reth-downloaders", "reth-etl", "reth-evm", + "reth-evm-bsc", "reth-evm-ethereum", "reth-exex", "reth-interfaces", @@ -8056,8 +8128,7 @@ dependencies = [ [[package]] name = "revm" version = "8.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72a454c1c650b2b2e23f0c461af09e6c31e1d15e1cbebe905a701c46b8a50afc" +source = "git+https://github.com/bnb-chain/revm?rev=dee51654d63f2a8c0197ae804e3efe985ec39557#dee51654d63f2a8c0197ae804e3efe985ec39557" dependencies = [ "auto_impl", "cfg-if", @@ -8089,8 +8160,7 @@ dependencies = [ [[package]] name = "revm-interpreter" version = "4.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d322f2730cd300e99d271a1704a2dfb8973d832428f5aa282aaa40e2473b5eec" +source = "git+https://github.com/bnb-chain/revm?rev=dee51654d63f2a8c0197ae804e3efe985ec39557#dee51654d63f2a8c0197ae804e3efe985ec39557" dependencies = [ "revm-primitives", "serde", @@ -8099,8 +8169,7 @@ dependencies = [ [[package]] name = "revm-precompile" version = "6.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "931f692f3f4fc72ec39d5d270f8e9d208c4a6008de7590ee96cf948e3b6d3f8d" +source = "git+https://github.com/bnb-chain/revm?rev=dee51654d63f2a8c0197ae804e3efe985ec39557#dee51654d63f2a8c0197ae804e3efe985ec39557" dependencies = [ "aurora-engine-modexp", "c-kzg", @@ -8116,8 +8185,7 @@ dependencies = [ [[package]] name = "revm-primitives" version = "3.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbbc9640790cebcb731289afb7a7d96d16ad94afeb64b5d0b66443bd151e79d6" +source = "git+https://github.com/bnb-chain/revm?rev=dee51654d63f2a8c0197ae804e3efe985ec39557#dee51654d63f2a8c0197ae804e3efe985ec39557" dependencies = [ "alloy-primitives", "auto_impl", @@ -8650,6 +8718,16 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_cbor" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bef2ebfde456fb76bbcf9f59315333decc4fda0b2b44b420243c11e0f5ec1f5" +dependencies = [ + "half 1.8.3", + "serde", +] + [[package]] name = "serde_derive" version = "1.0.199" diff --git a/Cargo.toml b/Cargo.toml index fe219f51b..cab85e35e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -2,6 +2,9 @@ members = [ "bin/reth/", "crates/blockchain-tree/", + "crates/bsc/consensus", + "crates/bsc/node/", + "crates/bsc/evm/", "crates/cli/runner/", "crates/config/", "crates/consensus/auto-seal/", @@ -208,6 +211,7 @@ reth = { path = "bin/reth" } reth-auto-seal-consensus = { path = "crates/consensus/auto-seal" } reth-basic-payload-builder = { path = "crates/payload/basic" } reth-beacon-consensus = { path = "crates/consensus/beacon" } +reth-bsc-consensus = { path = "crates/bsc/consensus" } reth-ethereum-consensus = { path = "crates/ethereum/consensus" } reth-blockchain-tree = { path = "crates/blockchain-tree" } reth-cli-runner = { path = "crates/cli/runner" } @@ -223,8 +227,10 @@ reth-e2e-test-utils = { path = "crates/e2e-test-utils" } reth-engine-primitives = { path = "crates/engine-primitives" } reth-ethereum-engine-primitives = { path = "crates/ethereum/engine-primitives" } reth-node-builder = { path = "crates/node/builder" } +reth-node-bsc= { path = "crates/bsc/node" } reth-node-ethereum = { path = "crates/ethereum/node" } reth-node-optimism = { path = "crates/optimism/node" } +reth-evm-bsc = { path = "crates/bsc/evm" } reth-evm-optimism = { path = "crates/optimism/evm" } reth-node-core = { path = "crates/node-core" } reth-node-api = { path = "crates/node/api" } @@ -286,6 +292,7 @@ revm-inspectors = { git = "https://github.com/paradigmxyz/evm-inspectors", rev = alloy-chains = "0.1.15" alloy-primitives = "0.7.2" alloy-dyn-abi = "0.7.2" +alloy-json-abi = "0.7.2" alloy-sol-types = "0.7.2" alloy-rlp = "0.3.4" alloy-trie = "0.3.1" @@ -399,3 +406,8 @@ proptest-derive = "0.4" serial_test = "3" similar-asserts = "1.5.0" test-fuzz = "5" + +[patch.crates-io] +# TODO: update to official version +revm = { git = "https://github.com/bnb-chain/revm", rev = "dee51654d63f2a8c0197ae804e3efe985ec39557" } +revm-primitives = { git = "https://github.com/bnb-chain/revm", rev = "dee51654d63f2a8c0197ae804e3efe985ec39557" } \ No newline at end of file diff --git a/bin/reth/src/commands/db/diff.rs b/bin/reth/src/commands/db/diff.rs index 9c098a50b..4ac3f18cd 100644 --- a/bin/reth/src/commands/db/diff.rs +++ b/bin/reth/src/commands/db/diff.rs @@ -8,10 +8,10 @@ use reth_db::{ cursor::DbCursorRO, database::Database, open_db_read_only, table::Table, transaction::DbTx, AccountChangeSets, AccountsHistory, AccountsTrie, BlockBodyIndices, BlockOmmers, BlockWithdrawals, Bytecodes, CanonicalHeaders, DatabaseEnv, HashedAccounts, HashedStorages, - HeaderNumbers, HeaderTerminalDifficulties, Headers, PlainAccountState, PlainStorageState, - PruneCheckpoints, Receipts, StageCheckpointProgresses, StageCheckpoints, StorageChangeSets, - StoragesHistory, StoragesTrie, Tables, TransactionBlocks, TransactionHashNumbers, - TransactionSenders, Transactions, VersionHistory, + HeaderNumbers, HeaderTerminalDifficulties, Headers, ParliaSnapshot, PlainAccountState, + PlainStorageState, PruneCheckpoints, Receipts, StageCheckpointProgresses, StageCheckpoints, + StorageChangeSets, StoragesHistory, StoragesTrie, Tables, TransactionBlocks, + TransactionHashNumbers, TransactionSenders, Transactions, VersionHistory, }; use std::{ collections::HashMap, @@ -154,6 +154,9 @@ impl Command { Tables::VersionHistory => { find_diffs::(primary_tx, secondary_tx, output_dir)? } + Tables::ParliaSnapshot => { + find_diffs::(primary_tx, secondary_tx, output_dir)? + } }; } diff --git a/bin/reth/src/commands/db/stats.rs b/bin/reth/src/commands/db/stats.rs index b47e7980b..5a8a2d69f 100644 --- a/bin/reth/src/commands/db/stats.rs +++ b/bin/reth/src/commands/db/stats.rs @@ -10,7 +10,7 @@ use reth_db::{ database::Database, mdbx, static_file::iter_static_files, AccountChangeSets, AccountsHistory, AccountsTrie, BlockBodyIndices, BlockOmmers, BlockWithdrawals, Bytecodes, CanonicalHeaders, DatabaseEnv, HashedAccounts, HashedStorages, HeaderNumbers, HeaderTerminalDifficulties, - Headers, PlainAccountState, PlainStorageState, PruneCheckpoints, Receipts, + Headers, ParliaSnapshot, PlainAccountState, PlainStorageState, PruneCheckpoints, Receipts, StageCheckpointProgresses, StageCheckpoints, StorageChangeSets, StoragesHistory, StoragesTrie, Tables, TransactionBlocks, TransactionHashNumbers, TransactionSenders, Transactions, VersionHistory, @@ -359,6 +359,7 @@ impl Command { Tables::TransactionSenders => viewer.get_checksum::().unwrap(), Tables::Transactions => viewer.get_checksum::().unwrap(), Tables::VersionHistory => viewer.get_checksum::().unwrap(), + Tables::ParliaSnapshot => viewer.get_checksum::().unwrap(), }; // increment duration for final report diff --git a/crates/bsc/consensus/Cargo.toml b/crates/bsc/consensus/Cargo.toml new file mode 100644 index 000000000..0451a6d6e --- /dev/null +++ b/crates/bsc/consensus/Cargo.toml @@ -0,0 +1,47 @@ +[package] +name = "reth-bsc-consensus" +version.workspace = true +edition.workspace = true +rust-version.workspace = true +license.workspace = true +homepage.workspace = true +repository.workspace = true + +[lints] +workspace = true + +[dependencies] +# reth +reth-consensus-common.workspace = true +reth-consensus.workspace = true +reth-primitives.workspace = true +reth-provider.workspace = true +reth-rpc-types.workspace = true +reth-db.workspace = true + +# eth +alloy-rlp.workspace = true +alloy-dyn-abi.workspace = true +alloy-json-abi.workspace = true + +# crypto +secp256k1.workspace = true +sha3 = "0.10.8" +blst = "0.3.11" + +# misc +serde_json.workspace = true +parking_lot.workspace = true +tracing.workspace = true +lazy_static = "1.4.0" +lru = "0.12" +bitset = "0.1.2" +thiserror = "1.0.59" + +[dev-dependencies] +reth-interfaces = { workspace = true, features = ["test-utils"] } +reth-provider = { workspace = true, features = ["test-utils"] } +mockall = "0.12" + +[features] +bsc = [] \ No newline at end of file diff --git a/crates/bsc/consensus/res/slash.json b/crates/bsc/consensus/res/slash.json new file mode 100644 index 000000000..2752cd870 --- /dev/null +++ b/crates/bsc/consensus/res/slash.json @@ -0,0 +1,958 @@ +[ + { + "type": "function", + "name": "BC_FUSION_CHANNELID", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint8", + "internalType": "uint8" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "BIND_CHANNELID", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint8", + "internalType": "uint8" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "CODE_OK", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint32", + "internalType": "uint32" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "CROSS_CHAIN_CONTRACT_ADDR", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "CROSS_STAKE_CHANNELID", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint8", + "internalType": "uint8" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "DECREASE_RATE", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "ERROR_FAIL_DECODE", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint32", + "internalType": "uint32" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "FELONY_THRESHOLD", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "GOVERNOR_ADDR", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "GOV_CHANNELID", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint8", + "internalType": "uint8" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "GOV_HUB_ADDR", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "GOV_TOKEN_ADDR", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "INCENTIVIZE_ADDR", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "INIT_FELONY_SLASH_REWARD_RATIO", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "INIT_FELONY_SLASH_SCOPE", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "LIGHT_CLIENT_ADDR", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "MISDEMEANOR_THRESHOLD", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "RELAYERHUB_CONTRACT_ADDR", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "SLASH_CHANNELID", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint8", + "internalType": "uint8" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "SLASH_CONTRACT_ADDR", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "STAKE_CREDIT_ADDR", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "STAKE_HUB_ADDR", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "STAKING_CHANNELID", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint8", + "internalType": "uint8" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "STAKING_CONTRACT_ADDR", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "SYSTEM_REWARD_ADDR", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "TIMELOCK_ADDR", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "TOKEN_HUB_ADDR", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "TOKEN_MANAGER_ADDR", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "TOKEN_RECOVER_PORTAL_ADDR", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "TRANSFER_IN_CHANNELID", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint8", + "internalType": "uint8" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "TRANSFER_OUT_CHANNELID", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint8", + "internalType": "uint8" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "VALIDATOR_CONTRACT_ADDR", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "alreadyInit", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "bscChainID", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint16", + "internalType": "uint16" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "clean", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "downtimeSlash", + "inputs": [ + { + "name": "validator", + "type": "address", + "internalType": "address" + }, + { + "name": "count", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "enableMaliciousVoteSlash", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "felonySlashRewardRatio", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "felonySlashScope", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "felonyThreshold", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getSlashIndicator", + "inputs": [ + { + "name": "validator", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getSlashThresholds", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "handleAckPackage", + "inputs": [ + { + "name": "", + "type": "uint8", + "internalType": "uint8" + }, + { + "name": "msgBytes", + "type": "bytes", + "internalType": "bytes" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "handleFailAckPackage", + "inputs": [ + { + "name": "", + "type": "uint8", + "internalType": "uint8" + }, + { + "name": "", + "type": "bytes", + "internalType": "bytes" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "handleSynPackage", + "inputs": [ + { + "name": "", + "type": "uint8", + "internalType": "uint8" + }, + { + "name": "", + "type": "bytes", + "internalType": "bytes" + } + ], + "outputs": [ + { + "name": "", + "type": "bytes", + "internalType": "bytes" + } + ], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "indicators", + "inputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "height", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "count", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "exist", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "init", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "misdemeanorThreshold", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "previousHeight", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "sendFelonyPackage", + "inputs": [ + { + "name": "validator", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "slash", + "inputs": [ + { + "name": "validator", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "submitDoubleSignEvidence", + "inputs": [ + { + "name": "header1", + "type": "bytes", + "internalType": "bytes" + }, + { + "name": "header2", + "type": "bytes", + "internalType": "bytes" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "submitFinalityViolationEvidence", + "inputs": [ + { + "name": "_evidence", + "type": "tuple", + "internalType": "struct SlashIndicator.FinalityEvidence", + "components": [ + { + "name": "voteA", + "type": "tuple", + "internalType": "struct SlashIndicator.VoteData", + "components": [ + { + "name": "srcNum", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "srcHash", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "tarNum", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "tarHash", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "sig", + "type": "bytes", + "internalType": "bytes" + } + ] + }, + { + "name": "voteB", + "type": "tuple", + "internalType": "struct SlashIndicator.VoteData", + "components": [ + { + "name": "srcNum", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "srcHash", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "tarNum", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "tarHash", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "sig", + "type": "bytes", + "internalType": "bytes" + } + ] + }, + { + "name": "voteAddr", + "type": "bytes", + "internalType": "bytes" + } + ] + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "updateParam", + "inputs": [ + { + "name": "key", + "type": "string", + "internalType": "string" + }, + { + "name": "value", + "type": "bytes", + "internalType": "bytes" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "validators", + "inputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "event", + "name": "crashResponse", + "inputs": [], + "anonymous": false + }, + { + "type": "event", + "name": "failedFelony", + "inputs": [ + { + "name": "validator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "slashCount", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + }, + { + "name": "failReason", + "type": "bytes", + "indexed": false, + "internalType": "bytes" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "indicatorCleaned", + "inputs": [], + "anonymous": false + }, + { + "type": "event", + "name": "knownResponse", + "inputs": [ + { + "name": "code", + "type": "uint32", + "indexed": false, + "internalType": "uint32" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "maliciousVoteSlashed", + "inputs": [ + { + "name": "voteAddrSlice", + "type": "bytes32", + "indexed": true, + "internalType": "bytes32" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "paramChange", + "inputs": [ + { + "name": "key", + "type": "string", + "indexed": false, + "internalType": "string" + }, + { + "name": "value", + "type": "bytes", + "indexed": false, + "internalType": "bytes" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "unKnownResponse", + "inputs": [ + { + "name": "code", + "type": "uint32", + "indexed": false, + "internalType": "uint32" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "validatorSlashed", + "inputs": [ + { + "name": "validator", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + } +] diff --git a/crates/bsc/consensus/res/stake_hub.json b/crates/bsc/consensus/res/stake_hub.json new file mode 100644 index 000000000..1e287f3e9 --- /dev/null +++ b/crates/bsc/consensus/res/stake_hub.json @@ -0,0 +1,1812 @@ +[ + { + "type": "receive", + "stateMutability": "payable" + }, + { + "type": "function", + "name": "BC_FUSION_CHANNELID", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint8", + "internalType": "uint8" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "BREATHE_BLOCK_INTERVAL", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "DEAD_ADDRESS", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "LOCK_AMOUNT", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "REDELEGATE_FEE_RATE_BASE", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "STAKING_CHANNELID", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint8", + "internalType": "uint8" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "addToBlackList", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "blackList", + "inputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "claim", + "inputs": [ + { + "name": "operatorAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "requestNumber", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "claimBatch", + "inputs": [ + { + "name": "operatorAddresses", + "type": "address[]", + "internalType": "address[]" + }, + { + "name": "requestNumbers", + "type": "uint256[]", + "internalType": "uint256[]" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "consensusExpiration", + "inputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "consensusToOperator", + "inputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "createValidator", + "inputs": [ + { + "name": "consensusAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "voteAddress", + "type": "bytes", + "internalType": "bytes" + }, + { + "name": "blsProof", + "type": "bytes", + "internalType": "bytes" + }, + { + "name": "commission", + "type": "tuple", + "internalType": "struct StakeHub.Commission", + "components": [ + { + "name": "rate", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "maxRate", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "maxChangeRate", + "type": "uint64", + "internalType": "uint64" + } + ] + }, + { + "name": "description", + "type": "tuple", + "internalType": "struct StakeHub.Description", + "components": [ + { + "name": "moniker", + "type": "string", + "internalType": "string" + }, + { + "name": "identity", + "type": "string", + "internalType": "string" + }, + { + "name": "website", + "type": "string", + "internalType": "string" + }, + { + "name": "details", + "type": "string", + "internalType": "string" + } + ] + } + ], + "outputs": [], + "stateMutability": "payable" + }, + { + "type": "function", + "name": "delegate", + "inputs": [ + { + "name": "operatorAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "delegateVotePower", + "type": "bool", + "internalType": "bool" + } + ], + "outputs": [], + "stateMutability": "payable" + }, + { + "type": "function", + "name": "distributeReward", + "inputs": [ + { + "name": "consensusAddress", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "payable" + }, + { + "type": "function", + "name": "doubleSignSlash", + "inputs": [ + { + "name": "consensusAddress", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "downtimeJailTime", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "downtimeSlash", + "inputs": [ + { + "name": "consensusAddress", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "downtimeSlashAmount", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "editCommissionRate", + "inputs": [ + { + "name": "commissionRate", + "type": "uint64", + "internalType": "uint64" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "editConsensusAddress", + "inputs": [ + { + "name": "newConsensusAddress", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "editDescription", + "inputs": [ + { + "name": "description", + "type": "tuple", + "internalType": "struct StakeHub.Description", + "components": [ + { + "name": "moniker", + "type": "string", + "internalType": "string" + }, + { + "name": "identity", + "type": "string", + "internalType": "string" + }, + { + "name": "website", + "type": "string", + "internalType": "string" + }, + { + "name": "details", + "type": "string", + "internalType": "string" + } + ] + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "editVoteAddress", + "inputs": [ + { + "name": "newVoteAddress", + "type": "bytes", + "internalType": "bytes" + }, + { + "name": "blsProof", + "type": "bytes", + "internalType": "bytes" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "felonyJailTime", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "felonySlashAmount", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getValidatorBasicInfo", + "inputs": [ + { + "name": "operatorAddress", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "createdTime", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "jailed", + "type": "bool", + "internalType": "bool" + }, + { + "name": "jailUntil", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getValidatorCommission", + "inputs": [ + { + "name": "operatorAddress", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple", + "internalType": "struct StakeHub.Commission", + "components": [ + { + "name": "rate", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "maxRate", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "maxChangeRate", + "type": "uint64", + "internalType": "uint64" + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getValidatorConsensusAddress", + "inputs": [ + { + "name": "operatorAddress", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "consensusAddress", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getValidatorCreditContract", + "inputs": [ + { + "name": "operatorAddress", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "creditContract", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getValidatorDescription", + "inputs": [ + { + "name": "operatorAddress", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple", + "internalType": "struct StakeHub.Description", + "components": [ + { + "name": "moniker", + "type": "string", + "internalType": "string" + }, + { + "name": "identity", + "type": "string", + "internalType": "string" + }, + { + "name": "website", + "type": "string", + "internalType": "string" + }, + { + "name": "details", + "type": "string", + "internalType": "string" + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getValidatorElectionInfo", + "inputs": [ + { + "name": "offset", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "limit", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "consensusAddrs", + "type": "address[]", + "internalType": "address[]" + }, + { + "name": "votingPowers", + "type": "uint256[]", + "internalType": "uint256[]" + }, + { + "name": "voteAddrs", + "type": "bytes[]", + "internalType": "bytes[]" + }, + { + "name": "totalLength", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getValidatorRewardRecord", + "inputs": [ + { + "name": "operatorAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "index", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getValidatorTotalPooledBNBRecord", + "inputs": [ + { + "name": "operatorAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "index", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getValidatorVoteAddress", + "inputs": [ + { + "name": "operatorAddress", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "voteAddress", + "type": "bytes", + "internalType": "bytes" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getValidators", + "inputs": [ + { + "name": "offset", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "limit", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "operatorAddrs", + "type": "address[]", + "internalType": "address[]" + }, + { + "name": "creditAddrs", + "type": "address[]", + "internalType": "address[]" + }, + { + "name": "totalLength", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "handleAckPackage", + "inputs": [ + { + "name": "channelId", + "type": "uint8", + "internalType": "uint8" + }, + { + "name": "msgBytes", + "type": "bytes", + "internalType": "bytes" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "handleFailAckPackage", + "inputs": [ + { + "name": "channelId", + "type": "uint8", + "internalType": "uint8" + }, + { + "name": "msgBytes", + "type": "bytes", + "internalType": "bytes" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "handleSynPackage", + "inputs": [ + { + "name": "", + "type": "uint8", + "internalType": "uint8" + }, + { + "name": "msgBytes", + "type": "bytes", + "internalType": "bytes" + } + ], + "outputs": [ + { + "name": "", + "type": "bytes", + "internalType": "bytes" + } + ], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "initialize", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "isPaused", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "maliciousVoteSlash", + "inputs": [ + { + "name": "voteAddress", + "type": "bytes", + "internalType": "bytes" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "maxElectedValidators", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "maxFelonyBetweenBreatheBlock", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "minDelegationBNBChange", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "minSelfDelegationBNB", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "numOfJailed", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "pause", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "redelegate", + "inputs": [ + { + "name": "srcValidator", + "type": "address", + "internalType": "address" + }, + { + "name": "dstValidator", + "type": "address", + "internalType": "address" + }, + { + "name": "shares", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "delegateVotePower", + "type": "bool", + "internalType": "bool" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "redelegateFeeRate", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "removeFromBlackList", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "resume", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "syncGovToken", + "inputs": [ + { + "name": "operatorAddresses", + "type": "address[]", + "internalType": "address[]" + }, + { + "name": "account", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "transferGasLimit", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "unbondPeriod", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "undelegate", + "inputs": [ + { + "name": "operatorAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "shares", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "unjail", + "inputs": [ + { + "name": "operatorAddress", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "updateParam", + "inputs": [ + { + "name": "key", + "type": "string", + "internalType": "string" + }, + { + "name": "value", + "type": "bytes", + "internalType": "bytes" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "voteExpiration", + "inputs": [ + { + "name": "", + "type": "bytes", + "internalType": "bytes" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "voteToOperator", + "inputs": [ + { + "name": "", + "type": "bytes", + "internalType": "bytes" + } + ], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "event", + "name": "BlackListed", + "inputs": [ + { + "name": "target", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Claimed", + "inputs": [ + { + "name": "operatorAddress", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "delegator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "bnbAmount", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "CommissionRateEdited", + "inputs": [ + { + "name": "operatorAddress", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "newCommissionRate", + "type": "uint64", + "indexed": false, + "internalType": "uint64" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ConsensusAddressEdited", + "inputs": [ + { + "name": "operatorAddress", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "newConsensusAddress", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Delegated", + "inputs": [ + { + "name": "operatorAddress", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "delegator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "shares", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + }, + { + "name": "bnbAmount", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "DescriptionEdited", + "inputs": [ + { + "name": "operatorAddress", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Initialized", + "inputs": [ + { + "name": "version", + "type": "uint8", + "indexed": false, + "internalType": "uint8" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "MigrateFailed", + "inputs": [ + { + "name": "operatorAddress", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "delegator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "bnbAmount", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + }, + { + "name": "respCode", + "type": "uint8", + "indexed": false, + "internalType": "enum StakeHub.StakeMigrationRespCode" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "MigrateSuccess", + "inputs": [ + { + "name": "operatorAddress", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "delegator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "shares", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + }, + { + "name": "bnbAmount", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ParamChange", + "inputs": [ + { + "name": "key", + "type": "string", + "indexed": false, + "internalType": "string" + }, + { + "name": "value", + "type": "bytes", + "indexed": false, + "internalType": "bytes" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Paused", + "inputs": [], + "anonymous": false + }, + { + "type": "event", + "name": "ProtectorChanged", + "inputs": [ + { + "name": "oldProtector", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "newProtector", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Redelegated", + "inputs": [ + { + "name": "srcValidator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "dstValidator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "delegator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "oldShares", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + }, + { + "name": "newShares", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + }, + { + "name": "bnbAmount", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Resumed", + "inputs": [], + "anonymous": false + }, + { + "type": "event", + "name": "RewardDistributeFailed", + "inputs": [ + { + "name": "operatorAddress", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "failReason", + "type": "bytes", + "indexed": false, + "internalType": "bytes" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "RewardDistributed", + "inputs": [ + { + "name": "operatorAddress", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "reward", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "StakeCreditInitialized", + "inputs": [ + { + "name": "operatorAddress", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "creditContract", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "UnBlackListed", + "inputs": [ + { + "name": "target", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Undelegated", + "inputs": [ + { + "name": "operatorAddress", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "delegator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "shares", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + }, + { + "name": "bnbAmount", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "UnexpectedPackage", + "inputs": [ + { + "name": "channelId", + "type": "uint8", + "indexed": false, + "internalType": "uint8" + }, + { + "name": "msgBytes", + "type": "bytes", + "indexed": false, + "internalType": "bytes" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ValidatorCreated", + "inputs": [ + { + "name": "consensusAddress", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "operatorAddress", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "creditContract", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "voteAddress", + "type": "bytes", + "indexed": false, + "internalType": "bytes" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ValidatorEmptyJailed", + "inputs": [ + { + "name": "operatorAddress", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ValidatorJailed", + "inputs": [ + { + "name": "operatorAddress", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ValidatorSlashed", + "inputs": [ + { + "name": "operatorAddress", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "jailUntil", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + }, + { + "name": "slashAmount", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + }, + { + "name": "slashType", + "type": "uint8", + "indexed": false, + "internalType": "enum StakeHub.SlashType" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ValidatorUnjailed", + "inputs": [ + { + "name": "operatorAddress", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "VoteAddressEdited", + "inputs": [ + { + "name": "operatorAddress", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "newVoteAddress", + "type": "bytes", + "indexed": false, + "internalType": "bytes" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "AlreadyPaused", + "inputs": [] + }, + { + "type": "error", + "name": "AlreadySlashed", + "inputs": [] + }, + { + "type": "error", + "name": "ConsensusAddressExpired", + "inputs": [] + }, + { + "type": "error", + "name": "DelegationAmountTooSmall", + "inputs": [] + }, + { + "type": "error", + "name": "DuplicateConsensusAddress", + "inputs": [] + }, + { + "type": "error", + "name": "DuplicateMoniker", + "inputs": [] + }, + { + "type": "error", + "name": "DuplicateVoteAddress", + "inputs": [] + }, + { + "type": "error", + "name": "InBlackList", + "inputs": [] + }, + { + "type": "error", + "name": "InvalidCommission", + "inputs": [] + }, + { + "type": "error", + "name": "InvalidConsensusAddress", + "inputs": [] + }, + { + "type": "error", + "name": "InvalidMoniker", + "inputs": [] + }, + { + "type": "error", + "name": "InvalidRequest", + "inputs": [] + }, + { + "type": "error", + "name": "InvalidSynPackage", + "inputs": [] + }, + { + "type": "error", + "name": "InvalidValue", + "inputs": [ + { + "name": "key", + "type": "string", + "internalType": "string" + }, + { + "name": "value", + "type": "bytes", + "internalType": "bytes" + } + ] + }, + { + "type": "error", + "name": "InvalidVoteAddress", + "inputs": [] + }, + { + "type": "error", + "name": "JailTimeNotExpired", + "inputs": [] + }, + { + "type": "error", + "name": "NoMoreFelonyAllowed", + "inputs": [] + }, + { + "type": "error", + "name": "NotPaused", + "inputs": [] + }, + { + "type": "error", + "name": "OnlyCoinbase", + "inputs": [] + }, + { + "type": "error", + "name": "OnlyProtector", + "inputs": [] + }, + { + "type": "error", + "name": "OnlySelfDelegation", + "inputs": [] + }, + { + "type": "error", + "name": "OnlySystemContract", + "inputs": [ + { + "name": "systemContract", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "OnlyZeroGasPrice", + "inputs": [] + }, + { + "type": "error", + "name": "SameValidator", + "inputs": [] + }, + { + "type": "error", + "name": "SelfDelegationNotEnough", + "inputs": [] + }, + { + "type": "error", + "name": "TransferFailed", + "inputs": [] + }, + { + "type": "error", + "name": "UnknownParam", + "inputs": [ + { + "name": "key", + "type": "string", + "internalType": "string" + }, + { + "name": "value", + "type": "bytes", + "internalType": "bytes" + } + ] + }, + { + "type": "error", + "name": "UpdateTooFrequently", + "inputs": [] + }, + { + "type": "error", + "name": "ValidatorExisted", + "inputs": [] + }, + { + "type": "error", + "name": "ValidatorNotExisted", + "inputs": [] + }, + { + "type": "error", + "name": "ValidatorNotJailed", + "inputs": [] + }, + { + "type": "error", + "name": "VoteAddressExpired", + "inputs": [] + }, + { + "type": "error", + "name": "ZeroShares", + "inputs": [] + } +] diff --git a/crates/bsc/consensus/res/validator_set.json b/crates/bsc/consensus/res/validator_set.json new file mode 100644 index 000000000..c3dddc4ed --- /dev/null +++ b/crates/bsc/consensus/res/validator_set.json @@ -0,0 +1,1687 @@ +[ + { + "type": "receive", + "stateMutability": "payable" + }, + { + "type": "function", + "name": "BC_FUSION_CHANNELID", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint8", + "internalType": "uint8" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "BIND_CHANNELID", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint8", + "internalType": "uint8" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "BLOCK_FEES_RATIO_SCALE", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "BURN_ADDRESS", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "CODE_OK", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint32", + "internalType": "uint32" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "CROSS_CHAIN_CONTRACT_ADDR", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "CROSS_STAKE_CHANNELID", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint8", + "internalType": "uint8" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "DUSTY_INCOMING", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "EPOCH", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "ERROR_FAIL_CHECK_VALIDATORS", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint32", + "internalType": "uint32" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "ERROR_FAIL_DECODE", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint32", + "internalType": "uint32" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "ERROR_LEN_OF_VAL_MISMATCH", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint32", + "internalType": "uint32" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "ERROR_RELAYFEE_TOO_LARGE", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint32", + "internalType": "uint32" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "ERROR_UNKNOWN_PACKAGE_TYPE", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint32", + "internalType": "uint32" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "EXPIRE_TIME_SECOND_GAP", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "GOVERNOR_ADDR", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "GOV_CHANNELID", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint8", + "internalType": "uint8" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "GOV_HUB_ADDR", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "GOV_TOKEN_ADDR", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "INCENTIVIZE_ADDR", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "INIT_BURN_RATIO", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "INIT_MAINTAIN_SLASH_SCALE", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "INIT_MAX_NUM_OF_MAINTAINING", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "INIT_NUM_OF_CABINETS", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "INIT_SYSTEM_REWARD_RATIO", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "INIT_VALIDATORSET_BYTES", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "bytes", + "internalType": "bytes" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "JAIL_MESSAGE_TYPE", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint8", + "internalType": "uint8" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "LIGHT_CLIENT_ADDR", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "MAX_NUM_OF_VALIDATORS", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "MAX_SYSTEM_REWARD_BALANCE", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "PRECISION", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "RELAYERHUB_CONTRACT_ADDR", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "SLASH_CHANNELID", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint8", + "internalType": "uint8" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "SLASH_CONTRACT_ADDR", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "STAKE_CREDIT_ADDR", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "STAKE_HUB_ADDR", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "STAKING_CHANNELID", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint8", + "internalType": "uint8" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "STAKING_CONTRACT_ADDR", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "SYSTEM_REWARD_ADDR", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "TIMELOCK_ADDR", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "TOKEN_HUB_ADDR", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "TOKEN_MANAGER_ADDR", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "TOKEN_RECOVER_PORTAL_ADDR", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "TRANSFER_IN_CHANNELID", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint8", + "internalType": "uint8" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "TRANSFER_OUT_CHANNELID", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint8", + "internalType": "uint8" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "VALIDATORS_UPDATE_MESSAGE_TYPE", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint8", + "internalType": "uint8" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "VALIDATOR_CONTRACT_ADDR", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "alreadyInit", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "bscChainID", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint16", + "internalType": "uint16" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "burnRatio", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "burnRatioInitialized", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "canEnterMaintenance", + "inputs": [ + { + "name": "index", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "currentValidatorSet", + "inputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "consensusAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "feeAddress", + "type": "address", + "internalType": "address payable" + }, + { + "name": "BBCFeeAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "votingPower", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "jailed", + "type": "bool", + "internalType": "bool" + }, + { + "name": "incoming", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "currentValidatorSetMap", + "inputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "currentVoteAddrFullSet", + "inputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "bytes", + "internalType": "bytes" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "deposit", + "inputs": [ + { + "name": "valAddr", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "payable" + }, + { + "type": "function", + "name": "distributeFinalityReward", + "inputs": [ + { + "name": "valAddrs", + "type": "address[]", + "internalType": "address[]" + }, + { + "name": "weights", + "type": "uint256[]", + "internalType": "uint256[]" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "enterMaintenance", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "exitMaintenance", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "expireTimeSecondGap", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "felony", + "inputs": [ + { + "name": "validator", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "getCurrentValidatorIndex", + "inputs": [ + { + "name": "validator", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getIncoming", + "inputs": [ + { + "name": "validator", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getLivingValidators", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address[]", + "internalType": "address[]" + }, + { + "name": "", + "type": "bytes[]", + "internalType": "bytes[]" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getMiningValidators", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address[]", + "internalType": "address[]" + }, + { + "name": "", + "type": "bytes[]", + "internalType": "bytes[]" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getValidators", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address[]", + "internalType": "address[]" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getWorkingValidatorCount", + "inputs": [], + "outputs": [ + { + "name": "workingValidatorCount", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "handleAckPackage", + "inputs": [ + { + "name": "channelId", + "type": "uint8", + "internalType": "uint8" + }, + { + "name": "msgBytes", + "type": "bytes", + "internalType": "bytes" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "handleFailAckPackage", + "inputs": [ + { + "name": "channelId", + "type": "uint8", + "internalType": "uint8" + }, + { + "name": "msgBytes", + "type": "bytes", + "internalType": "bytes" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "handleSynPackage", + "inputs": [ + { + "name": "", + "type": "uint8", + "internalType": "uint8" + }, + { + "name": "msgBytes", + "type": "bytes", + "internalType": "bytes" + } + ], + "outputs": [ + { + "name": "responsePayload", + "type": "bytes", + "internalType": "bytes" + } + ], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "init", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "isCurrentValidator", + "inputs": [ + { + "name": "validator", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "isMonitoredForMaliciousVote", + "inputs": [ + { + "name": "voteAddr", + "type": "bytes", + "internalType": "bytes" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "isSystemRewardIncluded", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "isWorkingValidator", + "inputs": [ + { + "name": "index", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "maintainSlashScale", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "maxNumOfCandidates", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "maxNumOfMaintaining", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "maxNumOfWorkingCandidates", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "misdemeanor", + "inputs": [ + { + "name": "validator", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "numOfCabinets", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "numOfJailed", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "numOfMaintaining", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "previousBalanceOfSystemReward", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "previousHeight", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "previousVoteAddrFullSet", + "inputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "bytes", + "internalType": "bytes" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "removeTmpMigratedValidator", + "inputs": [ + { + "name": "validator", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "systemRewardRatio", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "totalInComing", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "updateParam", + "inputs": [ + { + "name": "key", + "type": "string", + "internalType": "string" + }, + { + "name": "value", + "type": "bytes", + "internalType": "bytes" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "updateValidatorSetV2", + "inputs": [ + { + "name": "_consensusAddrs", + "type": "address[]", + "internalType": "address[]" + }, + { + "name": "_votingPowers", + "type": "uint64[]", + "internalType": "uint64[]" + }, + { + "name": "_voteAddrs", + "type": "bytes[]", + "internalType": "bytes[]" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "validatorExtraSet", + "inputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "enterMaintenanceHeight", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "isMaintaining", + "type": "bool", + "internalType": "bool" + }, + { + "name": "voteAddress", + "type": "bytes", + "internalType": "bytes" + } + ], + "stateMutability": "view" + }, + { + "type": "event", + "name": "batchTransfer", + "inputs": [ + { + "name": "amount", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "batchTransferFailed", + "inputs": [ + { + "name": "amount", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + }, + { + "name": "reason", + "type": "string", + "indexed": false, + "internalType": "string" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "batchTransferLowerFailed", + "inputs": [ + { + "name": "amount", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + }, + { + "name": "reason", + "type": "bytes", + "indexed": false, + "internalType": "bytes" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "deprecatedDeposit", + "inputs": [ + { + "name": "validator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "amount", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "deprecatedFinalityRewardDeposit", + "inputs": [ + { + "name": "validator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "amount", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "directTransfer", + "inputs": [ + { + "name": "validator", + "type": "address", + "indexed": true, + "internalType": "address payable" + }, + { + "name": "amount", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "directTransferFail", + "inputs": [ + { + "name": "validator", + "type": "address", + "indexed": true, + "internalType": "address payable" + }, + { + "name": "amount", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "failReasonWithStr", + "inputs": [ + { + "name": "message", + "type": "string", + "indexed": false, + "internalType": "string" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "feeBurned", + "inputs": [ + { + "name": "amount", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "finalityRewardDeposit", + "inputs": [ + { + "name": "validator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "amount", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "paramChange", + "inputs": [ + { + "name": "key", + "type": "string", + "indexed": false, + "internalType": "string" + }, + { + "name": "value", + "type": "bytes", + "indexed": false, + "internalType": "bytes" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "systemTransfer", + "inputs": [ + { + "name": "amount", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "tmpValidatorSetUpdated", + "inputs": [ + { + "name": "validatorsNum", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "unexpectedPackage", + "inputs": [ + { + "name": "channelId", + "type": "uint8", + "indexed": false, + "internalType": "uint8" + }, + { + "name": "msgBytes", + "type": "bytes", + "indexed": false, + "internalType": "bytes" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "validatorDeposit", + "inputs": [ + { + "name": "validator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "amount", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "validatorEmptyJailed", + "inputs": [ + { + "name": "validator", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "validatorEnterMaintenance", + "inputs": [ + { + "name": "validator", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "validatorExitMaintenance", + "inputs": [ + { + "name": "validator", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "validatorFelony", + "inputs": [ + { + "name": "validator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "amount", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "validatorJailed", + "inputs": [ + { + "name": "validator", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "validatorMisdemeanor", + "inputs": [ + { + "name": "validator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "amount", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "validatorSetUpdated", + "inputs": [], + "anonymous": false + } +] diff --git a/crates/bsc/consensus/res/validator_set_before_luban.json b/crates/bsc/consensus/res/validator_set_before_luban.json new file mode 100644 index 000000000..0805795fd --- /dev/null +++ b/crates/bsc/consensus/res/validator_set_before_luban.json @@ -0,0 +1,1388 @@ +[ + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "batchTransfer", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "string", + "name": "reason", + "type": "string" + } + ], + "name": "batchTransferFailed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "reason", + "type": "bytes" + } + ], + "name": "batchTransferLowerFailed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "validator", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "deprecatedDeposit", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address payable", + "name": "validator", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "directTransfer", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address payable", + "name": "validator", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "directTransferFail", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "string", + "name": "message", + "type": "string" + } + ], + "name": "failReasonWithStr", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "feeBurned", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "string", + "name": "key", + "type": "string" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "value", + "type": "bytes" + } + ], + "name": "paramChange", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "systemTransfer", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint8", + "name": "channelId", + "type": "uint8" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "msgBytes", + "type": "bytes" + } + ], + "name": "unexpectedPackage", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "validator", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "validatorDeposit", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "validator", + "type": "address" + } + ], + "name": "validatorEmptyJailed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "validator", + "type": "address" + } + ], + "name": "validatorEnterMaintenance", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "validator", + "type": "address" + } + ], + "name": "validatorExitMaintenance", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "validator", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "validatorFelony", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "validator", + "type": "address" + } + ], + "name": "validatorJailed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "validator", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "validatorMisdemeanor", + "type": "event" + }, + { + "anonymous": false, + "inputs": [], + "name": "validatorSetUpdated", + "type": "event" + }, + { + "inputs": [], + "name": "BIND_CHANNELID", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "BURN_ADDRESS", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "BURN_RATIO_SCALE", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "CODE_OK", + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "CROSS_CHAIN_CONTRACT_ADDR", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "DUSTY_INCOMING", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "EPOCH", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "ERROR_FAIL_CHECK_VALIDATORS", + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "ERROR_FAIL_DECODE", + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "ERROR_LEN_OF_VAL_MISMATCH", + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "ERROR_RELAYFEE_TOO_LARGE", + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "ERROR_UNKNOWN_PACKAGE_TYPE", + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "EXPIRE_TIME_SECOND_GAP", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "GOV_CHANNELID", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "GOV_HUB_ADDR", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "INCENTIVIZE_ADDR", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "INIT_BURN_RATIO", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "INIT_MAINTAIN_SLASH_SCALE", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "INIT_MAX_NUM_OF_MAINTAINING", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "INIT_NUM_OF_CABINETS", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "INIT_VALIDATORSET_BYTES", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "JAIL_MESSAGE_TYPE", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "LIGHT_CLIENT_ADDR", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MAX_NUM_OF_VALIDATORS", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "PRECISION", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "RELAYERHUB_CONTRACT_ADDR", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "SLASH_CHANNELID", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "SLASH_CONTRACT_ADDR", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "STAKING_CHANNELID", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "SYSTEM_ADDRESS", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "SYSTEM_REWARD_ADDR", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "TOKEN_HUB_ADDR", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "TOKEN_MANAGER_ADDR", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "TRANSFER_IN_CHANNELID", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "TRANSFER_OUT_CHANNELID", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "VALIDATORS_UPDATE_MESSAGE_TYPE", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "VALIDATOR_CONTRACT_ADDR", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "alreadyInit", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "bscChainID", + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "burnRatio", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "burnRatioInitialized", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "currentValidatorSet", + "outputs": [ + { + "internalType": "address", + "name": "consensusAddress", + "type": "address" + }, + { + "internalType": "address payable", + "name": "feeAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "BBCFeeAddress", + "type": "address" + }, + { + "internalType": "uint64", + "name": "votingPower", + "type": "uint64" + }, + { + "internalType": "bool", + "name": "jailed", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "incoming", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "currentValidatorSetMap", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "expireTimeSecondGap", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "maintainSlashScale", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "maxNumOfCandidates", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "maxNumOfMaintaining", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "maxNumOfWorkingCandidates", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "numOfCabinets", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "numOfJailed", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "numOfMaintaining", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalInComing", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "valAddr", + "type": "address" + }, + { + "internalType": "address", + "name": "slashAddr", + "type": "address" + }, + { + "internalType": "address", + "name": "rewardAddr", + "type": "address" + }, + { + "internalType": "address", + "name": "lightAddr", + "type": "address" + }, + { + "internalType": "address", + "name": "tokenHubAddr", + "type": "address" + }, + { + "internalType": "address", + "name": "incentivizeAddr", + "type": "address" + }, + { + "internalType": "address", + "name": "relayerHubAddr", + "type": "address" + }, + { + "internalType": "address", + "name": "govHub", + "type": "address" + }, + { + "internalType": "address", + "name": "tokenManagerAddr", + "type": "address" + }, + { + "internalType": "address", + "name": "crossChain", + "type": "address" + } + ], + "name": "updateContractAddr", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "validatorExtraSet", + "outputs": [ + { + "internalType": "uint256", + "name": "enterMaintenanceHeight", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "isMaintaining", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "init", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + }, + { + "internalType": "bytes", + "name": "msgBytes", + "type": "bytes" + } + ], + "name": "handleSynPackage", + "outputs": [ + { + "internalType": "bytes", + "name": "responsePayload", + "type": "bytes" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint8", + "name": "channelId", + "type": "uint8" + }, + { + "internalType": "bytes", + "name": "msgBytes", + "type": "bytes" + } + ], + "name": "handleAckPackage", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint8", + "name": "channelId", + "type": "uint8" + }, + { + "internalType": "bytes", + "name": "msgBytes", + "type": "bytes" + } + ], + "name": "handleFailAckPackage", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "valAddr", + "type": "address" + } + ], + "name": "deposit", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "getMiningValidators", + "outputs": [ + { + "internalType": "address[]", + "name": "", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getValidators", + "outputs": [ + { + "internalType": "address[]", + "name": "", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + } + ], + "name": "isWorkingValidator", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "validator", + "type": "address" + } + ], + "name": "getIncoming", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "validator", + "type": "address" + } + ], + "name": "isCurrentValidator", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "validator", + "type": "address" + } + ], + "name": "misdemeanor", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "validator", + "type": "address" + } + ], + "name": "felony", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_validator", + "type": "address" + } + ], + "name": "getCurrentValidatorIndex", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + } + ], + "name": "canEnterMaintenance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "enterMaintenance", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "exitMaintenance", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "key", + "type": "string" + }, + { + "internalType": "bytes", + "name": "value", + "type": "bytes" + } + ], + "name": "updateParam", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "validator", + "type": "address" + } + ], + "name": "isValidatorExist", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getMaintainingValidators", + "outputs": [ + { + "internalType": "address[]", + "name": "maintainingValidators", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function" + } +] diff --git a/crates/bsc/consensus/src/constants.rs b/crates/bsc/consensus/src/constants.rs new file mode 100644 index 000000000..ce44b7633 --- /dev/null +++ b/crates/bsc/consensus/src/constants.rs @@ -0,0 +1,34 @@ +use reth_primitives::{constants::ETH_TO_WEI, U256}; + +/// Fixed number of extra-data prefix bytes reserved for signer vanity +pub const EXTRA_VANITY_LEN: usize = 32; +/// Fixed number of extra-data prefix bytes reserved for signer vanity add validator num +pub const EXTRA_VANITY_LEN_WITH_VALIDATOR_NUM: usize = 33; +/// Fixed number of extra-data suffix bytes reserved for signer seal +pub const EXTRA_SEAL_LEN: usize = 65; +/// Address length of signer +pub const ADDRESS_LENGTH: usize = 20; +/// BLS public key bytes length +pub const BLS_PUBLIC_KEY_BYTES_LEN: usize = 48; +/// Fixed number of extra-data suffix bytes reserved before Luban validator +pub const EXTRA_VALIDATOR_LEN_BEFORE_LUBAN: usize = ADDRESS_LENGTH; +/// Fixed number of extra-data suffix bytes reserved for Luban validator +pub const EXTRA_VALIDATOR_LEN: usize = EXTRA_VALIDATOR_LEN_BEFORE_LUBAN + BLS_PUBLIC_KEY_BYTES_LEN; +/// Difficulty for INTURN block +pub const DIFF_INTURN: U256 = U256::from_limbs([2u64, 0, 0, 0]); +/// Difficulty for NOTURN block +pub const DIFF_NOTURN: U256 = U256::from_limbs([1u64, 0, 0, 0]); + +/// Reserved gas for system tx +pub const SYSTEM_TXS_GAS: u64 = 20_000_000; +/// The reward percent to system +pub const SYSTEM_REWARD_PERCENT: usize = 4; +/// The max reward in system reward contract +pub const MAX_SYSTEM_REWARD: u128 = 100 * ETH_TO_WEI; +/// The distance to naturally justify a block +pub const NATURALLY_JUSTIFIED_DIST: u64 = 15; +pub const COLLECT_ADDITIONAL_VOTES_REWARD_RATIO: usize = 100; +/// Default delay (per signer) to allow concurrent signers, second +pub(crate) const BACKOFF_TIME_OF_INITIAL: u64 = 1_u64; +/// Random additional delay (per signer) to allow concurrent signers, second +pub(crate) const BACKOFF_TIME_OF_WIGGLE: u64 = 1_u64; diff --git a/crates/bsc/consensus/src/contract_upgrade.rs b/crates/bsc/consensus/src/contract_upgrade.rs new file mode 100644 index 000000000..018a01c47 --- /dev/null +++ b/crates/bsc/consensus/src/contract_upgrade.rs @@ -0,0 +1,276 @@ +use lazy_static::lazy_static; +use reth_consensus::ConsensusError; +use reth_primitives::{revm_primitives::db::Database, BlockNumber, ChainSpec}; +use reth_provider::ProviderFactory; +use std::collections::HashMap; + +#[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd)] +pub struct UpgradeConfig { + pub contract_addr: &'static str, + pub code: &'static str, +} + +pub fn upgrade_build_in_system_contract( + _chain_spec: &ChainSpec, + _block_number: BlockNumber, + _statedb: ProviderFactory, +) -> Result<(), ConsensusError> { + todo!() +} + +pub fn apply_system_contract_upgrade( + _upgrade: &[UpgradeConfig], + _statedb: ProviderFactory, +) -> Result<(), ConsensusError> { + todo!() +} + +// TODO: add system contracts bytecode +lazy_static! { + pub static ref RAMANUJAN_UPGRADE_CONFIG: HashMap> = [( + 97, + vec![ + UpgradeConfig { + contract_addr: "0x0000000000000000000000000000000000001000", + code: "60806040526004361061027d5760003560e01c80639dc092621161014f578063c8509d81116100c1578063eb57e2021161007a578063eb57e20214610940578063eda5868c14610973578063f340fa0114610988578063f9a2bbc7146109ae578063fc3e5908146109c3578063fd6a6879146109d85761027d565b8063c8509d8114610609578063d86222d5146108d7578063daacdb66146108ec578063dc927faf14610901578063e086c7b114610916578063e1c7392a1461092b5761027d565b8063ab51bb9611610113578063ab51bb961461074a578063ac4317511461075f578063ad3c9da61461082a578063b7ab4db51461085d578063bf9f49951461041b578063c81b1662146108c25761027d565b80639dc09262146106cd578063a1a11bf5146106e2578063a5422d5c146106f7578063a78abc161461070c578063aaf5eb68146107355761027d565b80635667515a116101f35780637942fd05116101ac5780637942fd05146105df57806381650b62146105f4578063831d65d114610609578063853230aa1461068e57806386249882146106a357806396713da9146106b85761027d565b80635667515a146105005780635d77156c146105155780636969a25c1461052a5780636e47b482146105a057806370fd5bad146105b557806375d47a0a146105ca5761027d565b80633dffc387116102455780633dffc3871461041b57806343756e5c14610446578063493279b1146104775780634bf6c882146104a357806351e80672146104b8578063565c56b3146104cd5761027d565b80630bee7a67146102825780631182b875146102b05780631ff18069146103aa578063219f22d5146103d157806335409f7f146103e6575b600080fd5b34801561028e57600080fd5b506102976109ed565b6040805163ffffffff9092168252519081900360200190f35b3480156102bc57600080fd5b50610335600480360360408110156102d357600080fd5b60ff8235169190810190604081016020820135600160201b8111156102f757600080fd5b82018360208201111561030957600080fd5b803590602001918460018302840111600160201b8311171561032a57600080fd5b5090925090506109f2565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561036f578181015183820152602001610357565b50505050905090810190601f16801561039c5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156103b657600080fd5b506103bf610bdf565b60408051918252519081900360200190f35b3480156103dd57600080fd5b50610297610be5565b3480156103f257600080fd5b506104196004803603602081101561040957600080fd5b50356001600160a01b0316610bea565b005b34801561042757600080fd5b50610430610efe565b6040805160ff9092168252519081900360200190f35b34801561045257600080fd5b5061045b610f03565b604080516001600160a01b039092168252519081900360200190f35b34801561048357600080fd5b5061048c610f09565b6040805161ffff9092168252519081900360200190f35b3480156104af57600080fd5b50610430610f0e565b3480156104c457600080fd5b5061045b610f13565b3480156104d957600080fd5b506103bf600480360360208110156104f057600080fd5b50356001600160a01b0316610f19565b34801561050c57600080fd5b50610430610f6b565b34801561052157600080fd5b50610297610f70565b34801561053657600080fd5b506105546004803603602081101561054d57600080fd5b5035610f75565b604080516001600160a01b039788168152958716602087015293909516848401526001600160401b0390911660608401521515608083015260a082019290925290519081900360c00190f35b3480156105ac57600080fd5b5061045b610fd9565b3480156105c157600080fd5b50610430610fdf565b3480156105d657600080fd5b5061045b610fe4565b3480156105eb57600080fd5b50610430610fea565b34801561060057600080fd5b50610297610fef565b34801561061557600080fd5b506104196004803603604081101561062c57600080fd5b60ff8235169190810190604081016020820135600160201b81111561065057600080fd5b82018360208201111561066257600080fd5b803590602001918460018302840111600160201b8311171561068357600080fd5b509092509050610ff4565b34801561069a57600080fd5b506103bf6110a7565b3480156106af57600080fd5b506103bf6110ad565b3480156106c457600080fd5b506104306110b3565b3480156106d957600080fd5b5061045b6110b8565b3480156106ee57600080fd5b5061045b6110be565b34801561070357600080fd5b506103356110c4565b34801561071857600080fd5b506107216110e3565b604080519115158252519081900360200190f35b34801561074157600080fd5b506103bf6110ec565b34801561075657600080fd5b50610297610f6b565b34801561076b57600080fd5b506104196004803603604081101561078257600080fd5b810190602081018135600160201b81111561079c57600080fd5b8201836020820111156107ae57600080fd5b803590602001918460018302840111600160201b831117156107cf57600080fd5b919390929091602081019035600160201b8111156107ec57600080fd5b8201836020820111156107fe57600080fd5b803590602001918460018302840111600160201b8311171561081f57600080fd5b5090925090506110f5565b34801561083657600080fd5b506103bf6004803603602081101561084d57600080fd5b50356001600160a01b031661139c565b34801561086957600080fd5b506108726113ae565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156108ae578181015183820152602001610896565b505050509050019250505060405180910390f35b3480156108ce57600080fd5b5061045b6114d4565b3480156108e357600080fd5b506103bf6114da565b3480156108f857600080fd5b506103bf6114e6565b34801561090d57600080fd5b5061045b6114ec565b34801561092257600080fd5b506103bf6114f2565b34801561093757600080fd5b506104196114f7565b34801561094c57600080fd5b506104196004803603602081101561096357600080fd5b50356001600160a01b03166116fa565b34801561097f57600080fd5b506102976118c9565b6104196004803603602081101561099e57600080fd5b50356001600160a01b03166118ce565b3480156109ba57600080fd5b5061045b611b04565b3480156109cf57600080fd5b50610430611b0a565b3480156109e457600080fd5b5061045b611b0f565b606481565b60005460609060ff16610a48576040805162461bcd60e51b81526020600482015260196024820152781d1a194818dbdb9d1c9858dd081b9bdd081a5b9a5d081e595d603a1b604482015290519081900360640190fd5b3361200014610a885760405162461bcd60e51b815260040180806020018281038252602f8152602001806140de602f913960400191505060405180910390fd5b610a90613d69565b6000610ad185858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611b1592505050565b9150915080610aed57610ae46064611c6e565b92505050610bd8565b815160009060ff16610b0d57610b068360200151611ccf565b9050610ba4565b825160ff1660011415610ba057826020015151600114610b7a577f70e72399380dcfb0338abc03dc8d47f9f470ada8e769c9a78d644ea97385ecb2604051808060200182810382526025815260200180613e6c6025913960400191505060405180910390a1506067610b9b565b610b068360200151600081518110610b8e57fe5b6020026020010151612ad5565b610ba4565b5060655b63ffffffff8116610bc95750506040805160008152602081019091529150610bd89050565b610bd281611c6e565b93505050505b9392505050565b60035481565b606881565b3361100114610c2a5760405162461bcd60e51b815260040180806020018281038252602981526020018061413a6029913960400191505060405180910390fd5b6001600160a01b03811660009081526004602052604090205480610c4e5750610efb565b600181039050600060018281548110610c6357fe5b60009182526020909120600360049092020101546001549091506000190180610cb257600060018481548110610c9557fe5b906000526020600020906004020160030181905550505050610efb565b6040805183815290516001600160a01b038616917f3b6f9ef90462b512a1293ecec018670bf7b7f1876fb727590a8a6d7643130a70919081900360200190a26001600160a01b038416600090815260046020526040812055600154600019018314610e3457600180546000198101908110610d2957fe5b906000526020600020906004020160018481548110610d4457fe5b6000918252602082208354600492830290910180546001600160a01b03199081166001600160a01b0393841617825560018087015481840180548416918616919091179055600280880180549185018054909416919095161780835584546001600160401b03600160a01b91829004160267ffffffffffffffff60a01b1990911617808355935460ff600160e01b918290041615150260ff60e01b199094169390931790556003948501549401939093558254868401939192919087908110610e0957fe5b600091825260208083206004909202909101546001600160a01b031683528201929092526040019020555b6001805480610e3f57fe5b60008281526020812060046000199093019283020180546001600160a01b0319908116825560018201805490911690556002810180546001600160e81b03191690556003018190559155818381610e9257fe5b0490508015610ef65760015460005b81811015610ef3578260018281548110610eb757fe5b9060005260206000209060040201600301540160018281548110610ed757fe5b6000918252602090912060036004909202010155600101610ea1565b50505b505050505b50565b600181565b61100181565b606081565b600881565b61200081565b6001600160a01b03811660009081526004602052604081205480610f41576000915050610f66565b600180820381548110610f5057fe5b9060005260206000209060040201600301549150505b919050565b600081565b606781565b60018181548110610f8257fe5b600091825260209091206004909102018054600182015460028301546003909301546001600160a01b0392831694509082169291821691600160a01b81046001600160401b031691600160e01b90910460ff169086565b61100581565b600281565b61100881565b600b81565b606681565b33612000146110345760405162461bcd60e51b815260040180806020018281038252602f8152602001806140de602f913960400191505060405180910390fd5b7f41ce201247b6ceb957dcdb217d0b8acb50b9ea0e12af9af4f5e7f38902101605838383604051808460ff1660ff168152602001806020018281038252848482818152602001925080828437600083820152604051601f909101601f1916909201829003965090945050505050a1505050565b6103e881565b60025481565b600981565b61100781565b61100681565b604051806101e001604052806101b78152602001613f066101b7913981565b60005460ff1681565b6402540be40081565b60005460ff16611148576040805162461bcd60e51b81526020600482015260196024820152781d1a194818dbdb9d1c9858dd081b9bdd081a5b9a5d081e595d603a1b604482015290519081900360640190fd5b33611007146111885760405162461bcd60e51b815260040180806020018281038252602e815260200180613e91602e913960400191505060405180910390fd5b6111f284848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080518082019091526013815272065787069726554696d655365636f6e6447617606c1b60208201529150612c4c9050565b156112cd57602081146112365760405162461bcd60e51b8152600401808060200182810382526026815260200180613ee06026913960400191505060405180910390fd5b604080516020601f840181900481028201810190925282815260009161127491858580838501838280828437600092019190915250612d3492505050565b90506064811015801561128a5750620186a08111155b6112c55760405162461bcd60e51b8152600401808060200182810382526027815260200180613e456027913960400191505060405180910390fd5b60025561130a565b6040805162461bcd60e51b815260206004820152600d60248201526c756e6b6e6f776e20706172616d60981b604482015290519081900360640190fd5b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a848484846040518080602001806020018381038352878782818152602001925080828437600083820152601f01601f191690910184810383528581526020019050858580828437600083820152604051601f909101601f19169092018290039850909650505050505050a150505050565b60046020526000908152604090205481565b6001546060906000805b828110156113ff57600181815481106113cd57fe5b9060005260206000209060040201600201601c9054906101000a900460ff166113f7576001909101905b6001016113b8565b5060608160405190808252806020026020018201604052801561142c578160200160208202803683370190505b50600092509050815b838110156114cc576001818154811061144a57fe5b9060005260206000209060040201600201601c9054906101000a900460ff166114c4576001818154811061147a57fe5b600091825260209091206004909102015482516001600160a01b03909116908390859081106114a557fe5b6001600160a01b03909216602092830291909101909101526001909201915b600101611435565b509250505090565b61100281565b67016345785d8a000081565b60055481565b61100381565b602981565b60005460ff161561154f576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b611557613d69565b600061157d604051806101e001604052806101b78152602001613f066101b79139611b15565b91509150806115bd5760405162461bcd60e51b81526004018080602001828103825260218152602001806140bd6021913960400191505060405180910390fd5b60005b8260200151518110156116e2576001836020015182815181106115df57fe5b60209081029190910181015182546001818101855560009485528385208351600493840290910180546001600160a01b039283166001600160a01b03199182161782558587015182850180549185169183169190911790556040860151600283018054606089015160808a01511515600160e01b0260ff60e01b196001600160401b03909216600160a01b0267ffffffffffffffff60a01b199590981692909516919091179290921694909417161790915560a0909301516003909301929092559186015180519185019391859081106116b557fe5b602090810291909101810151516001600160a01b03168252810191909152604001600020556001016115c0565b50506103e8600255506000805460ff19166001179055565b336110011461173a5760405162461bcd60e51b815260040180806020018281038252602981526020018061413a6029913960400191505060405180910390fd5b6001600160a01b0381166000908152600460205260409020548061175e5750610efb565b60018103905060006001828154811061177357fe5b906000526020600020906004020160030154905060006001838154811061179657fe5b906000526020600020906004020160030181905550600060018080549050039050836001600160a01b03167f8cd4e147d8af98a9e3b6724021b8bf6aed2e5dac71c38f2dce8161b82585b25d836040518082815260200191505060405180910390a28061180557505050610efb565b600081838161181057fe5b0490508015610ef65760005b8481101561186e57816001828154811061183257fe5b906000526020600020906004020160030154016001828154811061185257fe5b600091825260209091206003600490920201015560010161181c565b50600180549085015b81811015610ef357826001828154811061188d57fe5b90600052602060002090600402016003015401600182815481106118ad57fe5b6000918252602090912060036004909202010155600101611877565b606581565b33411461190c5760405162461bcd60e51b815260040180806020018281038252602d81526020018061410d602d913960400191505060405180910390fd5b60005460ff1661195f576040805162461bcd60e51b81526020600482015260196024820152781d1a194818dbdb9d1c9858dd081b9bdd081a5b9a5d081e595d603a1b604482015290519081900360640190fd5b600034116119ac576040805162461bcd60e51b81526020600482015260156024820152746465706f7369742076616c7565206973207a65726f60581b604482015290519081900360640190fd5b6001600160a01b03811660009081526004602052604090205434908015611abf5760006001808303815481106119de57fe5b9060005260206000209060040201905080600201601c9054906101000a900460ff1615611a49576040805184815290516001600160a01b038616917ff177e5d6c5764d79c32883ed824111d9b13f5668cf6ab1cc12dd36791dd955b4919081900360200190a2611ab9565b600354611a5c908463ffffffff612d3916565b6003908155810154611a74908463ffffffff612d3916565b60038201556040805184815290516001600160a01b038616917f93a090ecc682c002995fad3c85b30c5651d7fd29b0be5da9d784a3302aedc055919081900360200190a25b50611aff565b6040805183815290516001600160a01b038516917ff177e5d6c5764d79c32883ed824111d9b13f5668cf6ab1cc12dd36791dd955b4919081900360200190a25b505050565b61100081565b600381565b61100481565b611b1d613d69565b6000611b27613d69565b611b2f613d81565b611b40611b3b86612d93565b612db8565b90506000805b611b4f83612e02565b15611c605780611b7457611b6a611b6584612e23565b612e71565b60ff168452611c58565b8060011415611c53576060611b90611b8b85612e23565b612f28565b90508051604051908082528060200260200182016040528015611bcd57816020015b611bba613da1565b815260200190600190039081611bb25790505b50602086015260005b8151811015611c4857611be7613da1565b6000611c05848481518110611bf857fe5b6020026020010151612ff9565b9150915080611c2257876000995099505050505050505050611c69565b8188602001518481518110611c3357fe5b60209081029190910101525050600101611bd6565b506001925050611c58565b611c60565b600101611b46565b50919350909150505b915091565b604080516001808252818301909252606091829190816020015b6060815260200190600190039081611c88579050509050611cae8363ffffffff166130d6565b81600081518110611cbb57fe5b6020026020010181905250610bd8816130e9565b6000806060611cdd84613173565b9150915081611d8a577f70e72399380dcfb0338abc03dc8d47f9f470ada8e769c9a78d644ea97385ecb2816040518080602001828103825283818151815260200191508051906020019080838360005b83811015611d45578181015183820152602001611d2d565b50505050905090810190601f168015611d725780820380516001836020036101000a031916815260200191505b509250505060405180910390a1606692505050610f66565b600080805b600154811015611e075767016345785d8a000060018281548110611daf57fe5b90600052602060002090600402016003015410611dd157600190920191611dff565b600060018281548110611de057fe5b9060005260206000209060040201600301541115611dff576001909101905b600101611d8f565b50606082604051908082528060200260200182016040528015611e34578160200160208202803683370190505b509050606083604051908082528060200260200182016040528015611e63578160200160208202803683370190505b509050606084604051908082528060200260200182016040528015611e92578160200160208202803683370190505b509050606085604051908082528060200260200182016040528015611ec1578160200160208202803683370190505b5090506000606086604051908082528060200260200182016040528015611ef2578160200160208202803683370190505b509050606087604051908082528060200260200182016040528015611f21578160200160208202803683370190505b509050600098506000975060608d905060006110046001600160a01b031663149d14d96040518163ffffffff1660e01b815260040160206040518083038186803b158015611f6e57600080fd5b505afa158015611f82573d6000803e3d6000fd5b505050506040513d6020811015611f9857600080fd5b5051905067016345785d8a000081111561200d577f70e72399380dcfb0338abc03dc8d47f9f470ada8e769c9a78d644ea97385ecb2604051808060200182810382526021815260200180613ebf6021913960400191505060405180910390a160689d5050505050505050505050505050610f66565b60005b6001548110156122805767016345785d8a00006001828154811061203057fe5b906000526020600020906004020160030154106121b6576001818154811061205457fe5b906000526020600020906004020160020160009054906101000a90046001600160a01b03168a8d8151811061208557fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060006402540be400600183815481106120ba57fe5b906000526020600020906004020160030154816120d357fe5b06600183815481106120e157fe5b906000526020600020906004020160030154039050612109838261325590919063ffffffff16565b8a8e8151811061211557fe5b6020026020010181815250506001828154811061212e57fe5b906000526020600020906004020160020160009054906101000a90046001600160a01b0316888e8151811061215f57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505081898e8151811061218c57fe5b60209081029190910101526121a7878263ffffffff612d3916565b6001909d019c96506122789050565b6000600182815481106121c557fe5b906000526020600020906004020160030154111561227857600181815481106121ea57fe5b906000526020600020906004020160010160009054906101000a90046001600160a01b0316858c8151811061221b57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506001818154811061224857fe5b906000526020600020906004020160030154848c8151811061226657fe5b60209081029190910101526001909a01995b600101612010565b50600085156126be576110046001600160a01b0316636e056520878c8c8b60025442016040518663ffffffff1660e01b815260040180806020018060200180602001856001600160401b03166001600160401b03168152602001848103845288818151815260200191508051906020019060200280838360005b838110156123125781810151838201526020016122fa565b50505050905001848103835287818151815260200191508051906020019060200280838360005b83811015612351578181015183820152602001612339565b50505050905001848103825286818151815260200191508051906020019060200280838360005b83811015612390578181015183820152602001612378565b505050509050019750505050505050506020604051808303818588803b1580156123b957600080fd5b505af1935050505080156123df57506040513d60208110156123da57600080fd5b505160015b61261a576040516000815260443d10156123fb57506000612496565b60046000803e60005160e01c6308c379a0811461241c576000915050612496565b60043d036004833e81513d60248201116001600160401b038211171561244757600092505050612496565b80830180516001600160401b03811115612468576000945050505050612496565b8060208301013d860181111561248657600095505050505050612496565b601f01601f191660405250925050505b806124a15750612545565b60019150867fa7cdeed7d0db45e3219a6e5d60838824c16f1d39991fcfe3f963029c844bf280826040518080602001828103825283818151815260200191508051906020019080838360005b838110156125055781810151838201526020016124ed565b50505050905090810190601f1680156125325780820380516001836020036101000a031916815260200191505b509250505060405180910390a250612615565b3d80801561256f576040519150601f19603f3d011682016040523d82523d6000602084013e612574565b606091505b5060019150867fbfa884552dd8921b6ce90bfe906952ae5b3b29be0cc1a951d4f62697635a3a45826040518080602001828103825283818151815260200191508051906020019080838360005b838110156125d95781810151838201526020016125c1565b50505050905090810190601f1680156126065780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505b6126be565b8015612658576040805188815290517fa217d08e65f80c73121cd9db834d81652d544bfbf452f6d04922b16c90a37b709181900360200190a16126bc565b604080516020808252601b908201527f6261746368207472616e736665722072657475726e2066616c7365000000000081830152905188917fa7cdeed7d0db45e3219a6e5d60838824c16f1d39991fcfe3f963029c844bf280919081900360600190a25b505b80156128745760005b88518110156128725760008982815181106126de57fe5b602002602001015190506000600182815481106126f757fe5b60009182526020909120600160049092020181015481546001600160a01b03909116916108fc918590811061272857fe5b9060005260206000209060040201600301549081150290604051600060405180830381858888f19350505050905080156127e4576001828154811061276957fe5b60009182526020909120600160049092020181015481546001600160a01b03909116917f6c61d60f69a7beb3e1c80db7f39f37b208537cbb19da3174511b477812b2fc7d91859081106127b857fe5b9060005260206000209060040201600301546040518082815260200191505060405180910390a2612868565b600182815481106127f157fe5b60009182526020909120600160049092020181015481546001600160a01b03909116917f25d0ce7d2f0cec669a8c17efe49d195c13455bb8872b65fa610ac7f53fe4ca7d918590811061284057fe5b9060005260206000209060040201600301546040518082815260200191505060405180910390a25b50506001016126c7565b505b8451156129be5760005b85518110156129bc57600086828151811061289557fe5b60200260200101516001600160a01b03166108fc8784815181106128b557fe5b60200260200101519081150290604051600060405180830381858888f193505050509050801561294b578682815181106128eb57fe5b60200260200101516001600160a01b03167f6c61d60f69a7beb3e1c80db7f39f37b208537cbb19da3174511b477812b2fc7d87848151811061292957fe5b60200260200101516040518082815260200191505060405180910390a26129b3565b86828151811061295757fe5b60200260200101516001600160a01b03167f25d0ce7d2f0cec669a8c17efe49d195c13455bb8872b65fa610ac7f53fe4ca7d87848151811061299557fe5b60200260200101516040518082815260200191505060405180910390a25b5060010161287e565b505b4715612a27576040805147815290517f6ecc855f9440a9282c90913bbc91619fd44f5ec0b462af28d127b116f130aa4d9181900360200190a1604051611002904780156108fc02916000818181858888f19350505050158015612a25573d6000803e3d6000fd5b505b60006003819055600555825115612a4157612a4183613297565b6110016001600160a01b031663fc4333cd6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612a7e57600080fd5b505af1158015612a92573d6000803e3d6000fd5b50506040517fedd8d7296956dd970ab4de3f2fc03be2b0ffc615d20cd4c72c6e44f928630ebf925060009150a15060009f9e505050505050505050505050505050565b80516001600160a01b0316600090815260046020526040812054801580612b265750600180820381548110612b0657fe5b9060005260206000209060040201600201601c9054906101000a900460ff165b15612b6c5782516040516001600160a01b03909116907fe209c46bebf57cf265d5d9009a00870e256d9150f3ed5281ab9d9eb3cec6e4be90600090a26000915050610f66565b600154600554600019820111801590612bc25784516040516001600160a01b03909116907fe209c46bebf57cf265d5d9009a00870e256d9150f3ed5281ab9d9eb3cec6e4be90600090a260009350505050610f66565b600580546001908101909155805481906000198601908110612be057fe5b6000918252602082206002600490920201018054921515600160e01b0260ff60e01b199093169290921790915585516040516001600160a01b03909116917ff226e7d8f547ff903d9d419cf5f54e0d7d07efa9584135a53a057c5f1f27f49a91a2506000949350505050565b6000816040516020018082805190602001908083835b60208310612c815780518252601f199092019160209182019101612c62565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120836040516020018082805190602001908083835b60208310612cef5780518252601f199092019160209182019101612cd0565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051602081830303815290604052805190602001201490505b92915050565b015190565b600082820183811015610bd8576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b612d9b613dd6565b506040805180820190915281518152602082810190820152919050565b612dc0613d81565b612dc98261375e565b612dd257600080fd5b6000612de18360200151613798565b60208085015160408051808201909152868152920190820152915050919050565b6000612e0c613dd6565b505080518051602091820151919092015191011190565b612e2b613dd6565b612e3482612e02565b612e3d57600080fd5b60208201516000612e4d826137fb565b80830160209586015260408051808201909152908152938401919091525090919050565b805160009015801590612e8657508151602110155b612e8f57600080fd5b6000612e9e8360200151613798565b90508083600001511015612ef9576040805162461bcd60e51b815260206004820152601a60248201527f6c656e677468206973206c657373207468616e206f6666736574000000000000604482015290519081900360640190fd5b825160208085015183018051928490039291831015612f1f57826020036101000a820491505b50949350505050565b6060612f338261375e565b612f3c57600080fd5b6000612f478361392e565b9050606081604051908082528060200260200182016040528015612f8557816020015b612f72613dd6565b815260200190600190039081612f6a5790505b5090506000612f978560200151613798565b60208601510190506000805b84811015612fee57612fb4836137fb565b9150604051806040016040528083815260200184815250848281518110612fd757fe5b602090810291909101015291810191600101612fa3565b509195945050505050565b613001613da1565b600061300b613da1565b613013613d81565b61301c85612db8565b90506000805b61302b83612e02565b15611c6057806130565761304661304184612e23565b61398a565b6001600160a01b031684526130ce565b806001141561307e5761306b61304184612e23565b6001600160a01b031660208501526130ce565b80600214156130a65761309361304184612e23565b6001600160a01b031660408501526130ce565b8060031415611c53576130bb611b6584612e23565b6001600160401b03166060850152600191505b600101613022565b6060612d2e6130e4836139a4565b613a8a565b606081516000141561310a5750604080516000815260208101909152610f66565b60608260008151811061311957fe5b602002602001015190506000600190505b835181101561315a576131508285838151811061314357fe5b6020026020010151613adc565b915060010161312a565b50610bd861316d825160c060ff16613b59565b82613adc565b600060606029835111156131a5576000604051806060016040528060298152602001613df16029913991509150611c69565b60005b835181101561323b5760005b81811015613232578481815181106131c857fe5b6020026020010151600001516001600160a01b03168583815181106131e957fe5b6020026020010151600001516001600160a01b0316141561322a5760006040518060600160405280602b8152602001613e1a602b9139935093505050611c69565b6001016131b4565b506001016131a8565b505060408051602081019091526000815260019150915091565b6000610bd883836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613c51565b600154815160005b828110156133b45760016132b1613da1565b600183815481106132be57fe5b600091825260208083206040805160c08101825260049490940290910180546001600160a01b0390811685526001820154811693850193909352600281015492831691840191909152600160a01b82046001600160401b03166060840152600160e01b90910460ff16151560808301526003015460a082015291505b848110156133885786818151811061334e57fe5b6020026020010151600001516001600160a01b031682600001516001600160a01b031614156133805760009250613388565b60010161333a565b5081156133aa5780516001600160a01b03166000908152600460205260408120555b505060010161329f565b508082111561342957805b828110156134275760018054806133d257fe5b60008281526020812060046000199093019283020180546001600160a01b03199081168255600182810180549092169091556002820180546001600160e81b03191690556003909101919091559155016133bf565b505b6000818310613438578161343a565b825b905060005b81811015613634576134ec85828151811061345657fe5b60200260200101516001838154811061346b57fe5b60009182526020918290206040805160c08101825260049390930290910180546001600160a01b0390811684526001820154811694840194909452600281015493841691830191909152600160a01b83046001600160401b03166060830152600160e01b90920460ff161515608082015260039091015460a0820152613ce8565b61360757806001016004600087848151811061350457fe5b6020026020010151600001516001600160a01b03166001600160a01b031681526020019081526020016000208190555084818151811061354057fe5b60200260200101516001828154811061355557fe5b6000918252602091829020835160049092020180546001600160a01b039283166001600160a01b0319918216178255928401516001820180549184169185169190911790556040840151600282018054606087015160808801511515600160e01b0260ff60e01b196001600160401b03909216600160a01b0267ffffffffffffffff60a01b1995909716929097169190911792909216939093171692909217905560a09091015160039091015561362c565b60006001828154811061361657fe5b9060005260206000209060040201600301819055505b60010161343f565b508282111561375857825b82811015610ef657600185828151811061365557fe5b60209081029190910181015182546001818101855560009485528385208351600493840290910180546001600160a01b039283166001600160a01b03199182161782559585015181840180549184169188169190911790556040850151600282018054606088015160808901511515600160e01b0260ff60e01b196001600160401b03909216600160a01b0267ffffffffffffffff60a01b199590971692909a169190911792909216939093171695909517905560a0909201516003909301929092558751908401929088908590811061372b57fe5b602090810291909101810151516001600160a01b031682528101919091526040016000205560010161363f565b50505050565b805160009061376f57506000610f66565b6020820151805160001a9060c082101561378e57600092505050610f66565b5060019392505050565b8051600090811a60808110156137b2576000915050610f66565b60b88110806137cd575060c081108015906137cd575060f881105b156137dc576001915050610f66565b60c08110156137f05760b519019050610f66565b60f519019050610f66565b80516000908190811a60808110156138165760019150613927565b60b881101561382b57607e1981019150613927565b60c08110156138a557600060b78203600186019550806020036101000a86510491506001810182019350508083101561389f576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b50613927565b60f88110156138ba5760be1981019150613927565b600060f78203600186019550806020036101000a865104915060018101820193505080831015613925576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b505b5092915050565b805160009061393f57506000610f66565b600080905060006139538460200151613798565b602085015185519181019250015b8082101561398157613972826137fb565b60019093019290910190613961565b50909392505050565b805160009060151461399b57600080fd5b612d2e82612e71565b604080516020808252818301909252606091829190602082018180368337505050602081018490529050600067ffffffffffffffff1984166139e857506018613a0c565b6fffffffffffffffffffffffffffffffff198416613a0857506010613a0c565b5060005b6020811015613a4257818181518110613a2157fe5b01602001516001600160f81b03191615613a3a57613a42565b600101613a0c565b60008160200390506060816040519080825280601f01601f191660200182016040528015613a77576020820181803683370190505b5080830196909652508452509192915050565b606081516001148015613abc5750607f60f81b82600081518110613aaa57fe5b01602001516001600160f81b03191611155b15613ac8575080610f66565b612d2e613ada8351608060ff16613b59565b835b6060806040519050835180825260208201818101602087015b81831015613b0d578051835260209283019201613af5565b50855184518101855292509050808201602086015b81831015613b3a578051835260209283019201613b22565b508651929092011591909101601f01601f191660405250905092915050565b6060680100000000000000008310613ba9576040805162461bcd60e51b815260206004820152600e60248201526d696e70757420746f6f206c6f6e6760901b604482015290519081900360640190fd5b60408051600180825281830190925260609160208201818036833701905050905060378411613c035782840160f81b81600081518110613be557fe5b60200101906001600160f81b031916908160001a9053509050612d2e565b6060613c0e856139a4565b90508381510160370160f81b82600081518110613c2757fe5b60200101906001600160f81b031916908160001a905350613c488282613adc565b95945050505050565b60008184841115613ce05760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613ca5578181015183820152602001613c8d565b50505050905090810190601f168015613cd25780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b805182516000916001600160a01b039182169116148015613d22575081602001516001600160a01b031683602001516001600160a01b0316145b8015613d47575081604001516001600160a01b031683604001516001600160a01b0316145b8015610bd85750506060908101519101516001600160401b0390811691161490565b60408051808201909152600081526060602082015290565b6040518060400160405280613d94613dd6565b8152602001600081525090565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915290565b60405180604001604052806000815260200160008152509056fe746865206e756d626572206f662076616c696461746f72732065786365656420746865206c696d69746475706c696361746520636f6e73656e7375732061646472657373206f662076616c696461746f725365747468652065787069726554696d655365636f6e64476170206973206f7574206f662072616e67656c656e677468206f66206a61696c2076616c696461746f7273206d757374206265206f6e65746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e7472616374666565206973206c6172676572207468616e2044555354595f494e434f4d494e476c656e677468206f662065787069726554696d655365636f6e64476170206d69736d61746368f901b480f901b0f846941284214b9b9c85549ab3d2b972df0deef66ac2c9946ddf42a51534fc98d0c0a3b42c963cace8441ddf9477f066f3fb515bb97015e4b4afddbcb25c94286b86048c27395000f84694b71b214cb885500844365e95cd9942c7276e7fd894d22ca3ba2141d23adab65ce4940eb7665ea2b6a794748c284f46ab87fd492326f1e2fe731d22ad2db386048c27395000f84694a2959d3f95eae5dc7d70144ce1b73b403b7eb6e0948081ef03f1d9e0bb4a5bf38f16285c879299f07f940ce09b38374887cb564b7efa60be130d99ed5f9586048c27395000f84694980a75ecd1309ea12fa2ed87a8744fbfc9b863d594cc6ac05c95a99c1f7b5f88de0e3486c82293b2709407eecf36cf0901fefe4bc505d6ba03c7480c7b5786048c27395000f8469435552c16704d214347f29fa77f77da6d75d7c75294dc4973e838e3949c77aced16ac2315dc2d7ab11194f57d36e129881a3a13a024fe8072507e5b2e70f886048c27395000f84694f474cf03cceff28abc65c9cbae594f725c80e12d94e61a183325a18a173319dd8e19c8d069459e217594ddfcaedf9bb451098c9917a45f02bd61342cca6686048c273950006661696c656420746f20706172736520696e69742076616c696461746f72536574746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e7472616374746865206d6573736167652073656e646572206d7573742062652074686520626c6f636b2070726f6475636572746865206d6573736167652073656e646572206d75737420626520736c61736820636f6e7472616374a26469706673582212203ab4e2f538c9084d689a3e9fdfcee54d2149c820c48e01a03c7f65be805a8edf64736f6c63430006040033", + }, + UpgradeConfig { + contract_addr: "0x0000000000000000000000000000000000001001", + code: "608060405234801561001057600080fd5b50600436106102275760003560e01c8063831d65d111610130578063c80d4b8f116100b8578063e1c7392a1161007c578063e1c7392a146106d9578063f9a2bbc7146106e1578063fc3e5908146106e9578063fc4333cd146106f1578063fd6a6879146106f957610227565b8063c80d4b8f14610623578063c81b16621461062b578063c8509d8114610633578063c96be4cb146106ab578063dc927faf146106d157610227565b8063a1a11bf5116100ff578063a1a11bf514610531578063a78abc1614610539578063ab51bb9614610555578063ac0af6291461055d578063ac4317511461056557610227565b8063831d65d11461049f57806396713da9146105195780639bc8e4f2146105215780639dc092621461052957610227565b80634bf6c882116101b35780636e47b482116101825780636e47b4821461047757806370fd5bad1461047f57806375d47a0a146104875780637912a65d1461048f5780637942fd051461049757610227565b80634bf6c8821461045757806351e806721461045f578063567a372d1461046757806362b72cf51461046f57610227565b806337c8dab9116101fa57806337c8dab9146103b9578063389f4f71146103f85780633dffc3871461041257806343756e5c14610430578063493279b11461043857610227565b80630bee7a671461022c5780631182b8751461024d57806323bac5a21461033a57806335aa2e4414610380575b600080fd5b610234610701565b6040805163ffffffff9092168252519081900360200190f35b6102c56004803603604081101561026357600080fd5b60ff8235169190810190604081016020820135600160201b81111561028757600080fd5b82018360208201111561029957600080fd5b803590602001918460018302840111600160201b831117156102ba57600080fd5b509092509050610706565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102ff5781810151838201526020016102e7565b50505050905090810190601f16801561032c5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6103606004803603602081101561035057600080fd5b50356001600160a01b03166107da565b604080519384526020840192909252151582820152519081900360600190f35b61039d6004803603602081101561039657600080fd5b50356107fd565b604080516001600160a01b039092168252519081900360200190f35b6103df600480360360208110156103cf57600080fd5b50356001600160a01b0316610824565b6040805192835260208301919091528051918290030190f35b61040061087b565b60408051918252519081900360200190f35b61041a610881565b6040805160ff9092168252519081900360200190f35b61039d610886565b61044061088c565b6040805161ffff9092168252519081900360200190f35b61041a610891565b61039d610896565b61040061089c565b6104006108a2565b61039d6108a8565b61041a6108ae565b61039d6108b3565b6104006108b9565b61041a6108be565b610517600480360360408110156104b557600080fd5b60ff8235169190810190604081016020820135600160201b8111156104d957600080fd5b8201836020820111156104eb57600080fd5b803590602001918460018302840111600160201b8311171561050c57600080fd5b5090925090506108c3565b005b61041a610a1e565b610400610a23565b61039d610a2e565b61039d610a34565b610541610a3a565b604080519115158252519081900360200190f35b610234610a43565b610400610a48565b6105176004803603604081101561057b57600080fd5b810190602081018135600160201b81111561059557600080fd5b8201836020820111156105a757600080fd5b803590602001918460018302840111600160201b831117156105c857600080fd5b919390929091602081019035600160201b8111156105e557600080fd5b8201836020820111156105f757600080fd5b803590602001918460018302840111600160201b8311171561061857600080fd5b509092509050610a4d565b610400610e3b565b61039d610e40565b6105176004803603604081101561064957600080fd5b60ff8235169190810190604081016020820135600160201b81111561066d57600080fd5b82018360208201111561067f57600080fd5b803590602001918460018302840111600160201b831117156106a057600080fd5b509092509050610e46565b610517600480360360208110156106c157600080fd5b50356001600160a01b0316610ef9565b61039d61131e565b610517611324565b61039d611395565b61041a61139b565b6105176113a0565b61039d61182b565b606481565b606033612000146107485760405162461bcd60e51b815260040180806020018281038252602f815260200180612282602f913960400191505060405180910390fd5b60005460ff1661078d576040805162461bcd60e51b815260206004820152601960248201526000805160206122de833981519152604482015290519081900360640190fd5b6040805162461bcd60e51b815260206004820152601e60248201527f7265636569766520756e65787065637465642073796e207061636b6167650000604482015290519081900360640190fd5b600260208190526000918252604090912080546001820154919092015460ff1683565b6001818154811061080a57fe5b6000918252602090912001546001600160a01b0316905081565b60008061082f612146565b5050506001600160a01b0316600090815260026020818152604092839020835160608101855281548082526001830154938201849052919093015460ff16151592909301919091529091565b60055481565b600181565b61100181565b606081565b600881565b61200081565b60045481565b60035481565b61100581565b600281565b61100881565b603281565b600b81565b33612000146109035760405162461bcd60e51b815260040180806020018281038252602f815260200180612282602f913960400191505060405180910390fd5b60005460ff16610948576040805162461bcd60e51b815260206004820152601960248201526000805160206122de833981519152604482015290519081900360640190fd5b610950612169565b600061099184848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061183192505050565b9150915080156109db5781516040805163ffffffff9092168252517f7f0956d47419b9525356e7111652b653b530ec6f5096dccc04589bc38e6299679181900360200190a1610a17565b81516040805163ffffffff9092168252517f7d45f62d17443dd4547bca8a8112c60e2385669318dc300ec61a5d2492f262e79181900360200190a15b5050505050565b600981565b662386f26fc1000081565b61100781565b61100681565b60005460ff1681565b600081565b600481565b60005460ff16610a92576040805162461bcd60e51b815260206004820152601960248201526000805160206122de833981519152604482015290519081900360640190fd5b3361100714610ad25760405162461bcd60e51b815260040180806020018281038252602e81526020018061220d602e913960400191505060405180910390fd5b610b3d84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260148152731b5a5cd9195b59585b9bdc951a1c995cda1bdb1960621b602082015291506118b19050565b15610c165760208114610b815760405162461bcd60e51b81526004018080602001828103825260278152602001806121b66027913960400191505060405180910390fd5b604080516020601f8401819004810282018101909252828152600091610bbf9185858083850183828082843760009201919091525061199992505050565b905060018110158015610bd3575060055481105b610c0e5760405162461bcd60e51b815260040180806020018281038252602581526020018061225d6025913960400191505060405180910390fd5b600455610da9565b610c7c84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600f81526e19995b1bdb9e551a1c995cda1bdb19608a1b602082015291506118b19050565b15610d6c5760208114610cc05760405162461bcd60e51b815260040180806020018281038252602281526020018061223b6022913960400191505060405180910390fd5b604080516020601f8401819004810282018101909252828152600091610cfe9185858083850183828082843760009201919091525061199992505050565b90506103e88111158015610d13575060045481115b610d64576040805162461bcd60e51b815260206004820181905260248201527f7468652066656c6f6e795468726573686f6c64206f7574206f662072616e6765604482015290519081900360640190fd5b600555610da9565b6040805162461bcd60e51b815260206004820152600d60248201526c756e6b6e6f776e20706172616d60981b604482015290519081900360640190fd5b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a848484846040518080602001806020018381038352878782818152602001925080828437600083820152601f01601f191690910184810383528581526020019050858580828437600083820152604051601f909101601f19169092018290039850909650505050505050a150505050565b609681565b61100281565b3361200014610e865760405162461bcd60e51b815260040180806020018281038252602f815260200180612282602f913960400191505060405180910390fd5b60005460ff16610ecb576040805162461bcd60e51b815260206004820152601960248201526000805160206122de833981519152604482015290519081900360640190fd5b6040517f07db600eebe2ac176be8dcebad61858c245a4961bb32ca2aa3d159b09aa0810e90600090a1505050565b334114610f375760405162461bcd60e51b815260040180806020018281038252602d8152602001806122b1602d913960400191505060405180910390fd5b60005460ff16610f7c576040805162461bcd60e51b815260206004820152601960248201526000805160206122de833981519152604482015290519081900360640190fd5b6003544311610fd2576040805162461bcd60e51b815260206004820181905260248201527f63616e206e6f7420736c61736820747769636520696e206f6e6520626c6f636b604482015290519081900360640190fd5b3a1561101c576040805162461bcd60e51b81526020600482015260146024820152736761737072696365206973206e6f74207a65726f60601b604482015290519081900360640190fd5b611024612146565b506001600160a01b0381166000908152600260208181526040928390208351606081018552815481526001820154928101929092529091015460ff16158015928201929092529061107f5760208101805160010190526110d8565b60016040820181905260208201819052805480820182556000919091527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf60180546001600160a01b0319166001600160a01b0384161790555b4381526005546020820151816110ea57fe5b0661123c57600060208201819052604080516335409f7f60e01b81526001600160a01b03851660048201529051611000926335409f7f926024808201939182900301818387803b15801561113d57600080fd5b505af1158015611151573d6000803e3d6000fd5b505050506120006001600160a01b031663f7a251d7600b6111718561199e565b60006040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b838110156111d15781810151838201526020016111b9565b50505050905090810190601f1680156111fe5780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b15801561121f57600080fd5b505af1158015611233573d6000803e3d6000fd5b505050506112b2565b60045481602001518161124b57fe5b066112b257604080516375abf10160e11b81526001600160a01b038416600482015290516110009163eb57e20291602480830192600092919082900301818387803b15801561129957600080fd5b505af11580156112ad573d6000803e3d6000fd5b505050505b6001600160a01b0382166000818152600260208181526040808420865181559186015160018301558581015191909201805460ff1916911515919091179055517fddb6012116e51abf5436d956a4f0ebd927e92c576ff96d7918290c8782291e3e9190a2505043600355565b61100381565b60005460ff161561137c576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b603260045560966005556000805460ff19166001179055565b61100081565b600381565b33611000146113e05760405162461bcd60e51b81526004018080602001828103825260308152602001806121dd6030913960400191505060405180910390fd5b60005460ff16611425576040805162461bcd60e51b815260206004820152601960248201526000805160206122de833981519152604482015290519081900360640190fd5b60015461143157611829565b600154600090600019015b8082116117fd576000805b8284101561156057611457612146565b600260006001878154811061146857fe5b60009182526020808320909101546001600160a01b0316835282810193909352604091820190208151606081018352815481526001820154938101939093526002015460ff16151590820152600554909150600490048160200151111561154a576004600554816114d557fe5b048160200151038160200181815250508060026000600188815481106114f757fe5b6000918252602080832091909101546001600160a01b0316835282810193909352604091820190208351815591830151600183015591909101516002909101805460ff1916911515919091179055611554565b6001925050611560565b50600190930192611447565b8284116116f75761156f612146565b600260006001868154811061158057fe5b60009182526020808320909101546001600160a01b0316835282810193909352604091820190208151606081018352815481526001820154938101939093526002015460ff161515908201526005549091506004900481602001511115611668576004600554816115ed57fe5b0481602001510381602001818152505080600260006001878154811061160f57fe5b6000918252602080832091909101546001600160a01b03168352828101939093526040918201902083518155918301516001808401919091559201516002909101805460ff191691151591909117905591506116f79050565b600260006001868154811061167957fe5b60009182526020808320909101546001600160a01b031683528201929092526040018120818155600181810192909255600201805460ff191690558054806116bd57fe5b600082815260209020810160001990810180546001600160a01b0319169055019055836116ea57506116f7565b5060001990920191611560565b8180156117015750805b156117e057600260006001868154811061171757fe5b60009182526020808320909101546001600160a01b031683528201929092526040018120818155600181810192909255600201805460ff1916905580548490811061175e57fe5b600091825260209091200154600180546001600160a01b03909216918690811061178457fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060018054806117bd57fe5b600082815260209020810160001990810180546001600160a01b03191690550190555b826117ec5750506117fd565b50506001909101906000190161143c565b6040517fcfdb3b6ccaeccbdc68be3c59c840e3b3c90f0a7c491f5fff1cf56cfda200dd9c90600090a150505b565b61100481565b611839612169565b6000611843612169565b61184b61217b565b61185c61185786611a70565b611a95565b90506000805b61186b83611adf565b156118a457806118975761188661188184611b00565b611b4e565b63ffffffff1684526001915061189c565b6118a4565b600101611862565b5091935090915050915091565b6000816040516020018082805190602001908083835b602083106118e65780518252601f1990920191602091820191016118c7565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120836040516020018082805190602001908083835b602083106119545780518252601f199092019160209182019101611935565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051602081830303815290604052805190602001201490505b92915050565b015190565b60408051600480825260a08201909252606091829190816020015b60608152602001906001900390816119b95790505090506119e2836001600160a01b0316611c05565b816000815181106119ef57fe5b6020026020010181905250611a0343611c28565b81600181518110611a1057fe5b6020908102919091010152611a256060611c28565b81600281518110611a3257fe5b6020026020010181905250611a4642611c28565b81600381518110611a5357fe5b6020026020010181905250611a6781611c3b565b9150505b919050565b611a7861219b565b506040805180820190915281518152602082810190820152919050565b611a9d61217b565b611aa682611cc5565b611aaf57600080fd5b6000611abe8360200151611cff565b60208085015160408051808201909152868152920190820152915050919050565b6000611ae961219b565b505080518051602091820151919092015191011190565b611b0861219b565b611b1182611adf565b611b1a57600080fd5b60208201516000611b2a82611d62565b80830160209586015260408051808201909152908152938401919091525090919050565b805160009015801590611b6357508151602110155b611b6c57600080fd5b6000611b7b8360200151611cff565b90508083600001511015611bd6576040805162461bcd60e51b815260206004820152601a60248201527f6c656e677468206973206c657373207468616e206f6666736574000000000000604482015290519081900360640190fd5b825160208085015183018051928490039291831015611bfc57826020036101000a820491505b50949350505050565b60408051600560a21b8318601482015260348101909152606090611a6781611e95565b6060611993611c3683611eeb565b611e95565b6060815160001415611c5c5750604080516000815260208101909152611a6b565b606082600081518110611c6b57fe5b602002602001015190506000600190505b8351811015611cac57611ca282858381518110611c9557fe5b6020026020010151611fd1565b9150600101611c7c565b50611a67611cbf825160c060ff1661204e565b82611fd1565b8051600090611cd657506000611a6b565b6020820151805160001a9060c0821015611cf557600092505050611a6b565b5060019392505050565b8051600090811a6080811015611d19576000915050611a6b565b60b8811080611d34575060c08110801590611d34575060f881105b15611d43576001915050611a6b565b60c0811015611d575760b519019050611a6b565b60f519019050611a6b565b80516000908190811a6080811015611d7d5760019150611e8e565b60b8811015611d9257607e1981019150611e8e565b60c0811015611e0c57600060b78203600186019550806020036101000a865104915060018101820193505080831015611e06576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b50611e8e565b60f8811015611e215760be1981019150611e8e565b600060f78203600186019550806020036101000a865104915060018101820193505080831015611e8c576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b505b5092915050565b606081516001148015611ec75750607f60f81b82600081518110611eb557fe5b01602001516001600160f81b03191611155b15611ed3575080611a6b565b611993611ee58351608060ff1661204e565b83611fd1565b604080516020808252818301909252606091829190602082018180368337505050602081018490529050600067ffffffffffffffff198416611f2f57506018611f53565b6fffffffffffffffffffffffffffffffff198416611f4f57506010611f53565b5060005b6020811015611f8957818181518110611f6857fe5b01602001516001600160f81b03191615611f8157611f89565b600101611f53565b60008160200390506060816040519080825280601f01601f191660200182016040528015611fbe576020820181803683370190505b5080830196909652508452509192915050565b6060806040519050835180825260208201818101602087015b81831015612002578051835260209283019201611fea565b50855184518101855292509050808201602086015b8183101561202f578051835260209283019201612017565b508651929092011591909101601f01601f191660405250905092915050565b606068010000000000000000831061209e576040805162461bcd60e51b815260206004820152600e60248201526d696e70757420746f6f206c6f6e6760901b604482015290519081900360640190fd5b604080516001808252818301909252606091602082018180368337019050509050603784116120f85782840160f81b816000815181106120da57fe5b60200101906001600160f81b031916908160001a9053509050611993565b606061210385611eeb565b90508381510160370160f81b8260008151811061211c57fe5b60200101906001600160f81b031916908160001a90535061213d8282611fd1565b95945050505050565b604051806060016040528060008152602001600081526020016000151581525090565b60408051602081019091526000815290565b604051806040016040528061218e61219b565b8152602001600081525090565b60405180604001604052806000815260200160008152509056fe6c656e677468206f66206d697364656d65616e6f725468726573686f6c64206d69736d61746368746865206d6573736167652073656e646572206d7573742062652076616c696461746f7253657420636f6e7472616374746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e74726163746c656e677468206f662066656c6f6e795468726573686f6c64206d69736d61746368746865206d697364656d65616e6f725468726573686f6c64206f7574206f662072616e6765746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e7472616374746865206d6573736167652073656e646572206d7573742062652074686520626c6f636b2070726f647563657274686520636f6e7472616374206e6f7420696e69742079657400000000000000a26469706673582212204ff575d7be356d691e7b7eae41716a4ccc366ec84f8235486e935261df61a18a64736f6c63430006040033", + }, + UpgradeConfig { + contract_addr: "0x0000000000000000000000000000000000001002", + code: "60806040526004361061014f5760003560e01c806396713da9116100b6578063c81b16621161006f578063c81b1662146103dc578063dc927faf146103f1578063f9a2bbc714610406578063fb5478b31461041b578063fc3e590814610430578063fd6a68791461044557610193565b806396713da91461033a5780639a99b4f01461034f5780639dc0926214610388578063a1a11bf51461039d578063a78abc16146103b2578063ab51bb96146103c757610193565b806351e806721161010857806351e806721461028a5780636d70f7ae1461029f5780636e47b482146102e657806370fd5bad146102fb57806375d47a0a146103105780637942fd051461032557610193565b80630bee7a67146101985780633a0b0eff146101c65780633dffc387146101ed57806343756e5c14610218578063493279b1146102495780634bf6c8821461027557610193565b366101935734156101915760408051348152905133917f6c98249d85d88c3753a04a22230f595e4dc8d3dc86c34af35deeeedc861b89db919081900360200190a25b005b600080fd5b3480156101a457600080fd5b506101ad61045a565b6040805163ffffffff9092168252519081900360200190f35b3480156101d257600080fd5b506101db61045f565b60408051918252519081900360200190f35b3480156101f957600080fd5b50610202610465565b6040805160ff9092168252519081900360200190f35b34801561022457600080fd5b5061022d61046a565b604080516001600160a01b039092168252519081900360200190f35b34801561025557600080fd5b5061025e610470565b6040805161ffff9092168252519081900360200190f35b34801561028157600080fd5b50610202610475565b34801561029657600080fd5b5061022d61047a565b3480156102ab57600080fd5b506102d2600480360360208110156102c257600080fd5b50356001600160a01b0316610480565b604080519115158252519081900360200190f35b3480156102f257600080fd5b5061022d61049e565b34801561030757600080fd5b506102026104a4565b34801561031c57600080fd5b5061022d6104a9565b34801561033157600080fd5b506102026104af565b34801561034657600080fd5b506102026104b4565b34801561035b57600080fd5b506101db6004803603604081101561037257600080fd5b506001600160a01b0381351690602001356104b9565b34801561039457600080fd5b5061022d610664565b3480156103a957600080fd5b5061022d61066a565b3480156103be57600080fd5b506102d2610670565b3480156103d357600080fd5b506101ad610679565b3480156103e857600080fd5b5061022d61067e565b3480156103fd57600080fd5b5061022d610684565b34801561041257600080fd5b5061022d61068a565b34801561042757600080fd5b506101db610690565b34801561043c57600080fd5b5061020261069c565b34801561045157600080fd5b5061022d6106a1565b606481565b60015481565b600181565b61100181565b606081565b600881565b61200081565b6001600160a01b031660009081526002602052604090205460ff1690565b61100581565b600281565b61100881565b600b81565b600981565b6000805460ff1661053657600260208190527fe57bda0a954a7c7381b17b2c763e646ba2c60f67292d287ba583603e2c1c41668054600160ff19918216811790925561100560009081527fe25235fc0de9d7165652bef0846fefda506174abb9a190f03d0f7bcc6146dbce80548316841790559282558254161790555b3360009081526002602052604090205460ff166105845760405162461bcd60e51b815260040180806020018281038252602b8152602001806106a8602b913960400191505060405180910390fd5b60004783106105935747610595565b825b9050670de0b6b3a76400008111156105b25750670de0b6b3a76400005b8015610633576040516001600160a01b0385169082156108fc029083906000818181858888f193505050501580156105ee573d6000803e3d6000fd5b506040805182815290516001600160a01b038616917ff8b71c64315fc33b2ead2adfa487955065152a8ac33d9d5193aafd7f45dc15a0919081900360200190a261065d565b6040517fe589651933c2457488cc0d8e0941518abf748e799435e4e396d9c4d0b2db2d4d90600090a15b9392505050565b61100781565b61100681565b60005460ff1681565b600081565b61100281565b61100381565b61100081565b670de0b6b3a764000081565b600381565b6110048156fe6f6e6c79206f70657261746f7220697320616c6c6f77656420746f2063616c6c20746865206d6574686f64a2646970667358221220d0a7618a32d393c0757994fad066c9aaf7342a982498e0748019ec232f5dc86764736f6c63430006040033", + }, + UpgradeConfig { + contract_addr: "0x0000000000000000000000000000000000001003", + code: "608060405234801561001057600080fd5b50600436106102115760003560e01c8063a78abc1611610125578063dda83148116100ad578063e405bbc31161007c578063e405bbc314610681578063ea54b2aa14610689578063f9a2bbc714610691578063fc3e590814610699578063fd6a6879146106a157610211565b8063dda8314814610609578063df5fe7041461062f578063e1c7392a14610655578063e2761af01461065d57610211565b8063c81b1662116100f4578063c81b166214610534578063cba510a91461053c578063d816987914610562578063da8d08f0146105db578063dc927faf1461060157610211565b8063a78abc1614610444578063ab51bb9614610460578063ac43175114610468578063adc879e91461052c57610211565b8063564b81ef116101a857806375d47a0a1161017757806375d47a0a1461041c5780637942fd051461042457806396713da91461042c5780639dc0926214610434578063a1a11bf51461043c57610211565b8063564b81ef146102ca5780635c5ae8db146103475780636e47b4821461040c57806370fd5bad1461041457610211565b806343756e5c116101e457806343756e5c14610277578063493279b11461029b5780634bf6c882146102ba57806351e80672146102c257610211565b80630bee7a67146102165780632657e9b61461023757806333f7798d146102515780633dffc38714610259575b600080fd5b61021e6106a9565b6040805163ffffffff9092168252519081900360200190f35b61023f6106ae565b60408051918252519081900360200190f35b61023f6106b9565b6102616106bf565b6040805160ff9092168252519081900360200190f35b61027f6106c4565b604080516001600160a01b039092168252519081900360200190f35b6102a36106ca565b6040805161ffff9092168252519081900360200190f35b6102616106cf565b61027f6106d4565b6102d26106da565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561030c5781810151838201526020016102f4565b50505050905090810190601f1680156103395780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61036d6004803603602081101561035d57600080fd5b50356001600160401b03166107e6565b60405180856001600160401b03166001600160401b0316815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156103ce5781810151838201526020016103b6565b50505050905090810190601f1680156103fb5780820380516001836020036101000a031916815260200191505b509550505050505060405180910390f35b61027f6108a1565b6102616108a7565b61027f6108ac565b6102616108b2565b6102616108b7565b61027f6108bc565b61027f6108c2565b61044c6108c8565b604080519115158252519081900360200190f35b61021e6108d1565b61052a6004803603604081101561047e57600080fd5b81019060208101813564010000000081111561049957600080fd5b8201836020820111156104ab57600080fd5b803590602001918460018302840111640100000000831117156104cd57600080fd5b9193909290916020810190356401000000008111156104eb57600080fd5b8201836020820111156104fd57600080fd5b8035906020019184600183028401116401000000008311171561051f57600080fd5b5090925090506108d6565b005b61023f610b8f565b61027f610b95565b61023f6004803603602081101561055257600080fd5b50356001600160401b0316610b9b565b61044c6004803603604081101561057857600080fd5b81019060208101813564010000000081111561059357600080fd5b8201836020820111156105a557600080fd5b803590602001918460018302840111640100000000831117156105c757600080fd5b9193509150356001600160401b0316610bba565b61027f600480360360208110156105f157600080fd5b50356001600160401b031661139b565b61027f6113b6565b61027f6004803603602081101561061f57600080fd5b50356001600160401b03166113bc565b61044c6004803603602081101561064557600080fd5b50356001600160401b03166113e0565b61052a611422565b6106656115c7565b604080516001600160401b039092168252519081900360200190f35b6106656115d6565b6102d26115ec565b61027f611609565b61026161160f565b61027f611614565b606481565b662386f26fc1000081565b60055481565b600181565b61100181565b606081565b600881565b61200081565b604080516020808252818301909252606091829190602082018180368337505060045460208301525090506000805b60208160ff16101561075057828160ff168151811061072457fe5b01602001516001600160f81b0319161561074357600190910190610748565b610750565b600101610709565b5060608160ff166040519080825280601f01601f191660200182016040528015610781576020820181803683370190505b50905060005b8260ff168160ff1610156107dd57838160ff16815181106107a457fe5b602001015160f81c60f81b828260ff16815181106107be57fe5b60200101906001600160f81b031916908160001a905350600101610787565b50925050505b90565b60016020818152600092835260409283902080548184015460028084015460038501805489516101009982161599909902600019011692909204601f81018790048702880187019098528787526001600160401b0390931696919592949091908301828280156108975780601f1061086c57610100808354040283529160200191610897565b820191906000526020600020905b81548152906001019060200180831161087a57829003601f168201915b5050505050905084565b61100581565b600281565b61100881565b600b81565b600981565b61100781565b61100681565b60005460ff1681565b600081565b60005460ff1661092d576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e7472616374206e6f7420696e69742079657400000000000000604482015290519081900360640190fd5b336110071461096d5760405162461bcd60e51b815260040180806020018281038252602e815260200180611ac6602e913960400191505060405180910390fd5b6109e184848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601b81527f726577617264466f7256616c696461746f725365744368616e676500000000006020820152915061161a9050565b15610ac05760208114610a255760405162461bcd60e51b815260040180806020018281038252602e815260200180611a65602e913960400191505060405180910390fd5b604080516020601f8401819004810282018101909252828152600091610a639185858083850183828082843760009201919091525061170192505050565b9050600081118015610a7d5750670de0b6b3a76400008111155b610ab85760405162461bcd60e51b815260040180806020018281038252602f815260200180611af4602f913960400191505060405180910390fd5b600555610afd565b6040805162461bcd60e51b815260206004820152600d60248201526c756e6b6e6f776e20706172616d60981b604482015290519081900360640190fd5b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a848484846040518080602001806020018381038352878782818152602001925080828437600083820152601f01601f191690910184810383528581526020019050858580828437600083820152604051601f909101601f19169092018290039850909650505050505050a150505050565b60045481565b61100281565b6001600160401b03166000908152600160208190526040909120015490565b60408051630a83aaa960e31b815233600482015290516000916110069163541d554891602480820192602092909190829003018186803b158015610bfd57600080fd5b505afa158015610c11573d6000803e3d6000fd5b505050506040513d6020811015610c2757600080fd5b5051610c7a576040805162461bcd60e51b815260206004820152601f60248201527f746865206d73672073656e646572206973206e6f7420612072656c6179657200604482015290519081900360640190fd5b6001600160401b0382166000908152600260205260409020546001600160a01b031615610cee576040805162461bcd60e51b815260206004820152601c60248201527f63616e27742073796e63206475706c6963617465642068656164657200000000604482015290519081900360640190fd5b6003546001600160401b0390811690831611610d3b5760405162461bcd60e51b8152600401808060200182810382526026815260200180611b236026913960400191505060405180910390fd5b600354600160401b90046001600160401b0316610d56611863565b6001600160401b0382811660009081526001602081815260409283902083516080810185528154909516855280830154858301526002808201548686015260038201805486516101009682161596909602600019011691909104601f81018490048402850184019095528484529093606086019392830182828015610e1c5780601f10610df157610100808354040283529160200191610e1c565b820191906000526020600020905b815481529060010190602001808311610dff57829003601f168201915b50505050508152505090505b836001600160401b0316826001600160401b031610158015610e5957506003546001600160401b0390811690831610155b15610f3a5780516001600160401b0380821660009081526001602081815260409283902083516080810185528154909516855280830154858301526002808201548686015260038201805486516101009682161596909602600019011691909104601f8101849004840285018401909552848452959750939460608601939091830182828015610f2a5780601f10610eff57610100808354040283529160200191610f2a565b820191906000526020600020905b815481529060010190602001808311610f0d57829003601f168201915b5050505050815250509050610e28565b6060810151516110315780516001600160401b03811660009081526001602081815260409283902060030180548451600294821615610100026000190190911693909304601f810183900483028401830190945283835293955090929190830182828015610fe95780601f10610fbe57610100808354040283529160200191610fe9565b820191906000526020600020905b815481529060010190602001808311610fcc57829003601f168201915b505050506060830182905250516110315760405162461bcd60e51b8152600401808060200182810382526021815260200180611a446021913960400191505060405180910390fd5b6000816060015151608801905060608787905082016040519080825280601f01601f191660200182016040528015611070576020820181803683370190505b509050600061107e82611706565b905061108c8486838661170c565b6110c75760405162461bcd60e51b81526004018080602001828103825260238152602001806119416023913960400191505060405180910390fd5b6000838201915061110d8a8a8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061177892505050565b9450905061111c818386611782565b8251602001935061112b611889565b6110008186866064600019fa61114057600080fd5b805194506000600160f81b8616156111cf5750600554604080516309a99b4f60e41b815233600482015260248101929092525160019161100291639a99b4f0916044808201926020929091908290030181600087803b1580156111a257600080fd5b505af11580156111b6573d6000803e3d6000fd5b505050506040513d60208110156111cc57600080fd5b50505b856001600160401b0316955060208201935060006111ef858884156117c3565b90985090506001600160401b03808216908c161461123e5760405162461bcd60e51b8152600401808060200182810382526033815260200180611a936033913960400191505060405180910390fd5b6001600160401b03808c16600081815260026020818152604080842080546001600160a01b031916331790558e86168e529383526001808252928490208d518154961667ffffffffffffffff199096169590951785558c81015192850192909255918b01519183019190915560608a015180518b93926112c59260038501929101906118a8565b50506003546001600160401b03600160401b9091048116908d161115905061130d576003805467ffffffffffffffff60401b1916600160401b6001600160401b038e16021790555b7f4042c1020a8f410fb1c8859d276ab436aeb2c3074960e48467299cf1c966d3b48b8a8a602001518560405180856001600160401b03166001600160401b03168152602001846001600160401b03166001600160401b031681526020018381526020018215151515815260200194505050505060405180910390a15060019c9b505050505050505050505050565b6002602052600090815260409020546001600160a01b031681565b61100381565b6001600160401b03166000908152600260205260409020546001600160a01b031690565b6001600160401b0381166000908152600260205260408120546001600160a01b031615158061141c57506003546001600160401b038381169116145b92915050565b60005460ff161561147a576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b60008061149f60405180610100016040528060e0815260200161196460e09139611778565b815160045590925090506114b1611863565b60006114bf848460006117c3565b60008083526001600160401b038281168252600160208181526040938490208651815467ffffffffffffffff191694169390931783558086015191830191909155918401516002820155606084015180519496509294508593909261152b9260038501929101906118a8565b50506003805467ffffffffffffffff19166001600160401b0384811691821767ffffffffffffffff60401b1916600160401b9290920291909117918290556000805460ff19166001179055662386f26fc10000600555602085810151604080519490931684529083015280517f5ac9b37d571677b80957ca05693f371526c602fd08042b416a29fdab7efefa499350918290030190a150505050565b6003546001600160401b031681565b600354600160401b90046001600160401b031681565b60405180610100016040528060e0815260200161196460e0913981565b61100081565b600381565b61100481565b6000816040516020018082805190602001908083835b6020831061164f5780518252601f199092019160209182019101611630565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120836040516020018082805190602001908083835b602083106116bd5780518252601f19909201916020918201910161169e565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040528051906020012014905092915050565b015190565b60200190565b600084606001515182840103925060008061172a8760600151611778565b909250905061173a828683611782565b5050506040840151601f1983810191909152602090940151603f19830152605f19820192909252600454606719820152910160871990910152600190565b8051602090910191565b5b602081106117a2578251825260209283019290910190601f1901611783565b915181516020939093036101000a6000190180199091169216919091179052565b6117cb611863565b60088401516028850151604890950180519095600092916117ea611863565b6020810183905260408101829052866118555760008060688a036040519080825280601f01601f19166020018201604052801561182e576020820181803683370190505b506060840181905261183f90611778565b909250905061185260208c018383611782565b50505b989297509195505050505050565b604080516080810182526000808252602082018190529181019190915260608082015290565b6040518061100001604052806080906020820280368337509192915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106118e957805160ff1916838001178555611916565b82800160010185558215611916579182015b828111156119165782518255916020019190600101906118fb565b50611922929150611926565b5090565b6107e391905b80821115611922576000815560010161192c56fe6661696c656420746f2073657269616c697a6520636f6e73656e73757320737461746542696e616e63652d436861696e2d47616e67657300000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000aea1ac326886b992a991d21a6eb155f41b77867cbf659e78f31d89d8205122a84d1be64f0e9a466c2e66a53433928192783e29f8fa21beb2133499b5ef770f60000000e8d4a5100099308aa365c40554bc89982af505d85da95251445d5dd4a9bb37dd2584fd92d3000000e8d4a5100001776920ff0b0f38d78cf95c033c21adf7045785114e392a7544179652e0a612000000e8d4a510006661696c656420746f206c6f61642076616c696461746f722073657420646174616c656e677468206f6620726577617264466f7256616c696461746f725365744368616e6765206d69736d617463686865616465722068656967687420646f65736e277420657175616c20746f207468652073706563696669656420686569676874746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e7472616374746865206e6577526577617264466f7256616c696461746f725365744368616e6765206f7574206f662072616e676563616e27742073796e6320686561646572206265666f726520696e697469616c486569676874a26469706673582212205276b0300b4926074c5521abe49ba680eda1820c6f75c2779994658ed250924164736f6c63430006040033", + }, + UpgradeConfig { + contract_addr: "0x0000000000000000000000000000000000001004", + code: "60806040526004361061031e5760003560e01c80639a99b4f0116101ab578063bd466461116100f7578063f014847211610095578063fc1a598f1161006f578063fc1a598f14610cb3578063fc3e5908146109c9578063fd6a687914610ce6578063ff9c0027146107c757610366565b8063f014847214610c74578063f9a2bbc714610c89578063fa9e915914610c9e57610366565b8063dc6f5e90116100d1578063dc6f5e90146109c9578063dc927faf14610c35578063e1c7392a14610c4a578063ebf71d5314610c5f57610366565b8063bd46646114610b68578063c81b166214610b9b578063c8509d8114610bb057610366565b8063a7c9f02d11610164578063ac4317511161013e578063ac43175114610a3a578063b770186114610b05578063b99328c514610b1a578063b9fd21e314610b5357610366565b8063a7c9f02d146109c9578063aa7415f5146109de578063ab51bb9614610a2557610366565b80639a99b4f0146109095780639dc0926214610942578063a1a11bf514610957578063a496fba21461096c578063a5cd588b14610981578063a78abc16146109b457610366565b80635d499b1b1161026a57806375d47a0a116102235780638b87b21f116101fd5780638b87b21f146105b25780638eff336c146108a057806396713da9146108df5780639a854bbd146108f457610366565b806375d47a0a146107f15780637942fd0514610806578063831d65d11461081b57610366565b80635d499b1b14610671578063613684751461036b5780636e056520146106865780636e47b482146107b257806370fd5bad146107c757806371d30863146107dc57610366565b806343756e5c116102d75780634bf6c882116102b15780634bf6c8821461036b57806350432d321461061d57806351e806721461063257806359b927891461064757610366565b806343756e5c146105c757806343a368b9146105dc578063493279b1146105f157610366565b8063077b8f351461036b5780630bee7a67146103965780631182b875146103c4578063149d14d9146104be5780633d713223146104e55780633dffc387146105b257610366565b36610366573415610364576040805133815234602082015281517f6c98249d85d88c3753a04a22230f595e4dc8d3dc86c34af35deeeedc861b89db929181900390910190a15b005b600080fd5b34801561037757600080fd5b50610380610cfb565b6040805160ff9092168252519081900360200190f35b3480156103a257600080fd5b506103ab610d00565b6040805163ffffffff9092168252519081900360200190f35b3480156103d057600080fd5b50610449600480360360408110156103e757600080fd5b60ff8235169190810190604081016020820135600160201b81111561040b57600080fd5b82018360208201111561041d57600080fd5b803590602001918460018302840111600160201b8311171561043e57600080fd5b509092509050610d05565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561048357818101518382015260200161046b565b50505050905090810190601f1680156104b05780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156104ca57600080fd5b506104d3610e33565b60408051918252519081900360200190f35b3480156104f157600080fd5b506105966004803603602081101561050857600080fd5b810190602081018135600160201b81111561052257600080fd5b82018360208201111561053457600080fd5b803590602001918460018302840111600160201b8311171561055557600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610e39945050505050565b604080516001600160a01b039092168252519081900360200190f35b3480156105be57600080fd5b50610380610e5d565b3480156105d357600080fd5b50610596610e62565b3480156105e857600080fd5b506104d3610e68565b3480156105fd57600080fd5b50610606610e74565b6040805161ffff9092168252519081900360200190f35b34801561062957600080fd5b506104d3610e79565b34801561063e57600080fd5b50610596610e84565b34801561065357600080fd5b506105966004803603602081101561066a57600080fd5b5035610e8a565b34801561067d57600080fd5b506104d3610ea5565b61079e6004803603608081101561069c57600080fd5b810190602081018135600160201b8111156106b657600080fd5b8201836020820111156106c857600080fd5b803590602001918460208302840111600160201b831117156106e957600080fd5b919390929091602081019035600160201b81111561070657600080fd5b82018360208201111561071857600080fd5b803590602001918460208302840111600160201b8311171561073957600080fd5b919390929091602081019035600160201b81111561075657600080fd5b82018360208201111561076857600080fd5b803590602001918460208302840111600160201b8311171561078957600080fd5b91935091503567ffffffffffffffff16610eae565b604080519115158252519081900360200190f35b3480156107be57600080fd5b50610596611383565b3480156107d357600080fd5b50610380611389565b3480156107e857600080fd5b506104d361138e565b3480156107fd57600080fd5b50610596611394565b34801561081257600080fd5b5061038061139a565b34801561082757600080fd5b506103646004803603604081101561083e57600080fd5b60ff8235169190810190604081016020820135600160201b81111561086257600080fd5b82018360208201111561087457600080fd5b803590602001918460018302840111600160201b8311171561089557600080fd5b50909250905061139f565b3480156108ac57600080fd5b50610364600480360360608110156108c357600080fd5b508035906001600160a01b0360208201351690604001356114e8565b3480156108eb57600080fd5b5061038061156e565b34801561090057600080fd5b506104d3611573565b34801561091557600080fd5b506104d36004803603604081101561092c57600080fd5b506001600160a01b03813516906020013561157f565b34801561094e57600080fd5b506105966116bd565b34801561096357600080fd5b506105966116c3565b34801561097857600080fd5b506103806116c9565b34801561098d57600080fd5b506104d3600480360360208110156109a457600080fd5b50356001600160a01b03166116ce565b3480156109c057600080fd5b5061079e6116e0565b3480156109d557600080fd5b506103806116e9565b61079e600480360360808110156109f457600080fd5b5080356001600160a01b03908116916020810135909116906040810135906060013567ffffffffffffffff166116ee565b348015610a3157600080fd5b506103ab6116c9565b348015610a4657600080fd5b5061036460048036036040811015610a5d57600080fd5b810190602081018135600160201b811115610a7757600080fd5b820183602082011115610a8957600080fd5b803590602001918460018302840111600160201b83111715610aaa57600080fd5b919390929091602081019035600160201b811115610ac757600080fd5b820183602082011115610ad957600080fd5b803590602001918460018302840111600160201b83111715610afa57600080fd5b509092509050611daf565b348015610b1157600080fd5b506104d361201e565b348015610b2657600080fd5b5061036460048036036040811015610b3d57600080fd5b50803590602001356001600160a01b0316612024565b348015610b5f57600080fd5b506104d361209a565b348015610b7457600080fd5b506104d360048036036020811015610b8b57600080fd5b50356001600160a01b03166120a4565b348015610ba757600080fd5b506105966120bf565b348015610bbc57600080fd5b5061036460048036036040811015610bd357600080fd5b60ff8235169190810190604081016020820135600160201b811115610bf757600080fd5b820183602082011115610c0957600080fd5b803590602001918460018302840111600160201b83111715610c2a57600080fd5b5090925090506120c5565b348015610c4157600080fd5b50610596612195565b348015610c5657600080fd5b5061036461219b565b348015610c6b57600080fd5b5061038061223b565b348015610c8057600080fd5b50610380612240565b348015610c9557600080fd5b50610596612245565b348015610caa57600080fd5b506104d361224b565b348015610cbf57600080fd5b5061044960048036036020811015610cd657600080fd5b50356001600160a01b0316612251565b348015610cf257600080fd5b50610596612378565b600881565b606481565b60005460609060ff16610d4d576040805162461bcd60e51b815260206004820152601960248201526000805160206147bf833981519152604482015290519081900360640190fd5b3361200014610d8d5760405162461bcd60e51b815260040180806020018281038252602f81526020018061476d602f913960400191505060405180910390fd5b60ff841660021415610ddf57610dd883838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061237e92505050565b9050610e2c565b6040805162461bcd60e51b815260206004820152601860248201527f756e7265636f676e697a65642073796e207061636b6167650000000000000000604482015290519081900360640190fd5b9392505050565b60015490565b6020818101516000908152600490915260409020546001600160a01b03165b919050565b600181565b61100181565b670de0b6b3a764000081565b606081565b662386f26fc1000081565b61200081565b6000908152600460205260409020546001600160a01b031690565b6402540be40081565b6000805460ff16610ef4576040805162461bcd60e51b815260206004820152601960248201526000805160206147bf833981519152604482015290519081900360640190fd5b868514610f325760405162461bcd60e51b815260040180806020018281038252603b815260200180614732603b913960400191505060405180910390fd5b868314610f705760405162461bcd60e51b815260040180806020018281038252603f815260200180614605603f913960400191505060405180910390fd5b426078018267ffffffffffffffff161015610fbc5760405162461bcd60e51b81526004018080602001828103825260248152602001806144f56024913960400191505060405180910390fd5b6402540be4003406156110005760405162461bcd60e51b81526004018080602001828103825260408152602001806148356040913960400191505060405180910390fd5b60408051868152602080880282010190915285906000908190606090848015611033578160200160208202803683370190505b50905060005b8481101561110e576402540be4008b8b8381811061105357fe5b905060200201358161106157fe5b061561109e5760405162461bcd60e51b815260040180806020018281038252603c815260200180614644603c913960400191505060405180910390fd5b6110c38b8b838181106110ad57fe5b90506020020135856124a290919063ffffffff16565b93506110ef6402540be4008c8c848181106110da57fe5b905060200201356124fc90919063ffffffff16565b8282815181106110fb57fe5b6020908102919091010152600101611039565b5060015461113390611126908663ffffffff61253e16565b849063ffffffff6124a216565b3410156111715760405162461bcd60e51b81526004018080602001828103825260568152602001806147df6056913960600191505060405180910390fd5b611181348463ffffffff61259716565b915061118b61434e565b6040518060c001604052806221272160e91b60001b815260200160006001600160a01b031681526020018381526020018e8e808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505050908252506040805160208c810282810182019093528c82529283019290918d918d91829185019084908082843760009201919091525050509082525067ffffffffffffffff8916602090910152905061200063f7a251d7600361124f846125d9565b611264876402540be40063ffffffff6124fc16565b6040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b838110156112c25781810151838201526020016112aa565b50505050905090810190601f1680156112ef5780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b15801561131057600080fd5b505af1158015611324573d6000803e3d6000fd5b505060408051600081523360208201528082018890526060810187905290517f74eab09b0e53aefc23f2e1b16da593f95c2dd49c6f5a23720463d10d9c330b2a9350908190036080019150a15060019c9b505050505050505050505050565b61100581565b600281565b60015481565b61100881565b600b81565b60005460ff166113e4576040805162461bcd60e51b815260206004820152601960248201526000805160206147bf833981519152604482015290519081900360640190fd5b33612000146114245760405162461bcd60e51b815260040180806020018281038252602f81526020018061476d602f913960400191505060405180910390fd5b60ff8316600314156114745761146f82828080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061289492505050565b6114e3565b7f41ce201247b6ceb957dcdb217d0b8acb50b9ea0e12af9af4f5e7f38902101605838383604051808460ff1660ff168152602001806020018281038252848482818152602001925080828437600083820152604051601f909101601f1916909201829003965090945050505050a15b505050565b33611008146115285760405162461bcd60e51b815260040180806020018281038252602381526020018061479c6023913960400191505060405180910390fd5b600083815260046020908152604080832080546001600160a01b039096166001600160a01b03199096168617905593825260038152838220949094556002909352912055565b600981565b677ce66c50e284000081565b6000805460ff166115c5576040805162461bcd60e51b815260206004820152601960248201526000805160206147bf833981519152604482015290519081900360640190fd5b33611005146116055760405162461bcd60e51b815260040180806020018281038252602f815260200180614468602f913960400191505060405180910390fd5b60004783106116145747611616565b825b9050670de0b6b3a76400008111156116325760009150506116b7565b80156116b4576040516001600160a01b0385169082156108fc029083906000818181858888f1935050505015801561166e573d6000803e3d6000fd5b50604080516001600160a01b03861681526020810183905281517ff8b71c64315fc33b2ead2adfa487955065152a8ac33d9d5193aafd7f45dc15a0929181900390910190a15b90505b92915050565b61100781565b61100681565b600081565b60026020526000908152604090205481565b60005460ff1681565b600381565b6000805460ff16611734576040805162461bcd60e51b815260206004820152601960248201526000805160206147bf833981519152604482015290519081900360640190fd5b426078018267ffffffffffffffff1610156117805760405162461bcd60e51b81526004018080602001828103825260248152602001806144f56024913960400191505060405180910390fd5b6402540be4003406156117c45760405162461bcd60e51b81526004018080602001828103825260408152602001806148356040913960400191505060405180910390fd5b600080806001600160a01b0388166118a3576001546117ea90879063ffffffff6124a216565b3410156118285760405162461bcd60e51b815260040180806020018281038252606181526020018061457f6061913960800191505060405180910390fd5b6402540be40086061561186c5760405162461bcd60e51b815260040180806020018281038252603c815260200180614644603c913960400191505060405180910390fd5b61187c348763ffffffff61259716565b9050611893866402540be40063ffffffff6124fc16565b6221272160e91b93509150611b46565b6001600160a01b0388166000908152600360205260409020549250826118fa5760405162461bcd60e51b815260040180806020018281038252603181526020018061454e6031913960400191505060405180910390fd5b60015434101561193b5760405162461bcd60e51b815260040180806020018281038252603f8152602001806146a1603f913960400191505060405180910390fd5b506001600160a01b038716600090815260026020526040902054349060088111158061198657506008811180156119865750611984876007198301600a0a63ffffffff6128f016565b155b6119c15760405162461bcd60e51b815260040180806020018281038252603c815260200180614644603c913960400191505060405180910390fd5b6119cb8782612932565b92506119d684612972565b15611a1e576305f5e100831015611a1e5760405162461bcd60e51b815260040180806020018281038252603a815260200180614497603a913960400191505060405180910390fd5b600881101580611a385750600881108015611a3857508683115b611a735760405162461bcd60e51b81526004018080602001828103825260258152602001806145e06025913960400191505060405180910390fd5b677ce66c50e2840000831115611aba5760405162461bcd60e51b81526004018080602001828103825260358152602001806145196035913960400191505060405180910390fd5b604080516323b872dd60e01b81523360048201523060248201526044810189905290516001600160a01b038b16916323b872dd9160648083019260209291908290030181600087803b158015611b0f57600080fd5b505af1158015611b23573d6000803e3d6000fd5b505050506040513d6020811015611b3957600080fd5b5051611b4457600080fd5b505b611b4e61434e565b6040805160c0810182528581526001600160a01b038b166020820152815160018082528184018452919283019181602001602082028036833750505081526040805160018082528183019092526020928301929091908083019080368337505050815260408051600180825281830190925260209283019290919080830190803683370190505081526020018767ffffffffffffffff168152509050828160400151600081518110611bfc57fe5b602002602001018181525050878160600151600081518110611c1a57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050338160800151600081518110611c4c57fe5b6001600160a01b039092166020928302919091019091015261200063f7a251d76003611c77846125d9565b611c8c866402540be40063ffffffff6124fc16565b6040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b83811015611cea578181015183820152602001611cd2565b50505050905090810190601f168015611d175780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b158015611d3857600080fd5b505af1158015611d4c573d6000803e3d6000fd5b5050604080516001600160a01b038d1681523360208201528082018b90526060810186905290517f74eab09b0e53aefc23f2e1b16da593f95c2dd49c6f5a23720463d10d9c330b2a9350908190036080019150a150600198975050505050505050565b3361100714611def5760405162461bcd60e51b815260040180806020018281038252602e8152602001806146e0602e913960400191505060405180910390fd5b60208114611e44576040805162461bcd60e51b815260206004820152601b60248201527f65787065637465642076616c7565206c656e6774682069732033320000000000604482015290519081900360640190fd5b606084848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8801819004810282018101909252868152939450606093925086915085908190840183828082843760009201919091525050505060208301519091506772656c617946656560c01b811415611f4c576020820151670de0b6b3a76400008111801590611ef357506402540be4008106155b611f44576040805162461bcd60e51b815260206004820152601960248201527f7468652072656c6179466565206f7574206f662072616e676500000000000000604482015290519081900360640190fd5b600155611f89565b6040805162461bcd60e51b815260206004820152600d60248201526c756e6b6e6f776e20706172616d60981b604482015290519081900360640190fd5b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a878787876040518080602001806020018381038352878782818152602001925080828437600083820152601f01601f191690910184810383528581526020019050858580828437600083820152604051601f909101601f19169092018290039850909650505050505050a150505050505050565b61c35081565b33611008146120645760405162461bcd60e51b815260040180806020018281038252602381526020018061479c6023913960400191505060405180910390fd5b600091825260046020908152604080842080546001600160a01b03191690556001600160a01b0392909216835260039052812055565b6221272160e91b81565b6001600160a01b031660009081526003602052604090205490565b61100281565b60005460ff1661210a576040805162461bcd60e51b815260206004820152601960248201526000805160206147bf833981519152604482015290519081900360640190fd5b336120001461214a5760405162461bcd60e51b815260040180806020018281038252602f81526020018061476d602f913960400191505060405180910390fd5b60ff8316600314156114745761146f82828080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612a7892505050565b61100381565b60005460ff16156121f3576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b662386f26fc1000060019081556000808052600260205260127fac33ff75c19e70fe83507db0d683fd3465c996598dc972688b7ace676c89077b55805460ff19169091179055565b600481565b600581565b61100081565b61271081565b6001600160a01b03811660009081526003602090815260409182902054825182815280840190935260609290918391906020820181803683375050506020810183905290506000805b60208160ff1610156122e157828160ff16815181106122b557fe5b01602001516001600160f81b031916156122d4576001909101906122d9565b6122e1565b60010161229a565b5060608160ff166040519080825280601f01601f191660200182016040528015612312576020820181803683370190505b50905060005b8260ff168160ff16101561236e57838160ff168151811061233557fe5b602001015160f81c60f81b828260ff168151811061234f57fe5b60200101906001600160f81b031916908160001a905350600101612318565b5095945050505050565b61100481565b606061238861439a565b600061239384612b76565b91509150806123e9576040805162461bcd60e51b815260206004820152601f60248201527f756e7265636f676e697a6564207472616e73666572496e207061636b61676500604482015290519081900360640190fd5b60006123f483612cb5565b905063ffffffff811615612488576040808401516020808601516001600160a01b0316600090815260029091529182205461242f9190612932565b90506124396143cf565b60405180608001604052808660000151815260200183815260200186608001516001600160a01b031681526020018463ffffffff16815250905061247c81613002565b95505050505050610e58565b50506040805160008152602081019091529150610e589050565b6000828201838110156116b4576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60006116b483836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506130de565b60008261254d575060006116b7565b8282028284828161255a57fe5b04146116b45760405162461bcd60e51b81526004018080602001828103825260218152602001806146806021913960400191505060405180910390fd5b60006116b483836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613180565b60408051600680825260e08201909252606091829190816020015b60608152602001906001900390816125f45750508351909150612616906131da565b8160008151811061262357fe5b602002602001018190525061264483602001516001600160a01b03166131ed565b8160018151811061265157fe5b60200260200101819052506000836040015151905060608160405190808252806020026020018201604052801561269c57816020015b60608152602001906001900390816126875790505b50905060005b828110156126e9576126ca866040015182815181106126bd57fe5b60200260200101516131da565b8282815181106126d657fe5b60209081029190910101526001016126a2565b506126f381613210565b8360028151811061270057fe5b602002602001018190525060608260405190808252806020026020018201604052801561274157816020015b606081526020019060019003908161272c5790505b50905060005b83811015612797576127788760600151828151811061276257fe5b60200260200101516001600160a01b03166131ed565b82828151811061278457fe5b6020908102919091010152600101612747565b506127a181613210565b846003815181106127ae57fe5b60200260200101819052506060836040519080825280602002602001820160405280156127ef57816020015b60608152602001906001900390816127da5790505b50905060005b8481101561282f576128108860800151828151811061276257fe5b82828151811061281c57fe5b60209081029190910101526001016127f5565b5061283981613210565b8560048151811061284657fe5b60200260200101819052506128688760a0015167ffffffffffffffff166131da565b8560058151811061287557fe5b602002602001018190525061288985613210565b979650505050505050565b61289c6143f6565b60006128a78361329a565b91509150806128e75760405162461bcd60e51b815260040180806020018281038252602481526020018061470e6024913960400191505060405180910390fd5b6114e382613465565b60006116b483836040518060400160405280601881526020017f536166654d6174683a206d6f64756c6f206279207a65726f00000000000000008152506138e9565b6000600882111561295b57612954836007198401600a0a63ffffffff6124fc16565b90506116b7565b6116b4836008849003600a0a63ffffffff61253e16565b604080516020808252818301909252600091606091906020820181803683375050506020810184905290506000805b60208160ff1610156129e857828160ff16815181106129bc57fe5b01602001516001600160f81b031916156129db576001909101906129e0565b6129e8565b6001016129a1565b50600860ff82161015612a0057600092505050610e58565b816005820360ff1681518110612a1257fe5b6020910101516001600160f81b031916602d60f81b14612a3757600092505050610e58565b816001820360ff1681518110612a4957fe5b6020910101516001600160f81b031916604d60f81b14612a6e57600092505050610e58565b5060019392505050565b612a8061434e565b6000612a8b8361394b565b9150915080612acb5760405162461bcd60e51b81526004018080602001828103825260248152602001806144d16024913960400191505060405180910390fd5b612ad36143f6565b602080840180516001600160a01b0390811684526040808701518585015291511660009081526002909252812054905b846040015151811015612b5457612b3185604001518281518110612b2357fe5b602002602001015183613bc6565b85604001518281518110612b4157fe5b6020908102919091010152600101612b03565b506080840151604083015260056060830152612b6f82613465565b5050505050565b612b7e61439a565b6000612b8861439a565b612b9061442d565b612ba1612b9c86613bff565b613c24565b90506000805b612bb083613c6e565b15612ca85780612bd257612bcb612bc684613c8f565b613cdd565b8452612ca0565b8060011415612bff57612bec612be784613c8f565b613d94565b6001600160a01b03166020850152612ca0565b8060021415612c1e57612c14612bc684613c8f565b6040850152612ca0565b8060031415612c4657612c33612be784613c8f565b6001600160a01b03166060850152612ca0565b8060041415612c6e57612c5b612be784613c8f565b6001600160a01b03166080850152612ca0565b8060051415612c9b57612c83612bc684613c8f565b67ffffffffffffffff1660a085015260019150612ca0565b612ca8565b600101612ba7565b5091935090915050915091565b60208101516000906001600160a01b0316612dec578160a0015167ffffffffffffffff16421115612ce857506001610e58565b8160400151471015612cfc57506003610e58565b606082015160408084015190516000926001600160a01b0316916127109184818181858888f193505050503d8060008114612d53576040519150601f19603f3d011682016040523d82523d6000602084013e612d58565b606091505b5050905080612d6b575060049050610e58565b7f471eb9cc1ffe55ffadf15b32595415eb9d80f22e761d24bd6dffc607e1284d5983602001518460600151856040015160405180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b03168152602001828152602001935050505060405180910390a15060009050610e58565b8160a0015167ffffffffffffffff16421115612e0a57506001610e58565b81516020808401516001600160a01b031660009081526003909152604090205414612e3757506002610e58565b602080830151604080516370a0823160e01b815230600482015290516000936001600160a01b03909316926370a082319261c3509260248083019392829003018187803b158015612e8757600080fd5b5086fa158015612e9b573d6000803e3d6000fd5b50505050506040513d6020811015612eb257600080fd5b50516040840151909150811015612ecd575060039050610e58565b600083602001516001600160a01b031663a9059cbb61c350866060015187604001516040518463ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600088803b158015612f3e57600080fd5b5087f1158015612f52573d6000803e3d6000fd5b50505050506040513d6020811015612f6957600080fd5b505190508015612ff6577f471eb9cc1ffe55ffadf15b32595415eb9d80f22e761d24bd6dffc607e1284d5984602001518560600151866040015160405180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b03168152602001828152602001935050505060405180910390a15060009150610e589050565b5060059150610e589050565b60408051600480825260a08201909252606091829190816020015b606081526020019060019003908161301d575050835190915061303f906131da565b8160008151811061304c57fe5b602002602001018190525061306483602001516131da565b8160018151811061307157fe5b602002602001018190525061309283604001516001600160a01b03166131ed565b8160028151811061309f57fe5b60200260200101819052506130bd836060015163ffffffff166131da565b816003815181106130ca57fe5b6020026020010181905250610e2c81613210565b6000818361316a5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561312f578181015183820152602001613117565b50505050905090810190601f16801561315c5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858161317657fe5b0495945050505050565b600081848411156131d25760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561312f578181015183820152602001613117565b505050900390565b60606116b76131e883613dae565b613e94565b60408051600560a21b8318601482015260348101909152606090610e2c81613e94565b60608151600014156132315750604080516000815260208101909152610e58565b60608260008151811061324057fe5b602002602001015190506000600190505b8351811015613281576132778285838151811061326a57fe5b6020026020010151613ee6565b9150600101613251565b50610e2c613294825160c060ff16613f63565b82613ee6565b6132a26143f6565b60006132ac6143f6565b6132b461442d565b6132c0612b9c86613bff565b90506000805b6132cf83613c6e565b15612ca857806132f5576132e5612be784613c8f565b6001600160a01b0316845261345d565b806001141561339657606061331161330c85613c8f565b61405b565b9050805160405190808252806020026020018201604052801561333e578160200160208202803683370190505b50602086015260005b815181101561338f5761336c82828151811061335f57fe5b6020026020010151613cdd565b8660200151828151811061337c57fe5b6020908102919091010152600101613347565b505061345d565b80600214156134385760606133ad61330c85613c8f565b905080516040519080825280602002602001820160405280156133da578160200160208202803683370190505b50604086015260005b815181101561338f576134088282815181106133fb57fe5b6020026020010151613d94565b8660400151828151811061341857fe5b6001600160a01b03909216602092830291909101909101526001016133e3565b8060031415612c9b5761344d612bc684613c8f565b63ffffffff166060850152600191505b6001016132c6565b80516001600160a01b031661368f5760005b8160200151518110156136895760008260400151828151811061349657fe5b60200260200101516001600160a01b0316612710846020015184815181106134ba57fe5b60209081029190910101516040516000818181858888f193505050503d8060008114613502576040519150601f19603f3d011682016040523d82523d6000602084013e613507565b606091505b50509050806135ca577f203f9f67a785f4f81be4d48b109aa0c498d1bc8097ecc2627063f480cc5fe73e83600001518460400151848151811061354657fe5b60200260200101518560200151858151811061355e57fe5b6020026020010151866060015160405180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b031681526020018381526020018263ffffffff1663ffffffff16815260200194505050505060405180910390a1613680565b7fd468d4fa5e8fb4adc119b29a983fd0785e04af5cb8b7a3a69a47270c54b6901a83600001518460400151848151811061360057fe5b60200260200101518560200151858151811061361857fe5b6020026020010151866060015160405180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b031681526020018381526020018263ffffffff1663ffffffff16815260200194505050505060405180910390a15b50600101613477565b506138e6565b60005b8160200151518110156138e457600082600001516001600160a01b031663a9059cbb61c350856040015185815181106136c757fe5b6020026020010151866020015186815181106136df57fe5b60200260200101516040518463ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600088803b15801561373657600080fd5b5087f115801561374a573d6000803e3d6000fd5b50505050506040513d602081101561376157600080fd5b505190508015613825577fd468d4fa5e8fb4adc119b29a983fd0785e04af5cb8b7a3a69a47270c54b6901a8360000151846040015184815181106137a157fe5b6020026020010151856020015185815181106137b957fe5b6020026020010151866060015160405180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b031681526020018381526020018263ffffffff1663ffffffff16815260200194505050505060405180910390a16138db565b7f203f9f67a785f4f81be4d48b109aa0c498d1bc8097ecc2627063f480cc5fe73e83600001518460400151848151811061385b57fe5b60200260200101518560200151858151811061387357fe5b6020026020010151866060015160405180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b031681526020018381526020018263ffffffff1663ffffffff16815260200194505050505060405180910390a15b50600101613692565b505b50565b600081836139385760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561312f578181015183820152602001613117565b5082848161394257fe5b06949350505050565b61395361434e565b600061395d61434e565b61396561442d565b613971612b9c86613bff565b90506000805b61398083613c6e565b15613bb8578061399d57613996612bc684613c8f565b8452613bb0565b80600114156139c5576139b2612be784613c8f565b6001600160a01b03166020850152613bb0565b8060021415613a545760606139dc61330c85613c8f565b90508051604051908082528060200260200182016040528015613a09578160200160208202803683370190505b50604086015260005b8151811015613a4d57613a2a82828151811061335f57fe5b86604001518281518110613a3a57fe5b6020908102919091010152600101613a12565b5050613bb0565b8060031415613ae9576060613a6b61330c85613c8f565b90508051604051908082528060200260200182016040528015613a98578160200160208202803683370190505b50606086015260005b8151811015613a4d57613ab98282815181106133fb57fe5b86606001518281518110613ac957fe5b6001600160a01b0390921660209283029190910190910152600101613aa1565b8060041415613b7e576060613b0061330c85613c8f565b90508051604051908082528060200260200182016040528015613b2d578160200160208202803683370190505b50608086015260005b8151811015613a4d57613b4e8282815181106133fb57fe5b86608001518281518110613b5e57fe5b6001600160a01b0390921660209283029190910190910152600101613b36565b8060051415613bab57613b93612bc684613c8f565b67ffffffffffffffff1660a085015260019150613bb0565b613bb8565b600101613977565b509195600195509350505050565b60006008821115613be857612954836007198401600a0a63ffffffff61253e16565b6116b4836008849003600a0a63ffffffff6124fc16565b613c0761444d565b506040805180820190915281518152602082810190820152919050565b613c2c61442d565b613c358261412c565b613c3e57600080fd5b6000613c4d836020015161415c565b60208085015160408051808201909152868152920190820152915050919050565b6000613c7861444d565b505080518051602091820151919092015191011190565b613c9761444d565b613ca082613c6e565b613ca957600080fd5b60208201516000613cb9826141bf565b80830160209586015260408051808201909152908152938401919091525090919050565b805160009015801590613cf257508151602110155b613cfb57600080fd5b6000613d0a836020015161415c565b90508083600001511015613d65576040805162461bcd60e51b815260206004820152601a60248201527f6c656e677468206973206c657373207468616e206f6666736574000000000000604482015290519081900360640190fd5b825160208085015183018051928490039291831015613d8b57826020036101000a820491505b50949350505050565b8051600090601514613da557600080fd5b6116b782613cdd565b604080516020808252818301909252606091829190602082018180368337505050602081018490529050600067ffffffffffffffff198416613df257506018613e16565b6fffffffffffffffffffffffffffffffff198416613e1257506010613e16565b5060005b6020811015613e4c57818181518110613e2b57fe5b01602001516001600160f81b03191615613e4457613e4c565b600101613e16565b60008160200390506060816040519080825280601f01601f191660200182016040528015613e81576020820181803683370190505b5080830196909652508452509192915050565b606081516001148015613ec65750607f60f81b82600081518110613eb457fe5b01602001516001600160f81b03191611155b15613ed2575080610e58565b6116b7613ee48351608060ff16613f63565b835b6060806040519050835180825260208201818101602087015b81831015613f17578051835260209283019201613eff565b50855184518101855292509050808201602086015b81831015613f44578051835260209283019201613f2c565b508651929092011591909101601f01601f191660405250905092915050565b6060680100000000000000008310613fb3576040805162461bcd60e51b815260206004820152600e60248201526d696e70757420746f6f206c6f6e6760901b604482015290519081900360640190fd5b6040805160018082528183019092526060916020820181803683370190505090506037841161400d5782840160f81b81600081518110613fef57fe5b60200101906001600160f81b031916908160001a90535090506116b7565b606061401885613dae565b90508381510160370160f81b8260008151811061403157fe5b60200101906001600160f81b031916908160001a9053506140528282613ee6565b95945050505050565b60606140668261412c565b61406f57600080fd5b600061407a836142f2565b90506060816040519080825280602002602001820160405280156140b857816020015b6140a561444d565b81526020019060019003908161409d5790505b50905060006140ca856020015161415c565b60208601510190506000805b84811015614121576140e7836141bf565b915060405180604001604052808381526020018481525084828151811061410a57fe5b6020908102919091010152918101916001016140d6565b509195945050505050565b805160009061413d57506000610e58565b6020820151805160001a9060c0821015612a6e57600092505050610e58565b8051600090811a6080811015614176576000915050610e58565b60b8811080614191575060c08110801590614191575060f881105b156141a0576001915050610e58565b60c08110156141b45760b519019050610e58565b60f519019050610e58565b80516000908190811a60808110156141da57600191506142eb565b60b88110156141ef57607e19810191506142eb565b60c081101561426957600060b78203600186019550806020036101000a865104915060018101820193505080831015614263576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b506142eb565b60f881101561427e5760be19810191506142eb565b600060f78203600186019550806020036101000a8651049150600181018201935050808310156142e9576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b505b5092915050565b805160009061430357506000610e58565b60008090506000614317846020015161415c565b602085015185519181019250015b8082101561434557614336826141bf565b60019093019290910190614325565b50909392505050565b6040518060c001604052806000801916815260200160006001600160a01b03168152602001606081526020016060815260200160608152602001600067ffffffffffffffff1681525090565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915290565b60408051608081018252600080825260208201819052918101829052606081019190915290565b604051806080016040528060006001600160a01b031681526020016060815260200160608152602001600063ffffffff1681525090565b604051806040016040528061444061444d565b8152602001600081525090565b60405180604001604052806000815260200160008152509056fe746865206d6573736167652073656e646572206d75737420626520696e63656e746976697a6520636f6e7472616374466f72206d696e69546f6b656e2c20746865207472616e7366657220616d6f756e74206d757374206e6f74206265206c657373207468616e2031756e7265636f676e697a6564207472616e736665724f75742073796e207061636b61676565787069726554696d65206d7573742062652074776f206d696e75746573206c61746572616d6f756e7420697320746f6f206c617267652c20657863656564206d6178696d756d206265703220746f6b656e20616d6f756e7474686520636f6e747261637420686173206e6f74206265656e20626f756e6420746f20616e79206265703220746f6b656e726563656976656420424e4220616d6f756e742073686f756c64206265206e6f206c657373207468616e207468652073756d206f66207472616e736665724f757420424e4220616d6f756e7420616e64206d696e696d756d2072656c6179466565616d6f756e7420697320746f6f206c617267652c2075696e74323536206f766572666c6f774c656e677468206f6620726563697069656e74416464727320646f65736e277420657175616c20746f206c656e677468206f6620726566756e644164647273696e76616c6964207472616e7366657220616d6f756e743a20707265636973696f6e206c6f737320696e20616d6f756e7420636f6e76657273696f6e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77726563656976656420424e4220616d6f756e742073686f756c64206265206e6f206c657373207468616e20746865206d696e696d756d2072656c6179466565746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e7472616374756e7265636f676e697a6564207472616e736665724f75742061636b207061636b6167654c656e677468206f6620726563697069656e74416464727320646f65736e277420657175616c20746f206c656e677468206f6620616d6f756e7473746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e7472616374746865206d73672073656e646572206d75737420626520746f6b656e4d616e6167657274686520636f6e7472616374206e6f7420696e69742079657400000000000000726563656976656420424e4220616d6f756e742073686f756c64206265206e6f206c657373207468616e207468652073756d206f66207472616e7366657220424e4220616d6f756e7420616e642072656c6179466565696e76616c696420726563656976656420424e4220616d6f756e743a20707265636973696f6e206c6f737320696e20616d6f756e7420636f6e76657273696f6ea2646970667358221220560ad3b1f9184c6b58a836a4c111faf5fdf5dc0e93dc1c013cd41cea18c69cbb64736f6c63430006040033", + }, + UpgradeConfig { + contract_addr: "0x0000000000000000000000000000000000001005", + code: "6080604052600436106102765760003560e01c80637e146cc51161014f578063af400681116100c1578063e75d72c71161007a578063e75d72c714610795578063e89a3020146107c8578063f9a2bbc7146107f2578063fc3e590814610807578063fd6a68791461081c578063fdd31fcd146108315761027d565b8063af400681146106ed578063bd4cc83014610717578063c81b166214610741578063dc927faf14610756578063dcae76ab1461076b578063e1c7392a146107805761027d565b8063a3c3c0ad11610113578063a3c3c0ad146105b3578063a78abc16146105c8578063a7c6a59d146105dd578063ab51bb96146105f2578063ac43175114610607578063ace9fcc2146106d85761027d565b80637e146cc51461052c578063930e1b091461054157806396713da9146105745780639dc0926214610589578063a1a11bf51461059e5761027d565b806343756e5c116101e85780636e47b482116101ac5780636e47b482146104645780636f93d2e61461047957806370fd5bad146104d857806374f2272d146104ed57806375d47a0a146105025780637942fd05146105175761027d565b806343756e5c146103e4578063493279b1146103f95780634bf6c8821461042557806351e806721461043a578063541333071461044f5761027d565b806312950c461161023a57806312950c46146103165780631b20087c1461032b5780631c643312146103405780633a975612146102825780633dffc3871461038657806340bb43c0146103b15761027d565b8063081e9d131461028257806308f2ec06146102a9578063093f2fc4146102be5780630bee7a67146102d357806310e06a76146103015761027d565b3661027d57005b600080fd5b34801561028e57600080fd5b50610297610864565b60408051918252519081900360200190f35b3480156102b557600080fd5b50610297610869565b3480156102ca57600080fd5b5061029761086e565b3480156102df57600080fd5b506102e8610873565b6040805163ffffffff9092168252519081900360200190f35b34801561030d57600080fd5b50610297610878565b34801561032257600080fd5b5061029761087e565b34801561033757600080fd5b50610297610884565b34801561034c57600080fd5b5061036a6004803603602081101561036357600080fd5b503561088a565b604080516001600160a01b039092168252519081900360200190f35b34801561039257600080fd5b5061039b610864565b6040805160ff9092168252519081900360200190f35b3480156103bd57600080fd5b50610297600480360360208110156103d457600080fd5b50356001600160a01b03166108b1565b3480156103f057600080fd5b5061036a6108c3565b34801561040557600080fd5b5061040e6108c9565b6040805161ffff9092168252519081900360200190f35b34801561043157600080fd5b5061039b6108ce565b34801561044657600080fd5b5061036a6108d3565b34801561045b57600080fd5b50610297610873565b34801561047057600080fd5b5061036a6108d9565b34801561048557600080fd5b506104c46004803603608081101561049c57600080fd5b506001600160a01b0381358116916020810135909116906040810135906060013515156108df565b604080519115158252519081900360200190f35b3480156104e457600080fd5b5061039b610cad565b3480156104f957600080fd5b50610297610cb2565b34801561050e57600080fd5b5061036a610cb8565b34801561052357600080fd5b5061039b610cbe565b34801561053857600080fd5b50610297610cc3565b34801561054d57600080fd5b506102976004803603602081101561056457600080fd5b50356001600160a01b0316610cc8565b34801561058057600080fd5b5061039b610cda565b34801561059557600080fd5b5061036a610cdf565b3480156105aa57600080fd5b5061036a610ce5565b3480156105bf57600080fd5b50610297610ceb565b3480156105d457600080fd5b506104c4610cf1565b3480156105e957600080fd5b50610297610cfa565b3480156105fe57600080fd5b506102e8610d00565b34801561061357600080fd5b506106d66004803603604081101561062a57600080fd5b81019060208101813564010000000081111561064557600080fd5b82018360208201111561065757600080fd5b8035906020019184600183028401116401000000008311171561067957600080fd5b91939092909160208101903564010000000081111561069757600080fd5b8201836020820111156106a957600080fd5b803590602001918460018302840111640100000000831117156106cb57600080fd5b509092509050610d05565b005b3480156106e457600080fd5b50610297611354565b3480156106f957600080fd5b506102976004803603602081101561071057600080fd5b503561135a565b34801561072357600080fd5b506102976004803603602081101561073a57600080fd5b50356113b5565b34801561074d57600080fd5b5061036a6113ce565b34801561076257600080fd5b5061036a6113d4565b34801561077757600080fd5b506102976113da565b34801561078c57600080fd5b506106d66113e0565b3480156107a157600080fd5b506106d6600480360360208110156107b857600080fd5b50356001600160a01b03166114a9565b3480156107d457600080fd5b5061036a600480360360208110156107eb57600080fd5b5035611602565b3480156107fe57600080fd5b5061036a61160f565b34801561081357600080fd5b5061039b611615565b34801561082857600080fd5b5061036a61161a565b34801561083d57600080fd5b506102976004803603602081101561085457600080fd5b50356001600160a01b0316611620565b600181565b602881565b605081565b606481565b600b5481565b60015481565b600c5481565b6006818154811061089757fe5b6000918252602090912001546001600160a01b0316905081565b60076020526000908152604090205481565b61100181565b606081565b600881565b61200081565b61100581565b6000805460ff16610937576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e7472616374206e6f7420696e69742079657400000000000000604482015290519081900360640190fd5b33612000146109775760405162461bcd60e51b815260040180806020018281038252602f815260200180612164602f913960400191505060405180910390fd5b600082156109fc57604080516309a99b4f60e41b8152611005600482015260248101869052905161100291639a99b4f09160448083019260209291908290030181600087803b1580156109c957600080fd5b505af11580156109dd573d6000803e3d6000fd5b505050506040513d60208110156109f357600080fd5b50519050610a75565b604080516309a99b4f60e41b8152611005600482015260248101869052905161100491639a99b4f09160448083019260209291908290030181600087803b158015610a4657600080fd5b505af1158015610a5a573d6000803e3d6000fd5b505050506040513d6020811015610a7057600080fd5b505190505b600c805460010190556000610a8982611632565b600954909150610a9f908263ffffffff61166116565b600955600a54610ac7908290610abb908563ffffffff61166116565b9063ffffffff6116c216565b600a556001600160a01b038716600090815260056020526040902054610b3357600680546001810182556000919091527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0180546001600160a01b0319166001600160a01b0389161790555b6001600160a01b038088166000908152600560209081526040808320805460010190559289168252600790522054610bb157600880546001810182556000919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30180546001600160a01b0319166001600160a01b0388161790555b6001600160a01b038616600090815260076020526040902080546001019055600c54606411610ca057600b54600954600a5460408051938452602084019290925282820152517f2649b1b772a1a74bd332a67695e285317dd722941166595741c60a00fa65bb759181900360600190a16000610c2b611704565b90506000610c376119e8565b6001600160a01b0389166000908152600d6020526040902054909150610c75908290610c69908563ffffffff61166116565b9063ffffffff61166116565b6001600160a01b0389166000908152600d6020526040812091909155600b80546001019055600c5550505b5060019695505050505050565b600281565b60035481565b61100881565b600b81565b600581565b60056020526000908152604090205481565b600981565b61100781565b61100681565b600a5481565b60005460ff1681565b60045481565b600081565b3361100714610d455760405162461bcd60e51b815260040180806020018281038252602e8152602001806120a9602e913960400191505060405180910390fd5b60005460ff16610d865760405162461bcd60e51b81526004018080602001828103825260218152602001806120d76021913960400191505060405180910390fd5b610dfa84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601f81527f68656164657252656c61796572526577617264526174654d6f6c6563756c650060208201529150611c669050565b15610ec75760208114610e3e5760405162461bcd60e51b81526004018080602001828103825260328152602001806121936032913960400191505060405180910390fd5b604080516020601f8401819004810282018101909252828152600091610e7c91858580838501838280828437600092019190915250611d4d92505050565b9050600254811115610ebf5760405162461bcd60e51b8152600401808060200182810382526060815260200180611f826060913960600191505060405180910390fd5b6001556112c2565b610f2084848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805160608101909152602280825290925090506120876020830139611c66565b15610ff85760208114610f645760405162461bcd60e51b815260040180806020018281038252602e815260200180612038602e913960400191505060405180910390fd5b604080516020601f8401819004810282018101909252828152600091610fa291858580838501838280828437600092019190915250611d4d92505050565b90508015801590610fb557506001548110155b610ff05760405162461bcd60e51b815260040180806020018281038252606c8152602001806120f8606c913960800191505060405180910390fd5b6002556112c2565b61106c84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601a81527f63616c6c6572436f6d70656e736174696f6e4d6f6c6563756c6500000000000060208201529150611c669050565b1561113957602081146110b05760405162461bcd60e51b815260040180806020018281038252602e815260200180612038602e913960400191505060405180910390fd5b604080516020601f84018190048102820181019092528281526000916110ee91858580838501838280828437600092019190915250611d4d92505050565b90506004548111156111315760405162461bcd60e51b8152600401808060200182810382526056815260200180611fe26056913960600191505060405180910390fd5b6003556112c2565b6111ad84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601d81527f63616c6c6572436f6d70656e736174696f6e44656e6f6d696e61746f7200000060208201529150611c669050565b1561128557602081146111f15760405162461bcd60e51b815260040180806020018281038252602e815260200180612038602e913960400191505060405180910390fd5b604080516020601f840181900481028201810190925282815260009161122f91858580838501838280828437600092019190915250611d4d92505050565b9050801580159061124257506003548110155b61127d5760405162461bcd60e51b8152600401808060200182810382526061815260200180611f216061913960800191505060405180910390fd5b6004556112c2565b6040805162461bcd60e51b815260206004820152600d60248201526c756e6b6e6f776e20706172616d60981b604482015290519081900360640190fd5b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a848484846040518080602001806020018381038352878782818152602001925080828437600083820152601f01601f191690910184810383528581526020019050858580828437600083820152604051601f909101601f19169092018290039850909650505050505050a150505050565b60025481565b60006028821161136b5750806113b0565b81602810801561137c575060508211155b15611389575060286113b0565b60508211801561139a5750606e8211155b156113aa575060788190036113b0565b50600481045b919050565b6000602882116113c65750806113b0565b5060286113b0565b61100281565b61100381565b60095481565b60005460ff1615611438576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b60005460ff1615611486576040805162461bcd60e51b8152602060048201526013602482015272185b1c9958591e481a5b9a5d1a585b1a5e9959606a1b604482015290519081900360640190fd5b60018080556005600255600381905560506004556000805460ff19169091179055565b6001600160a01b0381166000908152600d602052604090205480611508576040805162461bcd60e51b81526020600482015260116024820152701b9bc81c995b185e595c881c995dd85c99607a1b604482015290519081900360640190fd5b6001600160a01b0382166000818152600d60205260408082208290555184929184156108fc02918591818181858888f193505050506115b85760405161100290819084156108fc029085906000818181858888f19350505050158015611572573d6000803e3d6000fd5b506040805161100281526020810185905281517f24502838a334c8f2bb2ee1f8262a4fa7183e4489a717e96cc824e325f8b39e11929181900390910190a15050506115ff565b604080516001600160a01b03851681526020810184905281517f24502838a334c8f2bb2ee1f8262a4fa7183e4489a717e96cc824e325f8b39e11929181900390910190a150505b50565b6008818154811061089757fe5b61100081565b600381565b61100481565b600d6020526000908152604090205481565b600061165b60025461164f60015485611d5290919063ffffffff16565b9063ffffffff611dab16565b92915050565b6000828201838110156116bb576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b60006116bb83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611ded565b600954600680546040805160208084028201810190925282815260009493859360609383018282801561176057602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611742575b5050505050905060608151604051908082528060200260200182016040528015611794578160200160208202803683370190505b50905060005b82518110156118215760008382815181106117b157fe5b6020026020010151905060006117eb60056000846001600160a01b03166001600160a01b03168152602001908152602001600020546113b5565b9050808484815181106117fa57fe5b6020908102919091010152611815868263ffffffff61166116565b9550505060010161179a565b50600061183f60045461164f60035488611d5290919063ffffffff16565b9050611851858263ffffffff6116c216565b94508460015b845181101561192857600061188c8761164f8a88868151811061187657fe5b6020026020010151611d5290919063ffffffff16565b90506118d981600d60008986815181106118a257fe5b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000205461166190919063ffffffff16565b600d60008885815181106118e957fe5b6020908102919091018101516001600160a01b031682528101919091526040016000205561191d838263ffffffff6116c216565b925050600101611857565b5061193e81600d6000876000815181106118a257fe5b600d60008660008151811061194f57fe5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002081905550600060098190555060008090505b84518110156119d057600560008683815181106119a257fe5b6020908102919091018101516001600160a01b03168252810191909152604001600090812055600101611989565b506119dd60066000611ee9565b509450505050505b90565b600a546008805460408051602080840282018101909252828152600094938593606093830182828015611a4457602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611a26575b5050505050905060608151604051908082528060200260200182016040528015611a78578160200160208202803683370190505b50905060005b8251811015611af7576000838281518110611a9557fe5b602002602001015190506000611acf60076000846001600160a01b03166001600160a01b031681526020019081526020016000205461135a565b905080848481518110611ade57fe5b6020908102919091010152949094019350600101611a7e565b506000611b1560045461164f60035488611d5290919063ffffffff16565b9050611b27858263ffffffff6116c216565b94508460015b8451811015611bb1576000611b4c8761164f8a88868151811061187657fe5b9050611b6281600d60008986815181106118a257fe5b600d6000888581518110611b7257fe5b6020908102919091018101516001600160a01b0316825281019190915260400160002055611ba6838263ffffffff6116c216565b925050600101611b2d565b50611bc781600d6000876000815181106118a257fe5b600d600086600081518110611bd857fe5b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020819055506000600a8190555060008090505b8451811015611c595760076000868381518110611c2b57fe5b6020908102919091018101516001600160a01b03168252810191909152604001600090812055600101611c12565b506119dd60086000611ee9565b6000816040516020018082805190602001908083835b60208310611c9b5780518252601f199092019160209182019101611c7c565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120836040516020018082805190602001908083835b60208310611d095780518252601f199092019160209182019101611cea565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040528051906020012014905092915050565b015190565b600082611d615750600061165b565b82820282848281611d6e57fe5b04146116bb5760405162461bcd60e51b81526004018080602001828103825260218152602001806120666021913960400191505060405180910390fd5b60006116bb83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611e84565b60008184841115611e7c5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611e41578181015183820152602001611e29565b50505050905090810190601f168015611e6e5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60008183611ed35760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315611e41578181015183820152602001611e29565b506000838581611edf57fe5b0495945050505050565b50805460008255906000526020600020908101906115ff91906119e591905b80821115611f1c5760008155600101611f08565b509056fe746865206e657743616c6c6572436f6d70656e736174696f6e44656e6f6d696e61746f72206d757374206e6f74206265207a65726f20616e64206e6f206c657373207468616e2063616c6c6572436f6d70656e736174696f6e4d6f6c6563756c656e65772068656164657252656c61796572526577617264526174654d6f6c6563756c652073686f756c646e27742062652067726561746572207468616e2068656164657252656c617965725265776172645261746544656e6f6d696e61746f726e65772063616c6c6572436f6d70656e736174696f6e4d6f6c6563756c652073686f756c646e27742062652067726561746572207468616e2063616c6c6572436f6d70656e736174696f6e44656e6f6d696e61746f726c656e677468206f6620726577617264466f7256616c696461746f725365744368616e6765206d69736d61746368536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7768656164657252656c617965725265776172645261746544656e6f6d696e61746f72746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e7472616374636f6e747261637420686173206e6f74206265656e20696e697469616c697a6564746865206e65772068656164657252656c617965725265776172645261746544656e6f6d696e61746f72206d757374206e6f74206265207a65726f20616e64206e6f206c657373207468616e2068656164657252656c61796572526577617264526174654d6f6c6563756c65746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e74726163746c656e677468206f662068656164657252656c61796572526577617264526174654d6f6c6563756c65206d69736d61746368a264697066735822122046aa8f3564133ae19cf0f29fe8a7ebdf2a5f74f0268c42431d82384fe137b2ed64736f6c63430006040033", + }, + UpgradeConfig { + contract_addr: "0x0000000000000000000000000000000000001006", + code: "6080604052600436106101c25760003560e01c806395468d26116100f7578063c81b166211610095578063f9a2bbc711610064578063f9a2bbc714610529578063fb7cfdd71461053e578063fc3e590814610553578063fd6a687914610568576101c2565b8063c81b1662146104d5578063dc927faf146104ea578063e1c7392a146104ff578063e79a198f14610514576101c2565b8063a1a11bf5116100d1578063a1a11bf5146103c7578063a78abc16146103dc578063ab51bb96146103f1578063ac43175114610406576101c2565b806395468d261461038857806396713da91461039d5780639dc09262146103b2576101c2565b8063541d55481161016457806370fd5bad1161013e57806370fd5bad1461033457806375d47a0a146103495780637942fd051461035e5780637ae2308814610373576101c2565b8063541d5548146102b15780636a87d780146102f85780636e47b4821461031f576101c2565b806343756e5c116101a057806343756e5c1461022a578063493279b11461025b5780634bf6c8821461028757806351e806721461029c576101c2565b80630bee7a67146101c75780631aa3a008146101f55780633dffc387146101ff575b600080fd5b3480156101d357600080fd5b506101dc61057d565b6040805163ffffffff9092168252519081900360200190f35b6101fd610582565b005b34801561020b57600080fd5b5061021461077d565b6040805160ff9092168252519081900360200190f35b34801561023657600080fd5b5061023f610782565b604080516001600160a01b039092168252519081900360200190f35b34801561026757600080fd5b50610270610788565b6040805161ffff9092168252519081900360200190f35b34801561029357600080fd5b5061021461078d565b3480156102a857600080fd5b5061023f610792565b3480156102bd57600080fd5b506102e4600480360360208110156102d457600080fd5b50356001600160a01b0316610798565b604080519115158252519081900360200190f35b34801561030457600080fd5b5061030d6107b6565b60408051918252519081900360200190f35b34801561032b57600080fd5b5061023f6107bc565b34801561034057600080fd5b506102146107c2565b34801561035557600080fd5b5061023f6107c7565b34801561036a57600080fd5b506102146107cd565b34801561037f57600080fd5b5061030d6107d2565b34801561039457600080fd5b5061030d6107df565b3480156103a957600080fd5b506102146107eb565b3480156103be57600080fd5b5061023f6107f0565b3480156103d357600080fd5b5061023f6107f6565b3480156103e857600080fd5b506102e46107fc565b3480156103fd57600080fd5b506101dc610805565b34801561041257600080fd5b506101fd6004803603604081101561042957600080fd5b81019060208101813564010000000081111561044457600080fd5b82018360208201111561045657600080fd5b8035906020019184600183028401116401000000008311171561047857600080fd5b91939092909160208101903564010000000081111561049657600080fd5b8201836020820111156104a857600080fd5b803590602001918460018302840111640100000000831117156104ca57600080fd5b50909250905061080a565b3480156104e157600080fd5b5061023f610c2c565b3480156104f657600080fd5b5061023f610c32565b34801561050b57600080fd5b506101fd610c38565b34801561052057600080fd5b506101fd610cba565b34801561053557600080fd5b5061023f610e73565b34801561054a57600080fd5b5061030d610e79565b34801561055f57600080fd5b50610214610e7f565b34801561057457600080fd5b5061023f610e84565b606481565b3360009081526004602052604090205460ff16156105df576040805162461bcd60e51b81526020600482015260156024820152741c995b185e595c88185b1c9958591e48195e1a5cdd605a1b604482015290519081900360640190fd5b60005460ff16610632576040805162461bcd60e51b81526020600482015260196024820152781d1a194818dbdb9d1c9858dd081b9bdd081a5b9a5d081e595d603a1b604482015290519081900360640190fd5b61063b33610e8a565b156106775760405162461bcd60e51b815260040180806020018281038252602781526020018061109c6027913960400191505060405180910390fd5b3332146106c1576040805162461bcd60e51b81526020600482015260136024820152721b9bc81c1c9bde1e481a5cc8185b1b1bddd959606a1b604482015290519081900360640190fd5b60015434146107015760405162461bcd60e51b81526004018080602001828103825260258152602001806110776025913960400191505060405180910390fd5b604080518082018252600180548252600254602080840191825233600081815260038352868120955186559251948401949094556004815290849020805460ff1916909217909155825191825291517fdb33a09d38b59a8fa8b7d92a1d82c8015e99f05f67ae9c9ae623157767959496929181900390910190a1565b600181565b61100181565b606081565b600881565b61200081565b6001600160a01b031660009081526004602052604090205460ff1690565b60025481565b61100581565b600281565b61100881565b600b81565b68056bc75e2d6310000081565b67016345785d8a000081565b600981565b61100781565b61100681565b60005460ff1681565b600081565b60005460ff1661085d576040805162461bcd60e51b81526020600482015260196024820152781d1a194818dbdb9d1c9858dd081b9bdd081a5b9a5d081e595d603a1b604482015290519081900360640190fd5b336110071461089d5760405162461bcd60e51b815260040180806020018281038252602e8152602001806110c3602e913960400191505060405180910390fd5b61090384848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600f81526e1c995c5d5a5c995911195c1bdcda5d608a1b60208201529150610e909050565b15610a0657602081146109475760405162461bcd60e51b81526004018080602001828103825260228152602001806110f16022913960400191505060405180910390fd5b604080516020601f840181900481028201810190925282815260009161098591858580838501838280828437600092019190915250610f7792505050565b90506001811180156109a05750683635c9adc5dea000008111155b80156109ad575060025481115b6109fe576040805162461bcd60e51b815260206004820181905260248201527f7468652072657175697265644465706f736974206f7574206f662072616e6765604482015290519081900360640190fd5b600155610b9a565b610a6184848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260048152636475657360e01b60208201529150610e909050565b15610b5d5760208114610abb576040805162461bcd60e51b815260206004820152601760248201527f6c656e677468206f662064756573206d69736d61746368000000000000000000604482015290519081900360640190fd5b604080516020601f8401819004810282018101909252828152600091610af991858580838501838280828437600092019190915250610f7792505050565b9050600081118015610b0c575060015481105b610b55576040805162461bcd60e51b81526020600482015260156024820152747468652064756573206f7574206f662072616e676560581b604482015290519081900360640190fd5b600255610b9a565b6040805162461bcd60e51b815260206004820152600d60248201526c756e6b6e6f776e20706172616d60981b604482015290519081900360640190fd5b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a848484846040518080602001806020018381038352878782818152602001925080828437600083820152601f01601f191690910184810383528581526020019050858580828437600083820152604051601f909101601f19169092018290039850909650505050505050a150505050565b61100281565b61100381565b60005460ff1615610c90576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b68056bc75e2d63100000600190815567016345785d8a00006002556000805460ff19169091179055565b3360009081526004602052604090205460ff16610d15576040805162461bcd60e51b81526020600482015260146024820152731c995b185e595c88191bc81b9bdd08195e1a5cdd60621b604482015290519081900360640190fd5b60005460ff16610d68576040805162461bcd60e51b81526020600482015260196024820152781d1a194818dbdb9d1c9858dd081b9bdd081a5b9a5d081e595d603a1b604482015290519081900360640190fd5b610d7061105c565b5033600081815260036020908152604091829020825180840190935280548084526001909101549183018290529192916108fc91610db4919063ffffffff610f7c16565b6040518115909202916000818181858888f19350505050158015610ddc573d6000803e3d6000fd5b50602081015160405161100291829181156108fc0291906000818181858888f19350505050158015610e12573d6000803e3d6000fd5b50336000818152600460209081526040808320805460ff191690556003825280832083815560010192909255815192835290517fd17202129b83db7880d6b9f25df81c58ad46f7e0e2c92236b1aa10663a4876679281900390910190a15050565b61100081565b60015481565b600381565b61100481565b3b151590565b6000816040516020018082805190602001908083835b60208310610ec55780518252601f199092019160209182019101610ea6565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120836040516020018082805190602001908083835b60208310610f335780518252601f199092019160209182019101610f14565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040528051906020012014905092915050565b015190565b6000610fbe83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250610fc5565b9392505050565b600081848411156110545760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611019578181015183820152602001611001565b50505050905090810190601f1680156110465780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60405180604001604052806000815260200160008152509056fe6465706f7369742076616c7565206973206e6f742065786163746c79207468652073616d65636f6e7472616374206973206e6f7420616c6c6f77656420746f20626520612072656c61796572746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e74726163746c656e677468206f662072657175697265644465706f736974206d69736d61746368a264697066735822122011778451ed6d3e3757ce2e74acfc7fa17bf5d16f07168a6ce073d7c91e583c8c64736f6c63430006040033", + }, + UpgradeConfig { + contract_addr: "0x0000000000000000000000000000000000001007", + code: "608060405234801561001057600080fd5b506004361061018e5760003560e01c8063831d65d1116100de578063ab51bb9611610097578063dc927faf11610071578063dc927faf14610486578063f9a2bbc71461048e578063fc3e590814610496578063fd6a68791461049e5761018e565b8063ab51bb96146103fc578063c81b166214610404578063c8509d811461040c5761018e565b8063831d65d11461034457806396713da9146103c05780639ab1a373146103c85780639dc09262146103d0578063a1a11bf5146103d8578063a78abc16146103e05761018e565b8063493279b11161014b5780636e47b482116101255780636e47b4821461032457806370fd5bad1461032c57806375d47a0a146103345780637942fd051461033c5761018e565b8063493279b1146102f55780634bf6c8821461031457806351e806721461031c5761018e565b80630bee7a67146101935780631182b875146101b45780633a21baae146102a35780633dffc387146102ab57806343756e5c146102c95780634900c4ea146102ed575b600080fd5b61019b6104a6565b6040805163ffffffff9092168252519081900360200190f35b61022e600480360360408110156101ca57600080fd5b60ff82351691908101906040810160208201356401000000008111156101ef57600080fd5b82018360208201111561020157600080fd5b8035906020019184600183028401116401000000008311171561022357600080fd5b5090925090506104ab565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610268578181015183820152602001610250565b50505050905090810190601f1680156102955780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61019b61059a565b6102b361059f565b6040805160ff9092168252519081900360200190f35b6102d16105a4565b604080516001600160a01b039092168252519081900360200190f35b6102b36105aa565b6102fd6105af565b6040805161ffff9092168252519081900360200190f35b6102b36105b4565b6102d16105b9565b6102d16105bf565b6102b36105c5565b6102d16105ca565b6102b36105d0565b6103be6004803603604081101561035a57600080fd5b60ff823516919081019060408101602082013564010000000081111561037f57600080fd5b82018360208201111561039157600080fd5b803590602001918460018302840111640100000000831117156103b357600080fd5b5090925090506105d5565b005b6102b3610667565b61019b61066c565b6102d1610671565b6102d1610677565b6103e861067d565b604080519115158252519081900360200190f35b61019b6105aa565b6102d1610686565b6103be6004803603604081101561042257600080fd5b60ff823516919081019060408101602082013564010000000081111561044757600080fd5b82018360208201111561045957600080fd5b8035906020019184600183028401116401000000008311171561047b57600080fd5b50909250905061068c565b6102d1610703565b6102d1610709565b6102b361070f565b6102d1610714565b606481565b606033612000146104ed5760405162461bcd60e51b815260040180806020018281038252602f8152602001806113e7602f913960400191505060405180910390fd5b6104f5611382565b600061053685858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061071a92505050565b91509150806105525761054960646107e0565b92505050610593565b600061055d8361084a565b905063ffffffff811661058457505060408051600081526020810190915291506105939050565b61058d816107e0565b93505050505b9392505050565b606681565b600181565b61100181565b600081565b606081565b600881565b61200081565b61100581565b600281565b61100881565b600b81565b33612000146106155760405162461bcd60e51b815260040180806020018281038252602f8152602001806113e7602f913960400191505060405180910390fd5b6040805162461bcd60e51b815260206004820152601e60248201527f7265636569766520756e65787065637465642061636b207061636b6167650000604482015290519081900360640190fd5b505050565b600981565b606581565b61100781565b61100681565b60005460ff1681565b61100281565b33612000146106cc5760405162461bcd60e51b815260040180806020018281038252602f8152602001806113e7602f913960400191505060405180910390fd5b60405162461bcd60e51b81526004018080602001828103825260238152602001806114166023913960400191505060405180910390fd5b61100381565b61100081565b600381565b61100481565b610722611382565b600061072c611382565b6107346113ac565b61074561074086610beb565b610c10565b90506000805b61075483610c5a565b156107d357806107765761076f61076a84610c7b565b610cc9565b84526107cb565b80600114156107955761078b61076a84610c7b565b60208501526107cb565b80600214156107c6576107af6107aa84610c7b565b610d42565b6001600160a01b03166040850152600191506107cb565b6107d3565b60010161074b565b5091935090915050915091565b604080516001808252818301909252606091829190816020015b60608152602001906001900390816107fa5790505090506108208363ffffffff16610d62565b8160008151811061082d57fe5b602002602001018190525061084181610d75565b9150505b919050565b60006108598260400151610dff565b6108c557604080516020808252601c908201527f74686520746172676574206973206e6f74206120636f6e7472616374000000008183015290517f70e72399380dcfb0338abc03dc8d47f9f470ada8e769c9a78d644ea97385ecb29181900360600190a1506065610845565b81604001516001600160a01b031663ac431751836000015184602001516040518363ffffffff1660e01b8152600401808060200180602001838103835285818151815260200191508051906020019080838360005b8381101561093257818101518382015260200161091a565b50505050905090810190601f16801561095f5780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b8381101561099257818101518382015260200161097a565b50505050905090810190601f1680156109bf5780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b1580156109e057600080fd5b505af19250505080156109f1575060015b610be3576040516000815260443d1015610a0d57506000610aaa565b60046000803e60005160e01c6308c379a08114610a2e576000915050610aaa565b60043d036004833e81513d602482011167ffffffffffffffff82111715610a5a57600092505050610aaa565b808301805167ffffffffffffffff811115610a7c576000945050505050610aaa565b8060208301013d8601811115610a9a57600095505050505050610aaa565b601f01601f191660405250925050505b80610ab55750610b58565b7f70e72399380dcfb0338abc03dc8d47f9f470ada8e769c9a78d644ea97385ecb2816040518080602001828103825283818151815260200191508051906020019080838360005b83811015610b14578181015183820152602001610afc565b50505050905090810190601f168015610b415780820380516001836020036101000a031916815260200191505b509250505060405180910390a16066915050610845565b3d808015610b82576040519150601f19603f3d011682016040523d82523d6000602084013e610b87565b606091505b5060408051602080825283518183015283517f1279f84165b4fd69c35e1f338ff107231b036c655cd1688851e011ce617c4e8d938593928392918301919085019080838360008315610b14578181015183820152602001610afc565b506000919050565b610bf36113cc565b506040805180820190915281518152602082810190820152919050565b610c186113ac565b610c2182610e05565b610c2a57600080fd5b6000610c398360200151610e3f565b60208085015160408051808201909152868152920190820152915050919050565b6000610c646113cc565b505080518051602091820151919092015191011190565b610c836113cc565b610c8c82610c5a565b610c9557600080fd5b60208201516000610ca582610ea2565b80830160209586015260408051808201909152908152938401919091525090919050565b8051606090610cd757600080fd5b6000610ce68360200151610e3f565b83516040805191839003808352601f19601f8201168301602001909152919250606090828015610d1d576020820181803683370190505b5090506000816020019050610d39848760200151018285610fd5565b50949350505050565b8051600090601514610d5357600080fd5b610d5c82611020565b92915050565b6060610d5c610d70836110d5565b6111bb565b6060815160001415610d965750604080516000815260208101909152610845565b606082600081518110610da557fe5b602002602001015190506000600190505b8351811015610de657610ddc82858381518110610dcf57fe5b602002602001015161120d565b9150600101610db6565b50610841610df9825160c060ff1661128a565b8261120d565b3b151590565b8051600090610e1657506000610845565b6020820151805160001a9060c0821015610e3557600092505050610845565b5060019392505050565b8051600090811a6080811015610e59576000915050610845565b60b8811080610e74575060c08110801590610e74575060f881105b15610e83576001915050610845565b60c0811015610e975760b519019050610845565b60f519019050610845565b80516000908190811a6080811015610ebd5760019150610fce565b60b8811015610ed257607e1981019150610fce565b60c0811015610f4c57600060b78203600186019550806020036101000a865104915060018101820193505080831015610f46576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b50610fce565b60f8811015610f615760be1981019150610fce565b600060f78203600186019550806020036101000a865104915060018101820193505080831015610fcc576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b505b5092915050565b80610fdf57610662565b5b60208110610fff578251825260209283019290910190601f1901610fe0565b915181516020939093036101000a6000190180199091169216919091179052565b80516000901580159061103557508151602110155b61103e57600080fd5b600061104d8360200151610e3f565b905080836000015110156110a8576040805162461bcd60e51b815260206004820152601a60248201527f6c656e677468206973206c657373207468616e206f6666736574000000000000604482015290519081900360640190fd5b825160208085015183018051928490039291831015610d3957506020919091036101000a90049392505050565b604080516020808252818301909252606091829190602082018180368337505050602081018490529050600067ffffffffffffffff1984166111195750601861113d565b6fffffffffffffffffffffffffffffffff1984166111395750601061113d565b5060005b60208110156111735781818151811061115257fe5b01602001516001600160f81b0319161561116b57611173565b60010161113d565b60008160200390506060816040519080825280601f01601f1916602001820160405280156111a8576020820181803683370190505b5080830196909652508452509192915050565b6060815160011480156111ed5750607f60f81b826000815181106111db57fe5b01602001516001600160f81b03191611155b156111f9575080610845565b610d5c61120b8351608060ff1661128a565b835b6060806040519050835180825260208201818101602087015b8183101561123e578051835260209283019201611226565b50855184518101855292509050808201602086015b8183101561126b578051835260209283019201611253565b508651929092011591909101601f01601f191660405250905092915050565b60606801000000000000000083106112da576040805162461bcd60e51b815260206004820152600e60248201526d696e70757420746f6f206c6f6e6760901b604482015290519081900360640190fd5b604080516001808252818301909252606091602082018180368337019050509050603784116113345782840160f81b8160008151811061131657fe5b60200101906001600160f81b031916908160001a9053509050610d5c565b606061133f856110d5565b90508381510160370160f81b8260008151811061135857fe5b60200101906001600160f81b031916908160001a905350611379828261120d565b95945050505050565b6040518060600160405280606081526020016060815260200160006001600160a01b031681525090565b60405180604001604052806113bf6113cc565b8152602001600081525090565b60405180604001604052806000815260200160008152509056fe746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e74726163747265636569766520756e6578706563746564206661696c2061636b207061636b616765a2646970667358221220ea2b2b402a564a222b3f3e7c0f671622652543c9c5f6cb6c7b8db265ae9ebe4564736f6c63430006040033", + }, + UpgradeConfig { + contract_addr: "0x0000000000000000000000000000000000001008", + code: "6080604052600436106102465760003560e01c806375d47a0a11610139578063ab51bb96116100b6578063dc6f5e901161007a578063dc6f5e90146108df578063dc927faf14610975578063f9a2bbc71461098a578063fc3e5908146108df578063fd6a68791461099f578063fe3a2af5146104fd57610246565b8063ab51bb96146108b5578063c81b1662146108ca578063c8509d81146107c5578063c8e704a4146108df578063d117a110146108f457610246565b806395b9ad26116100fd57806395b9ad261461084c57806396713da9146108615780639dc0926214610876578063a1a11bf51461088b578063a78abc16146108a057610246565b806375d47a0a146106e757806377d9dae8146106fc5780637942fd05146107b05780637d078e13146103c8578063831d65d1146107c557610246565b80634a688818116101c75780635f558f861161018b5780635f558f86146105515780636b3f1307146105665780636e47b4821461062e57806370fd5bad1461055157806372c4e0861461064357610246565b80634a688818146104fd5780634bc81c00146105125780634bf6c8821461024b57806351e80672146105275780635d499b1b1461053c57610246565b806323996b531161020e57806323996b53146103c85780633dffc387146103c857806343756e5c146103dd578063445fcefe1461040e578063493279b1146104d157610246565b8063077b8f351461024b5780630bee7a67146102765780630f212b1b146102a45780631182b875146102b95780631f91600b146103b3575b600080fd5b34801561025757600080fd5b506102606109b4565b6040805160ff9092168252519081900360200190f35b34801561028257600080fd5b5061028b6109b9565b6040805163ffffffff9092168252519081900360200190f35b3480156102b057600080fd5b506102606109be565b3480156102c557600080fd5b5061033e600480360360408110156102dc57600080fd5b60ff8235169190810190604081016020820135600160201b81111561030057600080fd5b82018360208201111561031257600080fd5b803590602001918460018302840111600160201b8311171561033357600080fd5b5090925090506109c3565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610378578181015183820152602001610360565b50505050905090810190601f1680156103a55780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156103bf57600080fd5b50610260610a4c565b3480156103d457600080fd5b50610260610a51565b3480156103e957600080fd5b506103f2610a56565b604080516001600160a01b039092168252519081900360200190f35b34801561041a57600080fd5b506104bf6004803603602081101561043157600080fd5b810190602081018135600160201b81111561044b57600080fd5b82018360208201111561045d57600080fd5b803590602001918460018302840111600160201b8311171561047e57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610a5c945050505050565b60408051918252519081900360200190f35b3480156104dd57600080fd5b506104e6610bbb565b6040805161ffff9092168252519081900360200190f35b34801561050957600080fd5b50610260610bc0565b34801561051e57600080fd5b50610260610bc5565b34801561053357600080fd5b506103f2610bca565b34801561054857600080fd5b506104bf610bd0565b34801561055d57600080fd5b50610260610bd9565b61061a6004803603604081101561057c57600080fd5b6001600160a01b038235169190810190604081016020820135600160201b8111156105a657600080fd5b8201836020820111156105b857600080fd5b803590602001918460018302840111600160201b831117156105d957600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610bde945050505050565b604080519115158252519081900360200190f35b34801561063a57600080fd5b506103f2611460565b61061a6004803603602081101561065957600080fd5b810190602081018135600160201b81111561067357600080fd5b82018360208201111561068557600080fd5b803590602001918460018302840111600160201b831117156106a657600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611466945050505050565b3480156106f357600080fd5b506103f26118b4565b61061a6004803603604081101561071257600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561073c57600080fd5b82018360208201111561074e57600080fd5b803590602001918460018302840111600160201b8311171561076f57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506118ba945050505050565b3480156107bc57600080fd5b50610260611dc1565b3480156107d157600080fd5b5061084a600480360360408110156107e857600080fd5b60ff8235169190810190604081016020820135600160201b81111561080c57600080fd5b82018360208201111561081e57600080fd5b803590602001918460018302840111600160201b8311171561083f57600080fd5b509092509050611dc6565b005b34801561085857600080fd5b50610260611e79565b34801561086d57600080fd5b50610260611e7e565b34801561088257600080fd5b506103f2611e83565b34801561089757600080fd5b506103f2611e89565b3480156108ac57600080fd5b5061061a611e8f565b3480156108c157600080fd5b5061028b610bc0565b3480156108d657600080fd5b506103f2611e98565b3480156108eb57600080fd5b50610260611e9e565b34801561090057600080fd5b5061091e6004803603602081101561091757600080fd5b5035611ea3565b6040805160ff988916815260208101979097526001600160a01b03909516868601526060860193909352608085019190915290931660a083015267ffffffffffffffff90921660c082015290519081900360e00190f35b34801561098157600080fd5b506103f2611efb565b34801561099657600080fd5b506103f2611f01565b3480156109ab57600080fd5b506103f2611f07565b600881565b606481565b600681565b60603361200014610a055760405162461bcd60e51b815260040180806020018281038252602f8152602001806132a0602f913960400191505060405180910390fd5b610a4483838080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611f0d92505050565b949350505050565b600481565b600181565b61100181565b6020810151600090610a6c613168565b50600081815260016020818152604092839020835160e081018552815460ff9081168252938201549281019290925260028101546001600160a01b031693820184905260038101546060830152600481015460808301526005015491821660a082015261010090910467ffffffffffffffff1660c082015290610af457600092505050610bb6565b600081604001516001600160a01b03166370a082316110046040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015610b5257600080fd5b505afa158015610b66573d6000803e3d6000fd5b505050506040513d6020811015610b7c57600080fd5b505160808301516060840151919250600091610b9d9163ffffffff61219e16565b9050610baf818363ffffffff61219e16565b9450505050505b919050565b606081565b600081565b600581565b61200081565b6402540be40081565b600281565b600080610bea836121e7565b9050610bf4613168565b50600081815260016020818152604092839020835160e081018552815460ff90811682529382015492810183905260028201546001600160a01b03169481019490945260038101546060850152600481015460808501526005015491821660a084015261010090910467ffffffffffffffff1660c0830152610cba576040805162461bcd60e51b815260206004820152601a602482015279189a5b99081c995c5d595cdd08191bd95cdb89dd08195e1a5cdd60321b604482015290519081900360640190fd5b6000610cd78260800151836060015161219e90919063ffffffff16565b905081604001516001600160a01b0316866001600160a01b031614610d2d5760405162461bcd60e51b815260040180806020018281038252604581526020018061322d6045913960600191505060405180910390fd5b336001600160a01b0316866001600160a01b031663893d20e86040518163ffffffff1660e01b815260040160206040518083038186803b158015610d7057600080fd5b505afa158015610d84573d6000803e3d6000fd5b505050506040513d6020811015610d9a57600080fd5b50516001600160a01b031614610de15760405162461bcd60e51b815260040180806020018281038252602e815260200180613272602e913960400191505060405180910390fd5b604080516370a0823160e01b8152611004600482015290516000916001600160a01b038916916370a0823191602480820192602092909190829003018186803b158015610e2d57600080fd5b505afa158015610e41573d6000803e3d6000fd5b505050506040513d6020811015610e5757600080fd5b505160408051636eb1769f60e11b815233600482015230602482015290519192508391610ee89184916001600160a01b038c169163dd62ed3e916044808301926020929190829003018186803b158015610eb057600080fd5b505afa158015610ec4573d6000803e3d6000fd5b505050506040513d6020811015610eda57600080fd5b50519063ffffffff6121ee16565b1015610f3b576040805162461bcd60e51b815260206004820152601760248201527f616c6c6f77616e6365206973206e6f7420656e6f756768000000000000000000604482015290519081900360640190fd5b600034905060006110046001600160a01b031663149d14d96040518163ffffffff1660e01b815260040160206040518083038186803b158015610f7d57600080fd5b505afa158015610f91573d6000803e3d6000fd5b505050506040513d6020811015610fa757600080fd5b50519050808210801590610fc057506402540be4008206155b610ffb5760405162461bcd60e51b81526004018080602001828103825260378152602001806131f66037913960400191505060405180910390fd5b6000611007868b612248565b905063ffffffff8116611206576001600160a01b038a166323b872dd33611004611037898963ffffffff61219e16565b6040518463ffffffff1660e01b815260040180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b031681526020018281526020019350505050602060405180830381600087803b15801561109f57600080fd5b505af11580156110b3573d6000803e3d6000fd5b505050506040513d60208110156110c957600080fd5b5050602086015160408088015160a089015182516323bfccdb60e21b815260048101949094526001600160a01b03909116602484015260ff1660448301525161100491638eff336c91606480830192600092919082900301818387803b15801561113257600080fd5b505af1158015611146573d6000803e3d6000fd5b50505050896001600160a01b03167f78e7dd9aefcdbf795c4936a66f7dc6d41bb56637b54f561a6bf7829dca3348a88a8860600151886040518080602001848152602001838152602001828103825285818151815260200191508051906020019080838360005b838110156111c55781810151838201526020016111ad565b50505050905090810190601f1680156111f25780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a26112be565b896001600160a01b03167f831c0ef4d93bda3bce08b69ae3f29ef1a6e052b833200988554158494405a1078a8360405180806020018363ffffffff1663ffffffff168152602001828103825284818151815260200191508051906020019080838360005b8381101561128257818101518382015260200161126a565b50505050905090810190601f1680156112af5780820380516001836020036101000a031916815260200191505b50935050505060405180910390a25b60008781526001602081905260408220805460ff191681559081018290556002810180546001600160a01b0319169055600381018290556004810191909155600501805468ffffffffffffffffff191690556113186131a4565b5060408051808201825263ffffffff831681526020810189905290516110049085156108fc029086906000818181858888f19350505050158015611360573d6000803e3d6000fd5b5061200063f7a251d760016113748461269f565b611389886402540be40063ffffffff61272916565b6040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b838110156113e75781810151838201526020016113cf565b50505050905090810190601f1680156114145780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b15801561143557600080fd5b505af1158015611449573d6000803e3d6000fd5b505050506001985050505050505050505b92915050565b61100581565b600080611472836121e7565b905061147c613168565b50600081815260016020818152604092839020835160e081018552815460ff90811682529382015492810183905260028201546001600160a01b03169481019490945260038101546060850152600481015460808501526005015491821660a084015261010090910467ffffffffffffffff1660c0830152611542576040805162461bcd60e51b815260206004820152601a602482015279189a5b99081c995c5d595cdd08191bd95cdb89dd08195e1a5cdd60321b604482015290519081900360640190fd5b428160c0015167ffffffffffffffff16106115a4576040805162461bcd60e51b815260206004820152601b60248201527f62696e642072657175657374206973206e6f7420657870697265640000000000604482015290519081900360640190fd5b600034905060006110046001600160a01b031663149d14d96040518163ffffffff1660e01b815260040160206040518083038186803b1580156115e657600080fd5b505afa1580156115fa573d6000803e3d6000fd5b505050506040513d602081101561161057600080fd5b5051905080821080159061162957506402540be4008206155b6116645760405162461bcd60e51b81526004018080602001828103825260378152602001806131f66037913960400191505060405180910390fd5b60008481526001602081905260408220805460ff191681559081018290556002810180546001600160a01b0319169055600381018290556004810191909155600501805468ffffffffffffffffff191690556116be6131a4565b50604080518082018252600181526020810186905290516110049084156108fc029085906000818181858888f19350505050158015611701573d6000803e3d6000fd5b5061200063f7a251d760016117158461269f565b61172a876402540be40063ffffffff61272916565b6040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b83811015611788578181015183820152602001611770565b50505050905090810190601f1680156117b55780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b1580156117d657600080fd5b505af11580156117ea573d6000803e3d6000fd5b5050505083604001516001600160a01b03167f831c0ef4d93bda3bce08b69ae3f29ef1a6e052b833200988554158494405a10788600160405180806020018360ff1663ffffffff168152602001828103825284818151815260200191508051906020019080838360005b8381101561186c578181015183820152602001611854565b50505050905090810190601f1680156118995780820380516001836020036101000a031916815260200191505b50935050505060405180910390a25060019695505050505050565b61100881565b6000806118c6836121e7565b90506118d0613168565b50600081815260016020818152604092839020835160e081018552815460ff90811682529382015492810183905260028201546001600160a01b03169481019490945260038101546060850152600481015460808501526005015491821660a084015261010090910467ffffffffffffffff1660c0830152611996576040805162461bcd60e51b815260206004820152601a602482015279189a5b99081c995c5d595cdd08191bd95cdb89dd08195e1a5cdd60321b604482015290519081900360640190fd5b80604001516001600160a01b0316856001600160a01b0316146119ea5760405162461bcd60e51b815260040180806020018281038252604581526020018061322d6045913960600191505060405180910390fd5b336001600160a01b0316856001600160a01b031663893d20e86040518163ffffffff1660e01b815260040160206040518083038186803b158015611a2d57600080fd5b505afa158015611a41573d6000803e3d6000fd5b505050506040513d6020811015611a5757600080fd5b50516001600160a01b031614611ab4576040805162461bcd60e51b815260206004820152601b60248201527f6f6e6c79206265703265206f776e65722063616e2072656a6563740000000000604482015290519081900360640190fd5b600034905060006110046001600160a01b031663149d14d96040518163ffffffff1660e01b815260040160206040518083038186803b158015611af657600080fd5b505afa158015611b0a573d6000803e3d6000fd5b505050506040513d6020811015611b2057600080fd5b50519050808210801590611b3957506402540be4008206155b611b745760405162461bcd60e51b81526004018080602001828103825260378152602001806131f66037913960400191505060405180910390fd5b60008481526001602081905260408220805460ff191681559081018290556002810180546001600160a01b0319169055600381018290556004810191909155600501805468ffffffffffffffffff19169055611bce6131a4565b50604080518082018252600781526020810186905290516110049084156108fc029085906000818181858888f19350505050158015611c11573d6000803e3d6000fd5b5061200063f7a251d76001611c258461269f565b611c3a876402540be40063ffffffff61272916565b6040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b83811015611c98578181015183820152602001611c80565b50505050905090810190601f168015611cc55780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b158015611ce657600080fd5b505af1158015611cfa573d6000803e3d6000fd5b50505050876001600160a01b03167f831c0ef4d93bda3bce08b69ae3f29ef1a6e052b833200988554158494405a10788600760405180806020018360ff1663ffffffff168152602001828103825284818151815260200191508051906020019080838360005b83811015611d78578181015183820152602001611d60565b50505050905090810190601f168015611da55780820380516001836020036101000a031916815260200191505b50935050505060405180910390a2506001979650505050505050565b600b81565b3361200014611e065760405162461bcd60e51b815260040180806020018281038252602f8152602001806132a0602f913960400191505060405180910390fd5b7f41ce201247b6ceb957dcdb217d0b8acb50b9ea0e12af9af4f5e7f38902101605838383604051808460ff1660ff168152602001806020018281038252848482818152602001925080828437600083820152604051601f909101601f1916909201829003965090945050505050a1505050565b600781565b600981565b61100781565b61100681565b60005460ff1681565b61100281565b600381565b600160208190526000918252604090912080549181015460028201546003830154600484015460059094015460ff9586169593946001600160a01b0390931693919291811690610100900467ffffffffffffffff1687565b61100381565b61100081565b61100481565b6060611f17613168565b6000611f228461276b565b9150915080611f78576040805162461bcd60e51b815260206004820152601f60248201527f756e7265636f676e697a6564207472616e73666572496e207061636b61676500604482015290519081900360640190fd5b815160ff1661202c576020828101805160009081526001928390526040908190208551815460ff1990811660ff928316178355935194820194909455908501516002820180546001600160a01b0319166001600160a01b03909216919091179055606085015160038201556080850151600482015560a08501516005909101805460c08701519316919093161768ffffffffffffffff00191661010067ffffffffffffffff90921691909102179055612183565b815160ff16600114156121365760006110046001600160a01b03166359b9278984602001516040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561208557600080fd5b505afa158015612099573d6000803e3d6000fd5b505050506040513d60208110156120af57600080fd5b505190506001600160a01b038116156121305760208301516040805163b99328c560e01b815260048101929092526001600160a01b0383166024830152516110049163b99328c591604480830192600092919082900301818387803b15801561211757600080fd5b505af115801561212b573d6000803e3d6000fd5b505050505b50612183565b6040805162461bcd60e51b815260206004820152601960248201527f756e7265636f676e697a65642062696e64207061636b61676500000000000000604482015290519081900360640190fd5b60408051600080825260208201909252905b50949350505050565b60006121e083836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506128bd565b9392505050565b6020015190565b6000828201838110156121e0576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600080826001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561228457600080fd5b505afa158015612298573d6000803e3d6000fd5b505050506040513d60208110156122ae57600080fd5b5051604080516395d89b4160e01b815290519192506060916001600160a01b038616916395d89b41916004808301926000929190829003018186803b1580156122f657600080fd5b505afa15801561230a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561233357600080fd5b8101908080516040519392919084600160201b82111561235257600080fd5b90830190602082018581111561236757600080fd5b8251600160201b81118282018810171561238057600080fd5b82525081516020918201929091019080838360005b838110156123ad578181015183820152602001612395565b50505050905090810190601f1680156123da5780820380516001836020036101000a031916815260200191505b5060408181526370a0823160e01b82526110046004830152519495506000946001600160a01b038a1694506370a08231935060248083019350602092829003018186803b15801561242a57600080fd5b505afa15801561243e573d6000803e3d6000fd5b505050506040513d602081101561245457600080fd5b5051608087015160608801519192506000916124759163ffffffff61219e16565b9050428760c0015167ffffffffffffffff16101561249b57506001935061145a92505050565b6124a9838860200151612954565b6124bb57506002935061145a92505050565b808211156124d157506003935061145a92505050565b866060015187604001516001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561251357600080fd5b505afa158015612527573d6000803e3d6000fd5b505050506040513d602081101561253d57600080fd5b50511461255257506004935061145a92505050565b8660a0015160ff16841461256e57506005935061145a92505050565b602080880151604080516359b9278960e01b8152600481019290925251600092611004926359b927899260248083019392829003018186803b1580156125b357600080fd5b505afa1580156125c7573d6000803e3d6000fd5b505050506040513d60208110156125dd57600080fd5b50516001600160a01b031614158061267f57506000801b6110046001600160a01b031663bd46646189604001516040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561265057600080fd5b505afa158015612664573d6000803e3d6000fd5b505050506040513d602081101561267a57600080fd5b505114155b1561269257506006935061145a92505050565b5060009695505050505050565b6040805160028082526060828101909352829190816020015b60608152602001906001900390816126b857505083519091506126e09063ffffffff16612a3c565b816000815181106126ed57fe5b6020026020010181905250612708836020015160001c612a3c565b8160018151811061271557fe5b60200260200101819052506121e081612a4f565b60006121e083836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612ad9565b612773613168565b600061277d613168565b6127856131bb565b61279661279186612b3e565b612b63565b90506000805b6127a583612bad565b156128b057806127ca576127c06127bb84612bce565b612c1c565b60ff1684526128a8565b80600114156127e9576127df6127bb84612bce565b60208501526128a8565b8060021415612816576128036127fe84612bce565b612cd1565b6001600160a01b031660408501526128a8565b80600314156128355761282b6127bb84612bce565b60608501526128a8565b80600414156128545761284a6127bb84612bce565b60808501526128a8565b8060051415612876576128696127bb84612bce565b60ff1660a08501526128a8565b80600614156128a35761288b6127bb84612bce565b67ffffffffffffffff1660c0850152600191506128a8565b6128b0565b60010161279c565b5091935090915050915091565b6000818484111561294c5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156129115781810151838201526020016128f9565b50505050905090810190601f16801561293e5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b815160009083906008108061296a575080516003115b1561297957600091505061145a565b604080516020808252818301909252606091602082018180368337019050509050836020820152808251815181106129ad57fe5b6020910101516001600160f81b031916602d60f81b146129d25760009250505061145a565b600160005b8351811015612a32578281815181106129ec57fe5b602001015160f81c60f81b6001600160f81b031916848281518110612a0d57fe5b01602001516001600160f81b03191614612a2a5760009150612a32565b6001016129d7565b5095945050505050565b606061145a612a4a83612ceb565b612dd1565b6060815160001415612a705750604080516000815260208101909152610bb6565b606082600081518110612a7f57fe5b602002602001015190506000600190505b8351811015612ac057612ab682858381518110612aa957fe5b6020026020010151612e23565b9150600101612a90565b506121e0612ad3825160c060ff16612ea0565b82612e23565b60008183612b285760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156129115781810151838201526020016128f9565b506000838581612b3457fe5b0495945050505050565b612b466131db565b506040805180820190915281518152602082810190820152919050565b612b6b6131bb565b612b7482612f98565b612b7d57600080fd5b6000612b8c8360200151612fd2565b60208085015160408051808201909152868152920190820152915050919050565b6000612bb76131db565b505080518051602091820151919092015191011190565b612bd66131db565b612bdf82612bad565b612be857600080fd5b60208201516000612bf882613035565b80830160209586015260408051808201909152908152938401919091525090919050565b805160009015801590612c3157508151602110155b612c3a57600080fd5b6000612c498360200151612fd2565b90508083600001511015612ca4576040805162461bcd60e51b815260206004820152601a60248201527f6c656e677468206973206c657373207468616e206f6666736574000000000000604482015290519081900360640190fd5b82516020808501518301805192849003929183101561219557506020919091036101000a90049392505050565b8051600090601514612ce257600080fd5b61145a82612c1c565b604080516020808252818301909252606091829190602082018180368337505050602081018490529050600067ffffffffffffffff198416612d2f57506018612d53565b6fffffffffffffffffffffffffffffffff198416612d4f57506010612d53565b5060005b6020811015612d8957818181518110612d6857fe5b01602001516001600160f81b03191615612d8157612d89565b600101612d53565b60008160200390506060816040519080825280601f01601f191660200182016040528015612dbe576020820181803683370190505b5080830196909652508452509192915050565b606081516001148015612e035750607f60f81b82600081518110612df157fe5b01602001516001600160f81b03191611155b15612e0f575080610bb6565b61145a612e218351608060ff16612ea0565b835b6060806040519050835180825260208201818101602087015b81831015612e54578051835260209283019201612e3c565b50855184518101855292509050808201602086015b81831015612e81578051835260209283019201612e69565b508651929092011591909101601f01601f191660405250905092915050565b6060680100000000000000008310612ef0576040805162461bcd60e51b815260206004820152600e60248201526d696e70757420746f6f206c6f6e6760901b604482015290519081900360640190fd5b60408051600180825281830190925260609160208201818036833701905050905060378411612f4a5782840160f81b81600081518110612f2c57fe5b60200101906001600160f81b031916908160001a905350905061145a565b6060612f5585612ceb565b90508381510160370160f81b82600081518110612f6e57fe5b60200101906001600160f81b031916908160001a905350612f8f8282612e23565b95945050505050565b8051600090612fa957506000610bb6565b6020820151805160001a9060c0821015612fc857600092505050610bb6565b5060019392505050565b8051600090811a6080811015612fec576000915050610bb6565b60b8811080613007575060c08110801590613007575060f881105b15613016576001915050610bb6565b60c081101561302a5760b519019050610bb6565b60f519019050610bb6565b80516000908190811a60808110156130505760019150613161565b60b881101561306557607e1981019150613161565b60c08110156130df57600060b78203600186019550806020036101000a8651049150600181018201935050808310156130d9576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b50613161565b60f88110156130f45760be1981019150613161565b600060f78203600186019550806020036101000a86510491506001810182019350508083101561315f576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b505b5092915050565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081019190915290565b604080518082019091526000808252602082015290565b60405180604001604052806131ce6131db565b8152602001600081525090565b60405180604001604052806000815260200160008152509056fe72656c6179466565206d757374206265204e202a203165313020616e642067726561746572207468616e206d696e6952656c6179466565636f6e74616374206164647265737320646f65736e277420657175616c20746f2074686520636f6e7472616374206164647265737320696e2062696e6420726571756573746f6e6c79206265703265206f776e65722063616e20617070726f766520746869732062696e642072657175657374746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e7472616374a2646970667358221220f5905eb90e4a072fe66973705300bc7792e1c43c73c571a09629b9153e6b871864736f6c63430006040033", + }, + UpgradeConfig { + contract_addr: "0x0000000000000000000000000000000000002000", + code: "608060405234801561001057600080fd5b50600436106102485760003560e01c8063863fe4ab1161013b578063c81b1662116100b8578063e3b048051161007c578063e3b048051461072c578063f7a251d71461074c578063f9a2bbc7146107c4578063fc3e5908146107cc578063fd6a6879146107d457610248565b8063c81b1662146106dd578063d31f968d146106e5578063d76a867514610714578063dc927faf1461071c578063e1c7392a1461072457610248565b8063a78abc16116100ff578063a78abc16146105d3578063ab51bb96146105db578063ac431751146105e3578063b0355f5b146103ff578063c27cdcfb146106a157610248565b8063863fe4ab146105b35780638cc8f561146104b657806396713da9146105bb5780639dc09262146105c3578063a1a11bf5146105cb57610248565b8063493279b1116101c957806370fd5bad1161018d57806370fd5bad146104b657806374f079b8146104be57806375d47a0a146104c65780637942fd05146104ce57806384013b6a146104d657610248565b8063493279b11461045f5780634bf6c8821461047e57806351e80672146104865780636e47a51a1461048e5780636e47b482146104ae57610248565b8063308325f411610210578063308325f4146102cf5780633bdc47a6146102d75780633dffc387146103ff578063422f90501461040757806343756e5c1461043b57610248565b806305e682581461024d5780630bee7a671461026b57806314b3023b1461028c57806322556cdc146102a65780632ff32aea146102ae575b600080fd5b6102556107dc565b6040805160ff9092168252519081900360200190f35b6102736107e1565b6040805163ffffffff9092168252519081900360200190f35b6102946107e6565b60408051918252519081900360200190f35b6102946107ec565b6102b66107f1565b60408051600792830b90920b8252519081900360200190f35b6102946107fa565b61038a600480360360608110156102ed57600080fd5b60ff82351691602081013591810190606081016040820135600160201b81111561031657600080fd5b82018360208201111561032857600080fd5b803590602001918460018302840111600160201b8311171561034957600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610800945050505050565b6040805160208082528351818301528351919283929083019185019080838360005b838110156103c45781810151838201526020016103ac565b50505050905090810190601f1680156103f15780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610255610876565b6104276004803603602081101561041d57600080fd5b503560ff1661087b565b604080519115158252519081900360200190f35b610443610890565b604080516001600160a01b039092168252519081900360200190f35b610467610896565b6040805161ffff9092168252519081900360200190f35b61025561089b565b6104436108a0565b610443600480360360208110156104a457600080fd5b503560ff166108a6565b6104436108c1565b6102556108c7565b6102946108cc565b6104436108d2565b6102556108d8565b6105b1600480360360a08110156104ec57600080fd5b810190602081018135600160201b81111561050657600080fd5b82018360208201111561051857600080fd5b803590602001918460018302840111600160201b8311171561053957600080fd5b919390929091602081019035600160201b81111561055657600080fd5b82018360208201111561056857600080fd5b803590602001918460018302840111600160201b8311171561058957600080fd5b919350915080356001600160401b03908116916020810135909116906040013560ff166108dd565b005b610294611a8d565b610255611a95565b610443611a9a565b610443611aa0565b610427611aa6565b6102736107dc565b6105b1600480360360408110156105f957600080fd5b810190602081018135600160201b81111561061357600080fd5b82018360208201111561062557600080fd5b803590602001918460018302840111600160201b8311171561064657600080fd5b919390929091602081019035600160201b81111561066357600080fd5b82018360208201111561067557600080fd5b803590602001918460018302840111600160201b8311171561069657600080fd5b509092509050611aaf565b6106c1600480360360208110156106b757600080fd5b503560ff16612051565b604080516001600160401b039092168252519081900360200190f35b61044361206c565b610427600480360360408110156106fb57600080fd5b5080356001600160a01b0316906020013560ff16612072565b61038a612092565b6104436120b1565b6105b16120b7565b6106c16004803603602081101561074257600080fd5b503560ff1661246e565b6105b16004803603606081101561076257600080fd5b60ff8235169190810190604081016020820135600160201b81111561078657600080fd5b82018360208201111561079857600080fd5b803590602001918460018302840111600160201b831117156107b957600080fd5b919350915035612489565b6104436125da565b6102556125e0565b6104436125e5565b600081565b606481565b60015481565b603281565b60045460070b81565b60025481565b60606000825160210190506060816040519080825280601f01601f191660200182016040528015610838576020820181803683370190505b506021810186905260018101879052828152905060418101600061085b866125eb565b50905061086a818388516125f5565b50909695505050505050565b600181565b60096020526000908152604090205460ff1681565b61100181565b606081565b600881565b61200081565b6005602052600090815260409020546001600160a01b031681565b61100581565b600281565b60035481565b61100881565b600b81565b60005460ff16610930576040805162461bcd60e51b81526020600482015260196024820152781d1a194818dbdb9d1c9858dd081b9bdd081a5b9a5d081e595d603a1b604482015290519081900360640190fd5b60408051630a83aaa960e31b815233600482015290516110069163541d5548916024808301926020929190829003018186803b15801561096f57600080fd5b505afa158015610983573d6000803e3d6000fd5b505050506040513d602081101561099957600080fd5b50516109ec576040805162461bcd60e51b815260206004820152601f60248201527f746865206d73672073656e646572206973206e6f7420612072656c6179657200604482015290519081900360640190fd5b60ff8116600090815260086020526040902054829082906001600160401b039081169083168114610a5c576040805162461bcd60e51b815260206004820152601560248201527439b2b8bab2b731b2903737ba1034b71037b93232b960591b604482015290519081900360640190fd5b60ff8216600090815260086020908152604091829020805467ffffffffffffffff1916600185016001600160401b039081169190911790915582516337d7f9c160e21b81529089166004820152915188926110039263df5fe70492602480840193829003018186803b158015610ad157600080fd5b505afa158015610ae5573d6000803e3d6000fd5b505050506040513d6020811015610afb57600080fd5b5051610b385760405162461bcd60e51b8152600401808060200182810382526023815260200180612bcc6023913960400191505060405180910390fd5b60ff851660009081526005602052604090205485906001600160a01b0316610ba7576040805162461bcd60e51b815260206004820152601860248201527f6368616e6e656c206973206e6f7420737570706f727465640000000000000000604482015290519081900360640190fd5b60608c8c8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050905060608b8b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805163cba510a960e01b81526001600160401b038f1660048201529051939450610cce93611003935063cba510a992506024808301926020929190829003018186803b158015610c7757600080fd5b505afa158015610c8b573d6000803e3d6000fd5b505050506040513d6020811015610ca157600080fd5b505160408051808201909152600381526269626360e81b6020820152610cc78c8c612636565b858561267d565b610d16576040805162461bcd60e51b815260206004820152601460248201527334b73b30b634b21036b2b935b63290383937b7b360611b604482015290519081900360640190fd5b60408051631bb5062960e31b81526001600160401b038c16600482015290516000916110039163dda8314891602480820192602092909190829003018186803b158015610d6257600080fd5b505afa158015610d76573d6000803e3d6000fd5b505050506040513d6020811015610d8c57600080fd5b5051905088600080806060610da08861277a565b935093509350935083610e61578460ff168f6001600160401b03167ff7b2e42d694eb1100184aae86d4245d9e46966100b1dc7e723275b98326854ac8a6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610e1a578181015183820152602001610e02565b50505050905090810190601f168015610e475780820380516001836020036101000a031916815260200191505b509250505060405180910390a35050505050505050611a7f565b8460ff168f6001600160401b03167f36afdaf439a8f43fe72135135d804ae620b37a474f0943b5b85f6788312cad4085604051808260ff1660ff16815260200191505060405180910390a360ff83166113ea5760ff85166000818152600560209081526040808320548151631182b87560e01b815260048101958652602481019283528651604482015286516001600160a01b03909216958695631182b875958d958a9593949093606490910192918601918190849084905b83811015610f32578181015183820152602001610f1a565b50505050905090810190601f168015610f5f5780820380516001836020036101000a031916815260200191505b509350505050600060405180830381600087803b158015610f7f57600080fd5b505af192505050801561106357506040513d6000823e601f3d908101601f191682016040526020811015610fb257600080fd5b8101908080516040519392919084600160201b821115610fd157600080fd5b908301906020820185811115610fe657600080fd5b8251600160201b811182820188101715610fff57600080fd5b82525081516020918201929091019080838360005b8381101561102c578181015183820152602001611014565b50505050905090810190601f1680156110595780820380516001836020036101000a031916815260200191505b5060405250505060015b611375576040516000815260443d101561107f5750600061111a565b60046000803e60005160e01c6308c379a081146110a057600091505061111a565b60043d036004833e81513d60248201116001600160401b03821117156110cb5760009250505061111a565b80830180516001600160401b038111156110ec57600094505050505061111a565b8060208301013d860181111561110a5760009550505050505061111a565b601f01601f191660405250925050505b806111255750611237565b60ff871660009081526007602052604081205461115c916001600160401b039091169089906111579060029088610800565b61282a565b60ff8716600090815260076020908152604080832080546001600160401b038082166001011667ffffffffffffffff19909116179055805182815284518184015284516001600160a01b038716947ff91a8f63e5b3e0e89e5f93e1915a7805f3c52d9a73b3c09769785c2c7bf87acf948794849390840192918601918190849084905b838110156111f75781810151838201526020016111df565b50505050905090810190601f1680156112245780820380516001836020036101000a031916815260200191505b509250505060405180910390a250611370565b3d808015611261576040519150601f19603f3d011682016040523d82523d6000602084013e611266565b606091505b5060ff8716600090815260076020526040812054611299916001600160401b039091169089906111579060029088610800565b60ff8716600090815260076020908152604080832080546001600160401b038082166001011667ffffffffffffffff19909116179055805182815284518184015284516001600160a01b038716947f63ac299d6332d1cc4e61b81e59bc00c0ac7c798addadf33840f1307cd2977351948794849390840192918601918190849084905b8381101561133457818101518382015260200161131c565b50505050905090810190601f1680156113615780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505b6113e4565b8051156113e25760ff87166000908152600760205260408120546113ae916001600160401b039091169089906111579060019086610800565b60ff8716600090815260076020526040902080546001600160401b038082166001011667ffffffffffffffff199091161790555b505b506119b8565b60ff83166001141561168e5760ff8516600081815260056020908152604080832054815163831d65d160e01b815260048101958652602481019283528651604482015286516001600160a01b0390921695869563831d65d1958d958a9593949093606490910192918601918190849084905b8381101561147457818101518382015260200161145c565b50505050905090810190601f1680156114a15780820380516001836020036101000a031916815260200191505b509350505050600060405180830381600087803b1580156114c157600080fd5b505af19250505080156114d2575060015b6113e4576040516000815260443d10156114ee57506000611589565b60046000803e60005160e01c6308c379a0811461150f576000915050611589565b60043d036004833e81513d60248201116001600160401b038211171561153a57600092505050611589565b80830180516001600160401b0381111561155b576000945050505050611589565b8060208301013d860181111561157957600095505050505050611589565b601f01601f191660405250925050505b8061159457506115f9565b60408051602080825283518183015283516001600160a01b038616937ff91a8f63e5b3e0e89e5f93e1915a7805f3c52d9a73b3c09769785c2c7bf87acf93869390928392830191850190808383600083156111f75781810151838201526020016111df565b3d808015611623576040519150601f19603f3d011682016040523d82523d6000602084013e611628565b606091505b5060408051602080825283518183015283516001600160a01b038616937f63ac299d6332d1cc4e61b81e59bc00c0ac7c798addadf33840f1307cd2977351938693909283928301918501908083836000831561133457818101518382015260200161131c565b60ff8316600214156119b85760ff8516600081815260056020908152604080832054815163c8509d8160e01b815260048101958652602481019283528651604482015286516001600160a01b0390921695869563c8509d81958d958a9593949093606490910192918601918190849084905b83811015611718578181015183820152602001611700565b50505050905090810190601f1680156117455780820380516001836020036101000a031916815260200191505b509350505050600060405180830381600087803b15801561176557600080fd5b505af1925050508015611776575060015b6119b6576040516000815260443d10156117925750600061182d565b60046000803e60005160e01c6308c379a081146117b357600091505061182d565b60043d036004833e81513d60248201116001600160401b03821117156117de5760009250505061182d565b80830180516001600160401b038111156117ff57600094505050505061182d565b8060208301013d860181111561181d5760009550505050505061182d565b601f01601f191660405250925050505b8061183857506118e1565b816001600160a01b03167ff91a8f63e5b3e0e89e5f93e1915a7805f3c52d9a73b3c09769785c2c7bf87acf826040518080602001828103825283818151815260200191508051906020019080838360005b838110156118a1578181015183820152602001611889565b50505050905090810190601f1680156118ce5780820380516001836020036101000a031916815260200191505b509250505060405180910390a2506119b6565b3d80801561190b576040519150601f19603f3d011682016040523d82523d6000602084013e611910565b606091505b50816001600160a01b03167f63ac299d6332d1cc4e61b81e59bc00c0ac7c798addadf33840f1307cd2977351826040518080602001828103825283818151815260200191508051906020019080838360005b8381101561197a578181015183820152602001611962565b50505050905090810190601f1680156119a75780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505b505b60ff80861660009081526009602052604090205461100591636f93d2e69189913391879116806119ea575060ff881615155b604080516001600160e01b031960e088901b1681526001600160a01b039586166004820152939094166024840152604483019190915215156064820152905160848083019260209291908290030181600087803b158015611a4a57600080fd5b505af1158015611a5e573d6000803e3d6000fd5b505050506040513d6020811015611a7457600080fd5b505050505050505050505b505050505050505050505050565b630100600081565b600981565b61100781565b61100681565b60005460ff1681565b3361100714611aef5760405162461bcd60e51b815260040180806020018281038252602e815260200180612b22602e913960400191505060405180910390fd5b611b5884848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080518082019091526012815271626174636853697a65466f724f7261636c6560701b602082015291506129809050565b15611bf357604080516020601f8401819004810282018101909252828152600091611b9b91858580838501838280828437600092019190915250612a6792505050565b90506127108111158015611bb05750600a8110155b611beb5760405162461bcd60e51b8152600401808060200182810382526032815260200180612b9a6032913960400191505060405180910390fd5b600155611fbf565b611c5c84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601281527118591913dc955c19185d1950da185b9b995b60721b602082015291506129809050565b15611de457606082828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505082519293505060169091149050611cdf5760405162461bcd60e51b815260040180806020018281038252605a815260200180612ac8605a913960600191505060405180910390fd5b60018101516002820151601683015160ff82161590611cfd81612a6c565b611d4e576040805162461bcd60e51b815260206004820152601960248201527f61646472657373206973206e6f74206120636f6e747261637400000000000000604482015290519081900360640190fd5b60ff8416600081815260056020908152604080832080546001600160a01b0319166001600160a01b038716908117909155808452600683528184208585528352818420805460ff199081166001179091556009909352818420805490931687151517909255519092917f7e3b6af43092577ee20e60eaa1d9b114a7031305c895ee7dd3ffe17196d2e1e091a35050505050611fbf565b611e5184848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080518082019091526016815275195b98589b1953dc911a5cd8589b1950da185b9b995b60521b602082015291506129809050565b15611f8257606082828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505082519293505060029091149050611ed45760405162461bcd60e51b815260040180806020018281038252604a815260200180612b50604a913960600191505060405180910390fd5b600181810151600283015160ff80831660009081526005602052604090205492939192908316909114906001600160a01b03168015611f78576001600160a01b038116600090815260066020908152604080832060ff881680855290835292819020805460ff1916861515908117909155815190815290517fa3132e3f9819fbddc7f0ed6d38d7feef59aa95112090b7c592f5cb5bc4aa4adc929181900390910190a25b5050505050611fbf565b6040805162461bcd60e51b815260206004820152600d60248201526c756e6b6e6f776e20706172616d60981b604482015290519081900360640190fd5b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a848484846040518080602001806020018381038352878782818152602001925080828437600083820152601f01601f191690910184810383528581526020019050858580828437600083820152604051601f909101601f19169092018290039850909650505050505050a150505050565b6008602052600090815260409020546001600160401b031681565b61100281565b600660209081526000928352604080842090915290825290205460ff1681565b6040518060400160405280600381526020016269626360e81b81525081565b61100381565b60005460ff161561210f576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b7f1471eb6eb2c5e789fc3de43f8ce62938c7d1836ec861730447e2ada8fd81017b80546001600160a01b0319908116611008179091557f92e85d02570a8092d09a6e3a57665bc3815a2699a4074001bf1ccabf660f5a36805460ff199081169091557fd8af288fc1c8680b4f4706064cf021e264efb6828fcaf7eb5ca36818eb365bcc8054821660019081179091557f89832631fb3c3307a103ba2c84ab569c64d6182a18893dcd163f0f1c2090733a805484166110049081179091557f6cde3cea4b3a3fb2488b2808bae7556f4a405e50f65e1794383bc026131b13c38054841690557f72e4efa1513b071517c6c74dba31b5934a81aa83cddd400e7081df5529c9943680548416831790557fa9bc9a3a348c357ba16b37005d7e6b3236198c0e939f4af8c5f19b8deeb8ebc08054851690911790557fc575c31fea594a6eb97c8e9d3f9caee4c16218c6ef37e923234c0fe9014a61e78054831690557f4e523af77f034e9810f1c94057f5e931fb3d16a51511a4c3add793617d18610580548316821790557ffb33122aa9f93cc639ebe80a7bc4784c11e6053dde89c6f4f7e268c6a623da1e805484166110001790557fc7694af312c4f286114180fd0ba6a52461fcee8a381636770b19a343af92538a80548316821790557f01112dd68e482ba8d68a7e828cff8b3abcea08eab88941953c180a7e650e9cd480548316821790557fc0a4a8be475dfebc377ebef2d7c4ff47656f572a08dd92b81017efcdba0febe1805484166110071790557f87e8a52529e8ece4ef759037313542a6429ff494a9fab9027fb79db90124eba680548316821790557f4c7666bbcb22d46469f7cc282f70764a7012dca2cce630ff8d83db9a9cdd48f080548316821790557f40f28f99a40bc9f6beea1013afdbc3cdcc689eb76b82c4de06c0acf1e1932ed58054909316611001179092557f0d9cf2cd531699eed8dd34e40ff2884a14a698c4898184fba85194e6f6772d248054821683179055600b60009081527f23f68c9bd22b8a93d06adabe17481c87c016bcbd20adc8bfd707a4d813a572176020527fdf0d5d05428057f5455c2dc8e810dd86d1e9350faa72f16bda8a45443c5b39328054831684179055603283556004805467ffffffffffffffff19166001600160401b031790556002819055600381905580549091169091179055565b6007602052600090815260409020546001600160401b031681565b60005460ff166124dc576040805162461bcd60e51b81526020600482015260196024820152781d1a194818dbdb9d1c9858dd081b9bdd081a5b9a5d081e595d603a1b604482015290519081900360640190fd5b33600090815260066020908152604080832060ff80891685529252909120548591166125395760405162461bcd60e51b8152600401808060200182810382526031815260200180612a976031913960400191505060405180910390fd5b60ff85166000908152600760209081526040808320548151601f88018490048402810184019092528682526001600160401b03169261259e9284928a9261115792909189918c908c908190840183828082843760009201919091525061080092505050565b60ff959095166000908152600760205260409020805467ffffffffffffffff191660019096016001600160401b03169590951790945550505050565b61100081565b600381565b61100481565b8051602090910191565b5b60208110612615578251825260209283019290910190601f19016125f6565b915181516020939093036101000a6000190180199091169216919091179052565b60408051600e808252818301909252606091630100600060ff851617918391602082018180368337505050600e818101969096526006810192909252509283525090919050565b60008561268c57506000612771565b606082518451865160800101016040519080825280601f01601f1916602001820160405280156126c3576020820181803683370190505b50905060006126d182612a72565b6020808901518252019050866000806126e9896125eb565b80865260209095019490925090506127028285836125f5565b9283019261270f886125eb565b80865260209095019490925090506127288285836125f5565b9283018a81526020019261273b876125eb565b909250905061274b8285836125f5565b508351602001612759612a78565b60208183886065600019fa5051600114955050505050505b95945050505050565b600080600060606021855110156127aa575050604080516000808252602082019092529092508291508190612823565b600185015160218601518651604080516020198301808252601f19600119909401939093168101602001909152604189019392916060919080156127f5576020820181803683370190505b5090506000612803826125eb565b509050612815858260218d51036125f5565b506001975091955093509150505b9193509193565b600254431115612869576004805467ffffffffffffffff1981166001600160401b036001600793840b810190930b1617909155600355436002556128aa565b600380546001908101918290555410156128aa576004805467ffffffffffffffff1981166001600160401b036001600793840b810190930b16179091556003555b8160ff16836001600160401b0316600460009054906101000a900460070b6001600160401b03167f3a6e0fc61675aa2a100bcba0568368bb92bcec91c97673391074f11138f0cffe606085604051808361ffff1661ffff16815260200180602001828103825283818151815260200191508051906020019080838360005b83811015612940578181015183820152602001612928565b50505050905090810190601f16801561296d5780820380516001836020036101000a031916815260200191505b50935050505060405180910390a4505050565b6000816040516020018082805190602001908083835b602083106129b55780518252601f199092019160209182019101612996565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120836040516020018082805190602001908083835b60208310612a235780518252601f199092019160209182019101612a04565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040528051906020012014905092915050565b015190565b3b151590565b60200190565b6040518060200160405280600190602082028036833750919291505056fe74686520636f6e747261637420616e64206368616e6e656c2068617665206e6f74206265656e20726567697374657265646c656e677468206f662076616c756520666f72206164644f725570646174654368616e6e656c2073686f756c642062652032322c206368616e6e656c49643a697346726f6d53797374656d3a68616e646c657241646472657373746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e74726163746c656e677468206f662076616c756520666f7220656e61626c654f7244697361626c654368616e6e656c2073686f756c6420626520322c206368616e6e656c49643a6973456e61626c65746865206e6577426174636853697a65466f724f7261636c652073686f756c6420626520696e205b31302c2031303030305d6c6967687420636c69656e74206e6f742073796e632074686520626c6f636b20796574a264697066735822122033c2492ac02e70488d9ed3adb95888d7f5998dff786cf03d72be0cde759a14d064736f6c63430006040033", + }, + ], + )] + .iter() + .cloned() + .collect(); + + + pub static ref NIELS_UPGRADE_CONFIG: HashMap> = [( + 97, + vec![ + UpgradeConfig { + contract_addr: "0x0000000000000000000000000000000000001000", + code: "60806040526004361061027d5760003560e01c80639dc092621161014f578063c8509d81116100c1578063eb57e2021161007a578063eb57e20214610940578063eda5868c14610973578063f340fa0114610988578063f9a2bbc7146109ae578063fc3e5908146109c3578063fd6a6879146109d85761027d565b8063c8509d8114610609578063d86222d5146108d7578063daacdb66146108ec578063dc927faf14610901578063e086c7b114610916578063e1c7392a1461092b5761027d565b8063ab51bb9611610113578063ab51bb961461074a578063ac4317511461075f578063ad3c9da61461082a578063b7ab4db51461085d578063bf9f49951461041b578063c81b1662146108c25761027d565b80639dc09262146106cd578063a1a11bf5146106e2578063a5422d5c146106f7578063a78abc161461070c578063aaf5eb68146107355761027d565b80635667515a116101f35780637942fd05116101ac5780637942fd05146105df57806381650b62146105f4578063831d65d114610609578063853230aa1461068e57806386249882146106a357806396713da9146106b85761027d565b80635667515a146105005780635d77156c146105155780636969a25c1461052a5780636e47b482146105a057806370fd5bad146105b557806375d47a0a146105ca5761027d565b80633dffc387116102455780633dffc3871461041b57806343756e5c14610446578063493279b1146104775780634bf6c882146104a357806351e80672146104b8578063565c56b3146104cd5761027d565b80630bee7a67146102825780631182b875146102b05780631ff18069146103aa578063219f22d5146103d157806335409f7f146103e6575b600080fd5b34801561028e57600080fd5b506102976109ed565b6040805163ffffffff9092168252519081900360200190f35b3480156102bc57600080fd5b50610335600480360360408110156102d357600080fd5b60ff8235169190810190604081016020820135600160201b8111156102f757600080fd5b82018360208201111561030957600080fd5b803590602001918460018302840111600160201b8311171561032a57600080fd5b5090925090506109f2565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561036f578181015183820152602001610357565b50505050905090810190601f16801561039c5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156103b657600080fd5b506103bf610bdf565b60408051918252519081900360200190f35b3480156103dd57600080fd5b50610297610be5565b3480156103f257600080fd5b506104196004803603602081101561040957600080fd5b50356001600160a01b0316610bea565b005b34801561042757600080fd5b50610430610efe565b6040805160ff9092168252519081900360200190f35b34801561045257600080fd5b5061045b610f03565b604080516001600160a01b039092168252519081900360200190f35b34801561048357600080fd5b5061048c610f09565b6040805161ffff9092168252519081900360200190f35b3480156104af57600080fd5b50610430610f0e565b3480156104c457600080fd5b5061045b610f13565b3480156104d957600080fd5b506103bf600480360360208110156104f057600080fd5b50356001600160a01b0316610f19565b34801561050c57600080fd5b50610430610f6b565b34801561052157600080fd5b50610297610f70565b34801561053657600080fd5b506105546004803603602081101561054d57600080fd5b5035610f75565b604080516001600160a01b039788168152958716602087015293909516848401526001600160401b0390911660608401521515608083015260a082019290925290519081900360c00190f35b3480156105ac57600080fd5b5061045b610fd9565b3480156105c157600080fd5b50610430610fdf565b3480156105d657600080fd5b5061045b610fe4565b3480156105eb57600080fd5b50610430610fea565b34801561060057600080fd5b50610297610fef565b34801561061557600080fd5b506104196004803603604081101561062c57600080fd5b60ff8235169190810190604081016020820135600160201b81111561065057600080fd5b82018360208201111561066257600080fd5b803590602001918460018302840111600160201b8311171561068357600080fd5b509092509050610ff4565b34801561069a57600080fd5b506103bf6110a7565b3480156106af57600080fd5b506103bf6110ad565b3480156106c457600080fd5b506104306110b3565b3480156106d957600080fd5b5061045b6110b8565b3480156106ee57600080fd5b5061045b6110be565b34801561070357600080fd5b506103356110c4565b34801561071857600080fd5b506107216110e3565b604080519115158252519081900360200190f35b34801561074157600080fd5b506103bf6110ec565b34801561075657600080fd5b50610297610f6b565b34801561076b57600080fd5b506104196004803603604081101561078257600080fd5b810190602081018135600160201b81111561079c57600080fd5b8201836020820111156107ae57600080fd5b803590602001918460018302840111600160201b831117156107cf57600080fd5b919390929091602081019035600160201b8111156107ec57600080fd5b8201836020820111156107fe57600080fd5b803590602001918460018302840111600160201b8311171561081f57600080fd5b5090925090506110f5565b34801561083657600080fd5b506103bf6004803603602081101561084d57600080fd5b50356001600160a01b031661139c565b34801561086957600080fd5b506108726113ae565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156108ae578181015183820152602001610896565b505050509050019250505060405180910390f35b3480156108ce57600080fd5b5061045b6114d4565b3480156108e357600080fd5b506103bf6114da565b3480156108f857600080fd5b506103bf6114e6565b34801561090d57600080fd5b5061045b6114ec565b34801561092257600080fd5b506103bf6114f2565b34801561093757600080fd5b506104196114f7565b34801561094c57600080fd5b506104196004803603602081101561096357600080fd5b50356001600160a01b03166116fa565b34801561097f57600080fd5b506102976118c9565b6104196004803603602081101561099e57600080fd5b50356001600160a01b03166118ce565b3480156109ba57600080fd5b5061045b611b04565b3480156109cf57600080fd5b50610430611b0a565b3480156109e457600080fd5b5061045b611b0f565b606481565b60005460609060ff16610a48576040805162461bcd60e51b81526020600482015260196024820152781d1a194818dbdb9d1c9858dd081b9bdd081a5b9a5d081e595d603a1b604482015290519081900360640190fd5b3361200014610a885760405162461bcd60e51b815260040180806020018281038252602f8152602001806140de602f913960400191505060405180910390fd5b610a90613d69565b6000610ad185858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611b1592505050565b9150915080610aed57610ae46064611c6e565b92505050610bd8565b815160009060ff16610b0d57610b068360200151611ccf565b9050610ba4565b825160ff1660011415610ba057826020015151600114610b7a577f70e72399380dcfb0338abc03dc8d47f9f470ada8e769c9a78d644ea97385ecb2604051808060200182810382526025815260200180613e6c6025913960400191505060405180910390a1506067610b9b565b610b068360200151600081518110610b8e57fe5b6020026020010151612ad5565b610ba4565b5060655b63ffffffff8116610bc95750506040805160008152602081019091529150610bd89050565b610bd281611c6e565b93505050505b9392505050565b60035481565b606881565b3361100114610c2a5760405162461bcd60e51b815260040180806020018281038252602981526020018061413a6029913960400191505060405180910390fd5b6001600160a01b03811660009081526004602052604090205480610c4e5750610efb565b600181039050600060018281548110610c6357fe5b60009182526020909120600360049092020101546001549091506000190180610cb257600060018481548110610c9557fe5b906000526020600020906004020160030181905550505050610efb565b6040805183815290516001600160a01b038616917f3b6f9ef90462b512a1293ecec018670bf7b7f1876fb727590a8a6d7643130a70919081900360200190a26001600160a01b038416600090815260046020526040812055600154600019018314610e3457600180546000198101908110610d2957fe5b906000526020600020906004020160018481548110610d4457fe5b6000918252602082208354600492830290910180546001600160a01b03199081166001600160a01b0393841617825560018087015481840180548416918616919091179055600280880180549185018054909416919095161780835584546001600160401b03600160a01b91829004160267ffffffffffffffff60a01b1990911617808355935460ff600160e01b918290041615150260ff60e01b199094169390931790556003948501549401939093558254868401939192919087908110610e0957fe5b600091825260208083206004909202909101546001600160a01b031683528201929092526040019020555b6001805480610e3f57fe5b60008281526020812060046000199093019283020180546001600160a01b0319908116825560018201805490911690556002810180546001600160e81b03191690556003018190559155818381610e9257fe5b0490508015610ef65760015460005b81811015610ef3578260018281548110610eb757fe5b9060005260206000209060040201600301540160018281548110610ed757fe5b6000918252602090912060036004909202010155600101610ea1565b50505b505050505b50565b600181565b61100181565b606181565b600881565b61200081565b6001600160a01b03811660009081526004602052604081205480610f41576000915050610f66565b600180820381548110610f5057fe5b9060005260206000209060040201600301549150505b919050565b600081565b606781565b60018181548110610f8257fe5b600091825260209091206004909102018054600182015460028301546003909301546001600160a01b0392831694509082169291821691600160a01b81046001600160401b031691600160e01b90910460ff169086565b61100581565b600281565b61100881565b600b81565b606681565b33612000146110345760405162461bcd60e51b815260040180806020018281038252602f8152602001806140de602f913960400191505060405180910390fd5b7f41ce201247b6ceb957dcdb217d0b8acb50b9ea0e12af9af4f5e7f38902101605838383604051808460ff1660ff168152602001806020018281038252848482818152602001925080828437600083820152604051601f909101601f1916909201829003965090945050505050a1505050565b6103e881565b60025481565b600981565b61100781565b61100681565b604051806101e001604052806101b78152602001613f066101b7913981565b60005460ff1681565b6402540be40081565b60005460ff16611148576040805162461bcd60e51b81526020600482015260196024820152781d1a194818dbdb9d1c9858dd081b9bdd081a5b9a5d081e595d603a1b604482015290519081900360640190fd5b33611007146111885760405162461bcd60e51b815260040180806020018281038252602e815260200180613e91602e913960400191505060405180910390fd5b6111f284848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080518082019091526013815272065787069726554696d655365636f6e6447617606c1b60208201529150612c4c9050565b156112cd57602081146112365760405162461bcd60e51b8152600401808060200182810382526026815260200180613ee06026913960400191505060405180910390fd5b604080516020601f840181900481028201810190925282815260009161127491858580838501838280828437600092019190915250612d3492505050565b90506064811015801561128a5750620186a08111155b6112c55760405162461bcd60e51b8152600401808060200182810382526027815260200180613e456027913960400191505060405180910390fd5b60025561130a565b6040805162461bcd60e51b815260206004820152600d60248201526c756e6b6e6f776e20706172616d60981b604482015290519081900360640190fd5b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a848484846040518080602001806020018381038352878782818152602001925080828437600083820152601f01601f191690910184810383528581526020019050858580828437600083820152604051601f909101601f19169092018290039850909650505050505050a150505050565b60046020526000908152604090205481565b6001546060906000805b828110156113ff57600181815481106113cd57fe5b9060005260206000209060040201600201601c9054906101000a900460ff166113f7576001909101905b6001016113b8565b5060608160405190808252806020026020018201604052801561142c578160200160208202803683370190505b50600092509050815b838110156114cc576001818154811061144a57fe5b9060005260206000209060040201600201601c9054906101000a900460ff166114c4576001818154811061147a57fe5b600091825260209091206004909102015482516001600160a01b03909116908390859081106114a557fe5b6001600160a01b03909216602092830291909101909101526001909201915b600101611435565b509250505090565b61100281565b67016345785d8a000081565b60055481565b61100381565b602981565b60005460ff161561154f576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b611557613d69565b600061157d604051806101e001604052806101b78152602001613f066101b79139611b15565b91509150806115bd5760405162461bcd60e51b81526004018080602001828103825260218152602001806140bd6021913960400191505060405180910390fd5b60005b8260200151518110156116e2576001836020015182815181106115df57fe5b60209081029190910181015182546001818101855560009485528385208351600493840290910180546001600160a01b039283166001600160a01b03199182161782558587015182850180549185169183169190911790556040860151600283018054606089015160808a01511515600160e01b0260ff60e01b196001600160401b03909216600160a01b0267ffffffffffffffff60a01b199590981692909516919091179290921694909417161790915560a0909301516003909301929092559186015180519185019391859081106116b557fe5b602090810291909101810151516001600160a01b03168252810191909152604001600020556001016115c0565b50506103e8600255506000805460ff19166001179055565b336110011461173a5760405162461bcd60e51b815260040180806020018281038252602981526020018061413a6029913960400191505060405180910390fd5b6001600160a01b0381166000908152600460205260409020548061175e5750610efb565b60018103905060006001828154811061177357fe5b906000526020600020906004020160030154905060006001838154811061179657fe5b906000526020600020906004020160030181905550600060018080549050039050836001600160a01b03167f8cd4e147d8af98a9e3b6724021b8bf6aed2e5dac71c38f2dce8161b82585b25d836040518082815260200191505060405180910390a28061180557505050610efb565b600081838161181057fe5b0490508015610ef65760005b8481101561186e57816001828154811061183257fe5b906000526020600020906004020160030154016001828154811061185257fe5b600091825260209091206003600490920201015560010161181c565b50600180549085015b81811015610ef357826001828154811061188d57fe5b90600052602060002090600402016003015401600182815481106118ad57fe5b6000918252602090912060036004909202010155600101611877565b606581565b33411461190c5760405162461bcd60e51b815260040180806020018281038252602d81526020018061410d602d913960400191505060405180910390fd5b60005460ff1661195f576040805162461bcd60e51b81526020600482015260196024820152781d1a194818dbdb9d1c9858dd081b9bdd081a5b9a5d081e595d603a1b604482015290519081900360640190fd5b600034116119ac576040805162461bcd60e51b81526020600482015260156024820152746465706f7369742076616c7565206973207a65726f60581b604482015290519081900360640190fd5b6001600160a01b03811660009081526004602052604090205434908015611abf5760006001808303815481106119de57fe5b9060005260206000209060040201905080600201601c9054906101000a900460ff1615611a49576040805184815290516001600160a01b038616917ff177e5d6c5764d79c32883ed824111d9b13f5668cf6ab1cc12dd36791dd955b4919081900360200190a2611ab9565b600354611a5c908463ffffffff612d3916565b6003908155810154611a74908463ffffffff612d3916565b60038201556040805184815290516001600160a01b038616917f93a090ecc682c002995fad3c85b30c5651d7fd29b0be5da9d784a3302aedc055919081900360200190a25b50611aff565b6040805183815290516001600160a01b038516917ff177e5d6c5764d79c32883ed824111d9b13f5668cf6ab1cc12dd36791dd955b4919081900360200190a25b505050565b61100081565b600381565b61100481565b611b1d613d69565b6000611b27613d69565b611b2f613d81565b611b40611b3b86612d93565b612db8565b90506000805b611b4f83612e02565b15611c605780611b7457611b6a611b6584612e23565b612e71565b60ff168452611c58565b8060011415611c53576060611b90611b8b85612e23565b612f28565b90508051604051908082528060200260200182016040528015611bcd57816020015b611bba613da1565b815260200190600190039081611bb25790505b50602086015260005b8151811015611c4857611be7613da1565b6000611c05848481518110611bf857fe5b6020026020010151612ff9565b9150915080611c2257876000995099505050505050505050611c69565b8188602001518481518110611c3357fe5b60209081029190910101525050600101611bd6565b506001925050611c58565b611c60565b600101611b46565b50919350909150505b915091565b604080516001808252818301909252606091829190816020015b6060815260200190600190039081611c88579050509050611cae8363ffffffff166130d6565b81600081518110611cbb57fe5b6020026020010181905250610bd8816130e9565b6000806060611cdd84613173565b9150915081611d8a577f70e72399380dcfb0338abc03dc8d47f9f470ada8e769c9a78d644ea97385ecb2816040518080602001828103825283818151815260200191508051906020019080838360005b83811015611d45578181015183820152602001611d2d565b50505050905090810190601f168015611d725780820380516001836020036101000a031916815260200191505b509250505060405180910390a1606692505050610f66565b600080805b600154811015611e075767016345785d8a000060018281548110611daf57fe5b90600052602060002090600402016003015410611dd157600190920191611dff565b600060018281548110611de057fe5b9060005260206000209060040201600301541115611dff576001909101905b600101611d8f565b50606082604051908082528060200260200182016040528015611e34578160200160208202803683370190505b509050606083604051908082528060200260200182016040528015611e63578160200160208202803683370190505b509050606084604051908082528060200260200182016040528015611e92578160200160208202803683370190505b509050606085604051908082528060200260200182016040528015611ec1578160200160208202803683370190505b5090506000606086604051908082528060200260200182016040528015611ef2578160200160208202803683370190505b509050606087604051908082528060200260200182016040528015611f21578160200160208202803683370190505b509050600098506000975060608d905060006110046001600160a01b031663149d14d96040518163ffffffff1660e01b815260040160206040518083038186803b158015611f6e57600080fd5b505afa158015611f82573d6000803e3d6000fd5b505050506040513d6020811015611f9857600080fd5b5051905067016345785d8a000081111561200d577f70e72399380dcfb0338abc03dc8d47f9f470ada8e769c9a78d644ea97385ecb2604051808060200182810382526021815260200180613ebf6021913960400191505060405180910390a160689d5050505050505050505050505050610f66565b60005b6001548110156122805767016345785d8a00006001828154811061203057fe5b906000526020600020906004020160030154106121b6576001818154811061205457fe5b906000526020600020906004020160020160009054906101000a90046001600160a01b03168a8d8151811061208557fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060006402540be400600183815481106120ba57fe5b906000526020600020906004020160030154816120d357fe5b06600183815481106120e157fe5b906000526020600020906004020160030154039050612109838261325590919063ffffffff16565b8a8e8151811061211557fe5b6020026020010181815250506001828154811061212e57fe5b906000526020600020906004020160020160009054906101000a90046001600160a01b0316888e8151811061215f57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505081898e8151811061218c57fe5b60209081029190910101526121a7878263ffffffff612d3916565b6001909d019c96506122789050565b6000600182815481106121c557fe5b906000526020600020906004020160030154111561227857600181815481106121ea57fe5b906000526020600020906004020160010160009054906101000a90046001600160a01b0316858c8151811061221b57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506001818154811061224857fe5b906000526020600020906004020160030154848c8151811061226657fe5b60209081029190910101526001909a01995b600101612010565b50600085156126be576110046001600160a01b0316636e056520878c8c8b60025442016040518663ffffffff1660e01b815260040180806020018060200180602001856001600160401b03166001600160401b03168152602001848103845288818151815260200191508051906020019060200280838360005b838110156123125781810151838201526020016122fa565b50505050905001848103835287818151815260200191508051906020019060200280838360005b83811015612351578181015183820152602001612339565b50505050905001848103825286818151815260200191508051906020019060200280838360005b83811015612390578181015183820152602001612378565b505050509050019750505050505050506020604051808303818588803b1580156123b957600080fd5b505af1935050505080156123df57506040513d60208110156123da57600080fd5b505160015b61261a576040516000815260443d10156123fb57506000612496565b60046000803e60005160e01c6308c379a0811461241c576000915050612496565b60043d036004833e81513d60248201116001600160401b038211171561244757600092505050612496565b80830180516001600160401b03811115612468576000945050505050612496565b8060208301013d860181111561248657600095505050505050612496565b601f01601f191660405250925050505b806124a15750612545565b60019150867fa7cdeed7d0db45e3219a6e5d60838824c16f1d39991fcfe3f963029c844bf280826040518080602001828103825283818151815260200191508051906020019080838360005b838110156125055781810151838201526020016124ed565b50505050905090810190601f1680156125325780820380516001836020036101000a031916815260200191505b509250505060405180910390a250612615565b3d80801561256f576040519150601f19603f3d011682016040523d82523d6000602084013e612574565b606091505b5060019150867fbfa884552dd8921b6ce90bfe906952ae5b3b29be0cc1a951d4f62697635a3a45826040518080602001828103825283818151815260200191508051906020019080838360005b838110156125d95781810151838201526020016125c1565b50505050905090810190601f1680156126065780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505b6126be565b8015612658576040805188815290517fa217d08e65f80c73121cd9db834d81652d544bfbf452f6d04922b16c90a37b709181900360200190a16126bc565b604080516020808252601b908201527f6261746368207472616e736665722072657475726e2066616c7365000000000081830152905188917fa7cdeed7d0db45e3219a6e5d60838824c16f1d39991fcfe3f963029c844bf280919081900360600190a25b505b80156128745760005b88518110156128725760008982815181106126de57fe5b602002602001015190506000600182815481106126f757fe5b60009182526020909120600160049092020181015481546001600160a01b03909116916108fc918590811061272857fe5b9060005260206000209060040201600301549081150290604051600060405180830381858888f19350505050905080156127e4576001828154811061276957fe5b60009182526020909120600160049092020181015481546001600160a01b03909116917f6c61d60f69a7beb3e1c80db7f39f37b208537cbb19da3174511b477812b2fc7d91859081106127b857fe5b9060005260206000209060040201600301546040518082815260200191505060405180910390a2612868565b600182815481106127f157fe5b60009182526020909120600160049092020181015481546001600160a01b03909116917f25d0ce7d2f0cec669a8c17efe49d195c13455bb8872b65fa610ac7f53fe4ca7d918590811061284057fe5b9060005260206000209060040201600301546040518082815260200191505060405180910390a25b50506001016126c7565b505b8451156129be5760005b85518110156129bc57600086828151811061289557fe5b60200260200101516001600160a01b03166108fc8784815181106128b557fe5b60200260200101519081150290604051600060405180830381858888f193505050509050801561294b578682815181106128eb57fe5b60200260200101516001600160a01b03167f6c61d60f69a7beb3e1c80db7f39f37b208537cbb19da3174511b477812b2fc7d87848151811061292957fe5b60200260200101516040518082815260200191505060405180910390a26129b3565b86828151811061295757fe5b60200260200101516001600160a01b03167f25d0ce7d2f0cec669a8c17efe49d195c13455bb8872b65fa610ac7f53fe4ca7d87848151811061299557fe5b60200260200101516040518082815260200191505060405180910390a25b5060010161287e565b505b4715612a27576040805147815290517f6ecc855f9440a9282c90913bbc91619fd44f5ec0b462af28d127b116f130aa4d9181900360200190a1604051611002904780156108fc02916000818181858888f19350505050158015612a25573d6000803e3d6000fd5b505b60006003819055600555825115612a4157612a4183613297565b6110016001600160a01b031663fc4333cd6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612a7e57600080fd5b505af1158015612a92573d6000803e3d6000fd5b50506040517fedd8d7296956dd970ab4de3f2fc03be2b0ffc615d20cd4c72c6e44f928630ebf925060009150a15060009f9e505050505050505050505050505050565b80516001600160a01b0316600090815260046020526040812054801580612b265750600180820381548110612b0657fe5b9060005260206000209060040201600201601c9054906101000a900460ff165b15612b6c5782516040516001600160a01b03909116907fe209c46bebf57cf265d5d9009a00870e256d9150f3ed5281ab9d9eb3cec6e4be90600090a26000915050610f66565b600154600554600019820111801590612bc25784516040516001600160a01b03909116907fe209c46bebf57cf265d5d9009a00870e256d9150f3ed5281ab9d9eb3cec6e4be90600090a260009350505050610f66565b600580546001908101909155805481906000198601908110612be057fe5b6000918252602082206002600490920201018054921515600160e01b0260ff60e01b199093169290921790915585516040516001600160a01b03909116917ff226e7d8f547ff903d9d419cf5f54e0d7d07efa9584135a53a057c5f1f27f49a91a2506000949350505050565b6000816040516020018082805190602001908083835b60208310612c815780518252601f199092019160209182019101612c62565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120836040516020018082805190602001908083835b60208310612cef5780518252601f199092019160209182019101612cd0565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051602081830303815290604052805190602001201490505b92915050565b015190565b600082820183811015610bd8576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b612d9b613dd6565b506040805180820190915281518152602082810190820152919050565b612dc0613d81565b612dc98261375e565b612dd257600080fd5b6000612de18360200151613798565b60208085015160408051808201909152868152920190820152915050919050565b6000612e0c613dd6565b505080518051602091820151919092015191011190565b612e2b613dd6565b612e3482612e02565b612e3d57600080fd5b60208201516000612e4d826137fb565b80830160209586015260408051808201909152908152938401919091525090919050565b805160009015801590612e8657508151602110155b612e8f57600080fd5b6000612e9e8360200151613798565b90508083600001511015612ef9576040805162461bcd60e51b815260206004820152601a60248201527f6c656e677468206973206c657373207468616e206f6666736574000000000000604482015290519081900360640190fd5b825160208085015183018051928490039291831015612f1f57826020036101000a820491505b50949350505050565b6060612f338261375e565b612f3c57600080fd5b6000612f478361392e565b9050606081604051908082528060200260200182016040528015612f8557816020015b612f72613dd6565b815260200190600190039081612f6a5790505b5090506000612f978560200151613798565b60208601510190506000805b84811015612fee57612fb4836137fb565b9150604051806040016040528083815260200184815250848281518110612fd757fe5b602090810291909101015291810191600101612fa3565b509195945050505050565b613001613da1565b600061300b613da1565b613013613d81565b61301c85612db8565b90506000805b61302b83612e02565b15611c6057806130565761304661304184612e23565b61398a565b6001600160a01b031684526130ce565b806001141561307e5761306b61304184612e23565b6001600160a01b031660208501526130ce565b80600214156130a65761309361304184612e23565b6001600160a01b031660408501526130ce565b8060031415611c53576130bb611b6584612e23565b6001600160401b03166060850152600191505b600101613022565b6060612d2e6130e4836139a4565b613a8a565b606081516000141561310a5750604080516000815260208101909152610f66565b60608260008151811061311957fe5b602002602001015190506000600190505b835181101561315a576131508285838151811061314357fe5b6020026020010151613adc565b915060010161312a565b50610bd861316d825160c060ff16613b59565b82613adc565b600060606029835111156131a5576000604051806060016040528060298152602001613df16029913991509150611c69565b60005b835181101561323b5760005b81811015613232578481815181106131c857fe5b6020026020010151600001516001600160a01b03168583815181106131e957fe5b6020026020010151600001516001600160a01b0316141561322a5760006040518060600160405280602b8152602001613e1a602b9139935093505050611c69565b6001016131b4565b506001016131a8565b505060408051602081019091526000815260019150915091565b6000610bd883836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613c51565b600154815160005b828110156133b45760016132b1613da1565b600183815481106132be57fe5b600091825260208083206040805160c08101825260049490940290910180546001600160a01b0390811685526001820154811693850193909352600281015492831691840191909152600160a01b82046001600160401b03166060840152600160e01b90910460ff16151560808301526003015460a082015291505b848110156133885786818151811061334e57fe5b6020026020010151600001516001600160a01b031682600001516001600160a01b031614156133805760009250613388565b60010161333a565b5081156133aa5780516001600160a01b03166000908152600460205260408120555b505060010161329f565b508082111561342957805b828110156134275760018054806133d257fe5b60008281526020812060046000199093019283020180546001600160a01b03199081168255600182810180549092169091556002820180546001600160e81b03191690556003909101919091559155016133bf565b505b6000818310613438578161343a565b825b905060005b81811015613634576134ec85828151811061345657fe5b60200260200101516001838154811061346b57fe5b60009182526020918290206040805160c08101825260049390930290910180546001600160a01b0390811684526001820154811694840194909452600281015493841691830191909152600160a01b83046001600160401b03166060830152600160e01b90920460ff161515608082015260039091015460a0820152613ce8565b61360757806001016004600087848151811061350457fe5b6020026020010151600001516001600160a01b03166001600160a01b031681526020019081526020016000208190555084818151811061354057fe5b60200260200101516001828154811061355557fe5b6000918252602091829020835160049092020180546001600160a01b039283166001600160a01b0319918216178255928401516001820180549184169185169190911790556040840151600282018054606087015160808801511515600160e01b0260ff60e01b196001600160401b03909216600160a01b0267ffffffffffffffff60a01b1995909716929097169190911792909216939093171692909217905560a09091015160039091015561362c565b60006001828154811061361657fe5b9060005260206000209060040201600301819055505b60010161343f565b508282111561375857825b82811015610ef657600185828151811061365557fe5b60209081029190910181015182546001818101855560009485528385208351600493840290910180546001600160a01b039283166001600160a01b03199182161782559585015181840180549184169188169190911790556040850151600282018054606088015160808901511515600160e01b0260ff60e01b196001600160401b03909216600160a01b0267ffffffffffffffff60a01b199590971692909a169190911792909216939093171695909517905560a0909201516003909301929092558751908401929088908590811061372b57fe5b602090810291909101810151516001600160a01b031682528101919091526040016000205560010161363f565b50505050565b805160009061376f57506000610f66565b6020820151805160001a9060c082101561378e57600092505050610f66565b5060019392505050565b8051600090811a60808110156137b2576000915050610f66565b60b88110806137cd575060c081108015906137cd575060f881105b156137dc576001915050610f66565b60c08110156137f05760b519019050610f66565b60f519019050610f66565b80516000908190811a60808110156138165760019150613927565b60b881101561382b57607e1981019150613927565b60c08110156138a557600060b78203600186019550806020036101000a86510491506001810182019350508083101561389f576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b50613927565b60f88110156138ba5760be1981019150613927565b600060f78203600186019550806020036101000a865104915060018101820193505080831015613925576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b505b5092915050565b805160009061393f57506000610f66565b600080905060006139538460200151613798565b602085015185519181019250015b8082101561398157613972826137fb565b60019093019290910190613961565b50909392505050565b805160009060151461399b57600080fd5b612d2e82612e71565b604080516020808252818301909252606091829190602082018180368337505050602081018490529050600067ffffffffffffffff1984166139e857506018613a0c565b6fffffffffffffffffffffffffffffffff198416613a0857506010613a0c565b5060005b6020811015613a4257818181518110613a2157fe5b01602001516001600160f81b03191615613a3a57613a42565b600101613a0c565b60008160200390506060816040519080825280601f01601f191660200182016040528015613a77576020820181803683370190505b5080830196909652508452509192915050565b606081516001148015613abc5750607f60f81b82600081518110613aaa57fe5b01602001516001600160f81b03191611155b15613ac8575080610f66565b612d2e613ada8351608060ff16613b59565b835b6060806040519050835180825260208201818101602087015b81831015613b0d578051835260209283019201613af5565b50855184518101855292509050808201602086015b81831015613b3a578051835260209283019201613b22565b508651929092011591909101601f01601f191660405250905092915050565b6060680100000000000000008310613ba9576040805162461bcd60e51b815260206004820152600e60248201526d696e70757420746f6f206c6f6e6760901b604482015290519081900360640190fd5b60408051600180825281830190925260609160208201818036833701905050905060378411613c035782840160f81b81600081518110613be557fe5b60200101906001600160f81b031916908160001a9053509050612d2e565b6060613c0e856139a4565b90508381510160370160f81b82600081518110613c2757fe5b60200101906001600160f81b031916908160001a905350613c488282613adc565b95945050505050565b60008184841115613ce05760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613ca5578181015183820152602001613c8d565b50505050905090810190601f168015613cd25780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b805182516000916001600160a01b039182169116148015613d22575081602001516001600160a01b031683602001516001600160a01b0316145b8015613d47575081604001516001600160a01b031683604001516001600160a01b0316145b8015610bd85750506060908101519101516001600160401b0390811691161490565b60408051808201909152600081526060602082015290565b6040518060400160405280613d94613dd6565b8152602001600081525090565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915290565b60405180604001604052806000815260200160008152509056fe746865206e756d626572206f662076616c696461746f72732065786365656420746865206c696d69746475706c696361746520636f6e73656e7375732061646472657373206f662076616c696461746f725365747468652065787069726554696d655365636f6e64476170206973206f7574206f662072616e67656c656e677468206f66206a61696c2076616c696461746f7273206d757374206265206f6e65746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e7472616374666565206973206c6172676572207468616e2044555354595f494e434f4d494e476c656e677468206f662065787069726554696d655365636f6e64476170206d69736d61746368f901b480f901b0f846941284214b9b9c85549ab3d2b972df0deef66ac2c9946ddf42a51534fc98d0c0a3b42c963cace8441ddf9477f066f3fb515bb97015e4b4afddbcb25c94286b86048c27395000f84694b71b214cb885500844365e95cd9942c7276e7fd894d22ca3ba2141d23adab65ce4940eb7665ea2b6a794748c284f46ab87fd492326f1e2fe731d22ad2db386048c27395000f84694a2959d3f95eae5dc7d70144ce1b73b403b7eb6e0948081ef03f1d9e0bb4a5bf38f16285c879299f07f940ce09b38374887cb564b7efa60be130d99ed5f9586048c27395000f84694980a75ecd1309ea12fa2ed87a8744fbfc9b863d594cc6ac05c95a99c1f7b5f88de0e3486c82293b2709407eecf36cf0901fefe4bc505d6ba03c7480c7b5786048c27395000f8469435552c16704d214347f29fa77f77da6d75d7c75294dc4973e838e3949c77aced16ac2315dc2d7ab11194f57d36e129881a3a13a024fe8072507e5b2e70f886048c27395000f84694f474cf03cceff28abc65c9cbae594f725c80e12d94e61a183325a18a173319dd8e19c8d069459e217594ddfcaedf9bb451098c9917a45f02bd61342cca6686048c273950006661696c656420746f20706172736520696e69742076616c696461746f72536574746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e7472616374746865206d6573736167652073656e646572206d7573742062652074686520626c6f636b2070726f6475636572746865206d6573736167652073656e646572206d75737420626520736c61736820636f6e7472616374a2646970667358221220ccbabefa423adb1cc63a2da2811a349dd54007c9dc3bd490ac200572c4e8eb1064736f6c63430006040033", + }, + UpgradeConfig { + contract_addr: "0x0000000000000000000000000000000000001001", + code: "608060405234801561001057600080fd5b50600436106102275760003560e01c8063831d65d111610130578063c80d4b8f116100b8578063e1c7392a1161007c578063e1c7392a146106d9578063f9a2bbc7146106e1578063fc3e5908146106e9578063fc4333cd146106f1578063fd6a6879146106f957610227565b8063c80d4b8f14610623578063c81b16621461062b578063c8509d8114610633578063c96be4cb146106ab578063dc927faf146106d157610227565b8063a1a11bf5116100ff578063a1a11bf514610531578063a78abc1614610539578063ab51bb9614610555578063ac0af6291461055d578063ac4317511461056557610227565b8063831d65d11461049f57806396713da9146105195780639bc8e4f2146105215780639dc092621461052957610227565b80634bf6c882116101b35780636e47b482116101825780636e47b4821461047757806370fd5bad1461047f57806375d47a0a146104875780637912a65d1461048f5780637942fd051461049757610227565b80634bf6c8821461045757806351e806721461045f578063567a372d1461046757806362b72cf51461046f57610227565b806337c8dab9116101fa57806337c8dab9146103b9578063389f4f71146103f85780633dffc3871461041257806343756e5c14610430578063493279b11461043857610227565b80630bee7a671461022c5780631182b8751461024d57806323bac5a21461033a57806335aa2e4414610380575b600080fd5b610234610701565b6040805163ffffffff9092168252519081900360200190f35b6102c56004803603604081101561026357600080fd5b60ff8235169190810190604081016020820135600160201b81111561028757600080fd5b82018360208201111561029957600080fd5b803590602001918460018302840111600160201b831117156102ba57600080fd5b509092509050610706565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102ff5781810151838201526020016102e7565b50505050905090810190601f16801561032c5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6103606004803603602081101561035057600080fd5b50356001600160a01b03166107da565b604080519384526020840192909252151582820152519081900360600190f35b61039d6004803603602081101561039657600080fd5b50356107fd565b604080516001600160a01b039092168252519081900360200190f35b6103df600480360360208110156103cf57600080fd5b50356001600160a01b0316610824565b6040805192835260208301919091528051918290030190f35b61040061087b565b60408051918252519081900360200190f35b61041a610881565b6040805160ff9092168252519081900360200190f35b61039d610886565b61044061088c565b6040805161ffff9092168252519081900360200190f35b61041a610891565b61039d610896565b61040061089c565b6104006108a2565b61039d6108a8565b61041a6108ae565b61039d6108b3565b6104006108b9565b61041a6108be565b610517600480360360408110156104b557600080fd5b60ff8235169190810190604081016020820135600160201b8111156104d957600080fd5b8201836020820111156104eb57600080fd5b803590602001918460018302840111600160201b8311171561050c57600080fd5b5090925090506108c3565b005b61041a610a1e565b610400610a23565b61039d610a2e565b61039d610a34565b610541610a3a565b604080519115158252519081900360200190f35b610234610a43565b610400610a48565b6105176004803603604081101561057b57600080fd5b810190602081018135600160201b81111561059557600080fd5b8201836020820111156105a757600080fd5b803590602001918460018302840111600160201b831117156105c857600080fd5b919390929091602081019035600160201b8111156105e557600080fd5b8201836020820111156105f757600080fd5b803590602001918460018302840111600160201b8311171561061857600080fd5b509092509050610a4d565b610400610e3b565b61039d610e40565b6105176004803603604081101561064957600080fd5b60ff8235169190810190604081016020820135600160201b81111561066d57600080fd5b82018360208201111561067f57600080fd5b803590602001918460018302840111600160201b831117156106a057600080fd5b509092509050610e46565b610517600480360360208110156106c157600080fd5b50356001600160a01b0316610ef9565b61039d61131e565b610517611324565b61039d611395565b61041a61139b565b6105176113a0565b61039d61182b565b606481565b606033612000146107485760405162461bcd60e51b815260040180806020018281038252602f815260200180612282602f913960400191505060405180910390fd5b60005460ff1661078d576040805162461bcd60e51b815260206004820152601960248201526000805160206122de833981519152604482015290519081900360640190fd5b6040805162461bcd60e51b815260206004820152601e60248201527f7265636569766520756e65787065637465642073796e207061636b6167650000604482015290519081900360640190fd5b600260208190526000918252604090912080546001820154919092015460ff1683565b6001818154811061080a57fe5b6000918252602090912001546001600160a01b0316905081565b60008061082f612146565b5050506001600160a01b0316600090815260026020818152604092839020835160608101855281548082526001830154938201849052919093015460ff16151592909301919091529091565b60055481565b600181565b61100181565b606181565b600881565b61200081565b60045481565b60035481565b61100581565b600281565b61100881565b603281565b600b81565b33612000146109035760405162461bcd60e51b815260040180806020018281038252602f815260200180612282602f913960400191505060405180910390fd5b60005460ff16610948576040805162461bcd60e51b815260206004820152601960248201526000805160206122de833981519152604482015290519081900360640190fd5b610950612169565b600061099184848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061183192505050565b9150915080156109db5781516040805163ffffffff9092168252517f7f0956d47419b9525356e7111652b653b530ec6f5096dccc04589bc38e6299679181900360200190a1610a17565b81516040805163ffffffff9092168252517f7d45f62d17443dd4547bca8a8112c60e2385669318dc300ec61a5d2492f262e79181900360200190a15b5050505050565b600981565b662386f26fc1000081565b61100781565b61100681565b60005460ff1681565b600081565b600481565b60005460ff16610a92576040805162461bcd60e51b815260206004820152601960248201526000805160206122de833981519152604482015290519081900360640190fd5b3361100714610ad25760405162461bcd60e51b815260040180806020018281038252602e81526020018061220d602e913960400191505060405180910390fd5b610b3d84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260148152731b5a5cd9195b59585b9bdc951a1c995cda1bdb1960621b602082015291506118b19050565b15610c165760208114610b815760405162461bcd60e51b81526004018080602001828103825260278152602001806121b66027913960400191505060405180910390fd5b604080516020601f8401819004810282018101909252828152600091610bbf9185858083850183828082843760009201919091525061199992505050565b905060018110158015610bd3575060055481105b610c0e5760405162461bcd60e51b815260040180806020018281038252602581526020018061225d6025913960400191505060405180910390fd5b600455610da9565b610c7c84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600f81526e19995b1bdb9e551a1c995cda1bdb19608a1b602082015291506118b19050565b15610d6c5760208114610cc05760405162461bcd60e51b815260040180806020018281038252602281526020018061223b6022913960400191505060405180910390fd5b604080516020601f8401819004810282018101909252828152600091610cfe9185858083850183828082843760009201919091525061199992505050565b90506103e88111158015610d13575060045481115b610d64576040805162461bcd60e51b815260206004820181905260248201527f7468652066656c6f6e795468726573686f6c64206f7574206f662072616e6765604482015290519081900360640190fd5b600555610da9565b6040805162461bcd60e51b815260206004820152600d60248201526c756e6b6e6f776e20706172616d60981b604482015290519081900360640190fd5b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a848484846040518080602001806020018381038352878782818152602001925080828437600083820152601f01601f191690910184810383528581526020019050858580828437600083820152604051601f909101601f19169092018290039850909650505050505050a150505050565b609681565b61100281565b3361200014610e865760405162461bcd60e51b815260040180806020018281038252602f815260200180612282602f913960400191505060405180910390fd5b60005460ff16610ecb576040805162461bcd60e51b815260206004820152601960248201526000805160206122de833981519152604482015290519081900360640190fd5b6040517f07db600eebe2ac176be8dcebad61858c245a4961bb32ca2aa3d159b09aa0810e90600090a1505050565b334114610f375760405162461bcd60e51b815260040180806020018281038252602d8152602001806122b1602d913960400191505060405180910390fd5b60005460ff16610f7c576040805162461bcd60e51b815260206004820152601960248201526000805160206122de833981519152604482015290519081900360640190fd5b6003544311610fd2576040805162461bcd60e51b815260206004820181905260248201527f63616e206e6f7420736c61736820747769636520696e206f6e6520626c6f636b604482015290519081900360640190fd5b3a1561101c576040805162461bcd60e51b81526020600482015260146024820152736761737072696365206973206e6f74207a65726f60601b604482015290519081900360640190fd5b611024612146565b506001600160a01b0381166000908152600260208181526040928390208351606081018552815481526001820154928101929092529091015460ff16158015928201929092529061107f5760208101805160010190526110d8565b60016040820181905260208201819052805480820182556000919091527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf60180546001600160a01b0319166001600160a01b0384161790555b4381526005546020820151816110ea57fe5b0661123c57600060208201819052604080516335409f7f60e01b81526001600160a01b03851660048201529051611000926335409f7f926024808201939182900301818387803b15801561113d57600080fd5b505af1158015611151573d6000803e3d6000fd5b505050506120006001600160a01b031663f7a251d7600b6111718561199e565b60006040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b838110156111d15781810151838201526020016111b9565b50505050905090810190601f1680156111fe5780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b15801561121f57600080fd5b505af1158015611233573d6000803e3d6000fd5b505050506112b2565b60045481602001518161124b57fe5b066112b257604080516375abf10160e11b81526001600160a01b038416600482015290516110009163eb57e20291602480830192600092919082900301818387803b15801561129957600080fd5b505af11580156112ad573d6000803e3d6000fd5b505050505b6001600160a01b0382166000818152600260208181526040808420865181559186015160018301558581015191909201805460ff1916911515919091179055517fddb6012116e51abf5436d956a4f0ebd927e92c576ff96d7918290c8782291e3e9190a2505043600355565b61100381565b60005460ff161561137c576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b603260045560966005556000805460ff19166001179055565b61100081565b600381565b33611000146113e05760405162461bcd60e51b81526004018080602001828103825260308152602001806121dd6030913960400191505060405180910390fd5b60005460ff16611425576040805162461bcd60e51b815260206004820152601960248201526000805160206122de833981519152604482015290519081900360640190fd5b60015461143157611829565b600154600090600019015b8082116117fd576000805b8284101561156057611457612146565b600260006001878154811061146857fe5b60009182526020808320909101546001600160a01b0316835282810193909352604091820190208151606081018352815481526001820154938101939093526002015460ff16151590820152600554909150600490048160200151111561154a576004600554816114d557fe5b048160200151038160200181815250508060026000600188815481106114f757fe5b6000918252602080832091909101546001600160a01b0316835282810193909352604091820190208351815591830151600183015591909101516002909101805460ff1916911515919091179055611554565b6001925050611560565b50600190930192611447565b8284116116f75761156f612146565b600260006001868154811061158057fe5b60009182526020808320909101546001600160a01b0316835282810193909352604091820190208151606081018352815481526001820154938101939093526002015460ff161515908201526005549091506004900481602001511115611668576004600554816115ed57fe5b0481602001510381602001818152505080600260006001878154811061160f57fe5b6000918252602080832091909101546001600160a01b03168352828101939093526040918201902083518155918301516001808401919091559201516002909101805460ff191691151591909117905591506116f79050565b600260006001868154811061167957fe5b60009182526020808320909101546001600160a01b031683528201929092526040018120818155600181810192909255600201805460ff191690558054806116bd57fe5b600082815260209020810160001990810180546001600160a01b0319169055019055836116ea57506116f7565b5060001990920191611560565b8180156117015750805b156117e057600260006001868154811061171757fe5b60009182526020808320909101546001600160a01b031683528201929092526040018120818155600181810192909255600201805460ff1916905580548490811061175e57fe5b600091825260209091200154600180546001600160a01b03909216918690811061178457fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060018054806117bd57fe5b600082815260209020810160001990810180546001600160a01b03191690550190555b826117ec5750506117fd565b50506001909101906000190161143c565b6040517fcfdb3b6ccaeccbdc68be3c59c840e3b3c90f0a7c491f5fff1cf56cfda200dd9c90600090a150505b565b61100481565b611839612169565b6000611843612169565b61184b61217b565b61185c61185786611a70565b611a95565b90506000805b61186b83611adf565b156118a457806118975761188661188184611b00565b611b4e565b63ffffffff1684526001915061189c565b6118a4565b600101611862565b5091935090915050915091565b6000816040516020018082805190602001908083835b602083106118e65780518252601f1990920191602091820191016118c7565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120836040516020018082805190602001908083835b602083106119545780518252601f199092019160209182019101611935565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051602081830303815290604052805190602001201490505b92915050565b015190565b60408051600480825260a08201909252606091829190816020015b60608152602001906001900390816119b95790505090506119e2836001600160a01b0316611c05565b816000815181106119ef57fe5b6020026020010181905250611a0343611c28565b81600181518110611a1057fe5b6020908102919091010152611a256061611c28565b81600281518110611a3257fe5b6020026020010181905250611a4642611c28565b81600381518110611a5357fe5b6020026020010181905250611a6781611c3b565b9150505b919050565b611a7861219b565b506040805180820190915281518152602082810190820152919050565b611a9d61217b565b611aa682611cc5565b611aaf57600080fd5b6000611abe8360200151611cff565b60208085015160408051808201909152868152920190820152915050919050565b6000611ae961219b565b505080518051602091820151919092015191011190565b611b0861219b565b611b1182611adf565b611b1a57600080fd5b60208201516000611b2a82611d62565b80830160209586015260408051808201909152908152938401919091525090919050565b805160009015801590611b6357508151602110155b611b6c57600080fd5b6000611b7b8360200151611cff565b90508083600001511015611bd6576040805162461bcd60e51b815260206004820152601a60248201527f6c656e677468206973206c657373207468616e206f6666736574000000000000604482015290519081900360640190fd5b825160208085015183018051928490039291831015611bfc57826020036101000a820491505b50949350505050565b60408051600560a21b8318601482015260348101909152606090611a6781611e95565b6060611993611c3683611eeb565b611e95565b6060815160001415611c5c5750604080516000815260208101909152611a6b565b606082600081518110611c6b57fe5b602002602001015190506000600190505b8351811015611cac57611ca282858381518110611c9557fe5b6020026020010151611fd1565b9150600101611c7c565b50611a67611cbf825160c060ff1661204e565b82611fd1565b8051600090611cd657506000611a6b565b6020820151805160001a9060c0821015611cf557600092505050611a6b565b5060019392505050565b8051600090811a6080811015611d19576000915050611a6b565b60b8811080611d34575060c08110801590611d34575060f881105b15611d43576001915050611a6b565b60c0811015611d575760b519019050611a6b565b60f519019050611a6b565b80516000908190811a6080811015611d7d5760019150611e8e565b60b8811015611d9257607e1981019150611e8e565b60c0811015611e0c57600060b78203600186019550806020036101000a865104915060018101820193505080831015611e06576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b50611e8e565b60f8811015611e215760be1981019150611e8e565b600060f78203600186019550806020036101000a865104915060018101820193505080831015611e8c576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b505b5092915050565b606081516001148015611ec75750607f60f81b82600081518110611eb557fe5b01602001516001600160f81b03191611155b15611ed3575080611a6b565b611993611ee58351608060ff1661204e565b83611fd1565b604080516020808252818301909252606091829190602082018180368337505050602081018490529050600067ffffffffffffffff198416611f2f57506018611f53565b6fffffffffffffffffffffffffffffffff198416611f4f57506010611f53565b5060005b6020811015611f8957818181518110611f6857fe5b01602001516001600160f81b03191615611f8157611f89565b600101611f53565b60008160200390506060816040519080825280601f01601f191660200182016040528015611fbe576020820181803683370190505b5080830196909652508452509192915050565b6060806040519050835180825260208201818101602087015b81831015612002578051835260209283019201611fea565b50855184518101855292509050808201602086015b8183101561202f578051835260209283019201612017565b508651929092011591909101601f01601f191660405250905092915050565b606068010000000000000000831061209e576040805162461bcd60e51b815260206004820152600e60248201526d696e70757420746f6f206c6f6e6760901b604482015290519081900360640190fd5b604080516001808252818301909252606091602082018180368337019050509050603784116120f85782840160f81b816000815181106120da57fe5b60200101906001600160f81b031916908160001a9053509050611993565b606061210385611eeb565b90508381510160370160f81b8260008151811061211c57fe5b60200101906001600160f81b031916908160001a90535061213d8282611fd1565b95945050505050565b604051806060016040528060008152602001600081526020016000151581525090565b60408051602081019091526000815290565b604051806040016040528061218e61219b565b8152602001600081525090565b60405180604001604052806000815260200160008152509056fe6c656e677468206f66206d697364656d65616e6f725468726573686f6c64206d69736d61746368746865206d6573736167652073656e646572206d7573742062652076616c696461746f7253657420636f6e7472616374746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e74726163746c656e677468206f662066656c6f6e795468726573686f6c64206d69736d61746368746865206d697364656d65616e6f725468726573686f6c64206f7574206f662072616e6765746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e7472616374746865206d6573736167652073656e646572206d7573742062652074686520626c6f636b2070726f647563657274686520636f6e7472616374206e6f7420696e69742079657400000000000000a2646970667358221220928e8ab9d0213bb25ef35f991d92a3bba9ae0b32c8a4041abe55fcb03c7709dd64736f6c63430006040033", + }, + UpgradeConfig { + contract_addr: "0x0000000000000000000000000000000000001002", + code: "60806040526004361061014f5760003560e01c806396713da9116100b6578063c81b16621161006f578063c81b1662146103dc578063dc927faf146103f1578063f9a2bbc714610406578063fb5478b31461041b578063fc3e590814610430578063fd6a68791461044557610193565b806396713da91461033a5780639a99b4f01461034f5780639dc0926214610388578063a1a11bf51461039d578063a78abc16146103b2578063ab51bb96146103c757610193565b806351e806721161010857806351e806721461028a5780636d70f7ae1461029f5780636e47b482146102e657806370fd5bad146102fb57806375d47a0a146103105780637942fd051461032557610193565b80630bee7a67146101985780633a0b0eff146101c65780633dffc387146101ed57806343756e5c14610218578063493279b1146102495780634bf6c8821461027557610193565b366101935734156101915760408051348152905133917f6c98249d85d88c3753a04a22230f595e4dc8d3dc86c34af35deeeedc861b89db919081900360200190a25b005b600080fd5b3480156101a457600080fd5b506101ad61045a565b6040805163ffffffff9092168252519081900360200190f35b3480156101d257600080fd5b506101db61045f565b60408051918252519081900360200190f35b3480156101f957600080fd5b50610202610465565b6040805160ff9092168252519081900360200190f35b34801561022457600080fd5b5061022d61046a565b604080516001600160a01b039092168252519081900360200190f35b34801561025557600080fd5b5061025e610470565b6040805161ffff9092168252519081900360200190f35b34801561028157600080fd5b50610202610475565b34801561029657600080fd5b5061022d61047a565b3480156102ab57600080fd5b506102d2600480360360208110156102c257600080fd5b50356001600160a01b0316610480565b604080519115158252519081900360200190f35b3480156102f257600080fd5b5061022d61049e565b34801561030757600080fd5b506102026104a4565b34801561031c57600080fd5b5061022d6104a9565b34801561033157600080fd5b506102026104af565b34801561034657600080fd5b506102026104b4565b34801561035b57600080fd5b506101db6004803603604081101561037257600080fd5b506001600160a01b0381351690602001356104b9565b34801561039457600080fd5b5061022d610664565b3480156103a957600080fd5b5061022d61066a565b3480156103be57600080fd5b506102d2610670565b3480156103d357600080fd5b506101ad610679565b3480156103e857600080fd5b5061022d61067e565b3480156103fd57600080fd5b5061022d610684565b34801561041257600080fd5b5061022d61068a565b34801561042757600080fd5b506101db610690565b34801561043c57600080fd5b5061020261069c565b34801561045157600080fd5b5061022d6106a1565b606481565b60015481565b600181565b61100181565b606181565b600881565b61200081565b6001600160a01b031660009081526002602052604090205460ff1690565b61100581565b600281565b61100881565b600b81565b600981565b6000805460ff1661053657600260208190527fe57bda0a954a7c7381b17b2c763e646ba2c60f67292d287ba583603e2c1c41668054600160ff19918216811790925561100560009081527fe25235fc0de9d7165652bef0846fefda506174abb9a190f03d0f7bcc6146dbce80548316841790559282558254161790555b3360009081526002602052604090205460ff166105845760405162461bcd60e51b815260040180806020018281038252602b8152602001806106a8602b913960400191505060405180910390fd5b60004783106105935747610595565b825b9050670de0b6b3a76400008111156105b25750670de0b6b3a76400005b8015610633576040516001600160a01b0385169082156108fc029083906000818181858888f193505050501580156105ee573d6000803e3d6000fd5b506040805182815290516001600160a01b038616917ff8b71c64315fc33b2ead2adfa487955065152a8ac33d9d5193aafd7f45dc15a0919081900360200190a261065d565b6040517fe589651933c2457488cc0d8e0941518abf748e799435e4e396d9c4d0b2db2d4d90600090a15b9392505050565b61100781565b61100681565b60005460ff1681565b600081565b61100281565b61100381565b61100081565b670de0b6b3a764000081565b600381565b6110048156fe6f6e6c79206f70657261746f7220697320616c6c6f77656420746f2063616c6c20746865206d6574686f64a2646970667358221220276887b515b756cf3ef5b38df18fd3a11174ee7fd973bdd337fc09d6b0e42f3b64736f6c63430006040033", + }, + UpgradeConfig { + contract_addr: "0x0000000000000000000000000000000000001003", + code: "608060405234801561001057600080fd5b50600436106102115760003560e01c8063a78abc1611610125578063dda83148116100ad578063e405bbc31161007c578063e405bbc314610681578063ea54b2aa14610689578063f9a2bbc714610691578063fc3e590814610699578063fd6a6879146106a157610211565b8063dda8314814610609578063df5fe7041461062f578063e1c7392a14610655578063e2761af01461065d57610211565b8063c81b1662116100f4578063c81b166214610534578063cba510a91461053c578063d816987914610562578063da8d08f0146105db578063dc927faf1461060157610211565b8063a78abc1614610444578063ab51bb9614610460578063ac43175114610468578063adc879e91461052c57610211565b8063564b81ef116101a857806375d47a0a1161017757806375d47a0a1461041c5780637942fd051461042457806396713da91461042c5780639dc0926214610434578063a1a11bf51461043c57610211565b8063564b81ef146102ca5780635c5ae8db146103475780636e47b4821461040c57806370fd5bad1461041457610211565b806343756e5c116101e457806343756e5c14610277578063493279b11461029b5780634bf6c882146102ba57806351e80672146102c257610211565b80630bee7a67146102165780632657e9b61461023757806333f7798d146102515780633dffc38714610259575b600080fd5b61021e6106a9565b6040805163ffffffff9092168252519081900360200190f35b61023f6106ae565b60408051918252519081900360200190f35b61023f6106b9565b6102616106bf565b6040805160ff9092168252519081900360200190f35b61027f6106c4565b604080516001600160a01b039092168252519081900360200190f35b6102a36106ca565b6040805161ffff9092168252519081900360200190f35b6102616106cf565b61027f6106d4565b6102d26106da565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561030c5781810151838201526020016102f4565b50505050905090810190601f1680156103395780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61036d6004803603602081101561035d57600080fd5b50356001600160401b03166107e6565b60405180856001600160401b03166001600160401b0316815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156103ce5781810151838201526020016103b6565b50505050905090810190601f1680156103fb5780820380516001836020036101000a031916815260200191505b509550505050505060405180910390f35b61027f6108a1565b6102616108a7565b61027f6108ac565b6102616108b2565b6102616108b7565b61027f6108bc565b61027f6108c2565b61044c6108c8565b604080519115158252519081900360200190f35b61021e6108d1565b61052a6004803603604081101561047e57600080fd5b81019060208101813564010000000081111561049957600080fd5b8201836020820111156104ab57600080fd5b803590602001918460018302840111640100000000831117156104cd57600080fd5b9193909290916020810190356401000000008111156104eb57600080fd5b8201836020820111156104fd57600080fd5b8035906020019184600183028401116401000000008311171561051f57600080fd5b5090925090506108d6565b005b61023f610b8f565b61027f610b95565b61023f6004803603602081101561055257600080fd5b50356001600160401b0316610b9b565b61044c6004803603604081101561057857600080fd5b81019060208101813564010000000081111561059357600080fd5b8201836020820111156105a557600080fd5b803590602001918460018302840111640100000000831117156105c757600080fd5b9193509150356001600160401b0316610bba565b61027f600480360360208110156105f157600080fd5b50356001600160401b031661139b565b61027f6113b6565b61027f6004803603602081101561061f57600080fd5b50356001600160401b03166113bc565b61044c6004803603602081101561064557600080fd5b50356001600160401b03166113e0565b61052a611422565b6106656115c7565b604080516001600160401b039092168252519081900360200190f35b6106656115d6565b6102d26115ec565b61027f611609565b61026161160f565b61027f611614565b606481565b662386f26fc1000081565b60055481565b600181565b61100181565b606181565b600881565b61200081565b604080516020808252818301909252606091829190602082018180368337505060045460208301525090506000805b60208160ff16101561075057828160ff168151811061072457fe5b01602001516001600160f81b0319161561074357600190910190610748565b610750565b600101610709565b5060608160ff166040519080825280601f01601f191660200182016040528015610781576020820181803683370190505b50905060005b8260ff168160ff1610156107dd57838160ff16815181106107a457fe5b602001015160f81c60f81b828260ff16815181106107be57fe5b60200101906001600160f81b031916908160001a905350600101610787565b50925050505b90565b60016020818152600092835260409283902080548184015460028084015460038501805489516101009982161599909902600019011692909204601f81018790048702880187019098528787526001600160401b0390931696919592949091908301828280156108975780601f1061086c57610100808354040283529160200191610897565b820191906000526020600020905b81548152906001019060200180831161087a57829003601f168201915b5050505050905084565b61100581565b600281565b61100881565b600b81565b600981565b61100781565b61100681565b60005460ff1681565b600081565b60005460ff1661092d576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e7472616374206e6f7420696e69742079657400000000000000604482015290519081900360640190fd5b336110071461096d5760405162461bcd60e51b815260040180806020018281038252602e815260200180611ac6602e913960400191505060405180910390fd5b6109e184848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601b81527f726577617264466f7256616c696461746f725365744368616e676500000000006020820152915061161a9050565b15610ac05760208114610a255760405162461bcd60e51b815260040180806020018281038252602e815260200180611a65602e913960400191505060405180910390fd5b604080516020601f8401819004810282018101909252828152600091610a639185858083850183828082843760009201919091525061170192505050565b9050600081118015610a7d5750670de0b6b3a76400008111155b610ab85760405162461bcd60e51b815260040180806020018281038252602f815260200180611af4602f913960400191505060405180910390fd5b600555610afd565b6040805162461bcd60e51b815260206004820152600d60248201526c756e6b6e6f776e20706172616d60981b604482015290519081900360640190fd5b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a848484846040518080602001806020018381038352878782818152602001925080828437600083820152601f01601f191690910184810383528581526020019050858580828437600083820152604051601f909101601f19169092018290039850909650505050505050a150505050565b60045481565b61100281565b6001600160401b03166000908152600160208190526040909120015490565b60408051630a83aaa960e31b815233600482015290516000916110069163541d554891602480820192602092909190829003018186803b158015610bfd57600080fd5b505afa158015610c11573d6000803e3d6000fd5b505050506040513d6020811015610c2757600080fd5b5051610c7a576040805162461bcd60e51b815260206004820152601f60248201527f746865206d73672073656e646572206973206e6f7420612072656c6179657200604482015290519081900360640190fd5b6001600160401b0382166000908152600260205260409020546001600160a01b031615610cee576040805162461bcd60e51b815260206004820152601c60248201527f63616e27742073796e63206475706c6963617465642068656164657200000000604482015290519081900360640190fd5b6003546001600160401b0390811690831611610d3b5760405162461bcd60e51b8152600401808060200182810382526026815260200180611b236026913960400191505060405180910390fd5b600354600160401b90046001600160401b0316610d56611863565b6001600160401b0382811660009081526001602081815260409283902083516080810185528154909516855280830154858301526002808201548686015260038201805486516101009682161596909602600019011691909104601f81018490048402850184019095528484529093606086019392830182828015610e1c5780601f10610df157610100808354040283529160200191610e1c565b820191906000526020600020905b815481529060010190602001808311610dff57829003601f168201915b50505050508152505090505b836001600160401b0316826001600160401b031610158015610e5957506003546001600160401b0390811690831610155b15610f3a5780516001600160401b0380821660009081526001602081815260409283902083516080810185528154909516855280830154858301526002808201548686015260038201805486516101009682161596909602600019011691909104601f8101849004840285018401909552848452959750939460608601939091830182828015610f2a5780601f10610eff57610100808354040283529160200191610f2a565b820191906000526020600020905b815481529060010190602001808311610f0d57829003601f168201915b5050505050815250509050610e28565b6060810151516110315780516001600160401b03811660009081526001602081815260409283902060030180548451600294821615610100026000190190911693909304601f810183900483028401830190945283835293955090929190830182828015610fe95780601f10610fbe57610100808354040283529160200191610fe9565b820191906000526020600020905b815481529060010190602001808311610fcc57829003601f168201915b505050506060830182905250516110315760405162461bcd60e51b8152600401808060200182810382526021815260200180611a446021913960400191505060405180910390fd5b6000816060015151608801905060608787905082016040519080825280601f01601f191660200182016040528015611070576020820181803683370190505b509050600061107e82611706565b905061108c8486838661170c565b6110c75760405162461bcd60e51b81526004018080602001828103825260238152602001806119416023913960400191505060405180910390fd5b6000838201915061110d8a8a8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061177892505050565b9450905061111c818386611782565b8251602001935061112b611889565b6110008186866064600019fa61114057600080fd5b805194506000600160f81b8616156111cf5750600554604080516309a99b4f60e41b815233600482015260248101929092525160019161100291639a99b4f0916044808201926020929091908290030181600087803b1580156111a257600080fd5b505af11580156111b6573d6000803e3d6000fd5b505050506040513d60208110156111cc57600080fd5b50505b856001600160401b0316955060208201935060006111ef858884156117c3565b90985090506001600160401b03808216908c161461123e5760405162461bcd60e51b8152600401808060200182810382526033815260200180611a936033913960400191505060405180910390fd5b6001600160401b03808c16600081815260026020818152604080842080546001600160a01b031916331790558e86168e529383526001808252928490208d518154961667ffffffffffffffff199096169590951785558c81015192850192909255918b01519183019190915560608a015180518b93926112c59260038501929101906118a8565b50506003546001600160401b03600160401b9091048116908d161115905061130d576003805467ffffffffffffffff60401b1916600160401b6001600160401b038e16021790555b7f4042c1020a8f410fb1c8859d276ab436aeb2c3074960e48467299cf1c966d3b48b8a8a602001518560405180856001600160401b03166001600160401b03168152602001846001600160401b03166001600160401b031681526020018381526020018215151515815260200194505050505060405180910390a15060019c9b505050505050505050505050565b6002602052600090815260409020546001600160a01b031681565b61100381565b6001600160401b03166000908152600260205260409020546001600160a01b031690565b6001600160401b0381166000908152600260205260408120546001600160a01b031615158061141c57506003546001600160401b038381169116145b92915050565b60005460ff161561147a576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b60008061149f60405180610100016040528060e0815260200161196460e09139611778565b815160045590925090506114b1611863565b60006114bf848460006117c3565b60008083526001600160401b038281168252600160208181526040938490208651815467ffffffffffffffff191694169390931783558086015191830191909155918401516002820155606084015180519496509294508593909261152b9260038501929101906118a8565b50506003805467ffffffffffffffff19166001600160401b0384811691821767ffffffffffffffff60401b1916600160401b9290920291909117918290556000805460ff19166001179055662386f26fc10000600555602085810151604080519490931684529083015280517f5ac9b37d571677b80957ca05693f371526c602fd08042b416a29fdab7efefa499350918290030190a150505050565b6003546001600160401b031681565b600354600160401b90046001600160401b031681565b60405180610100016040528060e0815260200161196460e0913981565b61100081565b600381565b61100481565b6000816040516020018082805190602001908083835b6020831061164f5780518252601f199092019160209182019101611630565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120836040516020018082805190602001908083835b602083106116bd5780518252601f19909201916020918201910161169e565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040528051906020012014905092915050565b015190565b60200190565b600084606001515182840103925060008061172a8760600151611778565b909250905061173a828683611782565b5050506040840151601f1983810191909152602090940151603f19830152605f19820192909252600454606719820152910160871990910152600190565b8051602090910191565b5b602081106117a2578251825260209283019290910190601f1901611783565b915181516020939093036101000a6000190180199091169216919091179052565b6117cb611863565b60088401516028850151604890950180519095600092916117ea611863565b6020810183905260408101829052866118555760008060688a036040519080825280601f01601f19166020018201604052801561182e576020820181803683370190505b506060840181905261183f90611778565b909250905061185260208c018383611782565b50505b989297509195505050505050565b604080516080810182526000808252602082018190529181019190915260608082015290565b6040518061100001604052806080906020820280368337509192915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106118e957805160ff1916838001178555611916565b82800160010185558215611916579182015b828111156119165782518255916020019190600101906118fb565b50611922929150611926565b5090565b6107e391905b80821115611922576000815560010161192c56fe6661696c656420746f2073657269616c697a6520636f6e73656e73757320737461746542696e616e63652d436861696e2d47616e67657300000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000aea1ac326886b992a991d21a6eb155f41b77867cbf659e78f31d89d8205122a84d1be64f0e9a466c2e66a53433928192783e29f8fa21beb2133499b5ef770f60000000e8d4a5100099308aa365c40554bc89982af505d85da95251445d5dd4a9bb37dd2584fd92d3000000e8d4a5100001776920ff0b0f38d78cf95c033c21adf7045785114e392a7544179652e0a612000000e8d4a510006661696c656420746f206c6f61642076616c696461746f722073657420646174616c656e677468206f6620726577617264466f7256616c696461746f725365744368616e6765206d69736d617463686865616465722068656967687420646f65736e277420657175616c20746f207468652073706563696669656420686569676874746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e7472616374746865206e6577526577617264466f7256616c696461746f725365744368616e6765206f7574206f662072616e676563616e27742073796e6320686561646572206265666f726520696e697469616c486569676874a2646970667358221220137a8776113e727049f523a5f1486edaec611d89ff3d19f099dfe799b6b5e66f64736f6c63430006040033", + }, + UpgradeConfig { + contract_addr: "0x0000000000000000000000000000000000001004", + code: "60806040526004361061031e5760003560e01c80639a99b4f0116101ab578063bd466461116100f7578063f014847211610095578063fc1a598f1161006f578063fc1a598f14610cb3578063fc3e5908146109c9578063fd6a687914610ce6578063ff9c0027146107c757610366565b8063f014847214610c74578063f9a2bbc714610c89578063fa9e915914610c9e57610366565b8063dc6f5e90116100d1578063dc6f5e90146109c9578063dc927faf14610c35578063e1c7392a14610c4a578063ebf71d5314610c5f57610366565b8063bd46646114610b68578063c81b166214610b9b578063c8509d8114610bb057610366565b8063a7c9f02d11610164578063ac4317511161013e578063ac43175114610a3a578063b770186114610b05578063b99328c514610b1a578063b9fd21e314610b5357610366565b8063a7c9f02d146109c9578063aa7415f5146109de578063ab51bb9614610a2557610366565b80639a99b4f0146109095780639dc0926214610942578063a1a11bf514610957578063a496fba21461096c578063a5cd588b14610981578063a78abc16146109b457610366565b80635d499b1b1161026a57806375d47a0a116102235780638b87b21f116101fd5780638b87b21f146105b25780638eff336c146108a057806396713da9146108df5780639a854bbd146108f457610366565b806375d47a0a146107f15780637942fd0514610806578063831d65d11461081b57610366565b80635d499b1b14610671578063613684751461036b5780636e056520146106865780636e47b482146107b257806370fd5bad146107c757806371d30863146107dc57610366565b806343756e5c116102d75780634bf6c882116102b15780634bf6c8821461036b57806350432d321461061d57806351e806721461063257806359b927891461064757610366565b806343756e5c146105c757806343a368b9146105dc578063493279b1146105f157610366565b8063077b8f351461036b5780630bee7a67146103965780631182b875146103c4578063149d14d9146104be5780633d713223146104e55780633dffc387146105b257610366565b36610366573415610364576040805133815234602082015281517f6c98249d85d88c3753a04a22230f595e4dc8d3dc86c34af35deeeedc861b89db929181900390910190a15b005b600080fd5b34801561037757600080fd5b50610380610cfb565b6040805160ff9092168252519081900360200190f35b3480156103a257600080fd5b506103ab610d00565b6040805163ffffffff9092168252519081900360200190f35b3480156103d057600080fd5b50610449600480360360408110156103e757600080fd5b60ff8235169190810190604081016020820135600160201b81111561040b57600080fd5b82018360208201111561041d57600080fd5b803590602001918460018302840111600160201b8311171561043e57600080fd5b509092509050610d05565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561048357818101518382015260200161046b565b50505050905090810190601f1680156104b05780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156104ca57600080fd5b506104d3610e33565b60408051918252519081900360200190f35b3480156104f157600080fd5b506105966004803603602081101561050857600080fd5b810190602081018135600160201b81111561052257600080fd5b82018360208201111561053457600080fd5b803590602001918460018302840111600160201b8311171561055557600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610e39945050505050565b604080516001600160a01b039092168252519081900360200190f35b3480156105be57600080fd5b50610380610e5d565b3480156105d357600080fd5b50610596610e62565b3480156105e857600080fd5b506104d3610e68565b3480156105fd57600080fd5b50610606610e74565b6040805161ffff9092168252519081900360200190f35b34801561062957600080fd5b506104d3610e79565b34801561063e57600080fd5b50610596610e84565b34801561065357600080fd5b506105966004803603602081101561066a57600080fd5b5035610e8a565b34801561067d57600080fd5b506104d3610ea5565b61079e6004803603608081101561069c57600080fd5b810190602081018135600160201b8111156106b657600080fd5b8201836020820111156106c857600080fd5b803590602001918460208302840111600160201b831117156106e957600080fd5b919390929091602081019035600160201b81111561070657600080fd5b82018360208201111561071857600080fd5b803590602001918460208302840111600160201b8311171561073957600080fd5b919390929091602081019035600160201b81111561075657600080fd5b82018360208201111561076857600080fd5b803590602001918460208302840111600160201b8311171561078957600080fd5b91935091503567ffffffffffffffff16610eae565b604080519115158252519081900360200190f35b3480156107be57600080fd5b50610596611383565b3480156107d357600080fd5b50610380611389565b3480156107e857600080fd5b506104d361138e565b3480156107fd57600080fd5b50610596611394565b34801561081257600080fd5b5061038061139a565b34801561082757600080fd5b506103646004803603604081101561083e57600080fd5b60ff8235169190810190604081016020820135600160201b81111561086257600080fd5b82018360208201111561087457600080fd5b803590602001918460018302840111600160201b8311171561089557600080fd5b50909250905061139f565b3480156108ac57600080fd5b50610364600480360360608110156108c357600080fd5b508035906001600160a01b0360208201351690604001356114e8565b3480156108eb57600080fd5b5061038061156e565b34801561090057600080fd5b506104d3611573565b34801561091557600080fd5b506104d36004803603604081101561092c57600080fd5b506001600160a01b03813516906020013561157f565b34801561094e57600080fd5b506105966116bd565b34801561096357600080fd5b506105966116c3565b34801561097857600080fd5b506103806116c9565b34801561098d57600080fd5b506104d3600480360360208110156109a457600080fd5b50356001600160a01b03166116ce565b3480156109c057600080fd5b5061079e6116e0565b3480156109d557600080fd5b506103806116e9565b61079e600480360360808110156109f457600080fd5b5080356001600160a01b03908116916020810135909116906040810135906060013567ffffffffffffffff166116ee565b348015610a3157600080fd5b506103ab6116c9565b348015610a4657600080fd5b5061036460048036036040811015610a5d57600080fd5b810190602081018135600160201b811115610a7757600080fd5b820183602082011115610a8957600080fd5b803590602001918460018302840111600160201b83111715610aaa57600080fd5b919390929091602081019035600160201b811115610ac757600080fd5b820183602082011115610ad957600080fd5b803590602001918460018302840111600160201b83111715610afa57600080fd5b509092509050611daf565b348015610b1157600080fd5b506104d361201e565b348015610b2657600080fd5b5061036460048036036040811015610b3d57600080fd5b50803590602001356001600160a01b0316612024565b348015610b5f57600080fd5b506104d361209a565b348015610b7457600080fd5b506104d360048036036020811015610b8b57600080fd5b50356001600160a01b03166120a4565b348015610ba757600080fd5b506105966120bf565b348015610bbc57600080fd5b5061036460048036036040811015610bd357600080fd5b60ff8235169190810190604081016020820135600160201b811115610bf757600080fd5b820183602082011115610c0957600080fd5b803590602001918460018302840111600160201b83111715610c2a57600080fd5b5090925090506120c5565b348015610c4157600080fd5b50610596612195565b348015610c5657600080fd5b5061036461219b565b348015610c6b57600080fd5b5061038061223b565b348015610c8057600080fd5b50610380612240565b348015610c9557600080fd5b50610596612245565b348015610caa57600080fd5b506104d361224b565b348015610cbf57600080fd5b5061044960048036036020811015610cd657600080fd5b50356001600160a01b0316612251565b348015610cf257600080fd5b50610596612378565b600881565b606481565b60005460609060ff16610d4d576040805162461bcd60e51b815260206004820152601960248201526000805160206147bf833981519152604482015290519081900360640190fd5b3361200014610d8d5760405162461bcd60e51b815260040180806020018281038252602f81526020018061476d602f913960400191505060405180910390fd5b60ff841660021415610ddf57610dd883838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061237e92505050565b9050610e2c565b6040805162461bcd60e51b815260206004820152601860248201527f756e7265636f676e697a65642073796e207061636b6167650000000000000000604482015290519081900360640190fd5b9392505050565b60015490565b6020818101516000908152600490915260409020546001600160a01b03165b919050565b600181565b61100181565b670de0b6b3a764000081565b606181565b662386f26fc1000081565b61200081565b6000908152600460205260409020546001600160a01b031690565b6402540be40081565b6000805460ff16610ef4576040805162461bcd60e51b815260206004820152601960248201526000805160206147bf833981519152604482015290519081900360640190fd5b868514610f325760405162461bcd60e51b815260040180806020018281038252603b815260200180614732603b913960400191505060405180910390fd5b868314610f705760405162461bcd60e51b815260040180806020018281038252603f815260200180614605603f913960400191505060405180910390fd5b426078018267ffffffffffffffff161015610fbc5760405162461bcd60e51b81526004018080602001828103825260248152602001806144f56024913960400191505060405180910390fd5b6402540be4003406156110005760405162461bcd60e51b81526004018080602001828103825260408152602001806148356040913960400191505060405180910390fd5b60408051868152602080880282010190915285906000908190606090848015611033578160200160208202803683370190505b50905060005b8481101561110e576402540be4008b8b8381811061105357fe5b905060200201358161106157fe5b061561109e5760405162461bcd60e51b815260040180806020018281038252603c815260200180614644603c913960400191505060405180910390fd5b6110c38b8b838181106110ad57fe5b90506020020135856124a290919063ffffffff16565b93506110ef6402540be4008c8c848181106110da57fe5b905060200201356124fc90919063ffffffff16565b8282815181106110fb57fe5b6020908102919091010152600101611039565b5060015461113390611126908663ffffffff61253e16565b849063ffffffff6124a216565b3410156111715760405162461bcd60e51b81526004018080602001828103825260568152602001806147df6056913960600191505060405180910390fd5b611181348463ffffffff61259716565b915061118b61434e565b6040518060c001604052806221272160e91b60001b815260200160006001600160a01b031681526020018381526020018e8e808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505050908252506040805160208c810282810182019093528c82529283019290918d918d91829185019084908082843760009201919091525050509082525067ffffffffffffffff8916602090910152905061200063f7a251d7600361124f846125d9565b611264876402540be40063ffffffff6124fc16565b6040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b838110156112c25781810151838201526020016112aa565b50505050905090810190601f1680156112ef5780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b15801561131057600080fd5b505af1158015611324573d6000803e3d6000fd5b505060408051600081523360208201528082018890526060810187905290517f74eab09b0e53aefc23f2e1b16da593f95c2dd49c6f5a23720463d10d9c330b2a9350908190036080019150a15060019c9b505050505050505050505050565b61100581565b600281565b60015481565b61100881565b600b81565b60005460ff166113e4576040805162461bcd60e51b815260206004820152601960248201526000805160206147bf833981519152604482015290519081900360640190fd5b33612000146114245760405162461bcd60e51b815260040180806020018281038252602f81526020018061476d602f913960400191505060405180910390fd5b60ff8316600314156114745761146f82828080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061289492505050565b6114e3565b7f41ce201247b6ceb957dcdb217d0b8acb50b9ea0e12af9af4f5e7f38902101605838383604051808460ff1660ff168152602001806020018281038252848482818152602001925080828437600083820152604051601f909101601f1916909201829003965090945050505050a15b505050565b33611008146115285760405162461bcd60e51b815260040180806020018281038252602381526020018061479c6023913960400191505060405180910390fd5b600083815260046020908152604080832080546001600160a01b039096166001600160a01b03199096168617905593825260038152838220949094556002909352912055565b600981565b677ce66c50e284000081565b6000805460ff166115c5576040805162461bcd60e51b815260206004820152601960248201526000805160206147bf833981519152604482015290519081900360640190fd5b33611005146116055760405162461bcd60e51b815260040180806020018281038252602f815260200180614468602f913960400191505060405180910390fd5b60004783106116145747611616565b825b9050670de0b6b3a76400008111156116325760009150506116b7565b80156116b4576040516001600160a01b0385169082156108fc029083906000818181858888f1935050505015801561166e573d6000803e3d6000fd5b50604080516001600160a01b03861681526020810183905281517ff8b71c64315fc33b2ead2adfa487955065152a8ac33d9d5193aafd7f45dc15a0929181900390910190a15b90505b92915050565b61100781565b61100681565b600081565b60026020526000908152604090205481565b60005460ff1681565b600381565b6000805460ff16611734576040805162461bcd60e51b815260206004820152601960248201526000805160206147bf833981519152604482015290519081900360640190fd5b426078018267ffffffffffffffff1610156117805760405162461bcd60e51b81526004018080602001828103825260248152602001806144f56024913960400191505060405180910390fd5b6402540be4003406156117c45760405162461bcd60e51b81526004018080602001828103825260408152602001806148356040913960400191505060405180910390fd5b600080806001600160a01b0388166118a3576001546117ea90879063ffffffff6124a216565b3410156118285760405162461bcd60e51b815260040180806020018281038252606181526020018061457f6061913960800191505060405180910390fd5b6402540be40086061561186c5760405162461bcd60e51b815260040180806020018281038252603c815260200180614644603c913960400191505060405180910390fd5b61187c348763ffffffff61259716565b9050611893866402540be40063ffffffff6124fc16565b6221272160e91b93509150611b46565b6001600160a01b0388166000908152600360205260409020549250826118fa5760405162461bcd60e51b815260040180806020018281038252603181526020018061454e6031913960400191505060405180910390fd5b60015434101561193b5760405162461bcd60e51b815260040180806020018281038252603f8152602001806146a1603f913960400191505060405180910390fd5b506001600160a01b038716600090815260026020526040902054349060088111158061198657506008811180156119865750611984876007198301600a0a63ffffffff6128f016565b155b6119c15760405162461bcd60e51b815260040180806020018281038252603c815260200180614644603c913960400191505060405180910390fd5b6119cb8782612932565b92506119d684612972565b15611a1e576305f5e100831015611a1e5760405162461bcd60e51b815260040180806020018281038252603a815260200180614497603a913960400191505060405180910390fd5b600881101580611a385750600881108015611a3857508683115b611a735760405162461bcd60e51b81526004018080602001828103825260258152602001806145e06025913960400191505060405180910390fd5b677ce66c50e2840000831115611aba5760405162461bcd60e51b81526004018080602001828103825260358152602001806145196035913960400191505060405180910390fd5b604080516323b872dd60e01b81523360048201523060248201526044810189905290516001600160a01b038b16916323b872dd9160648083019260209291908290030181600087803b158015611b0f57600080fd5b505af1158015611b23573d6000803e3d6000fd5b505050506040513d6020811015611b3957600080fd5b5051611b4457600080fd5b505b611b4e61434e565b6040805160c0810182528581526001600160a01b038b166020820152815160018082528184018452919283019181602001602082028036833750505081526040805160018082528183019092526020928301929091908083019080368337505050815260408051600180825281830190925260209283019290919080830190803683370190505081526020018767ffffffffffffffff168152509050828160400151600081518110611bfc57fe5b602002602001018181525050878160600151600081518110611c1a57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050338160800151600081518110611c4c57fe5b6001600160a01b039092166020928302919091019091015261200063f7a251d76003611c77846125d9565b611c8c866402540be40063ffffffff6124fc16565b6040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b83811015611cea578181015183820152602001611cd2565b50505050905090810190601f168015611d175780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b158015611d3857600080fd5b505af1158015611d4c573d6000803e3d6000fd5b5050604080516001600160a01b038d1681523360208201528082018b90526060810186905290517f74eab09b0e53aefc23f2e1b16da593f95c2dd49c6f5a23720463d10d9c330b2a9350908190036080019150a150600198975050505050505050565b3361100714611def5760405162461bcd60e51b815260040180806020018281038252602e8152602001806146e0602e913960400191505060405180910390fd5b60208114611e44576040805162461bcd60e51b815260206004820152601b60248201527f65787065637465642076616c7565206c656e6774682069732033320000000000604482015290519081900360640190fd5b606084848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8801819004810282018101909252868152939450606093925086915085908190840183828082843760009201919091525050505060208301519091506772656c617946656560c01b811415611f4c576020820151670de0b6b3a76400008111801590611ef357506402540be4008106155b611f44576040805162461bcd60e51b815260206004820152601960248201527f7468652072656c6179466565206f7574206f662072616e676500000000000000604482015290519081900360640190fd5b600155611f89565b6040805162461bcd60e51b815260206004820152600d60248201526c756e6b6e6f776e20706172616d60981b604482015290519081900360640190fd5b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a878787876040518080602001806020018381038352878782818152602001925080828437600083820152601f01601f191690910184810383528581526020019050858580828437600083820152604051601f909101601f19169092018290039850909650505050505050a150505050505050565b61c35081565b33611008146120645760405162461bcd60e51b815260040180806020018281038252602381526020018061479c6023913960400191505060405180910390fd5b600091825260046020908152604080842080546001600160a01b03191690556001600160a01b0392909216835260039052812055565b6221272160e91b81565b6001600160a01b031660009081526003602052604090205490565b61100281565b60005460ff1661210a576040805162461bcd60e51b815260206004820152601960248201526000805160206147bf833981519152604482015290519081900360640190fd5b336120001461214a5760405162461bcd60e51b815260040180806020018281038252602f81526020018061476d602f913960400191505060405180910390fd5b60ff8316600314156114745761146f82828080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612a7892505050565b61100381565b60005460ff16156121f3576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b662386f26fc1000060019081556000808052600260205260127fac33ff75c19e70fe83507db0d683fd3465c996598dc972688b7ace676c89077b55805460ff19169091179055565b600481565b600581565b61100081565b61271081565b6001600160a01b03811660009081526003602090815260409182902054825182815280840190935260609290918391906020820181803683375050506020810183905290506000805b60208160ff1610156122e157828160ff16815181106122b557fe5b01602001516001600160f81b031916156122d4576001909101906122d9565b6122e1565b60010161229a565b5060608160ff166040519080825280601f01601f191660200182016040528015612312576020820181803683370190505b50905060005b8260ff168160ff16101561236e57838160ff168151811061233557fe5b602001015160f81c60f81b828260ff168151811061234f57fe5b60200101906001600160f81b031916908160001a905350600101612318565b5095945050505050565b61100481565b606061238861439a565b600061239384612b76565b91509150806123e9576040805162461bcd60e51b815260206004820152601f60248201527f756e7265636f676e697a6564207472616e73666572496e207061636b61676500604482015290519081900360640190fd5b60006123f483612cb5565b905063ffffffff811615612488576040808401516020808601516001600160a01b0316600090815260029091529182205461242f9190612932565b90506124396143cf565b60405180608001604052808660000151815260200183815260200186608001516001600160a01b031681526020018463ffffffff16815250905061247c81613002565b95505050505050610e58565b50506040805160008152602081019091529150610e589050565b6000828201838110156116b4576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60006116b483836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506130de565b60008261254d575060006116b7565b8282028284828161255a57fe5b04146116b45760405162461bcd60e51b81526004018080602001828103825260218152602001806146806021913960400191505060405180910390fd5b60006116b483836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613180565b60408051600680825260e08201909252606091829190816020015b60608152602001906001900390816125f45750508351909150612616906131da565b8160008151811061262357fe5b602002602001018190525061264483602001516001600160a01b03166131ed565b8160018151811061265157fe5b60200260200101819052506000836040015151905060608160405190808252806020026020018201604052801561269c57816020015b60608152602001906001900390816126875790505b50905060005b828110156126e9576126ca866040015182815181106126bd57fe5b60200260200101516131da565b8282815181106126d657fe5b60209081029190910101526001016126a2565b506126f381613210565b8360028151811061270057fe5b602002602001018190525060608260405190808252806020026020018201604052801561274157816020015b606081526020019060019003908161272c5790505b50905060005b83811015612797576127788760600151828151811061276257fe5b60200260200101516001600160a01b03166131ed565b82828151811061278457fe5b6020908102919091010152600101612747565b506127a181613210565b846003815181106127ae57fe5b60200260200101819052506060836040519080825280602002602001820160405280156127ef57816020015b60608152602001906001900390816127da5790505b50905060005b8481101561282f576128108860800151828151811061276257fe5b82828151811061281c57fe5b60209081029190910101526001016127f5565b5061283981613210565b8560048151811061284657fe5b60200260200101819052506128688760a0015167ffffffffffffffff166131da565b8560058151811061287557fe5b602002602001018190525061288985613210565b979650505050505050565b61289c6143f6565b60006128a78361329a565b91509150806128e75760405162461bcd60e51b815260040180806020018281038252602481526020018061470e6024913960400191505060405180910390fd5b6114e382613465565b60006116b483836040518060400160405280601881526020017f536166654d6174683a206d6f64756c6f206279207a65726f00000000000000008152506138e9565b6000600882111561295b57612954836007198401600a0a63ffffffff6124fc16565b90506116b7565b6116b4836008849003600a0a63ffffffff61253e16565b604080516020808252818301909252600091606091906020820181803683375050506020810184905290506000805b60208160ff1610156129e857828160ff16815181106129bc57fe5b01602001516001600160f81b031916156129db576001909101906129e0565b6129e8565b6001016129a1565b50600860ff82161015612a0057600092505050610e58565b816005820360ff1681518110612a1257fe5b6020910101516001600160f81b031916602d60f81b14612a3757600092505050610e58565b816001820360ff1681518110612a4957fe5b6020910101516001600160f81b031916604d60f81b14612a6e57600092505050610e58565b5060019392505050565b612a8061434e565b6000612a8b8361394b565b9150915080612acb5760405162461bcd60e51b81526004018080602001828103825260248152602001806144d16024913960400191505060405180910390fd5b612ad36143f6565b602080840180516001600160a01b0390811684526040808701518585015291511660009081526002909252812054905b846040015151811015612b5457612b3185604001518281518110612b2357fe5b602002602001015183613bc6565b85604001518281518110612b4157fe5b6020908102919091010152600101612b03565b506080840151604083015260056060830152612b6f82613465565b5050505050565b612b7e61439a565b6000612b8861439a565b612b9061442d565b612ba1612b9c86613bff565b613c24565b90506000805b612bb083613c6e565b15612ca85780612bd257612bcb612bc684613c8f565b613cdd565b8452612ca0565b8060011415612bff57612bec612be784613c8f565b613d94565b6001600160a01b03166020850152612ca0565b8060021415612c1e57612c14612bc684613c8f565b6040850152612ca0565b8060031415612c4657612c33612be784613c8f565b6001600160a01b03166060850152612ca0565b8060041415612c6e57612c5b612be784613c8f565b6001600160a01b03166080850152612ca0565b8060051415612c9b57612c83612bc684613c8f565b67ffffffffffffffff1660a085015260019150612ca0565b612ca8565b600101612ba7565b5091935090915050915091565b60208101516000906001600160a01b0316612dec578160a0015167ffffffffffffffff16421115612ce857506001610e58565b8160400151471015612cfc57506003610e58565b606082015160408084015190516000926001600160a01b0316916127109184818181858888f193505050503d8060008114612d53576040519150601f19603f3d011682016040523d82523d6000602084013e612d58565b606091505b5050905080612d6b575060049050610e58565b7f471eb9cc1ffe55ffadf15b32595415eb9d80f22e761d24bd6dffc607e1284d5983602001518460600151856040015160405180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b03168152602001828152602001935050505060405180910390a15060009050610e58565b8160a0015167ffffffffffffffff16421115612e0a57506001610e58565b81516020808401516001600160a01b031660009081526003909152604090205414612e3757506002610e58565b602080830151604080516370a0823160e01b815230600482015290516000936001600160a01b03909316926370a082319261c3509260248083019392829003018187803b158015612e8757600080fd5b5086fa158015612e9b573d6000803e3d6000fd5b50505050506040513d6020811015612eb257600080fd5b50516040840151909150811015612ecd575060039050610e58565b600083602001516001600160a01b031663a9059cbb61c350866060015187604001516040518463ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600088803b158015612f3e57600080fd5b5087f1158015612f52573d6000803e3d6000fd5b50505050506040513d6020811015612f6957600080fd5b505190508015612ff6577f471eb9cc1ffe55ffadf15b32595415eb9d80f22e761d24bd6dffc607e1284d5984602001518560600151866040015160405180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b03168152602001828152602001935050505060405180910390a15060009150610e589050565b5060059150610e589050565b60408051600480825260a08201909252606091829190816020015b606081526020019060019003908161301d575050835190915061303f906131da565b8160008151811061304c57fe5b602002602001018190525061306483602001516131da565b8160018151811061307157fe5b602002602001018190525061309283604001516001600160a01b03166131ed565b8160028151811061309f57fe5b60200260200101819052506130bd836060015163ffffffff166131da565b816003815181106130ca57fe5b6020026020010181905250610e2c81613210565b6000818361316a5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561312f578181015183820152602001613117565b50505050905090810190601f16801561315c5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858161317657fe5b0495945050505050565b600081848411156131d25760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561312f578181015183820152602001613117565b505050900390565b60606116b76131e883613dae565b613e94565b60408051600560a21b8318601482015260348101909152606090610e2c81613e94565b60608151600014156132315750604080516000815260208101909152610e58565b60608260008151811061324057fe5b602002602001015190506000600190505b8351811015613281576132778285838151811061326a57fe5b6020026020010151613ee6565b9150600101613251565b50610e2c613294825160c060ff16613f63565b82613ee6565b6132a26143f6565b60006132ac6143f6565b6132b461442d565b6132c0612b9c86613bff565b90506000805b6132cf83613c6e565b15612ca857806132f5576132e5612be784613c8f565b6001600160a01b0316845261345d565b806001141561339657606061331161330c85613c8f565b61405b565b9050805160405190808252806020026020018201604052801561333e578160200160208202803683370190505b50602086015260005b815181101561338f5761336c82828151811061335f57fe5b6020026020010151613cdd565b8660200151828151811061337c57fe5b6020908102919091010152600101613347565b505061345d565b80600214156134385760606133ad61330c85613c8f565b905080516040519080825280602002602001820160405280156133da578160200160208202803683370190505b50604086015260005b815181101561338f576134088282815181106133fb57fe5b6020026020010151613d94565b8660400151828151811061341857fe5b6001600160a01b03909216602092830291909101909101526001016133e3565b8060031415612c9b5761344d612bc684613c8f565b63ffffffff166060850152600191505b6001016132c6565b80516001600160a01b031661368f5760005b8160200151518110156136895760008260400151828151811061349657fe5b60200260200101516001600160a01b0316612710846020015184815181106134ba57fe5b60209081029190910101516040516000818181858888f193505050503d8060008114613502576040519150601f19603f3d011682016040523d82523d6000602084013e613507565b606091505b50509050806135ca577f203f9f67a785f4f81be4d48b109aa0c498d1bc8097ecc2627063f480cc5fe73e83600001518460400151848151811061354657fe5b60200260200101518560200151858151811061355e57fe5b6020026020010151866060015160405180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b031681526020018381526020018263ffffffff1663ffffffff16815260200194505050505060405180910390a1613680565b7fd468d4fa5e8fb4adc119b29a983fd0785e04af5cb8b7a3a69a47270c54b6901a83600001518460400151848151811061360057fe5b60200260200101518560200151858151811061361857fe5b6020026020010151866060015160405180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b031681526020018381526020018263ffffffff1663ffffffff16815260200194505050505060405180910390a15b50600101613477565b506138e6565b60005b8160200151518110156138e457600082600001516001600160a01b031663a9059cbb61c350856040015185815181106136c757fe5b6020026020010151866020015186815181106136df57fe5b60200260200101516040518463ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600088803b15801561373657600080fd5b5087f115801561374a573d6000803e3d6000fd5b50505050506040513d602081101561376157600080fd5b505190508015613825577fd468d4fa5e8fb4adc119b29a983fd0785e04af5cb8b7a3a69a47270c54b6901a8360000151846040015184815181106137a157fe5b6020026020010151856020015185815181106137b957fe5b6020026020010151866060015160405180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b031681526020018381526020018263ffffffff1663ffffffff16815260200194505050505060405180910390a16138db565b7f203f9f67a785f4f81be4d48b109aa0c498d1bc8097ecc2627063f480cc5fe73e83600001518460400151848151811061385b57fe5b60200260200101518560200151858151811061387357fe5b6020026020010151866060015160405180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b031681526020018381526020018263ffffffff1663ffffffff16815260200194505050505060405180910390a15b50600101613692565b505b50565b600081836139385760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561312f578181015183820152602001613117565b5082848161394257fe5b06949350505050565b61395361434e565b600061395d61434e565b61396561442d565b613971612b9c86613bff565b90506000805b61398083613c6e565b15613bb8578061399d57613996612bc684613c8f565b8452613bb0565b80600114156139c5576139b2612be784613c8f565b6001600160a01b03166020850152613bb0565b8060021415613a545760606139dc61330c85613c8f565b90508051604051908082528060200260200182016040528015613a09578160200160208202803683370190505b50604086015260005b8151811015613a4d57613a2a82828151811061335f57fe5b86604001518281518110613a3a57fe5b6020908102919091010152600101613a12565b5050613bb0565b8060031415613ae9576060613a6b61330c85613c8f565b90508051604051908082528060200260200182016040528015613a98578160200160208202803683370190505b50606086015260005b8151811015613a4d57613ab98282815181106133fb57fe5b86606001518281518110613ac957fe5b6001600160a01b0390921660209283029190910190910152600101613aa1565b8060041415613b7e576060613b0061330c85613c8f565b90508051604051908082528060200260200182016040528015613b2d578160200160208202803683370190505b50608086015260005b8151811015613a4d57613b4e8282815181106133fb57fe5b86608001518281518110613b5e57fe5b6001600160a01b0390921660209283029190910190910152600101613b36565b8060051415613bab57613b93612bc684613c8f565b67ffffffffffffffff1660a085015260019150613bb0565b613bb8565b600101613977565b509195600195509350505050565b60006008821115613be857612954836007198401600a0a63ffffffff61253e16565b6116b4836008849003600a0a63ffffffff6124fc16565b613c0761444d565b506040805180820190915281518152602082810190820152919050565b613c2c61442d565b613c358261412c565b613c3e57600080fd5b6000613c4d836020015161415c565b60208085015160408051808201909152868152920190820152915050919050565b6000613c7861444d565b505080518051602091820151919092015191011190565b613c9761444d565b613ca082613c6e565b613ca957600080fd5b60208201516000613cb9826141bf565b80830160209586015260408051808201909152908152938401919091525090919050565b805160009015801590613cf257508151602110155b613cfb57600080fd5b6000613d0a836020015161415c565b90508083600001511015613d65576040805162461bcd60e51b815260206004820152601a60248201527f6c656e677468206973206c657373207468616e206f6666736574000000000000604482015290519081900360640190fd5b825160208085015183018051928490039291831015613d8b57826020036101000a820491505b50949350505050565b8051600090601514613da557600080fd5b6116b782613cdd565b604080516020808252818301909252606091829190602082018180368337505050602081018490529050600067ffffffffffffffff198416613df257506018613e16565b6fffffffffffffffffffffffffffffffff198416613e1257506010613e16565b5060005b6020811015613e4c57818181518110613e2b57fe5b01602001516001600160f81b03191615613e4457613e4c565b600101613e16565b60008160200390506060816040519080825280601f01601f191660200182016040528015613e81576020820181803683370190505b5080830196909652508452509192915050565b606081516001148015613ec65750607f60f81b82600081518110613eb457fe5b01602001516001600160f81b03191611155b15613ed2575080610e58565b6116b7613ee48351608060ff16613f63565b835b6060806040519050835180825260208201818101602087015b81831015613f17578051835260209283019201613eff565b50855184518101855292509050808201602086015b81831015613f44578051835260209283019201613f2c565b508651929092011591909101601f01601f191660405250905092915050565b6060680100000000000000008310613fb3576040805162461bcd60e51b815260206004820152600e60248201526d696e70757420746f6f206c6f6e6760901b604482015290519081900360640190fd5b6040805160018082528183019092526060916020820181803683370190505090506037841161400d5782840160f81b81600081518110613fef57fe5b60200101906001600160f81b031916908160001a90535090506116b7565b606061401885613dae565b90508381510160370160f81b8260008151811061403157fe5b60200101906001600160f81b031916908160001a9053506140528282613ee6565b95945050505050565b60606140668261412c565b61406f57600080fd5b600061407a836142f2565b90506060816040519080825280602002602001820160405280156140b857816020015b6140a561444d565b81526020019060019003908161409d5790505b50905060006140ca856020015161415c565b60208601510190506000805b84811015614121576140e7836141bf565b915060405180604001604052808381526020018481525084828151811061410a57fe5b6020908102919091010152918101916001016140d6565b509195945050505050565b805160009061413d57506000610e58565b6020820151805160001a9060c0821015612a6e57600092505050610e58565b8051600090811a6080811015614176576000915050610e58565b60b8811080614191575060c08110801590614191575060f881105b156141a0576001915050610e58565b60c08110156141b45760b519019050610e58565b60f519019050610e58565b80516000908190811a60808110156141da57600191506142eb565b60b88110156141ef57607e19810191506142eb565b60c081101561426957600060b78203600186019550806020036101000a865104915060018101820193505080831015614263576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b506142eb565b60f881101561427e5760be19810191506142eb565b600060f78203600186019550806020036101000a8651049150600181018201935050808310156142e9576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b505b5092915050565b805160009061430357506000610e58565b60008090506000614317846020015161415c565b602085015185519181019250015b8082101561434557614336826141bf565b60019093019290910190614325565b50909392505050565b6040518060c001604052806000801916815260200160006001600160a01b03168152602001606081526020016060815260200160608152602001600067ffffffffffffffff1681525090565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915290565b60408051608081018252600080825260208201819052918101829052606081019190915290565b604051806080016040528060006001600160a01b031681526020016060815260200160608152602001600063ffffffff1681525090565b604051806040016040528061444061444d565b8152602001600081525090565b60405180604001604052806000815260200160008152509056fe746865206d6573736167652073656e646572206d75737420626520696e63656e746976697a6520636f6e7472616374466f72206d696e69546f6b656e2c20746865207472616e7366657220616d6f756e74206d757374206e6f74206265206c657373207468616e2031756e7265636f676e697a6564207472616e736665724f75742073796e207061636b61676565787069726554696d65206d7573742062652074776f206d696e75746573206c61746572616d6f756e7420697320746f6f206c617267652c20657863656564206d6178696d756d206265703220746f6b656e20616d6f756e7474686520636f6e747261637420686173206e6f74206265656e20626f756e6420746f20616e79206265703220746f6b656e726563656976656420424e4220616d6f756e742073686f756c64206265206e6f206c657373207468616e207468652073756d206f66207472616e736665724f757420424e4220616d6f756e7420616e64206d696e696d756d2072656c6179466565616d6f756e7420697320746f6f206c617267652c2075696e74323536206f766572666c6f774c656e677468206f6620726563697069656e74416464727320646f65736e277420657175616c20746f206c656e677468206f6620726566756e644164647273696e76616c6964207472616e7366657220616d6f756e743a20707265636973696f6e206c6f737320696e20616d6f756e7420636f6e76657273696f6e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77726563656976656420424e4220616d6f756e742073686f756c64206265206e6f206c657373207468616e20746865206d696e696d756d2072656c6179466565746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e7472616374756e7265636f676e697a6564207472616e736665724f75742061636b207061636b6167654c656e677468206f6620726563697069656e74416464727320646f65736e277420657175616c20746f206c656e677468206f6620616d6f756e7473746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e7472616374746865206d73672073656e646572206d75737420626520746f6b656e4d616e6167657274686520636f6e7472616374206e6f7420696e69742079657400000000000000726563656976656420424e4220616d6f756e742073686f756c64206265206e6f206c657373207468616e207468652073756d206f66207472616e7366657220424e4220616d6f756e7420616e642072656c6179466565696e76616c696420726563656976656420424e4220616d6f756e743a20707265636973696f6e206c6f737320696e20616d6f756e7420636f6e76657273696f6ea2646970667358221220e59d62bf5fb2933f655143755e397406da6b105ef90a69a8209ff1a057bc41c964736f6c63430006040033", + }, + UpgradeConfig { + contract_addr: "0x0000000000000000000000000000000000001005", + code: "6080604052600436106102765760003560e01c80637e146cc51161014f578063af400681116100c1578063e75d72c71161007a578063e75d72c714610795578063e89a3020146107c8578063f9a2bbc7146107f2578063fc3e590814610807578063fd6a68791461081c578063fdd31fcd146108315761027d565b8063af400681146106ed578063bd4cc83014610717578063c81b166214610741578063dc927faf14610756578063dcae76ab1461076b578063e1c7392a146107805761027d565b8063a3c3c0ad11610113578063a3c3c0ad146105b3578063a78abc16146105c8578063a7c6a59d146105dd578063ab51bb96146105f2578063ac43175114610607578063ace9fcc2146106d85761027d565b80637e146cc51461052c578063930e1b091461054157806396713da9146105745780639dc0926214610589578063a1a11bf51461059e5761027d565b806343756e5c116101e85780636e47b482116101ac5780636e47b482146104645780636f93d2e61461047957806370fd5bad146104d857806374f2272d146104ed57806375d47a0a146105025780637942fd05146105175761027d565b806343756e5c146103e4578063493279b1146103f95780634bf6c8821461042557806351e806721461043a578063541333071461044f5761027d565b806312950c461161023a57806312950c46146103165780631b20087c1461032b5780631c643312146103405780633a975612146102825780633dffc3871461038657806340bb43c0146103b15761027d565b8063081e9d131461028257806308f2ec06146102a9578063093f2fc4146102be5780630bee7a67146102d357806310e06a76146103015761027d565b3661027d57005b600080fd5b34801561028e57600080fd5b50610297610864565b60408051918252519081900360200190f35b3480156102b557600080fd5b50610297610869565b3480156102ca57600080fd5b5061029761086e565b3480156102df57600080fd5b506102e8610873565b6040805163ffffffff9092168252519081900360200190f35b34801561030d57600080fd5b50610297610878565b34801561032257600080fd5b5061029761087e565b34801561033757600080fd5b50610297610884565b34801561034c57600080fd5b5061036a6004803603602081101561036357600080fd5b503561088a565b604080516001600160a01b039092168252519081900360200190f35b34801561039257600080fd5b5061039b610864565b6040805160ff9092168252519081900360200190f35b3480156103bd57600080fd5b50610297600480360360208110156103d457600080fd5b50356001600160a01b03166108b1565b3480156103f057600080fd5b5061036a6108c3565b34801561040557600080fd5b5061040e6108c9565b6040805161ffff9092168252519081900360200190f35b34801561043157600080fd5b5061039b6108ce565b34801561044657600080fd5b5061036a6108d3565b34801561045b57600080fd5b50610297610873565b34801561047057600080fd5b5061036a6108d9565b34801561048557600080fd5b506104c46004803603608081101561049c57600080fd5b506001600160a01b0381358116916020810135909116906040810135906060013515156108df565b604080519115158252519081900360200190f35b3480156104e457600080fd5b5061039b610cad565b3480156104f957600080fd5b50610297610cb2565b34801561050e57600080fd5b5061036a610cb8565b34801561052357600080fd5b5061039b610cbe565b34801561053857600080fd5b50610297610cc3565b34801561054d57600080fd5b506102976004803603602081101561056457600080fd5b50356001600160a01b0316610cc8565b34801561058057600080fd5b5061039b610cda565b34801561059557600080fd5b5061036a610cdf565b3480156105aa57600080fd5b5061036a610ce5565b3480156105bf57600080fd5b50610297610ceb565b3480156105d457600080fd5b506104c4610cf1565b3480156105e957600080fd5b50610297610cfa565b3480156105fe57600080fd5b506102e8610d00565b34801561061357600080fd5b506106d66004803603604081101561062a57600080fd5b81019060208101813564010000000081111561064557600080fd5b82018360208201111561065757600080fd5b8035906020019184600183028401116401000000008311171561067957600080fd5b91939092909160208101903564010000000081111561069757600080fd5b8201836020820111156106a957600080fd5b803590602001918460018302840111640100000000831117156106cb57600080fd5b509092509050610d05565b005b3480156106e457600080fd5b50610297611354565b3480156106f957600080fd5b506102976004803603602081101561071057600080fd5b503561135a565b34801561072357600080fd5b506102976004803603602081101561073a57600080fd5b50356113b5565b34801561074d57600080fd5b5061036a6113ce565b34801561076257600080fd5b5061036a6113d4565b34801561077757600080fd5b506102976113da565b34801561078c57600080fd5b506106d66113e0565b3480156107a157600080fd5b506106d6600480360360208110156107b857600080fd5b50356001600160a01b03166114a9565b3480156107d457600080fd5b5061036a600480360360208110156107eb57600080fd5b5035611602565b3480156107fe57600080fd5b5061036a61160f565b34801561081357600080fd5b5061039b611615565b34801561082857600080fd5b5061036a61161a565b34801561083d57600080fd5b506102976004803603602081101561085457600080fd5b50356001600160a01b0316611620565b600181565b602881565b605081565b606481565b600b5481565b60015481565b600c5481565b6006818154811061089757fe5b6000918252602090912001546001600160a01b0316905081565b60076020526000908152604090205481565b61100181565b606181565b600881565b61200081565b61100581565b6000805460ff16610937576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e7472616374206e6f7420696e69742079657400000000000000604482015290519081900360640190fd5b33612000146109775760405162461bcd60e51b815260040180806020018281038252602f815260200180612164602f913960400191505060405180910390fd5b600082156109fc57604080516309a99b4f60e41b8152611005600482015260248101869052905161100291639a99b4f09160448083019260209291908290030181600087803b1580156109c957600080fd5b505af11580156109dd573d6000803e3d6000fd5b505050506040513d60208110156109f357600080fd5b50519050610a75565b604080516309a99b4f60e41b8152611005600482015260248101869052905161100491639a99b4f09160448083019260209291908290030181600087803b158015610a4657600080fd5b505af1158015610a5a573d6000803e3d6000fd5b505050506040513d6020811015610a7057600080fd5b505190505b600c805460010190556000610a8982611632565b600954909150610a9f908263ffffffff61166116565b600955600a54610ac7908290610abb908563ffffffff61166116565b9063ffffffff6116c216565b600a556001600160a01b038716600090815260056020526040902054610b3357600680546001810182556000919091527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0180546001600160a01b0319166001600160a01b0389161790555b6001600160a01b038088166000908152600560209081526040808320805460010190559289168252600790522054610bb157600880546001810182556000919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30180546001600160a01b0319166001600160a01b0388161790555b6001600160a01b038616600090815260076020526040902080546001019055600c54606411610ca057600b54600954600a5460408051938452602084019290925282820152517f2649b1b772a1a74bd332a67695e285317dd722941166595741c60a00fa65bb759181900360600190a16000610c2b611704565b90506000610c376119e8565b6001600160a01b0389166000908152600d6020526040902054909150610c75908290610c69908563ffffffff61166116565b9063ffffffff61166116565b6001600160a01b0389166000908152600d6020526040812091909155600b80546001019055600c5550505b5060019695505050505050565b600281565b60035481565b61100881565b600b81565b600581565b60056020526000908152604090205481565b600981565b61100781565b61100681565b600a5481565b60005460ff1681565b60045481565b600081565b3361100714610d455760405162461bcd60e51b815260040180806020018281038252602e8152602001806120a9602e913960400191505060405180910390fd5b60005460ff16610d865760405162461bcd60e51b81526004018080602001828103825260218152602001806120d76021913960400191505060405180910390fd5b610dfa84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601f81527f68656164657252656c61796572526577617264526174654d6f6c6563756c650060208201529150611c669050565b15610ec75760208114610e3e5760405162461bcd60e51b81526004018080602001828103825260328152602001806121936032913960400191505060405180910390fd5b604080516020601f8401819004810282018101909252828152600091610e7c91858580838501838280828437600092019190915250611d4d92505050565b9050600254811115610ebf5760405162461bcd60e51b8152600401808060200182810382526060815260200180611f826060913960600191505060405180910390fd5b6001556112c2565b610f2084848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805160608101909152602280825290925090506120876020830139611c66565b15610ff85760208114610f645760405162461bcd60e51b815260040180806020018281038252602e815260200180612038602e913960400191505060405180910390fd5b604080516020601f8401819004810282018101909252828152600091610fa291858580838501838280828437600092019190915250611d4d92505050565b90508015801590610fb557506001548110155b610ff05760405162461bcd60e51b815260040180806020018281038252606c8152602001806120f8606c913960800191505060405180910390fd5b6002556112c2565b61106c84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601a81527f63616c6c6572436f6d70656e736174696f6e4d6f6c6563756c6500000000000060208201529150611c669050565b1561113957602081146110b05760405162461bcd60e51b815260040180806020018281038252602e815260200180612038602e913960400191505060405180910390fd5b604080516020601f84018190048102820181019092528281526000916110ee91858580838501838280828437600092019190915250611d4d92505050565b90506004548111156111315760405162461bcd60e51b8152600401808060200182810382526056815260200180611fe26056913960600191505060405180910390fd5b6003556112c2565b6111ad84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601d81527f63616c6c6572436f6d70656e736174696f6e44656e6f6d696e61746f7200000060208201529150611c669050565b1561128557602081146111f15760405162461bcd60e51b815260040180806020018281038252602e815260200180612038602e913960400191505060405180910390fd5b604080516020601f840181900481028201810190925282815260009161122f91858580838501838280828437600092019190915250611d4d92505050565b9050801580159061124257506003548110155b61127d5760405162461bcd60e51b8152600401808060200182810382526061815260200180611f216061913960800191505060405180910390fd5b6004556112c2565b6040805162461bcd60e51b815260206004820152600d60248201526c756e6b6e6f776e20706172616d60981b604482015290519081900360640190fd5b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a848484846040518080602001806020018381038352878782818152602001925080828437600083820152601f01601f191690910184810383528581526020019050858580828437600083820152604051601f909101601f19169092018290039850909650505050505050a150505050565b60025481565b60006028821161136b5750806113b0565b81602810801561137c575060508211155b15611389575060286113b0565b60508211801561139a5750606e8211155b156113aa575060788190036113b0565b50600481045b919050565b6000602882116113c65750806113b0565b5060286113b0565b61100281565b61100381565b60095481565b60005460ff1615611438576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b60005460ff1615611486576040805162461bcd60e51b8152602060048201526013602482015272185b1c9958591e481a5b9a5d1a585b1a5e9959606a1b604482015290519081900360640190fd5b60018080556005600255600381905560506004556000805460ff19169091179055565b6001600160a01b0381166000908152600d602052604090205480611508576040805162461bcd60e51b81526020600482015260116024820152701b9bc81c995b185e595c881c995dd85c99607a1b604482015290519081900360640190fd5b6001600160a01b0382166000818152600d60205260408082208290555184929184156108fc02918591818181858888f193505050506115b85760405161100290819084156108fc029085906000818181858888f19350505050158015611572573d6000803e3d6000fd5b506040805161100281526020810185905281517f24502838a334c8f2bb2ee1f8262a4fa7183e4489a717e96cc824e325f8b39e11929181900390910190a15050506115ff565b604080516001600160a01b03851681526020810184905281517f24502838a334c8f2bb2ee1f8262a4fa7183e4489a717e96cc824e325f8b39e11929181900390910190a150505b50565b6008818154811061089757fe5b61100081565b600381565b61100481565b600d6020526000908152604090205481565b600061165b60025461164f60015485611d5290919063ffffffff16565b9063ffffffff611dab16565b92915050565b6000828201838110156116bb576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b60006116bb83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611ded565b600954600680546040805160208084028201810190925282815260009493859360609383018282801561176057602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611742575b5050505050905060608151604051908082528060200260200182016040528015611794578160200160208202803683370190505b50905060005b82518110156118215760008382815181106117b157fe5b6020026020010151905060006117eb60056000846001600160a01b03166001600160a01b03168152602001908152602001600020546113b5565b9050808484815181106117fa57fe5b6020908102919091010152611815868263ffffffff61166116565b9550505060010161179a565b50600061183f60045461164f60035488611d5290919063ffffffff16565b9050611851858263ffffffff6116c216565b94508460015b845181101561192857600061188c8761164f8a88868151811061187657fe5b6020026020010151611d5290919063ffffffff16565b90506118d981600d60008986815181106118a257fe5b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000205461166190919063ffffffff16565b600d60008885815181106118e957fe5b6020908102919091018101516001600160a01b031682528101919091526040016000205561191d838263ffffffff6116c216565b925050600101611857565b5061193e81600d6000876000815181106118a257fe5b600d60008660008151811061194f57fe5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002081905550600060098190555060008090505b84518110156119d057600560008683815181106119a257fe5b6020908102919091018101516001600160a01b03168252810191909152604001600090812055600101611989565b506119dd60066000611ee9565b509450505050505b90565b600a546008805460408051602080840282018101909252828152600094938593606093830182828015611a4457602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611a26575b5050505050905060608151604051908082528060200260200182016040528015611a78578160200160208202803683370190505b50905060005b8251811015611af7576000838281518110611a9557fe5b602002602001015190506000611acf60076000846001600160a01b03166001600160a01b031681526020019081526020016000205461135a565b905080848481518110611ade57fe5b6020908102919091010152949094019350600101611a7e565b506000611b1560045461164f60035488611d5290919063ffffffff16565b9050611b27858263ffffffff6116c216565b94508460015b8451811015611bb1576000611b4c8761164f8a88868151811061187657fe5b9050611b6281600d60008986815181106118a257fe5b600d6000888581518110611b7257fe5b6020908102919091018101516001600160a01b0316825281019190915260400160002055611ba6838263ffffffff6116c216565b925050600101611b2d565b50611bc781600d6000876000815181106118a257fe5b600d600086600081518110611bd857fe5b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020819055506000600a8190555060008090505b8451811015611c595760076000868381518110611c2b57fe5b6020908102919091018101516001600160a01b03168252810191909152604001600090812055600101611c12565b506119dd60086000611ee9565b6000816040516020018082805190602001908083835b60208310611c9b5780518252601f199092019160209182019101611c7c565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120836040516020018082805190602001908083835b60208310611d095780518252601f199092019160209182019101611cea565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040528051906020012014905092915050565b015190565b600082611d615750600061165b565b82820282848281611d6e57fe5b04146116bb5760405162461bcd60e51b81526004018080602001828103825260218152602001806120666021913960400191505060405180910390fd5b60006116bb83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611e84565b60008184841115611e7c5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611e41578181015183820152602001611e29565b50505050905090810190601f168015611e6e5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60008183611ed35760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315611e41578181015183820152602001611e29565b506000838581611edf57fe5b0495945050505050565b50805460008255906000526020600020908101906115ff91906119e591905b80821115611f1c5760008155600101611f08565b509056fe746865206e657743616c6c6572436f6d70656e736174696f6e44656e6f6d696e61746f72206d757374206e6f74206265207a65726f20616e64206e6f206c657373207468616e2063616c6c6572436f6d70656e736174696f6e4d6f6c6563756c656e65772068656164657252656c61796572526577617264526174654d6f6c6563756c652073686f756c646e27742062652067726561746572207468616e2068656164657252656c617965725265776172645261746544656e6f6d696e61746f726e65772063616c6c6572436f6d70656e736174696f6e4d6f6c6563756c652073686f756c646e27742062652067726561746572207468616e2063616c6c6572436f6d70656e736174696f6e44656e6f6d696e61746f726c656e677468206f6620726577617264466f7256616c696461746f725365744368616e6765206d69736d61746368536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7768656164657252656c617965725265776172645261746544656e6f6d696e61746f72746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e7472616374636f6e747261637420686173206e6f74206265656e20696e697469616c697a6564746865206e65772068656164657252656c617965725265776172645261746544656e6f6d696e61746f72206d757374206e6f74206265207a65726f20616e64206e6f206c657373207468616e2068656164657252656c61796572526577617264526174654d6f6c6563756c65746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e74726163746c656e677468206f662068656164657252656c61796572526577617264526174654d6f6c6563756c65206d69736d61746368a2646970667358221220b0f586134d92421afeb7764dfa9711bf04e0920aa1729c40e9183ccccafbb49d64736f6c63430006040033", + }, + UpgradeConfig { + contract_addr: "0x0000000000000000000000000000000000001006", + code: "6080604052600436106101c25760003560e01c806395468d26116100f7578063c81b166211610095578063f9a2bbc711610064578063f9a2bbc714610529578063fb7cfdd71461053e578063fc3e590814610553578063fd6a687914610568576101c2565b8063c81b1662146104d5578063dc927faf146104ea578063e1c7392a146104ff578063e79a198f14610514576101c2565b8063a1a11bf5116100d1578063a1a11bf5146103c7578063a78abc16146103dc578063ab51bb96146103f1578063ac43175114610406576101c2565b806395468d261461038857806396713da91461039d5780639dc09262146103b2576101c2565b8063541d55481161016457806370fd5bad1161013e57806370fd5bad1461033457806375d47a0a146103495780637942fd051461035e5780637ae2308814610373576101c2565b8063541d5548146102b15780636a87d780146102f85780636e47b4821461031f576101c2565b806343756e5c116101a057806343756e5c1461022a578063493279b11461025b5780634bf6c8821461028757806351e806721461029c576101c2565b80630bee7a67146101c75780631aa3a008146101f55780633dffc387146101ff575b600080fd5b3480156101d357600080fd5b506101dc61057d565b6040805163ffffffff9092168252519081900360200190f35b6101fd610582565b005b34801561020b57600080fd5b5061021461077d565b6040805160ff9092168252519081900360200190f35b34801561023657600080fd5b5061023f610782565b604080516001600160a01b039092168252519081900360200190f35b34801561026757600080fd5b50610270610788565b6040805161ffff9092168252519081900360200190f35b34801561029357600080fd5b5061021461078d565b3480156102a857600080fd5b5061023f610792565b3480156102bd57600080fd5b506102e4600480360360208110156102d457600080fd5b50356001600160a01b0316610798565b604080519115158252519081900360200190f35b34801561030457600080fd5b5061030d6107b6565b60408051918252519081900360200190f35b34801561032b57600080fd5b5061023f6107bc565b34801561034057600080fd5b506102146107c2565b34801561035557600080fd5b5061023f6107c7565b34801561036a57600080fd5b506102146107cd565b34801561037f57600080fd5b5061030d6107d2565b34801561039457600080fd5b5061030d6107df565b3480156103a957600080fd5b506102146107eb565b3480156103be57600080fd5b5061023f6107f0565b3480156103d357600080fd5b5061023f6107f6565b3480156103e857600080fd5b506102e46107fc565b3480156103fd57600080fd5b506101dc610805565b34801561041257600080fd5b506101fd6004803603604081101561042957600080fd5b81019060208101813564010000000081111561044457600080fd5b82018360208201111561045657600080fd5b8035906020019184600183028401116401000000008311171561047857600080fd5b91939092909160208101903564010000000081111561049657600080fd5b8201836020820111156104a857600080fd5b803590602001918460018302840111640100000000831117156104ca57600080fd5b50909250905061080a565b3480156104e157600080fd5b5061023f610c2c565b3480156104f657600080fd5b5061023f610c32565b34801561050b57600080fd5b506101fd610c38565b34801561052057600080fd5b506101fd610cba565b34801561053557600080fd5b5061023f610e73565b34801561054a57600080fd5b5061030d610e79565b34801561055f57600080fd5b50610214610e7f565b34801561057457600080fd5b5061023f610e84565b606481565b3360009081526004602052604090205460ff16156105df576040805162461bcd60e51b81526020600482015260156024820152741c995b185e595c88185b1c9958591e48195e1a5cdd605a1b604482015290519081900360640190fd5b60005460ff16610632576040805162461bcd60e51b81526020600482015260196024820152781d1a194818dbdb9d1c9858dd081b9bdd081a5b9a5d081e595d603a1b604482015290519081900360640190fd5b61063b33610e8a565b156106775760405162461bcd60e51b815260040180806020018281038252602781526020018061109c6027913960400191505060405180910390fd5b3332146106c1576040805162461bcd60e51b81526020600482015260136024820152721b9bc81c1c9bde1e481a5cc8185b1b1bddd959606a1b604482015290519081900360640190fd5b60015434146107015760405162461bcd60e51b81526004018080602001828103825260258152602001806110776025913960400191505060405180910390fd5b604080518082018252600180548252600254602080840191825233600081815260038352868120955186559251948401949094556004815290849020805460ff1916909217909155825191825291517fdb33a09d38b59a8fa8b7d92a1d82c8015e99f05f67ae9c9ae623157767959496929181900390910190a1565b600181565b61100181565b606181565b600881565b61200081565b6001600160a01b031660009081526004602052604090205460ff1690565b60025481565b61100581565b600281565b61100881565b600b81565b68056bc75e2d6310000081565b67016345785d8a000081565b600981565b61100781565b61100681565b60005460ff1681565b600081565b60005460ff1661085d576040805162461bcd60e51b81526020600482015260196024820152781d1a194818dbdb9d1c9858dd081b9bdd081a5b9a5d081e595d603a1b604482015290519081900360640190fd5b336110071461089d5760405162461bcd60e51b815260040180806020018281038252602e8152602001806110c3602e913960400191505060405180910390fd5b61090384848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600f81526e1c995c5d5a5c995911195c1bdcda5d608a1b60208201529150610e909050565b15610a0657602081146109475760405162461bcd60e51b81526004018080602001828103825260228152602001806110f16022913960400191505060405180910390fd5b604080516020601f840181900481028201810190925282815260009161098591858580838501838280828437600092019190915250610f7792505050565b90506001811180156109a05750683635c9adc5dea000008111155b80156109ad575060025481115b6109fe576040805162461bcd60e51b815260206004820181905260248201527f7468652072657175697265644465706f736974206f7574206f662072616e6765604482015290519081900360640190fd5b600155610b9a565b610a6184848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260048152636475657360e01b60208201529150610e909050565b15610b5d5760208114610abb576040805162461bcd60e51b815260206004820152601760248201527f6c656e677468206f662064756573206d69736d61746368000000000000000000604482015290519081900360640190fd5b604080516020601f8401819004810282018101909252828152600091610af991858580838501838280828437600092019190915250610f7792505050565b9050600081118015610b0c575060015481105b610b55576040805162461bcd60e51b81526020600482015260156024820152747468652064756573206f7574206f662072616e676560581b604482015290519081900360640190fd5b600255610b9a565b6040805162461bcd60e51b815260206004820152600d60248201526c756e6b6e6f776e20706172616d60981b604482015290519081900360640190fd5b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a848484846040518080602001806020018381038352878782818152602001925080828437600083820152601f01601f191690910184810383528581526020019050858580828437600083820152604051601f909101601f19169092018290039850909650505050505050a150505050565b61100281565b61100381565b60005460ff1615610c90576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b68056bc75e2d63100000600190815567016345785d8a00006002556000805460ff19169091179055565b3360009081526004602052604090205460ff16610d15576040805162461bcd60e51b81526020600482015260146024820152731c995b185e595c88191bc81b9bdd08195e1a5cdd60621b604482015290519081900360640190fd5b60005460ff16610d68576040805162461bcd60e51b81526020600482015260196024820152781d1a194818dbdb9d1c9858dd081b9bdd081a5b9a5d081e595d603a1b604482015290519081900360640190fd5b610d7061105c565b5033600081815260036020908152604091829020825180840190935280548084526001909101549183018290529192916108fc91610db4919063ffffffff610f7c16565b6040518115909202916000818181858888f19350505050158015610ddc573d6000803e3d6000fd5b50602081015160405161100291829181156108fc0291906000818181858888f19350505050158015610e12573d6000803e3d6000fd5b50336000818152600460209081526040808320805460ff191690556003825280832083815560010192909255815192835290517fd17202129b83db7880d6b9f25df81c58ad46f7e0e2c92236b1aa10663a4876679281900390910190a15050565b61100081565b60015481565b600381565b61100481565b3b151590565b6000816040516020018082805190602001908083835b60208310610ec55780518252601f199092019160209182019101610ea6565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120836040516020018082805190602001908083835b60208310610f335780518252601f199092019160209182019101610f14565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040528051906020012014905092915050565b015190565b6000610fbe83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250610fc5565b9392505050565b600081848411156110545760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611019578181015183820152602001611001565b50505050905090810190601f1680156110465780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60405180604001604052806000815260200160008152509056fe6465706f7369742076616c7565206973206e6f742065786163746c79207468652073616d65636f6e7472616374206973206e6f7420616c6c6f77656420746f20626520612072656c61796572746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e74726163746c656e677468206f662072657175697265644465706f736974206d69736d61746368a26469706673582212205b3719dbe352a0da1c7c0fda084d877d745e453695a354811ae82144145a56ae64736f6c63430006040033", + }, + UpgradeConfig { + contract_addr: "0x0000000000000000000000000000000000001007", + code: "608060405234801561001057600080fd5b506004361061018e5760003560e01c8063831d65d1116100de578063ab51bb9611610097578063dc927faf11610071578063dc927faf14610486578063f9a2bbc71461048e578063fc3e590814610496578063fd6a68791461049e5761018e565b8063ab51bb96146103fc578063c81b166214610404578063c8509d811461040c5761018e565b8063831d65d11461034457806396713da9146103c05780639ab1a373146103c85780639dc09262146103d0578063a1a11bf5146103d8578063a78abc16146103e05761018e565b8063493279b11161014b5780636e47b482116101255780636e47b4821461032457806370fd5bad1461032c57806375d47a0a146103345780637942fd051461033c5761018e565b8063493279b1146102f55780634bf6c8821461031457806351e806721461031c5761018e565b80630bee7a67146101935780631182b875146101b45780633a21baae146102a35780633dffc387146102ab57806343756e5c146102c95780634900c4ea146102ed575b600080fd5b61019b6104a6565b6040805163ffffffff9092168252519081900360200190f35b61022e600480360360408110156101ca57600080fd5b60ff82351691908101906040810160208201356401000000008111156101ef57600080fd5b82018360208201111561020157600080fd5b8035906020019184600183028401116401000000008311171561022357600080fd5b5090925090506104ab565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610268578181015183820152602001610250565b50505050905090810190601f1680156102955780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61019b61059a565b6102b361059f565b6040805160ff9092168252519081900360200190f35b6102d16105a4565b604080516001600160a01b039092168252519081900360200190f35b6102b36105aa565b6102fd6105af565b6040805161ffff9092168252519081900360200190f35b6102b36105b4565b6102d16105b9565b6102d16105bf565b6102b36105c5565b6102d16105ca565b6102b36105d0565b6103be6004803603604081101561035a57600080fd5b60ff823516919081019060408101602082013564010000000081111561037f57600080fd5b82018360208201111561039157600080fd5b803590602001918460018302840111640100000000831117156103b357600080fd5b5090925090506105d5565b005b6102b3610667565b61019b61066c565b6102d1610671565b6102d1610677565b6103e861067d565b604080519115158252519081900360200190f35b61019b6105aa565b6102d1610686565b6103be6004803603604081101561042257600080fd5b60ff823516919081019060408101602082013564010000000081111561044757600080fd5b82018360208201111561045957600080fd5b8035906020019184600183028401116401000000008311171561047b57600080fd5b50909250905061068c565b6102d1610703565b6102d1610709565b6102b361070f565b6102d1610714565b606481565b606033612000146104ed5760405162461bcd60e51b815260040180806020018281038252602f8152602001806113e7602f913960400191505060405180910390fd5b6104f5611382565b600061053685858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061071a92505050565b91509150806105525761054960646107e0565b92505050610593565b600061055d8361084a565b905063ffffffff811661058457505060408051600081526020810190915291506105939050565b61058d816107e0565b93505050505b9392505050565b606681565b600181565b61100181565b600081565b606181565b600881565b61200081565b61100581565b600281565b61100881565b600b81565b33612000146106155760405162461bcd60e51b815260040180806020018281038252602f8152602001806113e7602f913960400191505060405180910390fd5b6040805162461bcd60e51b815260206004820152601e60248201527f7265636569766520756e65787065637465642061636b207061636b6167650000604482015290519081900360640190fd5b505050565b600981565b606581565b61100781565b61100681565b60005460ff1681565b61100281565b33612000146106cc5760405162461bcd60e51b815260040180806020018281038252602f8152602001806113e7602f913960400191505060405180910390fd5b60405162461bcd60e51b81526004018080602001828103825260238152602001806114166023913960400191505060405180910390fd5b61100381565b61100081565b600381565b61100481565b610722611382565b600061072c611382565b6107346113ac565b61074561074086610beb565b610c10565b90506000805b61075483610c5a565b156107d357806107765761076f61076a84610c7b565b610cc9565b84526107cb565b80600114156107955761078b61076a84610c7b565b60208501526107cb565b80600214156107c6576107af6107aa84610c7b565b610d42565b6001600160a01b03166040850152600191506107cb565b6107d3565b60010161074b565b5091935090915050915091565b604080516001808252818301909252606091829190816020015b60608152602001906001900390816107fa5790505090506108208363ffffffff16610d62565b8160008151811061082d57fe5b602002602001018190525061084181610d75565b9150505b919050565b60006108598260400151610dff565b6108c557604080516020808252601c908201527f74686520746172676574206973206e6f74206120636f6e7472616374000000008183015290517f70e72399380dcfb0338abc03dc8d47f9f470ada8e769c9a78d644ea97385ecb29181900360600190a1506065610845565b81604001516001600160a01b031663ac431751836000015184602001516040518363ffffffff1660e01b8152600401808060200180602001838103835285818151815260200191508051906020019080838360005b8381101561093257818101518382015260200161091a565b50505050905090810190601f16801561095f5780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b8381101561099257818101518382015260200161097a565b50505050905090810190601f1680156109bf5780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b1580156109e057600080fd5b505af19250505080156109f1575060015b610be3576040516000815260443d1015610a0d57506000610aaa565b60046000803e60005160e01c6308c379a08114610a2e576000915050610aaa565b60043d036004833e81513d602482011167ffffffffffffffff82111715610a5a57600092505050610aaa565b808301805167ffffffffffffffff811115610a7c576000945050505050610aaa565b8060208301013d8601811115610a9a57600095505050505050610aaa565b601f01601f191660405250925050505b80610ab55750610b58565b7f70e72399380dcfb0338abc03dc8d47f9f470ada8e769c9a78d644ea97385ecb2816040518080602001828103825283818151815260200191508051906020019080838360005b83811015610b14578181015183820152602001610afc565b50505050905090810190601f168015610b415780820380516001836020036101000a031916815260200191505b509250505060405180910390a16066915050610845565b3d808015610b82576040519150601f19603f3d011682016040523d82523d6000602084013e610b87565b606091505b5060408051602080825283518183015283517f1279f84165b4fd69c35e1f338ff107231b036c655cd1688851e011ce617c4e8d938593928392918301919085019080838360008315610b14578181015183820152602001610afc565b506000919050565b610bf36113cc565b506040805180820190915281518152602082810190820152919050565b610c186113ac565b610c2182610e05565b610c2a57600080fd5b6000610c398360200151610e3f565b60208085015160408051808201909152868152920190820152915050919050565b6000610c646113cc565b505080518051602091820151919092015191011190565b610c836113cc565b610c8c82610c5a565b610c9557600080fd5b60208201516000610ca582610ea2565b80830160209586015260408051808201909152908152938401919091525090919050565b8051606090610cd757600080fd5b6000610ce68360200151610e3f565b83516040805191839003808352601f19601f8201168301602001909152919250606090828015610d1d576020820181803683370190505b5090506000816020019050610d39848760200151018285610fd5565b50949350505050565b8051600090601514610d5357600080fd5b610d5c82611020565b92915050565b6060610d5c610d70836110d5565b6111bb565b6060815160001415610d965750604080516000815260208101909152610845565b606082600081518110610da557fe5b602002602001015190506000600190505b8351811015610de657610ddc82858381518110610dcf57fe5b602002602001015161120d565b9150600101610db6565b50610841610df9825160c060ff1661128a565b8261120d565b3b151590565b8051600090610e1657506000610845565b6020820151805160001a9060c0821015610e3557600092505050610845565b5060019392505050565b8051600090811a6080811015610e59576000915050610845565b60b8811080610e74575060c08110801590610e74575060f881105b15610e83576001915050610845565b60c0811015610e975760b519019050610845565b60f519019050610845565b80516000908190811a6080811015610ebd5760019150610fce565b60b8811015610ed257607e1981019150610fce565b60c0811015610f4c57600060b78203600186019550806020036101000a865104915060018101820193505080831015610f46576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b50610fce565b60f8811015610f615760be1981019150610fce565b600060f78203600186019550806020036101000a865104915060018101820193505080831015610fcc576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b505b5092915050565b80610fdf57610662565b5b60208110610fff578251825260209283019290910190601f1901610fe0565b915181516020939093036101000a6000190180199091169216919091179052565b80516000901580159061103557508151602110155b61103e57600080fd5b600061104d8360200151610e3f565b905080836000015110156110a8576040805162461bcd60e51b815260206004820152601a60248201527f6c656e677468206973206c657373207468616e206f6666736574000000000000604482015290519081900360640190fd5b825160208085015183018051928490039291831015610d3957506020919091036101000a90049392505050565b604080516020808252818301909252606091829190602082018180368337505050602081018490529050600067ffffffffffffffff1984166111195750601861113d565b6fffffffffffffffffffffffffffffffff1984166111395750601061113d565b5060005b60208110156111735781818151811061115257fe5b01602001516001600160f81b0319161561116b57611173565b60010161113d565b60008160200390506060816040519080825280601f01601f1916602001820160405280156111a8576020820181803683370190505b5080830196909652508452509192915050565b6060815160011480156111ed5750607f60f81b826000815181106111db57fe5b01602001516001600160f81b03191611155b156111f9575080610845565b610d5c61120b8351608060ff1661128a565b835b6060806040519050835180825260208201818101602087015b8183101561123e578051835260209283019201611226565b50855184518101855292509050808201602086015b8183101561126b578051835260209283019201611253565b508651929092011591909101601f01601f191660405250905092915050565b60606801000000000000000083106112da576040805162461bcd60e51b815260206004820152600e60248201526d696e70757420746f6f206c6f6e6760901b604482015290519081900360640190fd5b604080516001808252818301909252606091602082018180368337019050509050603784116113345782840160f81b8160008151811061131657fe5b60200101906001600160f81b031916908160001a9053509050610d5c565b606061133f856110d5565b90508381510160370160f81b8260008151811061135857fe5b60200101906001600160f81b031916908160001a905350611379828261120d565b95945050505050565b6040518060600160405280606081526020016060815260200160006001600160a01b031681525090565b60405180604001604052806113bf6113cc565b8152602001600081525090565b60405180604001604052806000815260200160008152509056fe746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e74726163747265636569766520756e6578706563746564206661696c2061636b207061636b616765a2646970667358221220401be81505a1aa0dde70753881234490b5e4c39ce009cb7950f994eead5c3f9064736f6c63430006040033", + }, + UpgradeConfig { + contract_addr: "0x0000000000000000000000000000000000001008", + code: "6080604052600436106102465760003560e01c806375d47a0a11610139578063ab51bb96116100b6578063dc6f5e901161007a578063dc6f5e90146108df578063dc927faf14610975578063f9a2bbc71461098a578063fc3e5908146108df578063fd6a68791461099f578063fe3a2af5146104fd57610246565b8063ab51bb96146108b5578063c81b1662146108ca578063c8509d81146107c5578063c8e704a4146108df578063d117a110146108f457610246565b806395b9ad26116100fd57806395b9ad261461084c57806396713da9146108615780639dc0926214610876578063a1a11bf51461088b578063a78abc16146108a057610246565b806375d47a0a146106e757806377d9dae8146106fc5780637942fd05146107b05780637d078e13146103c8578063831d65d1146107c557610246565b80634a688818116101c75780635f558f861161018b5780635f558f86146105515780636b3f1307146105665780636e47b4821461062e57806370fd5bad1461055157806372c4e0861461064357610246565b80634a688818146104fd5780634bc81c00146105125780634bf6c8821461024b57806351e80672146105275780635d499b1b1461053c57610246565b806323996b531161020e57806323996b53146103c85780633dffc387146103c857806343756e5c146103dd578063445fcefe1461040e578063493279b1146104d157610246565b8063077b8f351461024b5780630bee7a67146102765780630f212b1b146102a45780631182b875146102b95780631f91600b146103b3575b600080fd5b34801561025757600080fd5b506102606109b4565b6040805160ff9092168252519081900360200190f35b34801561028257600080fd5b5061028b6109b9565b6040805163ffffffff9092168252519081900360200190f35b3480156102b057600080fd5b506102606109be565b3480156102c557600080fd5b5061033e600480360360408110156102dc57600080fd5b60ff8235169190810190604081016020820135600160201b81111561030057600080fd5b82018360208201111561031257600080fd5b803590602001918460018302840111600160201b8311171561033357600080fd5b5090925090506109c3565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610378578181015183820152602001610360565b50505050905090810190601f1680156103a55780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156103bf57600080fd5b50610260610a4c565b3480156103d457600080fd5b50610260610a51565b3480156103e957600080fd5b506103f2610a56565b604080516001600160a01b039092168252519081900360200190f35b34801561041a57600080fd5b506104bf6004803603602081101561043157600080fd5b810190602081018135600160201b81111561044b57600080fd5b82018360208201111561045d57600080fd5b803590602001918460018302840111600160201b8311171561047e57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610a5c945050505050565b60408051918252519081900360200190f35b3480156104dd57600080fd5b506104e6610bbb565b6040805161ffff9092168252519081900360200190f35b34801561050957600080fd5b50610260610bc0565b34801561051e57600080fd5b50610260610bc5565b34801561053357600080fd5b506103f2610bca565b34801561054857600080fd5b506104bf610bd0565b34801561055d57600080fd5b50610260610bd9565b61061a6004803603604081101561057c57600080fd5b6001600160a01b038235169190810190604081016020820135600160201b8111156105a657600080fd5b8201836020820111156105b857600080fd5b803590602001918460018302840111600160201b831117156105d957600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610bde945050505050565b604080519115158252519081900360200190f35b34801561063a57600080fd5b506103f2611460565b61061a6004803603602081101561065957600080fd5b810190602081018135600160201b81111561067357600080fd5b82018360208201111561068557600080fd5b803590602001918460018302840111600160201b831117156106a657600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611466945050505050565b3480156106f357600080fd5b506103f26118b4565b61061a6004803603604081101561071257600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561073c57600080fd5b82018360208201111561074e57600080fd5b803590602001918460018302840111600160201b8311171561076f57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506118ba945050505050565b3480156107bc57600080fd5b50610260611dc1565b3480156107d157600080fd5b5061084a600480360360408110156107e857600080fd5b60ff8235169190810190604081016020820135600160201b81111561080c57600080fd5b82018360208201111561081e57600080fd5b803590602001918460018302840111600160201b8311171561083f57600080fd5b509092509050611dc6565b005b34801561085857600080fd5b50610260611e79565b34801561086d57600080fd5b50610260611e7e565b34801561088257600080fd5b506103f2611e83565b34801561089757600080fd5b506103f2611e89565b3480156108ac57600080fd5b5061061a611e8f565b3480156108c157600080fd5b5061028b610bc0565b3480156108d657600080fd5b506103f2611e98565b3480156108eb57600080fd5b50610260611e9e565b34801561090057600080fd5b5061091e6004803603602081101561091757600080fd5b5035611ea3565b6040805160ff988916815260208101979097526001600160a01b03909516868601526060860193909352608085019190915290931660a083015267ffffffffffffffff90921660c082015290519081900360e00190f35b34801561098157600080fd5b506103f2611efb565b34801561099657600080fd5b506103f2611f01565b3480156109ab57600080fd5b506103f2611f07565b600881565b606481565b600681565b60603361200014610a055760405162461bcd60e51b815260040180806020018281038252602f8152602001806132a0602f913960400191505060405180910390fd5b610a4483838080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611f0d92505050565b949350505050565b600481565b600181565b61100181565b6020810151600090610a6c613168565b50600081815260016020818152604092839020835160e081018552815460ff9081168252938201549281019290925260028101546001600160a01b031693820184905260038101546060830152600481015460808301526005015491821660a082015261010090910467ffffffffffffffff1660c082015290610af457600092505050610bb6565b600081604001516001600160a01b03166370a082316110046040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015610b5257600080fd5b505afa158015610b66573d6000803e3d6000fd5b505050506040513d6020811015610b7c57600080fd5b505160808301516060840151919250600091610b9d9163ffffffff61219e16565b9050610baf818363ffffffff61219e16565b9450505050505b919050565b606181565b600081565b600581565b61200081565b6402540be40081565b600281565b600080610bea836121e7565b9050610bf4613168565b50600081815260016020818152604092839020835160e081018552815460ff90811682529382015492810183905260028201546001600160a01b03169481019490945260038101546060850152600481015460808501526005015491821660a084015261010090910467ffffffffffffffff1660c0830152610cba576040805162461bcd60e51b815260206004820152601a602482015279189a5b99081c995c5d595cdd08191bd95cdb89dd08195e1a5cdd60321b604482015290519081900360640190fd5b6000610cd78260800151836060015161219e90919063ffffffff16565b905081604001516001600160a01b0316866001600160a01b031614610d2d5760405162461bcd60e51b815260040180806020018281038252604581526020018061322d6045913960600191505060405180910390fd5b336001600160a01b0316866001600160a01b031663893d20e86040518163ffffffff1660e01b815260040160206040518083038186803b158015610d7057600080fd5b505afa158015610d84573d6000803e3d6000fd5b505050506040513d6020811015610d9a57600080fd5b50516001600160a01b031614610de15760405162461bcd60e51b815260040180806020018281038252602e815260200180613272602e913960400191505060405180910390fd5b604080516370a0823160e01b8152611004600482015290516000916001600160a01b038916916370a0823191602480820192602092909190829003018186803b158015610e2d57600080fd5b505afa158015610e41573d6000803e3d6000fd5b505050506040513d6020811015610e5757600080fd5b505160408051636eb1769f60e11b815233600482015230602482015290519192508391610ee89184916001600160a01b038c169163dd62ed3e916044808301926020929190829003018186803b158015610eb057600080fd5b505afa158015610ec4573d6000803e3d6000fd5b505050506040513d6020811015610eda57600080fd5b50519063ffffffff6121ee16565b1015610f3b576040805162461bcd60e51b815260206004820152601760248201527f616c6c6f77616e6365206973206e6f7420656e6f756768000000000000000000604482015290519081900360640190fd5b600034905060006110046001600160a01b031663149d14d96040518163ffffffff1660e01b815260040160206040518083038186803b158015610f7d57600080fd5b505afa158015610f91573d6000803e3d6000fd5b505050506040513d6020811015610fa757600080fd5b50519050808210801590610fc057506402540be4008206155b610ffb5760405162461bcd60e51b81526004018080602001828103825260378152602001806131f66037913960400191505060405180910390fd5b6000611007868b612248565b905063ffffffff8116611206576001600160a01b038a166323b872dd33611004611037898963ffffffff61219e16565b6040518463ffffffff1660e01b815260040180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b031681526020018281526020019350505050602060405180830381600087803b15801561109f57600080fd5b505af11580156110b3573d6000803e3d6000fd5b505050506040513d60208110156110c957600080fd5b5050602086015160408088015160a089015182516323bfccdb60e21b815260048101949094526001600160a01b03909116602484015260ff1660448301525161100491638eff336c91606480830192600092919082900301818387803b15801561113257600080fd5b505af1158015611146573d6000803e3d6000fd5b50505050896001600160a01b03167f78e7dd9aefcdbf795c4936a66f7dc6d41bb56637b54f561a6bf7829dca3348a88a8860600151886040518080602001848152602001838152602001828103825285818151815260200191508051906020019080838360005b838110156111c55781810151838201526020016111ad565b50505050905090810190601f1680156111f25780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a26112be565b896001600160a01b03167f831c0ef4d93bda3bce08b69ae3f29ef1a6e052b833200988554158494405a1078a8360405180806020018363ffffffff1663ffffffff168152602001828103825284818151815260200191508051906020019080838360005b8381101561128257818101518382015260200161126a565b50505050905090810190601f1680156112af5780820380516001836020036101000a031916815260200191505b50935050505060405180910390a25b60008781526001602081905260408220805460ff191681559081018290556002810180546001600160a01b0319169055600381018290556004810191909155600501805468ffffffffffffffffff191690556113186131a4565b5060408051808201825263ffffffff831681526020810189905290516110049085156108fc029086906000818181858888f19350505050158015611360573d6000803e3d6000fd5b5061200063f7a251d760016113748461269f565b611389886402540be40063ffffffff61272916565b6040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b838110156113e75781810151838201526020016113cf565b50505050905090810190601f1680156114145780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b15801561143557600080fd5b505af1158015611449573d6000803e3d6000fd5b505050506001985050505050505050505b92915050565b61100581565b600080611472836121e7565b905061147c613168565b50600081815260016020818152604092839020835160e081018552815460ff90811682529382015492810183905260028201546001600160a01b03169481019490945260038101546060850152600481015460808501526005015491821660a084015261010090910467ffffffffffffffff1660c0830152611542576040805162461bcd60e51b815260206004820152601a602482015279189a5b99081c995c5d595cdd08191bd95cdb89dd08195e1a5cdd60321b604482015290519081900360640190fd5b428160c0015167ffffffffffffffff16106115a4576040805162461bcd60e51b815260206004820152601b60248201527f62696e642072657175657374206973206e6f7420657870697265640000000000604482015290519081900360640190fd5b600034905060006110046001600160a01b031663149d14d96040518163ffffffff1660e01b815260040160206040518083038186803b1580156115e657600080fd5b505afa1580156115fa573d6000803e3d6000fd5b505050506040513d602081101561161057600080fd5b5051905080821080159061162957506402540be4008206155b6116645760405162461bcd60e51b81526004018080602001828103825260378152602001806131f66037913960400191505060405180910390fd5b60008481526001602081905260408220805460ff191681559081018290556002810180546001600160a01b0319169055600381018290556004810191909155600501805468ffffffffffffffffff191690556116be6131a4565b50604080518082018252600181526020810186905290516110049084156108fc029085906000818181858888f19350505050158015611701573d6000803e3d6000fd5b5061200063f7a251d760016117158461269f565b61172a876402540be40063ffffffff61272916565b6040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b83811015611788578181015183820152602001611770565b50505050905090810190601f1680156117b55780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b1580156117d657600080fd5b505af11580156117ea573d6000803e3d6000fd5b5050505083604001516001600160a01b03167f831c0ef4d93bda3bce08b69ae3f29ef1a6e052b833200988554158494405a10788600160405180806020018360ff1663ffffffff168152602001828103825284818151815260200191508051906020019080838360005b8381101561186c578181015183820152602001611854565b50505050905090810190601f1680156118995780820380516001836020036101000a031916815260200191505b50935050505060405180910390a25060019695505050505050565b61100881565b6000806118c6836121e7565b90506118d0613168565b50600081815260016020818152604092839020835160e081018552815460ff90811682529382015492810183905260028201546001600160a01b03169481019490945260038101546060850152600481015460808501526005015491821660a084015261010090910467ffffffffffffffff1660c0830152611996576040805162461bcd60e51b815260206004820152601a602482015279189a5b99081c995c5d595cdd08191bd95cdb89dd08195e1a5cdd60321b604482015290519081900360640190fd5b80604001516001600160a01b0316856001600160a01b0316146119ea5760405162461bcd60e51b815260040180806020018281038252604581526020018061322d6045913960600191505060405180910390fd5b336001600160a01b0316856001600160a01b031663893d20e86040518163ffffffff1660e01b815260040160206040518083038186803b158015611a2d57600080fd5b505afa158015611a41573d6000803e3d6000fd5b505050506040513d6020811015611a5757600080fd5b50516001600160a01b031614611ab4576040805162461bcd60e51b815260206004820152601b60248201527f6f6e6c79206265703265206f776e65722063616e2072656a6563740000000000604482015290519081900360640190fd5b600034905060006110046001600160a01b031663149d14d96040518163ffffffff1660e01b815260040160206040518083038186803b158015611af657600080fd5b505afa158015611b0a573d6000803e3d6000fd5b505050506040513d6020811015611b2057600080fd5b50519050808210801590611b3957506402540be4008206155b611b745760405162461bcd60e51b81526004018080602001828103825260378152602001806131f66037913960400191505060405180910390fd5b60008481526001602081905260408220805460ff191681559081018290556002810180546001600160a01b0319169055600381018290556004810191909155600501805468ffffffffffffffffff19169055611bce6131a4565b50604080518082018252600781526020810186905290516110049084156108fc029085906000818181858888f19350505050158015611c11573d6000803e3d6000fd5b5061200063f7a251d76001611c258461269f565b611c3a876402540be40063ffffffff61272916565b6040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b83811015611c98578181015183820152602001611c80565b50505050905090810190601f168015611cc55780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b158015611ce657600080fd5b505af1158015611cfa573d6000803e3d6000fd5b50505050876001600160a01b03167f831c0ef4d93bda3bce08b69ae3f29ef1a6e052b833200988554158494405a10788600760405180806020018360ff1663ffffffff168152602001828103825284818151815260200191508051906020019080838360005b83811015611d78578181015183820152602001611d60565b50505050905090810190601f168015611da55780820380516001836020036101000a031916815260200191505b50935050505060405180910390a2506001979650505050505050565b600b81565b3361200014611e065760405162461bcd60e51b815260040180806020018281038252602f8152602001806132a0602f913960400191505060405180910390fd5b7f41ce201247b6ceb957dcdb217d0b8acb50b9ea0e12af9af4f5e7f38902101605838383604051808460ff1660ff168152602001806020018281038252848482818152602001925080828437600083820152604051601f909101601f1916909201829003965090945050505050a1505050565b600781565b600981565b61100781565b61100681565b60005460ff1681565b61100281565b600381565b600160208190526000918252604090912080549181015460028201546003830154600484015460059094015460ff9586169593946001600160a01b0390931693919291811690610100900467ffffffffffffffff1687565b61100381565b61100081565b61100481565b6060611f17613168565b6000611f228461276b565b9150915080611f78576040805162461bcd60e51b815260206004820152601f60248201527f756e7265636f676e697a6564207472616e73666572496e207061636b61676500604482015290519081900360640190fd5b815160ff1661202c576020828101805160009081526001928390526040908190208551815460ff1990811660ff928316178355935194820194909455908501516002820180546001600160a01b0319166001600160a01b03909216919091179055606085015160038201556080850151600482015560a08501516005909101805460c08701519316919093161768ffffffffffffffff00191661010067ffffffffffffffff90921691909102179055612183565b815160ff16600114156121365760006110046001600160a01b03166359b9278984602001516040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561208557600080fd5b505afa158015612099573d6000803e3d6000fd5b505050506040513d60208110156120af57600080fd5b505190506001600160a01b038116156121305760208301516040805163b99328c560e01b815260048101929092526001600160a01b0383166024830152516110049163b99328c591604480830192600092919082900301818387803b15801561211757600080fd5b505af115801561212b573d6000803e3d6000fd5b505050505b50612183565b6040805162461bcd60e51b815260206004820152601960248201527f756e7265636f676e697a65642062696e64207061636b61676500000000000000604482015290519081900360640190fd5b60408051600080825260208201909252905b50949350505050565b60006121e083836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506128bd565b9392505050565b6020015190565b6000828201838110156121e0576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600080826001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561228457600080fd5b505afa158015612298573d6000803e3d6000fd5b505050506040513d60208110156122ae57600080fd5b5051604080516395d89b4160e01b815290519192506060916001600160a01b038616916395d89b41916004808301926000929190829003018186803b1580156122f657600080fd5b505afa15801561230a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561233357600080fd5b8101908080516040519392919084600160201b82111561235257600080fd5b90830190602082018581111561236757600080fd5b8251600160201b81118282018810171561238057600080fd5b82525081516020918201929091019080838360005b838110156123ad578181015183820152602001612395565b50505050905090810190601f1680156123da5780820380516001836020036101000a031916815260200191505b5060408181526370a0823160e01b82526110046004830152519495506000946001600160a01b038a1694506370a08231935060248083019350602092829003018186803b15801561242a57600080fd5b505afa15801561243e573d6000803e3d6000fd5b505050506040513d602081101561245457600080fd5b5051608087015160608801519192506000916124759163ffffffff61219e16565b9050428760c0015167ffffffffffffffff16101561249b57506001935061145a92505050565b6124a9838860200151612954565b6124bb57506002935061145a92505050565b808211156124d157506003935061145a92505050565b866060015187604001516001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561251357600080fd5b505afa158015612527573d6000803e3d6000fd5b505050506040513d602081101561253d57600080fd5b50511461255257506004935061145a92505050565b8660a0015160ff16841461256e57506005935061145a92505050565b602080880151604080516359b9278960e01b8152600481019290925251600092611004926359b927899260248083019392829003018186803b1580156125b357600080fd5b505afa1580156125c7573d6000803e3d6000fd5b505050506040513d60208110156125dd57600080fd5b50516001600160a01b031614158061267f57506000801b6110046001600160a01b031663bd46646189604001516040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561265057600080fd5b505afa158015612664573d6000803e3d6000fd5b505050506040513d602081101561267a57600080fd5b505114155b1561269257506006935061145a92505050565b5060009695505050505050565b6040805160028082526060828101909352829190816020015b60608152602001906001900390816126b857505083519091506126e09063ffffffff16612a3c565b816000815181106126ed57fe5b6020026020010181905250612708836020015160001c612a3c565b8160018151811061271557fe5b60200260200101819052506121e081612a4f565b60006121e083836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612ad9565b612773613168565b600061277d613168565b6127856131bb565b61279661279186612b3e565b612b63565b90506000805b6127a583612bad565b156128b057806127ca576127c06127bb84612bce565b612c1c565b60ff1684526128a8565b80600114156127e9576127df6127bb84612bce565b60208501526128a8565b8060021415612816576128036127fe84612bce565b612cd1565b6001600160a01b031660408501526128a8565b80600314156128355761282b6127bb84612bce565b60608501526128a8565b80600414156128545761284a6127bb84612bce565b60808501526128a8565b8060051415612876576128696127bb84612bce565b60ff1660a08501526128a8565b80600614156128a35761288b6127bb84612bce565b67ffffffffffffffff1660c0850152600191506128a8565b6128b0565b60010161279c565b5091935090915050915091565b6000818484111561294c5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156129115781810151838201526020016128f9565b50505050905090810190601f16801561293e5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b815160009083906008108061296a575080516003115b1561297957600091505061145a565b604080516020808252818301909252606091602082018180368337019050509050836020820152808251815181106129ad57fe5b6020910101516001600160f81b031916602d60f81b146129d25760009250505061145a565b600160005b8351811015612a32578281815181106129ec57fe5b602001015160f81c60f81b6001600160f81b031916848281518110612a0d57fe5b01602001516001600160f81b03191614612a2a5760009150612a32565b6001016129d7565b5095945050505050565b606061145a612a4a83612ceb565b612dd1565b6060815160001415612a705750604080516000815260208101909152610bb6565b606082600081518110612a7f57fe5b602002602001015190506000600190505b8351811015612ac057612ab682858381518110612aa957fe5b6020026020010151612e23565b9150600101612a90565b506121e0612ad3825160c060ff16612ea0565b82612e23565b60008183612b285760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156129115781810151838201526020016128f9565b506000838581612b3457fe5b0495945050505050565b612b466131db565b506040805180820190915281518152602082810190820152919050565b612b6b6131bb565b612b7482612f98565b612b7d57600080fd5b6000612b8c8360200151612fd2565b60208085015160408051808201909152868152920190820152915050919050565b6000612bb76131db565b505080518051602091820151919092015191011190565b612bd66131db565b612bdf82612bad565b612be857600080fd5b60208201516000612bf882613035565b80830160209586015260408051808201909152908152938401919091525090919050565b805160009015801590612c3157508151602110155b612c3a57600080fd5b6000612c498360200151612fd2565b90508083600001511015612ca4576040805162461bcd60e51b815260206004820152601a60248201527f6c656e677468206973206c657373207468616e206f6666736574000000000000604482015290519081900360640190fd5b82516020808501518301805192849003929183101561219557506020919091036101000a90049392505050565b8051600090601514612ce257600080fd5b61145a82612c1c565b604080516020808252818301909252606091829190602082018180368337505050602081018490529050600067ffffffffffffffff198416612d2f57506018612d53565b6fffffffffffffffffffffffffffffffff198416612d4f57506010612d53565b5060005b6020811015612d8957818181518110612d6857fe5b01602001516001600160f81b03191615612d8157612d89565b600101612d53565b60008160200390506060816040519080825280601f01601f191660200182016040528015612dbe576020820181803683370190505b5080830196909652508452509192915050565b606081516001148015612e035750607f60f81b82600081518110612df157fe5b01602001516001600160f81b03191611155b15612e0f575080610bb6565b61145a612e218351608060ff16612ea0565b835b6060806040519050835180825260208201818101602087015b81831015612e54578051835260209283019201612e3c565b50855184518101855292509050808201602086015b81831015612e81578051835260209283019201612e69565b508651929092011591909101601f01601f191660405250905092915050565b6060680100000000000000008310612ef0576040805162461bcd60e51b815260206004820152600e60248201526d696e70757420746f6f206c6f6e6760901b604482015290519081900360640190fd5b60408051600180825281830190925260609160208201818036833701905050905060378411612f4a5782840160f81b81600081518110612f2c57fe5b60200101906001600160f81b031916908160001a905350905061145a565b6060612f5585612ceb565b90508381510160370160f81b82600081518110612f6e57fe5b60200101906001600160f81b031916908160001a905350612f8f8282612e23565b95945050505050565b8051600090612fa957506000610bb6565b6020820151805160001a9060c0821015612fc857600092505050610bb6565b5060019392505050565b8051600090811a6080811015612fec576000915050610bb6565b60b8811080613007575060c08110801590613007575060f881105b15613016576001915050610bb6565b60c081101561302a5760b519019050610bb6565b60f519019050610bb6565b80516000908190811a60808110156130505760019150613161565b60b881101561306557607e1981019150613161565b60c08110156130df57600060b78203600186019550806020036101000a8651049150600181018201935050808310156130d9576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b50613161565b60f88110156130f45760be1981019150613161565b600060f78203600186019550806020036101000a86510491506001810182019350508083101561315f576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b505b5092915050565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081019190915290565b604080518082019091526000808252602082015290565b60405180604001604052806131ce6131db565b8152602001600081525090565b60405180604001604052806000815260200160008152509056fe72656c6179466565206d757374206265204e202a203165313020616e642067726561746572207468616e206d696e6952656c6179466565636f6e74616374206164647265737320646f65736e277420657175616c20746f2074686520636f6e7472616374206164647265737320696e2062696e6420726571756573746f6e6c79206265703265206f776e65722063616e20617070726f766520746869732062696e642072657175657374746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e7472616374a2646970667358221220914ada54d09b696ad62036cb65a565d2a3c3d1be8ef0e6805b9a955ec5783d0864736f6c63430006040033", + }, + UpgradeConfig { + contract_addr: "0x0000000000000000000000000000000000002000", + code: "608060405234801561001057600080fd5b50600436106102485760003560e01c8063863fe4ab1161013b578063c81b1662116100b8578063e3b048051161007c578063e3b048051461072c578063f7a251d71461074c578063f9a2bbc7146107c4578063fc3e5908146107cc578063fd6a6879146107d457610248565b8063c81b1662146106dd578063d31f968d146106e5578063d76a867514610714578063dc927faf1461071c578063e1c7392a1461072457610248565b8063a78abc16116100ff578063a78abc16146105d3578063ab51bb96146105db578063ac431751146105e3578063b0355f5b146103ff578063c27cdcfb146106a157610248565b8063863fe4ab146105b35780638cc8f561146104b657806396713da9146105bb5780639dc09262146105c3578063a1a11bf5146105cb57610248565b8063493279b1116101c957806370fd5bad1161018d57806370fd5bad146104b657806374f079b8146104be57806375d47a0a146104c65780637942fd05146104ce57806384013b6a146104d657610248565b8063493279b11461045f5780634bf6c8821461047e57806351e80672146104865780636e47a51a1461048e5780636e47b482146104ae57610248565b8063308325f411610210578063308325f4146102cf5780633bdc47a6146102d75780633dffc387146103ff578063422f90501461040757806343756e5c1461043b57610248565b806305e682581461024d5780630bee7a671461026b57806314b3023b1461028c57806322556cdc146102a65780632ff32aea146102ae575b600080fd5b6102556107dc565b6040805160ff9092168252519081900360200190f35b6102736107e1565b6040805163ffffffff9092168252519081900360200190f35b6102946107e6565b60408051918252519081900360200190f35b6102946107ec565b6102b66107f1565b60408051600792830b90920b8252519081900360200190f35b6102946107fa565b61038a600480360360608110156102ed57600080fd5b60ff82351691602081013591810190606081016040820135600160201b81111561031657600080fd5b82018360208201111561032857600080fd5b803590602001918460018302840111600160201b8311171561034957600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610800945050505050565b6040805160208082528351818301528351919283929083019185019080838360005b838110156103c45781810151838201526020016103ac565b50505050905090810190601f1680156103f15780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610255610876565b6104276004803603602081101561041d57600080fd5b503560ff1661087b565b604080519115158252519081900360200190f35b610443610890565b604080516001600160a01b039092168252519081900360200190f35b610467610896565b6040805161ffff9092168252519081900360200190f35b61025561089b565b6104436108a0565b610443600480360360208110156104a457600080fd5b503560ff166108a6565b6104436108c1565b6102556108c7565b6102946108cc565b6104436108d2565b6102556108d8565b6105b1600480360360a08110156104ec57600080fd5b810190602081018135600160201b81111561050657600080fd5b82018360208201111561051857600080fd5b803590602001918460018302840111600160201b8311171561053957600080fd5b919390929091602081019035600160201b81111561055657600080fd5b82018360208201111561056857600080fd5b803590602001918460018302840111600160201b8311171561058957600080fd5b919350915080356001600160401b03908116916020810135909116906040013560ff166108dd565b005b610294611a8d565b610255611a95565b610443611a9a565b610443611aa0565b610427611aa6565b6102736107dc565b6105b1600480360360408110156105f957600080fd5b810190602081018135600160201b81111561061357600080fd5b82018360208201111561062557600080fd5b803590602001918460018302840111600160201b8311171561064657600080fd5b919390929091602081019035600160201b81111561066357600080fd5b82018360208201111561067557600080fd5b803590602001918460018302840111600160201b8311171561069657600080fd5b509092509050611aaf565b6106c1600480360360208110156106b757600080fd5b503560ff16612051565b604080516001600160401b039092168252519081900360200190f35b61044361206c565b610427600480360360408110156106fb57600080fd5b5080356001600160a01b0316906020013560ff16612072565b61038a612092565b6104436120b1565b6105b16120b7565b6106c16004803603602081101561074257600080fd5b503560ff1661246e565b6105b16004803603606081101561076257600080fd5b60ff8235169190810190604081016020820135600160201b81111561078657600080fd5b82018360208201111561079857600080fd5b803590602001918460018302840111600160201b831117156107b957600080fd5b919350915035612489565b6104436125da565b6102556125e0565b6104436125e5565b600081565b606481565b60015481565b603281565b60045460070b81565b60025481565b60606000825160210190506060816040519080825280601f01601f191660200182016040528015610838576020820181803683370190505b506021810186905260018101879052828152905060418101600061085b866125eb565b50905061086a818388516125f5565b50909695505050505050565b600181565b60096020526000908152604090205460ff1681565b61100181565b606181565b600881565b61200081565b6005602052600090815260409020546001600160a01b031681565b61100581565b600281565b60035481565b61100881565b600b81565b60005460ff16610930576040805162461bcd60e51b81526020600482015260196024820152781d1a194818dbdb9d1c9858dd081b9bdd081a5b9a5d081e595d603a1b604482015290519081900360640190fd5b60408051630a83aaa960e31b815233600482015290516110069163541d5548916024808301926020929190829003018186803b15801561096f57600080fd5b505afa158015610983573d6000803e3d6000fd5b505050506040513d602081101561099957600080fd5b50516109ec576040805162461bcd60e51b815260206004820152601f60248201527f746865206d73672073656e646572206973206e6f7420612072656c6179657200604482015290519081900360640190fd5b60ff8116600090815260086020526040902054829082906001600160401b039081169083168114610a5c576040805162461bcd60e51b815260206004820152601560248201527439b2b8bab2b731b2903737ba1034b71037b93232b960591b604482015290519081900360640190fd5b60ff8216600090815260086020908152604091829020805467ffffffffffffffff1916600185016001600160401b039081169190911790915582516337d7f9c160e21b81529089166004820152915188926110039263df5fe70492602480840193829003018186803b158015610ad157600080fd5b505afa158015610ae5573d6000803e3d6000fd5b505050506040513d6020811015610afb57600080fd5b5051610b385760405162461bcd60e51b8152600401808060200182810382526023815260200180612bcc6023913960400191505060405180910390fd5b60ff851660009081526005602052604090205485906001600160a01b0316610ba7576040805162461bcd60e51b815260206004820152601860248201527f6368616e6e656c206973206e6f7420737570706f727465640000000000000000604482015290519081900360640190fd5b60608c8c8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050905060608b8b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805163cba510a960e01b81526001600160401b038f1660048201529051939450610cce93611003935063cba510a992506024808301926020929190829003018186803b158015610c7757600080fd5b505afa158015610c8b573d6000803e3d6000fd5b505050506040513d6020811015610ca157600080fd5b505160408051808201909152600381526269626360e81b6020820152610cc78c8c612636565b858561267d565b610d16576040805162461bcd60e51b815260206004820152601460248201527334b73b30b634b21036b2b935b63290383937b7b360611b604482015290519081900360640190fd5b60408051631bb5062960e31b81526001600160401b038c16600482015290516000916110039163dda8314891602480820192602092909190829003018186803b158015610d6257600080fd5b505afa158015610d76573d6000803e3d6000fd5b505050506040513d6020811015610d8c57600080fd5b5051905088600080806060610da08861277a565b935093509350935083610e61578460ff168f6001600160401b03167ff7b2e42d694eb1100184aae86d4245d9e46966100b1dc7e723275b98326854ac8a6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610e1a578181015183820152602001610e02565b50505050905090810190601f168015610e475780820380516001836020036101000a031916815260200191505b509250505060405180910390a35050505050505050611a7f565b8460ff168f6001600160401b03167f36afdaf439a8f43fe72135135d804ae620b37a474f0943b5b85f6788312cad4085604051808260ff1660ff16815260200191505060405180910390a360ff83166113ea5760ff85166000818152600560209081526040808320548151631182b87560e01b815260048101958652602481019283528651604482015286516001600160a01b03909216958695631182b875958d958a9593949093606490910192918601918190849084905b83811015610f32578181015183820152602001610f1a565b50505050905090810190601f168015610f5f5780820380516001836020036101000a031916815260200191505b509350505050600060405180830381600087803b158015610f7f57600080fd5b505af192505050801561106357506040513d6000823e601f3d908101601f191682016040526020811015610fb257600080fd5b8101908080516040519392919084600160201b821115610fd157600080fd5b908301906020820185811115610fe657600080fd5b8251600160201b811182820188101715610fff57600080fd5b82525081516020918201929091019080838360005b8381101561102c578181015183820152602001611014565b50505050905090810190601f1680156110595780820380516001836020036101000a031916815260200191505b5060405250505060015b611375576040516000815260443d101561107f5750600061111a565b60046000803e60005160e01c6308c379a081146110a057600091505061111a565b60043d036004833e81513d60248201116001600160401b03821117156110cb5760009250505061111a565b80830180516001600160401b038111156110ec57600094505050505061111a565b8060208301013d860181111561110a5760009550505050505061111a565b601f01601f191660405250925050505b806111255750611237565b60ff871660009081526007602052604081205461115c916001600160401b039091169089906111579060029088610800565b61282a565b60ff8716600090815260076020908152604080832080546001600160401b038082166001011667ffffffffffffffff19909116179055805182815284518184015284516001600160a01b038716947ff91a8f63e5b3e0e89e5f93e1915a7805f3c52d9a73b3c09769785c2c7bf87acf948794849390840192918601918190849084905b838110156111f75781810151838201526020016111df565b50505050905090810190601f1680156112245780820380516001836020036101000a031916815260200191505b509250505060405180910390a250611370565b3d808015611261576040519150601f19603f3d011682016040523d82523d6000602084013e611266565b606091505b5060ff8716600090815260076020526040812054611299916001600160401b039091169089906111579060029088610800565b60ff8716600090815260076020908152604080832080546001600160401b038082166001011667ffffffffffffffff19909116179055805182815284518184015284516001600160a01b038716947f63ac299d6332d1cc4e61b81e59bc00c0ac7c798addadf33840f1307cd2977351948794849390840192918601918190849084905b8381101561133457818101518382015260200161131c565b50505050905090810190601f1680156113615780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505b6113e4565b8051156113e25760ff87166000908152600760205260408120546113ae916001600160401b039091169089906111579060019086610800565b60ff8716600090815260076020526040902080546001600160401b038082166001011667ffffffffffffffff199091161790555b505b506119b8565b60ff83166001141561168e5760ff8516600081815260056020908152604080832054815163831d65d160e01b815260048101958652602481019283528651604482015286516001600160a01b0390921695869563831d65d1958d958a9593949093606490910192918601918190849084905b8381101561147457818101518382015260200161145c565b50505050905090810190601f1680156114a15780820380516001836020036101000a031916815260200191505b509350505050600060405180830381600087803b1580156114c157600080fd5b505af19250505080156114d2575060015b6113e4576040516000815260443d10156114ee57506000611589565b60046000803e60005160e01c6308c379a0811461150f576000915050611589565b60043d036004833e81513d60248201116001600160401b038211171561153a57600092505050611589565b80830180516001600160401b0381111561155b576000945050505050611589565b8060208301013d860181111561157957600095505050505050611589565b601f01601f191660405250925050505b8061159457506115f9565b60408051602080825283518183015283516001600160a01b038616937ff91a8f63e5b3e0e89e5f93e1915a7805f3c52d9a73b3c09769785c2c7bf87acf93869390928392830191850190808383600083156111f75781810151838201526020016111df565b3d808015611623576040519150601f19603f3d011682016040523d82523d6000602084013e611628565b606091505b5060408051602080825283518183015283516001600160a01b038616937f63ac299d6332d1cc4e61b81e59bc00c0ac7c798addadf33840f1307cd2977351938693909283928301918501908083836000831561133457818101518382015260200161131c565b60ff8316600214156119b85760ff8516600081815260056020908152604080832054815163c8509d8160e01b815260048101958652602481019283528651604482015286516001600160a01b0390921695869563c8509d81958d958a9593949093606490910192918601918190849084905b83811015611718578181015183820152602001611700565b50505050905090810190601f1680156117455780820380516001836020036101000a031916815260200191505b509350505050600060405180830381600087803b15801561176557600080fd5b505af1925050508015611776575060015b6119b6576040516000815260443d10156117925750600061182d565b60046000803e60005160e01c6308c379a081146117b357600091505061182d565b60043d036004833e81513d60248201116001600160401b03821117156117de5760009250505061182d565b80830180516001600160401b038111156117ff57600094505050505061182d565b8060208301013d860181111561181d5760009550505050505061182d565b601f01601f191660405250925050505b8061183857506118e1565b816001600160a01b03167ff91a8f63e5b3e0e89e5f93e1915a7805f3c52d9a73b3c09769785c2c7bf87acf826040518080602001828103825283818151815260200191508051906020019080838360005b838110156118a1578181015183820152602001611889565b50505050905090810190601f1680156118ce5780820380516001836020036101000a031916815260200191505b509250505060405180910390a2506119b6565b3d80801561190b576040519150601f19603f3d011682016040523d82523d6000602084013e611910565b606091505b50816001600160a01b03167f63ac299d6332d1cc4e61b81e59bc00c0ac7c798addadf33840f1307cd2977351826040518080602001828103825283818151815260200191508051906020019080838360005b8381101561197a578181015183820152602001611962565b50505050905090810190601f1680156119a75780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505b505b60ff80861660009081526009602052604090205461100591636f93d2e69189913391879116806119ea575060ff881615155b604080516001600160e01b031960e088901b1681526001600160a01b039586166004820152939094166024840152604483019190915215156064820152905160848083019260209291908290030181600087803b158015611a4a57600080fd5b505af1158015611a5e573d6000803e3d6000fd5b505050506040513d6020811015611a7457600080fd5b505050505050505050505b505050505050505050505050565b630100610081565b600981565b61100781565b61100681565b60005460ff1681565b3361100714611aef5760405162461bcd60e51b815260040180806020018281038252602e815260200180612b22602e913960400191505060405180910390fd5b611b5884848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080518082019091526012815271626174636853697a65466f724f7261636c6560701b602082015291506129809050565b15611bf357604080516020601f8401819004810282018101909252828152600091611b9b91858580838501838280828437600092019190915250612a6792505050565b90506127108111158015611bb05750600a8110155b611beb5760405162461bcd60e51b8152600401808060200182810382526032815260200180612b9a6032913960400191505060405180910390fd5b600155611fbf565b611c5c84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601281527118591913dc955c19185d1950da185b9b995b60721b602082015291506129809050565b15611de457606082828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505082519293505060169091149050611cdf5760405162461bcd60e51b815260040180806020018281038252605a815260200180612ac8605a913960600191505060405180910390fd5b60018101516002820151601683015160ff82161590611cfd81612a6c565b611d4e576040805162461bcd60e51b815260206004820152601960248201527f61646472657373206973206e6f74206120636f6e747261637400000000000000604482015290519081900360640190fd5b60ff8416600081815260056020908152604080832080546001600160a01b0319166001600160a01b038716908117909155808452600683528184208585528352818420805460ff199081166001179091556009909352818420805490931687151517909255519092917f7e3b6af43092577ee20e60eaa1d9b114a7031305c895ee7dd3ffe17196d2e1e091a35050505050611fbf565b611e5184848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080518082019091526016815275195b98589b1953dc911a5cd8589b1950da185b9b995b60521b602082015291506129809050565b15611f8257606082828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505082519293505060029091149050611ed45760405162461bcd60e51b815260040180806020018281038252604a815260200180612b50604a913960600191505060405180910390fd5b600181810151600283015160ff80831660009081526005602052604090205492939192908316909114906001600160a01b03168015611f78576001600160a01b038116600090815260066020908152604080832060ff881680855290835292819020805460ff1916861515908117909155815190815290517fa3132e3f9819fbddc7f0ed6d38d7feef59aa95112090b7c592f5cb5bc4aa4adc929181900390910190a25b5050505050611fbf565b6040805162461bcd60e51b815260206004820152600d60248201526c756e6b6e6f776e20706172616d60981b604482015290519081900360640190fd5b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a848484846040518080602001806020018381038352878782818152602001925080828437600083820152601f01601f191690910184810383528581526020019050858580828437600083820152604051601f909101601f19169092018290039850909650505050505050a150505050565b6008602052600090815260409020546001600160401b031681565b61100281565b600660209081526000928352604080842090915290825290205460ff1681565b6040518060400160405280600381526020016269626360e81b81525081565b61100381565b60005460ff161561210f576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b7f1471eb6eb2c5e789fc3de43f8ce62938c7d1836ec861730447e2ada8fd81017b80546001600160a01b0319908116611008179091557f92e85d02570a8092d09a6e3a57665bc3815a2699a4074001bf1ccabf660f5a36805460ff199081169091557fd8af288fc1c8680b4f4706064cf021e264efb6828fcaf7eb5ca36818eb365bcc8054821660019081179091557f89832631fb3c3307a103ba2c84ab569c64d6182a18893dcd163f0f1c2090733a805484166110049081179091557f6cde3cea4b3a3fb2488b2808bae7556f4a405e50f65e1794383bc026131b13c38054841690557f72e4efa1513b071517c6c74dba31b5934a81aa83cddd400e7081df5529c9943680548416831790557fa9bc9a3a348c357ba16b37005d7e6b3236198c0e939f4af8c5f19b8deeb8ebc08054851690911790557fc575c31fea594a6eb97c8e9d3f9caee4c16218c6ef37e923234c0fe9014a61e78054831690557f4e523af77f034e9810f1c94057f5e931fb3d16a51511a4c3add793617d18610580548316821790557ffb33122aa9f93cc639ebe80a7bc4784c11e6053dde89c6f4f7e268c6a623da1e805484166110001790557fc7694af312c4f286114180fd0ba6a52461fcee8a381636770b19a343af92538a80548316821790557f01112dd68e482ba8d68a7e828cff8b3abcea08eab88941953c180a7e650e9cd480548316821790557fc0a4a8be475dfebc377ebef2d7c4ff47656f572a08dd92b81017efcdba0febe1805484166110071790557f87e8a52529e8ece4ef759037313542a6429ff494a9fab9027fb79db90124eba680548316821790557f4c7666bbcb22d46469f7cc282f70764a7012dca2cce630ff8d83db9a9cdd48f080548316821790557f40f28f99a40bc9f6beea1013afdbc3cdcc689eb76b82c4de06c0acf1e1932ed58054909316611001179092557f0d9cf2cd531699eed8dd34e40ff2884a14a698c4898184fba85194e6f6772d248054821683179055600b60009081527f23f68c9bd22b8a93d06adabe17481c87c016bcbd20adc8bfd707a4d813a572176020527fdf0d5d05428057f5455c2dc8e810dd86d1e9350faa72f16bda8a45443c5b39328054831684179055603283556004805467ffffffffffffffff19166001600160401b031790556002819055600381905580549091169091179055565b6007602052600090815260409020546001600160401b031681565b60005460ff166124dc576040805162461bcd60e51b81526020600482015260196024820152781d1a194818dbdb9d1c9858dd081b9bdd081a5b9a5d081e595d603a1b604482015290519081900360640190fd5b33600090815260066020908152604080832060ff80891685529252909120548591166125395760405162461bcd60e51b8152600401808060200182810382526031815260200180612a976031913960400191505060405180910390fd5b60ff85166000908152600760209081526040808320548151601f88018490048402810184019092528682526001600160401b03169261259e9284928a9261115792909189918c908c908190840183828082843760009201919091525061080092505050565b60ff959095166000908152600760205260409020805467ffffffffffffffff191660019096016001600160401b03169590951790945550505050565b61100081565b600381565b61100481565b8051602090910191565b5b60208110612615578251825260209283019290910190601f19016125f6565b915181516020939093036101000a6000190180199091169216919091179052565b60408051600e808252818301909252606091630100610060ff851617918391602082018180368337505050600e818101969096526006810192909252509283525090919050565b60008561268c57506000612771565b606082518451865160800101016040519080825280601f01601f1916602001820160405280156126c3576020820181803683370190505b50905060006126d182612a72565b6020808901518252019050866000806126e9896125eb565b80865260209095019490925090506127028285836125f5565b9283019261270f886125eb565b80865260209095019490925090506127288285836125f5565b9283018a81526020019261273b876125eb565b909250905061274b8285836125f5565b508351602001612759612a78565b60208183886065600019fa5051600114955050505050505b95945050505050565b600080600060606021855110156127aa575050604080516000808252602082019092529092508291508190612823565b600185015160218601518651604080516020198301808252601f19600119909401939093168101602001909152604189019392916060919080156127f5576020820181803683370190505b5090506000612803826125eb565b509050612815858260218d51036125f5565b506001975091955093509150505b9193509193565b600254431115612869576004805467ffffffffffffffff1981166001600160401b036001600793840b810190930b1617909155600355436002556128aa565b600380546001908101918290555410156128aa576004805467ffffffffffffffff1981166001600160401b036001600793840b810190930b16179091556003555b8160ff16836001600160401b0316600460009054906101000a900460070b6001600160401b03167f3a6e0fc61675aa2a100bcba0568368bb92bcec91c97673391074f11138f0cffe606185604051808361ffff1661ffff16815260200180602001828103825283818151815260200191508051906020019080838360005b83811015612940578181015183820152602001612928565b50505050905090810190601f16801561296d5780820380516001836020036101000a031916815260200191505b50935050505060405180910390a4505050565b6000816040516020018082805190602001908083835b602083106129b55780518252601f199092019160209182019101612996565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120836040516020018082805190602001908083835b60208310612a235780518252601f199092019160209182019101612a04565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040528051906020012014905092915050565b015190565b3b151590565b60200190565b6040518060200160405280600190602082028036833750919291505056fe74686520636f6e747261637420616e64206368616e6e656c2068617665206e6f74206265656e20726567697374657265646c656e677468206f662076616c756520666f72206164644f725570646174654368616e6e656c2073686f756c642062652032322c206368616e6e656c49643a697346726f6d53797374656d3a68616e646c657241646472657373746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e74726163746c656e677468206f662076616c756520666f7220656e61626c654f7244697361626c654368616e6e656c2073686f756c6420626520322c206368616e6e656c49643a6973456e61626c65746865206e6577426174636853697a65466f724f7261636c652073686f756c6420626520696e205b31302c2031303030305d6c6967687420636c69656e74206e6f742073796e632074686520626c6f636b20796574a26469706673582212207ab71aabd28c992023fb9ff6fe581825d14cb96a7bc39321484311e85804154864736f6c63430006040033", + }, + ], + )] + .iter() + .cloned() + .collect(); + + + pub static ref MIRRORSYNC_UPGRADE_CONFIG: HashMap> = [( + 56, + vec![ + UpgradeConfig { + contract_addr: "0000000000000000000000000000000000001008", + code: "6080604052600436106103815760003560e01c80637d078e13116101d1578063b795031711610102578063d9e6dae9116100a0578063fa9e91591161006f578063fa9e915914610d38578063fc3e5908146105b2578063fd6a687914610d4d578063fe3a2af514610d6257610381565b8063d9e6dae9146106fc578063dc927faf14610cf9578063e605bca014610d0e578063f9a2bbc714610d2357610381565b8063c8509d81116100dc578063c8509d8114610bdf578063c8e704a4146105b2578063d117a11014610c64578063d7109ce614610ce457610381565b8063b79503171461073b578063bd32d3f9146104d9578063c81b166214610bca57610381565b80639a854bbd1161016f578063a78abc1611610149578063a78abc1614610ad5578063ab51bb9614610aea578063ab67a4851461073b578063ac43175114610aff57610381565b80639a854bbd14610a965780639dc0926214610aab578063a1a11bf514610ac057610381565b8063859180fb116101ab578063859180fb146106e757806394553a4e14610a3757806395b9ad2614610a6c57806396713da914610a8157610381565b80637d078e13146104ee5780637ec816dd1461099b578063831d65d1146109b057610381565b8063493279b1116102b657806366dea52a1161025457806372c4e0861161022357806372c4e0861461081957806375d47a0a146108bd57806377d9dae8146108d25780637942fd051461098657610381565b806366dea52a1461073b5780636b3f1307146107505780636e47b4821461080457806370fd5bad1461073b57610381565b806351e806721161029057806351e80672146107115780635d499b1b146107265780635f558f861461073b57806361368475146106fc57610381565b8063493279b1146106bb5780634bc81c00146106e75780634bf6c882146106fc57610381565b80632e02d77611610323578063401809f9116102fd578063401809f9146105b257806343756e5c146105c7578063445fcefe146105f8578063487c88ac146104ee57610381565b80632e02d7761461054c57806337e6ecda1461057f5780633dffc387146104ee57610381565b80631f91600b1161035f5780631f91600b146104d957806323996b53146104ee57806325c751b7146105035780632d89ac32146104ee57610381565b80630bee7a67146103865780630f212b1b146103b45780631182b875146103df575b600080fd5b34801561039257600080fd5b5061039b610d77565b6040805163ffffffff9092168252519081900360200190f35b3480156103c057600080fd5b506103c9610d7c565b6040805160ff9092168252519081900360200190f35b3480156103eb57600080fd5b506104646004803603604081101561040257600080fd5b60ff8235169190810190604081016020820135600160201b81111561042657600080fd5b82018360208201111561043857600080fd5b803590602001918460018302840111600160201b8311171561045957600080fd5b509092509050610d81565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561049e578181015183820152602001610486565b50505050905090810190601f1680156104cb5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156104e557600080fd5b506103c9610e9b565b3480156104fa57600080fd5b506103c9610ea0565b6105386004803603604081101561051957600080fd5b5080356001600160a01b031690602001356001600160401b0316610ea5565b604080519115158252519081900360200190f35b34801561055857600080fd5b506105386004803603602081101561056f57600080fd5b50356001600160a01b03166113f1565b34801561058b57600080fd5b50610538600480360360208110156105a257600080fd5b50356001600160a01b0316611406565b3480156105be57600080fd5b506103c961141b565b3480156105d357600080fd5b506105dc611420565b604080516001600160a01b039092168252519081900360200190f35b34801561060457600080fd5b506106a96004803603602081101561061b57600080fd5b810190602081018135600160201b81111561063557600080fd5b82018360208201111561064757600080fd5b803590602001918460018302840111600160201b8311171561066857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611426945050505050565b60408051918252519081900360200190f35b3480156106c757600080fd5b506106d0611584565b6040805161ffff9092168252519081900360200190f35b3480156106f357600080fd5b506103c9611589565b34801561070857600080fd5b506103c961158e565b34801561071d57600080fd5b506105dc611593565b34801561073257600080fd5b506106a9611599565b34801561074757600080fd5b506103c96115a2565b6105386004803603604081101561076657600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561079057600080fd5b8201836020820111156107a257600080fd5b803590602001918460018302840111600160201b831117156107c357600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506115a7945050505050565b34801561081057600080fd5b506105dc611e7d565b6105386004803603602081101561082f57600080fd5b810190602081018135600160201b81111561084957600080fd5b82018360208201111561085b57600080fd5b803590602001918460018302840111600160201b8311171561087c57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611e83945050505050565b3480156108c957600080fd5b506105dc6122cf565b610538600480360360408110156108e857600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561091257600080fd5b82018360208201111561092457600080fd5b803590602001918460018302840111600160201b8311171561094557600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506122d5945050505050565b34801561099257600080fd5b506103c96127db565b3480156109a757600080fd5b506106a96127e0565b3480156109bc57600080fd5b50610a35600480360360408110156109d357600080fd5b60ff8235169190810190604081016020820135600160201b8111156109f757600080fd5b820183602082011115610a0957600080fd5b803590602001918460018302840111600160201b83111715610a2a57600080fd5b5090925090506127e6565b005b61053860048036036040811015610a4d57600080fd5b5080356001600160a01b031690602001356001600160401b0316612935565b348015610a7857600080fd5b506103c961332c565b348015610a8d57600080fd5b506103c9613331565b348015610aa257600080fd5b506106a9613336565b348015610ab757600080fd5b506105dc613342565b348015610acc57600080fd5b506105dc613348565b348015610ae157600080fd5b5061053861334e565b348015610af657600080fd5b5061039b613357565b348015610b0b57600080fd5b50610a3560048036036040811015610b2257600080fd5b810190602081018135600160201b811115610b3c57600080fd5b820183602082011115610b4e57600080fd5b803590602001918460018302840111600160201b83111715610b6f57600080fd5b919390929091602081019035600160201b811115610b8c57600080fd5b820183602082011115610b9e57600080fd5b803590602001918460018302840111600160201b83111715610bbf57600080fd5b50909250905061335c565b348015610bd657600080fd5b506105dc613631565b348015610beb57600080fd5b50610a3560048036036040811015610c0257600080fd5b60ff8235169190810190604081016020820135600160201b811115610c2657600080fd5b820183602082011115610c3857600080fd5b803590602001918460018302840111600160201b83111715610c5957600080fd5b509092509050613637565b348015610c7057600080fd5b50610c8e60048036036020811015610c8757600080fd5b503561370d565b6040805160ff988916815260208101979097526001600160a01b03909516868601526060860193909352608085019190915290931660a08301526001600160401b0390921660c082015290519081900360e00190f35b348015610cf057600080fd5b506106a9613764565b348015610d0557600080fd5b506105dc613769565b348015610d1a57600080fd5b506106a961376f565b348015610d2f57600080fd5b506105dc613775565b348015610d4457600080fd5b506106a961377b565b348015610d5957600080fd5b506105dc613781565b348015610d6e57600080fd5b506103c9613357565b606481565b600681565b60603361200014610dc35760405162461bcd60e51b815260040180806020018281038252602f815260200180615b89602f913960400191505060405180910390fd5b60ff841660011415610e1557610e0e83838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061378792505050565b9050610e94565b7f41ce201247b6ceb957dcdb217d0b8acb50b9ea0e12af9af4f5e7f38902101605848484604051808460ff1660ff168152602001806020018281038252848482818152602001925080828437600083820152604051601f909101601f1916909201829003965090945050505050a1506040805160008152602081019091525b9392505050565b600481565b600181565b6040805163bd46646160e01b81526001600160a01b0384166004820152905160009182916110049163bd466461916024808301926020929190829003018186803b158015610ef257600080fd5b505afa158015610f06573d6000803e3d6000fd5b505050506040513d6020811015610f1c57600080fd5b5051905080610f5e576040805162461bcd60e51b81526020600482015260096024820152681b9bdd08189bdd5b9960ba1b604482015290519081900360640190fd5b6001600160a01b03841660009081526003602052604090205460ff16610fc1576040805162461bcd60e51b81526020600482015260136024820152723737ba103137bab73210313c9036b4b93937b960691b604482015290519081900360640190fd5b60006110046001600160a01b031663149d14d96040518163ffffffff1660e01b815260040160206040518083038186803b158015610ffe57600080fd5b505afa158015611012573d6000803e3d6000fd5b505050506040513d602081101561102857600080fd5b505190506402540be4003406158015611053575060055461104f908263ffffffff613a1716565b3410155b61108e5760405162461bcd60e51b8152600401808060200182810382526046815260200180615b156046913960600191505060405180910390fd5b42607801846001600160401b0316101580156110b85750426201518001846001600160401b031611155b6110f35760405162461bcd60e51b8152600401808060200182810382526038815260200180615a126038913960400191505060405180910390fd5b6000856001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561112e57600080fd5b505afa158015611142573d6000803e3d6000fd5b505050506040513d602081101561115857600080fd5b50516040805163313ce56760e01b815290519192506000916001600160a01b0389169163313ce567916004808301926020929190829003018186803b1580156111a057600080fd5b505afa1580156111b4573d6000803e3d6000fd5b505050506040513d60208110156111ca57600080fd5b50519050677ce66c50e28400006111e48360ff8416613a71565b1115611230576040805162461bcd60e51b8152602060048201526016602482015275746f6f206c6172676520746f74616c20737570706c7960501b604482015290519081900360640190fd5b600554611004906108fc9061124c90349063ffffffff613b0016565b6040518115909202916000818181858888f19350505050158015611274573d6000803e3d6000fd5b5061127d615869565b6040518060c00160405280336001600160a01b03168152602001896001600160a01b031681526020018681526020018481526020016112cc6402540be400600554613b4290919063ffffffff16565b81526001600160401b038916602090910152905061200063f7a251d760056112f384613b84565b61131d6402540be40061131160055434613b0090919063ffffffff16565b9063ffffffff613b4216565b6040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b8381101561137b578181015183820152602001611363565b50505050905090810190601f1680156113a85780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b1580156113c957600080fd5b505af11580156113dd573d6000803e3d6000fd5b505050506001955050505050505b92915050565b60036020526000908152604090205460ff1681565b60026020526000908152604090205460ff1681565b600381565b61100181565b602081015160009061143661589e565b50600081815260016020818152604092839020835160e081018552815460ff9081168252938201549281019290925260028101546001600160a01b031693820184905260038101546060830152600481015460808301526005015491821660a08201526101009091046001600160401b031660c0820152906114bd5760009250505061157f565b600081604001516001600160a01b03166370a082316110046040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561151b57600080fd5b505afa15801561152f573d6000803e3d6000fd5b505050506040513d602081101561154557600080fd5b5051608083015160608401519192506000916115669163ffffffff613b0016565b9050611578818363ffffffff613b0016565b9450505050505b919050565b603881565b600581565b600881565b61200081565b6402540be40081565b600281565b6001600160a01b03821660009081526002602052604081205460ff16156115ff5760405162461bcd60e51b815260040180806020018281038252602b815260200180615bb8602b913960400191505060405180910390fd5b600061160a83613cb9565b905061161461589e565b50600081815260016020818152604092839020835160e081018552815460ff90811682529382015492810183905260028201546001600160a01b03169481019490945260038101546060850152600481015460808501526005015491821660a08401526101009091046001600160401b031660c08301526116d9576040805162461bcd60e51b815260206004820152601a602482015279189a5b99081c995c5d595cdd08191bd95cdb89dd08195e1a5cdd60321b604482015290519081900360640190fd5b60006116f682608001518360600151613b0090919063ffffffff16565b905081604001516001600160a01b0316866001600160a01b03161461174c5760405162461bcd60e51b8152600401808060200182810382526045815260200180615a816045913960600191505060405180910390fd5b336001600160a01b0316866001600160a01b031663893d20e86040518163ffffffff1660e01b815260040160206040518083038186803b15801561178f57600080fd5b505afa1580156117a3573d6000803e3d6000fd5b505050506040513d60208110156117b957600080fd5b50516001600160a01b0316146118005760405162461bcd60e51b815260040180806020018281038252602e8152602001806159e4602e913960400191505060405180910390fd5b604080516370a0823160e01b8152611004600482015290516000916001600160a01b038916916370a0823191602480820192602092909190829003018186803b15801561184c57600080fd5b505afa158015611860573d6000803e3d6000fd5b505050506040513d602081101561187657600080fd5b505160408051636eb1769f60e11b8152336004820152306024820152905191925083916119079184916001600160a01b038c169163dd62ed3e916044808301926020929190829003018186803b1580156118cf57600080fd5b505afa1580156118e3573d6000803e3d6000fd5b505050506040513d60208110156118f957600080fd5b50519063ffffffff613a1716565b101561195a576040805162461bcd60e51b815260206004820152601760248201527f616c6c6f77616e6365206973206e6f7420656e6f756768000000000000000000604482015290519081900360640190fd5b600034905060006110046001600160a01b031663149d14d96040518163ffffffff1660e01b815260040160206040518083038186803b15801561199c57600080fd5b505afa1580156119b0573d6000803e3d6000fd5b505050506040513d60208110156119c657600080fd5b505190508082108015906119df57506402540be4008206155b611a1a5760405162461bcd60e51b8152600401808060200182810382526037815260200180615a4a6037913960400191505060405180910390fd5b6000611a26868b613cc0565b905063ffffffff8116611c25576001600160a01b038a166323b872dd33611004611a56898963ffffffff613b0016565b6040518463ffffffff1660e01b815260040180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b031681526020018281526020019350505050602060405180830381600087803b158015611abe57600080fd5b505af1158015611ad2573d6000803e3d6000fd5b505050506040513d6020811015611ae857600080fd5b5050602086015160408088015160a089015182516323bfccdb60e21b815260048101949094526001600160a01b03909116602484015260ff1660448301525161100491638eff336c91606480830192600092919082900301818387803b158015611b5157600080fd5b505af1158015611b65573d6000803e3d6000fd5b50505050896001600160a01b03167f78e7dd9aefcdbf795c4936a66f7dc6d41bb56637b54f561a6bf7829dca3348a88a8860600151886040518080602001848152602001838152602001828103825285818151815260200191508051906020019080838360005b83811015611be4578181015183820152602001611bcc565b50505050905090810190601f168015611c115780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a2611cdd565b896001600160a01b03167f831c0ef4d93bda3bce08b69ae3f29ef1a6e052b833200988554158494405a1078a8360405180806020018363ffffffff1663ffffffff168152602001828103825284818151815260200191508051906020019080838360005b83811015611ca1578181015183820152602001611c89565b50505050905090810190601f168015611cce5780820380516001836020036101000a031916815260200191505b50935050505060405180910390a25b60008781526001602081905260408220805460ff191681559081018290556002810180546001600160a01b0319169055600381018290556004810191909155600501805468ffffffffffffffffff19169055611d376158da565b5060408051808201825263ffffffff831681526020810189905290516110049085156108fc029086906000818181858888f19350505050158015611d7f573d6000803e3d6000fd5b5061200063f7a251d76001611d938461411a565b611da8886402540be40063ffffffff613b4216565b6040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b83811015611e06578181015183820152602001611dee565b50505050905090810190601f168015611e335780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b158015611e5457600080fd5b505af1158015611e68573d6000803e3d6000fd5b5060019e9d5050505050505050505050505050565b61100581565b600080611e8f83613cb9565b9050611e9961589e565b50600081815260016020818152604092839020835160e081018552815460ff90811682529382015492810183905260028201546001600160a01b03169481019490945260038101546060850152600481015460808501526005015491821660a08401526101009091046001600160401b031660c0830152611f5e576040805162461bcd60e51b815260206004820152601a602482015279189a5b99081c995c5d595cdd08191bd95cdb89dd08195e1a5cdd60321b604482015290519081900360640190fd5b428160c001516001600160401b031610611fbf576040805162461bcd60e51b815260206004820152601b60248201527f62696e642072657175657374206973206e6f7420657870697265640000000000604482015290519081900360640190fd5b600034905060006110046001600160a01b031663149d14d96040518163ffffffff1660e01b815260040160206040518083038186803b15801561200157600080fd5b505afa158015612015573d6000803e3d6000fd5b505050506040513d602081101561202b57600080fd5b5051905080821080159061204457506402540be4008206155b61207f5760405162461bcd60e51b8152600401808060200182810382526037815260200180615a4a6037913960400191505060405180910390fd5b60008481526001602081905260408220805460ff191681559081018290556002810180546001600160a01b0319169055600381018290556004810191909155600501805468ffffffffffffffffff191690556120d96158da565b50604080518082018252600181526020810186905290516110049084156108fc029085906000818181858888f1935050505015801561211c573d6000803e3d6000fd5b5061200063f7a251d760016121308461411a565b612145876402540be40063ffffffff613b4216565b6040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b838110156121a357818101518382015260200161218b565b50505050905090810190601f1680156121d05780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b1580156121f157600080fd5b505af1158015612205573d6000803e3d6000fd5b5050505083604001516001600160a01b03167f831c0ef4d93bda3bce08b69ae3f29ef1a6e052b833200988554158494405a10788600160405180806020018360ff1663ffffffff168152602001828103825284818151815260200191508051906020019080838360005b8381101561228757818101518382015260200161226f565b50505050905090810190601f1680156122b45780820380516001836020036101000a031916815260200191505b50935050505060405180910390a25060019695505050505050565b61100881565b6000806122e183613cb9565b90506122eb61589e565b50600081815260016020818152604092839020835160e081018552815460ff90811682529382015492810183905260028201546001600160a01b03169481019490945260038101546060850152600481015460808501526005015491821660a08401526101009091046001600160401b031660c08301526123b0576040805162461bcd60e51b815260206004820152601a602482015279189a5b99081c995c5d595cdd08191bd95cdb89dd08195e1a5cdd60321b604482015290519081900360640190fd5b80604001516001600160a01b0316856001600160a01b0316146124045760405162461bcd60e51b8152600401808060200182810382526045815260200180615a816045913960600191505060405180910390fd5b336001600160a01b0316856001600160a01b031663893d20e86040518163ffffffff1660e01b815260040160206040518083038186803b15801561244757600080fd5b505afa15801561245b573d6000803e3d6000fd5b505050506040513d602081101561247157600080fd5b50516001600160a01b0316146124ce576040805162461bcd60e51b815260206004820152601b60248201527f6f6e6c79206265703230206f776e65722063616e2072656a6563740000000000604482015290519081900360640190fd5b600034905060006110046001600160a01b031663149d14d96040518163ffffffff1660e01b815260040160206040518083038186803b15801561251057600080fd5b505afa158015612524573d6000803e3d6000fd5b505050506040513d602081101561253a57600080fd5b5051905080821080159061255357506402540be4008206155b61258e5760405162461bcd60e51b8152600401808060200182810382526037815260200180615a4a6037913960400191505060405180910390fd5b60008481526001602081905260408220805460ff191681559081018290556002810180546001600160a01b0319169055600381018290556004810191909155600501805468ffffffffffffffffff191690556125e86158da565b50604080518082018252600781526020810186905290516110049084156108fc029085906000818181858888f1935050505015801561262b573d6000803e3d6000fd5b5061200063f7a251d7600161263f8461411a565b612654876402540be40063ffffffff613b4216565b6040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b838110156126b257818101518382015260200161269a565b50505050905090810190601f1680156126df5780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b15801561270057600080fd5b505af1158015612714573d6000803e3d6000fd5b50505050876001600160a01b03167f831c0ef4d93bda3bce08b69ae3f29ef1a6e052b833200988554158494405a10788600760405180806020018360ff1663ffffffff168152602001828103825284818151815260200191508051906020019080838360005b8381101561279257818101518382015260200161277a565b50505050905090810190601f1680156127bf5780820380516001836020036101000a031916815260200191505b50935050505060405180910390a2506001979650505050505050565b600b81565b60045481565b33612000146128265760405162461bcd60e51b815260040180806020018281038252602f815260200180615b89602f913960400191505060405180910390fd5b60ff8316600414156128765761287182828080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061419092505050565b612930565b60ff8316600514156128c15761287182828080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061443d92505050565b7f41ce201247b6ceb957dcdb217d0b8acb50b9ea0e12af9af4f5e7f38902101605838383604051808460ff1660ff168152602001806020018281038252848482818152602001925080828437600083820152604051601f909101601f1916909201829003965090945050505050a15b505050565b6040805163bd46646160e01b81526001600160a01b0384166004820152905160009182916110049163bd466461916024808301926020929190829003018186803b15801561298257600080fd5b505afa158015612996573d6000803e3d6000fd5b505050506040513d60208110156129ac57600080fd5b5051146129f0576040805162461bcd60e51b815260206004820152600d60248201526c185b1c9958591e48189bdd5b99609a1b604482015290519081900360640190fd5b6001600160a01b03831660009081526002602052604090205460ff1615612a4f576040805162461bcd60e51b815260206004820152600e60248201526d6d6972726f722070656e64696e6760901b604482015290519081900360640190fd5b60006110046001600160a01b031663149d14d96040518163ffffffff1660e01b815260040160206040518083038186803b158015612a8c57600080fd5b505afa158015612aa0573d6000803e3d6000fd5b505050506040513d6020811015612ab657600080fd5b505190506402540be4003406158015612ae15750600454612add908263ffffffff613a1716565b3410155b612b1c5760405162461bcd60e51b815260040180806020018281038252604d815260200180615997604d913960600191505060405180910390fd5b42607801836001600160401b031610158015612b465750426201518001836001600160401b031611155b612b815760405162461bcd60e51b8152600401808060200182810382526038815260200180615a126038913960400191505060405180910390fd5b6000846001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015612bbc57600080fd5b505afa158015612bd0573d6000803e3d6000fd5b505050506040513d6020811015612be657600080fd5b5051604080516318160ddd60e01b815290519192506000916001600160a01b038816916318160ddd916004808301926020929190829003018186803b158015612c2e57600080fd5b505afa158015612c42573d6000803e3d6000fd5b505050506040513d6020811015612c5857600080fd5b50519050677ce66c50e2840000612c728260ff8516613a71565b1115612cbe576040805162461bcd60e51b8152602060048201526016602482015275746f6f206c6172676520746f74616c20737570706c7960501b604482015290519081900360640190fd5b6060866001600160a01b03166306fdde036040518163ffffffff1660e01b815260040160006040518083038186803b158015612cf957600080fd5b505afa158015612d0d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015612d3657600080fd5b8101908080516040519392919084600160201b821115612d5557600080fd5b908301906020820185811115612d6a57600080fd5b8251600160201b811182820188101715612d8357600080fd5b82525081516020918201929091019080838360005b83811015612db0578181015183820152602001612d98565b50505050905090810190601f168015612ddd5780820380516001836020036101000a031916815260200191505b50604052505050905060608190506001815110158015612dff57506020815111155b612e50576040805162461bcd60e51b815260206004820152601d60248201527f6e616d65206c656e677468206d75737420626520696e205b312c33325d000000604482015290519081900360640190fd5b6060886001600160a01b03166395d89b416040518163ffffffff1660e01b815260040160006040518083038186803b158015612e8b57600080fd5b505afa158015612e9f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015612ec857600080fd5b8101908080516040519392919084600160201b821115612ee757600080fd5b908301906020820185811115612efc57600080fd5b8251600160201b811182820188101715612f1557600080fd5b82525081516020918201929091019080838360005b83811015612f42578181015183820152602001612f2a565b50505050905090810190601f168015612f6f5780820380516001836020036101000a031916815260200191505b5060405250508151919250829160021180159150612f8f57508051600810155b612fe0576040805162461bcd60e51b815260206004820152601e60248201527f73796d626f6c206c656e677468206d75737420626520696e205b322c385d0000604482015290519081900360640190fd5b60005b81518160ff16101561313457604160f81b828260ff168151811061300357fe5b01602001516001600160f81b031916108015906130415750602d60f91b828260ff168151811061302f57fe5b01602001516001600160f81b03191611155b806130995750606160f81b828260ff168151811061305b57fe5b01602001516001600160f81b031916108015906130995750603d60f91b828260ff168151811061308757fe5b01602001516001600160f81b03191611155b806130f15750600360fc1b828260ff16815181106130b357fe5b01602001516001600160f81b031916108015906130f15750603960f81b828260ff16815181106130df57fe5b01602001516001600160f81b03191611155b61312c5760405162461bcd60e51b815260040180806020018281038252602e815260200180615ac6602e913960400191505060405180910390fd5b600101612fe3565b50600454611004906108fc9061315190349063ffffffff613b0016565b6040518115909202916000818181858888f19350505050158015613179573d6000803e3d6000fd5b506001600160a01b038a166000908152600260209081526040909120805460ff1916600117905584810151908301516131b06158f1565b604051806101000160405280336001600160a01b031681526020018e6001600160a01b031681526020018481526020018381526020018981526020018a60ff16815260200161320f6402540be400600454613b4290919063ffffffff16565b81526001600160401b038e16602090910152905061200063f7a251d7600461323684614608565b6132546402540be40061131160045434613b0090919063ffffffff16565b6040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b838110156132b257818101518382015260200161329a565b50505050905090810190601f1680156132df5780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b15801561330057600080fd5b505af1158015613314573d6000803e3d6000fd5b5050505060019a505050505050505050505092915050565b600781565b600981565b677ce66c50e284000081565b61100781565b61100681565b60005460ff1681565b600081565b336110071461339c5760405162461bcd60e51b815260040180806020018281038252602e815260200180615b5b602e913960400191505060405180910390fd5b602081146133f1576040805162461bcd60e51b815260206004820152601860248201527f65787065637465642076616c7565206c656e6774682033320000000000000000604482015290519081900360640190fd5b606084848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f880181900481028201810190925286815293945060609392508691508590819084018382808284376000920191909152505050506020830151909150686d6972726f7246656560b81b8114156134e65760208201516402540be4008106156134de576040805162461bcd60e51b815260206004820152601a60248201527f6d6972726f72466565206d757374206265204e202a2031653130000000000000604482015290519081900360640190fd5b60045561359c565b6673796e6346656560c81b81141561355f5760208201516402540be400810615613557576040805162461bcd60e51b815260206004820152601860248201527f73796e63466565206d757374206265204e202a20316531300000000000000000604482015290519081900360640190fd5b60055561359c565b6040805162461bcd60e51b815260206004820152600d60248201526c756e6b6e6f776e20706172616d60981b604482015290519081900360640190fd5b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a878787876040518080602001806020018381038352878782818152602001925080828437600083820152601f01601f191690910184810383528581526020019050858580828437600083820152604051601f909101601f19169092018290039850909650505050505050a150505050505050565b61100281565b33612000146136775760405162461bcd60e51b815260040180806020018281038252602f815260200180615b89602f913960400191505060405180910390fd5b60ff8316600414156136c25761287182828080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061477a92505050565b60ff8316600514156128c15761287182828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506148b992505050565b600160208190526000918252604090912080549181015460028201546003830154600484015460059094015460ff9586169593946001600160a01b039093169391929181169061010090046001600160401b031687565b604d81565b61100381565b60055481565b61100081565b61271081565b61100481565b606061379161589e565b600061379c846149b3565b91509150806137f2576040805162461bcd60e51b815260206004820152601f60248201527f756e7265636f676e697a6564207472616e73666572496e207061636b61676500604482015290519081900360640190fd5b815160ff166138a5576020828101805160009081526001928390526040908190208551815460ff1990811660ff928316178355935194820194909455908501516002820180546001600160a01b0319166001600160a01b03909216919091179055606085015160038201556080850151600482015560a08501516005909101805460c08701519316919093161768ffffffffffffffff0019166101006001600160401b03909216919091021790556139fc565b815160ff16600114156139af5760006110046001600160a01b03166359b9278984602001516040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b1580156138fe57600080fd5b505afa158015613912573d6000803e3d6000fd5b505050506040513d602081101561392857600080fd5b505190506001600160a01b038116156139a95760208301516040805163b99328c560e01b815260048101929092526001600160a01b0383166024830152516110049163b99328c591604480830192600092919082900301818387803b15801561399057600080fd5b505af11580156139a4573d6000803e3d6000fd5b505050505b506139fc565b6040805162461bcd60e51b815260206004820152601960248201527f756e7265636f676e697a65642062696e64207061636b61676500000000000000604482015290519081900360640190fd5b60408051600080825260208201909252905b50949350505050565b600082820183811015610e94576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60006008821115613ae957604d60071983011115613acb576040805162461bcd60e51b8152602060048201526012602482015271746f6f206c6172676520646563696d616c7360701b604482015290519081900360640190fd5b613ae2836007198401600a0a63ffffffff613b4216565b90506113eb565b610e94836008849003600a0a63ffffffff614b0416565b6000610e9483836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250614b5d565b6000610e9483836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250614bf4565b60408051600680825260e08201909252606091829190816020015b6060815260200190600190039081613b9f5750508351909150613bca906001600160a01b0316614c59565b81600081518110613bd757fe5b6020026020010181905250613bf883602001516001600160a01b0316614c59565b81600181518110613c0557fe5b6020026020010181905250613c20836040015160001c614c7c565b81600281518110613c2d57fe5b6020026020010181905250613c458360600151614c7c565b81600381518110613c5257fe5b6020026020010181905250613c6a8360800151614c7c565b81600481518110613c7757fe5b6020026020010181905250613c988360a001516001600160401b0316614c7c565b81600581518110613ca557fe5b6020026020010181905250610e9481614c8f565b6020015190565b600080826001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015613cfc57600080fd5b505afa158015613d10573d6000803e3d6000fd5b505050506040513d6020811015613d2657600080fd5b5051604080516395d89b4160e01b8152905160ff90921692506060916001600160a01b038616916395d89b41916004808301926000929190829003018186803b158015613d7257600080fd5b505afa158015613d86573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015613daf57600080fd5b8101908080516040519392919084600160201b821115613dce57600080fd5b908301906020820185811115613de357600080fd5b8251600160201b811182820188101715613dfc57600080fd5b82525081516020918201929091019080838360005b83811015613e29578181015183820152602001613e11565b50505050905090810190601f168015613e565780820380516001836020036101000a031916815260200191505b5060408181526370a0823160e01b82526110046004830152519495506000946001600160a01b038a1694506370a08231935060248083019350602092829003018186803b158015613ea657600080fd5b505afa158015613eba573d6000803e3d6000fd5b505050506040513d6020811015613ed057600080fd5b505160808701516060880151919250600091613ef19163ffffffff613b0016565b9050428760c001516001600160401b03161015613f165750600193506113eb92505050565b613f24838860200151614d19565b613f365750600293506113eb92505050565b80821115613f4c5750600393506113eb92505050565b866060015187604001516001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015613f8e57600080fd5b505afa158015613fa2573d6000803e3d6000fd5b505050506040513d6020811015613fb857600080fd5b505114613fcd5750600493506113eb92505050565b8660a0015160ff168414613fe95750600593506113eb92505050565b602080880151604080516359b9278960e01b8152600481019290925251600092611004926359b927899260248083019392829003018186803b15801561402e57600080fd5b505afa158015614042573d6000803e3d6000fd5b505050506040513d602081101561405857600080fd5b50516001600160a01b03161415806140fa57506000801b6110046001600160a01b031663bd46646189604001516040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b1580156140cb57600080fd5b505afa1580156140df573d6000803e3d6000fd5b505050506040513d60208110156140f557600080fd5b505114155b1561410d5750600693506113eb92505050565b5060009695505050505050565b6040805160028082526060828101909352829190816020015b6060815260200190600190039081614133575050835190915061415b9063ffffffff16614c7c565b8160008151811061416857fe5b6020026020010181905250614183836020015160001c614c7c565b81600181518110613ca557fe5b614198615869565b60006141a383614e01565b91509150806141f0576040805162461bcd60e51b8152602060048201526014602482015273756e7265636f676e697a6564207061636b61676560601b604482015290519081900360640190fd5b6020808301516001600160a01b03166000908152600290915260409020805460ff1916905560a082015160ff166143515760808201516040516110049180156108fc02916000818181858888f19350505050158015614253573d6000803e3d6000fd5b506110046001600160a01b0316638eff336c8360600151846020015185604001516040518463ffffffff1660e01b815260040180848152602001836001600160a01b03166001600160a01b031681526020018260ff1681526020019350505050600060405180830381600087803b1580156142cd57600080fd5b505af11580156142e1573d6000803e3d6000fd5b50505050602082810180516001600160a01b03908116600090815260038452604090819020805460ff1916600117905591516060860151835190815292519116927f41787d7db08fc5907641ee8343379f28215727eb123d4b462099afab4300b036928290030190a2505061443a565b815160808301516040516000926001600160a01b0316916127109184818181858888f193505050503d80600081146143a5576040519150601f19603f3d011682016040523d82523d6000602084013e6143aa565b606091505b50509050806143e75760808301516040516110029180156108fc02916000818181858888f193505050501580156143e5573d6000803e3d6000fd5b505b82602001516001600160a01b03167fefe400ad0042ebf81a245de9ae669616105e0ca9fc946352c085da0c2bc524e58460a00151604051808260ff1660ff16815260200191505060405180910390a25050505b50565b614445615935565b600061445083614f0e565b915091508061449d576040805162461bcd60e51b8152602060048201526014602482015273756e7265636f676e697a6564207061636b61676560601b604482015290519081900360640190fd5b606082015160ff1661451d5760408083015190516110049180156108fc02916000818181858888f193505050501580156144db573d6000803e3d6000fd5b5081602001516001600160a01b03167fbb7d3a9a559080d8281b0e4fb39dacbe2fdcafd5ef765e9a6ed871c9167dc60f60405160405180910390a2505061443a565b81602001516001600160a01b03167ff1e25fa536da84053644fd788b1d6a27ea6edd1f3af80c7d36ca253c4c82c9c38360600151604051808260ff1660ff16815260200191505060405180910390a2815160408084015190516000926001600160a01b0316916127109184818181858888f193505050503d80600081146145c0576040519150601f19603f3d011682016040523d82523d6000602084013e6145c5565b606091505b50509050806146025760408084015190516110029180156108fc02916000818181858888f19350505050158015614600573d6000803e3d6000fd5b505b50505050565b6040805160088082526101208201909252606091829190816020015b6060815260200190600190039081614624575050835190915061464f906001600160a01b0316614c59565b8160008151811061465c57fe5b602002602001018190525061467d83602001516001600160a01b0316614c59565b8160018151811061468a57fe5b60200260200101819052506146a5836040015160001c614c7c565b816002815181106146b257fe5b60200260200101819052506146cd836060015160001c614c7c565b816003815181106146da57fe5b60200260200101819052506146f28360800151614c7c565b816004815181106146ff57fe5b602002602001018190525061471a8360a0015160ff16614c7c565b8160058151811061472757fe5b602002602001018190525061473f8360c00151614c7c565b8160068151811061474c57fe5b602002602001018190525061476d8360e001516001600160401b0316614c7c565b81600781518110613ca557fe5b6147826158f1565b600061478d83614fda565b91509150806147da576040805162461bcd60e51b8152602060048201526014602482015273756e7265636f676e697a6564207061636b61676560601b604482015290519081900360640190fd5b6020808301516001600160a01b039081166000908152600290925260408220805460ff19169055835160c085015191169061271090614824906402540be40063ffffffff614b0416565b6040516000818181858888f193505050503d8060008114614861576040519150601f19603f3d011682016040523d82523d6000602084013e614866565b606091505b50509050806146025760c0830151611002906108fc90614891906402540be40063ffffffff614b0416565b6040518115909202916000818181858888f19350505050158015614600573d6000803e3d6000fd5b6148c1615869565b60006148cc8361512b565b9150915080614919576040805162461bcd60e51b8152602060048201526014602482015273756e7265636f676e697a6564207061636b61676560601b604482015290519081900360640190fd5b815160808301516000916001600160a01b03169061271090614946906402540be40063ffffffff614b0416565b6040516000818181858888f193505050503d8060008114614983576040519150601f19603f3d011682016040523d82523d6000602084013e614988565b606091505b5050905080614602576080830151611002906108fc90614891906402540be40063ffffffff614b0416565b6149bb61589e565b60006149c561589e565b6149cd61595c565b6149de6149d98661523b565b615260565b90506000805b6149ed836152aa565b15614af75780614a1257614a08614a03846152cb565b615319565b60ff168452614aef565b8060011415614a3157614a27614a03846152cb565b6020850152614aef565b8060021415614a5e57614a4b614a46846152cb565b6153ce565b6001600160a01b03166040850152614aef565b8060031415614a7d57614a73614a03846152cb565b6060850152614aef565b8060041415614a9c57614a92614a03846152cb565b6080850152614aef565b8060051415614abe57614ab1614a03846152cb565b60ff1660a0850152614aef565b8060061415614aea57614ad3614a03846152cb565b6001600160401b031660c085015260019150614aef565b614af7565b6001016149e4565b5091935090915050915091565b600082614b13575060006113eb565b82820282848281614b2057fe5b0414610e945760405162461bcd60e51b8152600401808060200182810382526021815260200180615af46021913960400191505060405180910390fd5b60008184841115614bec5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015614bb1578181015183820152602001614b99565b50505050905090810190601f168015614bde5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60008183614c435760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315614bb1578181015183820152602001614b99565b506000838581614c4f57fe5b0495945050505050565b60408051600560a21b8318601482015260348101909152606090610e94816153e8565b60606113eb614c8a8361543e565b6153e8565b6060815160001415614cb0575060408051600081526020810190915261157f565b606082600081518110614cbf57fe5b602002602001015190506000600190505b8351811015614d0057614cf682858381518110614ce957fe5b6020026020010151615524565b9150600101614cd0565b50610e94614d13825160c060ff166155a1565b82615524565b8151600090839060081080614d2f575080516002115b15614d3e5760009150506113eb565b60408051602080825281830190925260609160208201818036833701905050905083602082015280825181518110614d7257fe5b6020910101516001600160f81b031916602d60f81b14614d97576000925050506113eb565b600160005b8351811015614df757828181518110614db157fe5b602001015160f81c60f81b6001600160f81b031916848281518110614dd257fe5b01602001516001600160f81b03191614614def5760009150614df7565b600101614d9c565b5095945050505050565b614e09615869565b6000614e13615869565b614e1b61595c565b614e276149d98661523b565b90506000805b614e36836152aa565b15614af75780614e5c57614e4c614a46846152cb565b6001600160a01b03168452614f06565b8060011415614e8457614e71614a46846152cb565b6001600160a01b03166020850152614f06565b8060021415614ea657614e99614a03846152cb565b60ff166040850152614f06565b8060031415614ec557614ebb614a03846152cb565b6060850152614f06565b8060041415614ee457614eda614a03846152cb565b6080850152614f06565b8060051415614aea57614ef9614a03846152cb565b60ff1660a0850152600191505b600101614e2d565b614f16615935565b6000614f20615935565b614f2861595c565b614f346149d98661523b565b90506000805b614f43836152aa565b15614af75780614f6957614f59614a46846152cb565b6001600160a01b03168452614fd2565b8060011415614f9157614f7e614a46846152cb565b6001600160a01b03166020850152614fd2565b8060021415614fb057614fa6614a03846152cb565b6040850152614fd2565b8060031415614aea57614fc5614a03846152cb565b60ff166060850152600191505b600101614f3a565b614fe26158f1565b6000614fec6158f1565b614ff461595c565b6150006149d98661523b565b90506000805b61500f836152aa565b15614af7578061503557615025614a46846152cb565b6001600160a01b03168452615123565b806001141561505d5761504a614a46846152cb565b6001600160a01b03166020850152615123565b806002141561507c57615072614a03846152cb565b6040850152615123565b806003141561509b57615091614a03846152cb565b6060850152615123565b80600414156150ba576150b0614a03846152cb565b6080850152615123565b80600514156150dc576150cf614a03846152cb565b60ff1660a0850152615123565b80600614156150fb576150f1614a03846152cb565b60c0850152615123565b8060071415614aea57615110614a03846152cb565b6001600160401b031660e0850152600191505b600101615006565b615133615869565b600061513d615869565b61514561595c565b6151516149d98661523b565b90506000805b615160836152aa565b15614af7578061518657615176614a46846152cb565b6001600160a01b03168452615233565b80600114156151ae5761519b614a46846152cb565b6001600160a01b03166020850152615233565b80600214156151cd576151c3614a03846152cb565b6040850152615233565b80600314156151ec576151e2614a03846152cb565b6060850152615233565b806004141561520b57615201614a03846152cb565b6080850152615233565b8060051415614aea57615220614a03846152cb565b6001600160401b031660a0850152600191505b600101615157565b61524361597c565b506040805180820190915281518152602082810190820152919050565b61526861595c565b61527182615699565b61527a57600080fd5b600061528983602001516156d3565b60208085015160408051808201909152868152920190820152915050919050565b60006152b461597c565b505080518051602091820151919092015191011190565b6152d361597c565b6152dc826152aa565b6152e557600080fd5b602082015160006152f582615736565b80830160209586015260408051808201909152908152938401919091525090919050565b80516000901580159061532e57508151602110155b61533757600080fd5b600061534683602001516156d3565b905080836000015110156153a1576040805162461bcd60e51b815260206004820152601a60248201527f6c656e677468206973206c657373207468616e206f6666736574000000000000604482015290519081900360640190fd5b825160208085015183018051928490039291831015613a0e57506020919091036101000a90049392505050565b80516000906015146153df57600080fd5b6113eb82615319565b60608151600114801561541a5750607f60f81b8260008151811061540857fe5b01602001516001600160f81b03191611155b1561542657508061157f565b6113eb6154388351608060ff166155a1565b83615524565b604080516020808252818301909252606091829190602082018180368337505050602081018490529050600067ffffffffffffffff198416615482575060186154a6565b6fffffffffffffffffffffffffffffffff1984166154a2575060106154a6565b5060005b60208110156154dc578181815181106154bb57fe5b01602001516001600160f81b031916156154d4576154dc565b6001016154a6565b60008160200390506060816040519080825280601f01601f191660200182016040528015615511576020820181803683370190505b5080830196909652508452509192915050565b6060806040519050835180825260208201818101602087015b8183101561555557805183526020928301920161553d565b50855184518101855292509050808201602086015b8183101561558257805183526020928301920161556a565b508651929092011591909101601f01601f191660405250905092915050565b60606801000000000000000083106155f1576040805162461bcd60e51b815260206004820152600e60248201526d696e70757420746f6f206c6f6e6760901b604482015290519081900360640190fd5b6040805160018082528183019092526060916020820181803683370190505090506037841161564b5782840160f81b8160008151811061562d57fe5b60200101906001600160f81b031916908160001a90535090506113eb565b60606156568561543e565b90508381510160370160f81b8260008151811061566f57fe5b60200101906001600160f81b031916908160001a9053506156908282615524565b95945050505050565b80516000906156aa5750600061157f565b6020820151805160001a9060c08210156156c95760009250505061157f565b5060019392505050565b8051600090811a60808110156156ed57600091505061157f565b60b8811080615708575060c08110801590615708575060f881105b1561571757600191505061157f565b60c081101561572b5760b51901905061157f565b60f51901905061157f565b80516000908190811a60808110156157515760019150615862565b60b881101561576657607e1981019150615862565b60c08110156157e057600060b78203600186019550806020036101000a8651049150600181018201935050808310156157da576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b50615862565b60f88110156157f55760be1981019150615862565b600060f78203600186019550806020036101000a865104915060018101820193505080831015615860576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b505b5092915050565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915290565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081019190915290565b604080518082019091526000808252602082015290565b6040805161010081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081019190915290565b60408051608081018252600080825260208201819052918101829052606081019190915290565b604051806040016040528061596f61597c565b8152602001600081525090565b60405180604001604052806000815260200160008152509056fe6d73672e76616c7565206d757374206265204e202a203165313020616e642067726561746572207468616e2073756d206f66206d696e6952656c617946656520616e64206d6972726f724665656f6e6c79206265703230206f776e65722063616e20617070726f766520746869732062696e64207265717565737465787069726554696d65206d7573742062652074776f206d696e75746573206c6174657220616e64206f6e6520646179206561726c69657272656c6179466565206d757374206265204e202a203165313020616e642067726561746572207468616e206d696e6952656c6179466565636f6e74616374206164647265737320646f65736e277420657175616c20746f2074686520636f6e7472616374206164647265737320696e2062696e64207265717565737473796d626f6c2073686f756c64206f6e6c7920636f6e7461696e20616c70686162657420616e64206e756d626572536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f776d73672e76616c7565206d757374206265204e202a203165313020616e64206e6f206c6573732073756d206f66206d696e6952656c617946656520616e642073796e63466565746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e7472616374746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e747261637474686520626570323020746f6b656e20697320696e206d6972726f722070656e64696e6720737461747573a2646970667358221220ab8dfdd9914857b55fc1c6e49c911de2d861380dc81004c5ff0a4e67915545b764736f6c63430006040033", + }, + UpgradeConfig { + contract_addr: "0000000000000000000000000000000000001004", + code: "60806040526004361061031e5760003560e01c80639a99b4f0116101ab578063bd466461116100f7578063f014847211610095578063fc1a598f1161006f578063fc1a598f14610cb3578063fc3e590814610996578063fd6a687914610ce6578063ff9c00271461068657610366565b8063f014847214610c74578063f9a2bbc714610c89578063fa9e915914610c9e57610366565b8063d9e6dae9116100d1578063d9e6dae914610608578063dc927faf14610c35578063e1c7392a14610c4a578063ebf71d5314610c5f57610366565b8063bd46646114610b68578063c81b166214610b9b578063c8509d8114610bb057610366565b8063aa7415f511610164578063b99328c51161013e578063b99328c514610ad2578063b9fd21e314610b0b578063ba35ead614610b20578063bbface1f14610b3557610366565b8063aa7415f5146109ab578063ab51bb96146109f2578063ac43175114610a0757610366565b80639a99b4f0146109095780639dc0926214610942578063a1a11bf514610957578063a496fba21461096c578063a78abc1614610981578063a7c9f02d1461099657610366565b8063613684751161026a57806375d47a0a116102235780638b87b21f116101fd5780638b87b21f146105875780638eff336c146108a057806396713da9146108df5780639a854bbd146108f457610366565b806375d47a0a146107f15780637942fd0514610806578063831d65d11461081b57610366565b8063613684751461060857806366dea52a146106865780636e0565201461069b5780636e47b482146107c757806370fd5bad1461068657806371d30863146107dc57610366565b806343a368b9116102d757806350432d32116102b157806350432d321461061d57806351e806721461063257806359b92789146106475780635d499b1b1461067157610366565b806343a368b9146105c7578063493279b1146105dc5780634bf6c8821461060857610366565b80630bee7a671461036b5780631182b87514610399578063149d14d9146104935780633d713223146104ba5780633dffc3871461058757806343756e5c146105b257610366565b36610366573415610364576040805133815234602082015281517f6c98249d85d88c3753a04a22230f595e4dc8d3dc86c34af35deeeedc861b89db929181900390910190a15b005b600080fd5b34801561037757600080fd5b50610380610cfb565b6040805163ffffffff9092168252519081900360200190f35b3480156103a557600080fd5b5061041e600480360360408110156103bc57600080fd5b60ff8235169190810190604081016020820135600160201b8111156103e057600080fd5b8201836020820111156103f257600080fd5b803590602001918460018302840111600160201b8311171561041357600080fd5b509092509050610d00565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610458578181015183820152602001610440565b50505050905090810190601f1680156104855780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561049f57600080fd5b506104a8610e2e565b60408051918252519081900360200190f35b3480156104c657600080fd5b5061056b600480360360208110156104dd57600080fd5b810190602081018135600160201b8111156104f757600080fd5b82018360208201111561050957600080fd5b803590602001918460018302840111600160201b8311171561052a57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610e34945050505050565b604080516001600160a01b039092168252519081900360200190f35b34801561059357600080fd5b5061059c610e58565b6040805160ff9092168252519081900360200190f35b3480156105be57600080fd5b5061056b610e5d565b3480156105d357600080fd5b506104a8610e63565b3480156105e857600080fd5b506105f1610e6f565b6040805161ffff9092168252519081900360200190f35b34801561061457600080fd5b5061059c610e74565b34801561062957600080fd5b506104a8610e79565b34801561063e57600080fd5b5061056b610e84565b34801561065357600080fd5b5061056b6004803603602081101561066a57600080fd5b5035610e8a565b34801561067d57600080fd5b506104a8610ea5565b34801561069257600080fd5b5061059c610eae565b6107b3600480360360808110156106b157600080fd5b810190602081018135600160201b8111156106cb57600080fd5b8201836020820111156106dd57600080fd5b803590602001918460208302840111600160201b831117156106fe57600080fd5b919390929091602081019035600160201b81111561071b57600080fd5b82018360208201111561072d57600080fd5b803590602001918460208302840111600160201b8311171561074e57600080fd5b919390929091602081019035600160201b81111561076b57600080fd5b82018360208201111561077d57600080fd5b803590602001918460208302840111600160201b8311171561079e57600080fd5b91935091503567ffffffffffffffff16610eb3565b604080519115158252519081900360200190f35b3480156107d357600080fd5b5061056b611388565b3480156107e857600080fd5b506104a861138e565b3480156107fd57600080fd5b5061056b611394565b34801561081257600080fd5b5061059c61139a565b34801561082757600080fd5b506103646004803603604081101561083e57600080fd5b60ff8235169190810190604081016020820135600160201b81111561086257600080fd5b82018360208201111561087457600080fd5b803590602001918460018302840111600160201b8311171561089557600080fd5b50909250905061139f565b3480156108ac57600080fd5b50610364600480360360608110156108c357600080fd5b508035906001600160a01b0360208201351690604001356114e8565b3480156108eb57600080fd5b5061059c61156e565b34801561090057600080fd5b506104a8611573565b34801561091557600080fd5b506104a86004803603604081101561092c57600080fd5b506001600160a01b03813516906020013561157f565b34801561094e57600080fd5b5061056b6116bd565b34801561096357600080fd5b5061056b6116c3565b34801561097857600080fd5b5061059c6116c9565b34801561098d57600080fd5b506107b36116ce565b3480156109a257600080fd5b5061059c6116d7565b6107b3600480360360808110156109c157600080fd5b5080356001600160a01b03908116916020810135909116906040810135906060013567ffffffffffffffff166116dc565b3480156109fe57600080fd5b506103806116c9565b348015610a1357600080fd5b5061036460048036036040811015610a2a57600080fd5b810190602081018135600160201b811115610a4457600080fd5b820183602082011115610a5657600080fd5b803590602001918460018302840111600160201b83111715610a7757600080fd5b919390929091602081019035600160201b811115610a9457600080fd5b820183602082011115610aa657600080fd5b803590602001918460018302840111600160201b83111715610ac757600080fd5b509092509050611d9d565b348015610ade57600080fd5b5061036460048036036040811015610af557600080fd5b50803590602001356001600160a01b031661200c565b348015610b1757600080fd5b506104a8612082565b348015610b2c57600080fd5b506104a861208c565b348015610b4157600080fd5b506104a860048036036020811015610b5857600080fd5b50356001600160a01b0316612092565b348015610b7457600080fd5b506104a860048036036020811015610b8b57600080fd5b50356001600160a01b03166120a4565b348015610ba757600080fd5b5061056b6120bf565b348015610bbc57600080fd5b5061036460048036036040811015610bd357600080fd5b60ff8235169190810190604081016020820135600160201b811115610bf757600080fd5b820183602082011115610c0957600080fd5b803590602001918460018302840111600160201b83111715610c2a57600080fd5b5090925090506120c5565b348015610c4157600080fd5b5061056b612195565b348015610c5657600080fd5b5061036461219b565b348015610c6b57600080fd5b5061059c61223b565b348015610c8057600080fd5b5061059c612240565b348015610c9557600080fd5b5061056b612245565b348015610caa57600080fd5b506104a861224b565b348015610cbf57600080fd5b5061041e60048036036020811015610cd657600080fd5b50356001600160a01b0316612251565b348015610cf257600080fd5b5061056b612378565b606481565b60005460609060ff16610d48576040805162461bcd60e51b815260206004820152601960248201526000805160206147a8833981519152604482015290519081900360640190fd5b3361200014610d885760405162461bcd60e51b815260040180806020018281038252602f815260200180614756602f913960400191505060405180910390fd5b60ff841660021415610dda57610dd383838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061237e92505050565b9050610e27565b6040805162461bcd60e51b815260206004820152601860248201527f756e7265636f676e697a65642073796e207061636b6167650000000000000000604482015290519081900360640190fd5b9392505050565b60015490565b6020818101516000908152600490915260409020546001600160a01b03165b919050565b600181565b61100181565b670de0b6b3a764000081565b603881565b600881565b66071afd498d000081565b61200081565b6000908152600460205260409020546001600160a01b031690565b6402540be40081565b600281565b6000805460ff16610ef9576040805162461bcd60e51b815260206004820152601960248201526000805160206147a8833981519152604482015290519081900360640190fd5b868514610f375760405162461bcd60e51b815260040180806020018281038252603b81526020018061471b603b913960400191505060405180910390fd5b868314610f755760405162461bcd60e51b815260040180806020018281038252603f8152602001806145ee603f913960400191505060405180910390fd5b426078018267ffffffffffffffff161015610fc15760405162461bcd60e51b81526004018080602001828103825260248152602001806144de6024913960400191505060405180910390fd5b6402540be4003406156110055760405162461bcd60e51b815260040180806020018281038252604081526020018061481e6040913960400191505060405180910390fd5b60408051868152602080880282010190915285906000908190606090848015611038578160200160208202803683370190505b50905060005b84811015611113576402540be4008b8b8381811061105857fe5b905060200201358161106657fe5b06156110a35760405162461bcd60e51b815260040180806020018281038252603c81526020018061462d603c913960400191505060405180910390fd5b6110c88b8b838181106110b257fe5b90506020020135856124a290919063ffffffff16565b93506110f46402540be4008c8c848181106110df57fe5b905060200201356124fc90919063ffffffff16565b82828151811061110057fe5b602090810291909101015260010161103e565b506001546111389061112b908663ffffffff61253e16565b849063ffffffff6124a216565b3410156111765760405162461bcd60e51b81526004018080602001828103825260568152602001806147c86056913960600191505060405180910390fd5b611186348463ffffffff61259716565b9150611190614337565b6040518060c001604052806221272160e91b60001b815260200160006001600160a01b031681526020018381526020018e8e808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505050908252506040805160208c810282810182019093528c82529283019290918d918d91829185019084908082843760009201919091525050509082525067ffffffffffffffff8916602090910152905061200063f7a251d76003611254846125d9565b611269876402540be40063ffffffff6124fc16565b6040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b838110156112c75781810151838201526020016112af565b50505050905090810190601f1680156112f45780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b15801561131557600080fd5b505af1158015611329573d6000803e3d6000fd5b505060408051600081523360208201528082018890526060810187905290517f74eab09b0e53aefc23f2e1b16da593f95c2dd49c6f5a23720463d10d9c330b2a9350908190036080019150a15060019c9b505050505050505050505050565b61100581565b60015481565b61100881565b600b81565b60005460ff166113e4576040805162461bcd60e51b815260206004820152601960248201526000805160206147a8833981519152604482015290519081900360640190fd5b33612000146114245760405162461bcd60e51b815260040180806020018281038252602f815260200180614756602f913960400191505060405180910390fd5b60ff8316600314156114745761146f82828080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061289492505050565b6114e3565b7f41ce201247b6ceb957dcdb217d0b8acb50b9ea0e12af9af4f5e7f38902101605838383604051808460ff1660ff168152602001806020018281038252848482818152602001925080828437600083820152604051601f909101601f1916909201829003965090945050505050a15b505050565b33611008146115285760405162461bcd60e51b81526004018080602001828103825260238152602001806147856023913960400191505060405180910390fd5b600083815260046020908152604080832080546001600160a01b039096166001600160a01b03199096168617905593825260038152838220949094556002909352912055565b600981565b677ce66c50e284000081565b6000805460ff166115c5576040805162461bcd60e51b815260206004820152601960248201526000805160206147a8833981519152604482015290519081900360640190fd5b33611005146116055760405162461bcd60e51b815260040180806020018281038252602f815260200180614451602f913960400191505060405180910390fd5b60004783106116145747611616565b825b9050670de0b6b3a76400008111156116325760009150506116b7565b80156116b4576040516001600160a01b0385169082156108fc029083906000818181858888f1935050505015801561166e573d6000803e3d6000fd5b50604080516001600160a01b03861681526020810183905281517ff8b71c64315fc33b2ead2adfa487955065152a8ac33d9d5193aafd7f45dc15a0929181900390910190a15b90505b92915050565b61100781565b61100681565b600081565b60005460ff1681565b600381565b6000805460ff16611722576040805162461bcd60e51b815260206004820152601960248201526000805160206147a8833981519152604482015290519081900360640190fd5b426078018267ffffffffffffffff16101561176e5760405162461bcd60e51b81526004018080602001828103825260248152602001806144de6024913960400191505060405180910390fd5b6402540be4003406156117b25760405162461bcd60e51b815260040180806020018281038252604081526020018061481e6040913960400191505060405180910390fd5b600080806001600160a01b038816611891576001546117d890879063ffffffff6124a216565b3410156118165760405162461bcd60e51b81526004018080602001828103825260618152602001806145686061913960800191505060405180910390fd5b6402540be40086061561185a5760405162461bcd60e51b815260040180806020018281038252603c81526020018061462d603c913960400191505060405180910390fd5b61186a348763ffffffff61259716565b9050611881866402540be40063ffffffff6124fc16565b6221272160e91b93509150611b34565b6001600160a01b0388166000908152600360205260409020549250826118e85760405162461bcd60e51b81526004018080602001828103825260318152602001806145376031913960400191505060405180910390fd5b6001543410156119295760405162461bcd60e51b815260040180806020018281038252603f81526020018061468a603f913960400191505060405180910390fd5b506001600160a01b038716600090815260026020526040902054349060088111158061197457506008811180156119745750611972876007198301600a0a63ffffffff6128f016565b155b6119af5760405162461bcd60e51b815260040180806020018281038252603c81526020018061462d603c913960400191505060405180910390fd5b6119b98782612932565b92506119c484612972565b15611a0c576305f5e100831015611a0c5760405162461bcd60e51b815260040180806020018281038252603a815260200180614480603a913960400191505060405180910390fd5b600881101580611a265750600881108015611a2657508683115b611a615760405162461bcd60e51b81526004018080602001828103825260258152602001806145c96025913960400191505060405180910390fd5b677ce66c50e2840000831115611aa85760405162461bcd60e51b81526004018080602001828103825260358152602001806145026035913960400191505060405180910390fd5b604080516323b872dd60e01b81523360048201523060248201526044810189905290516001600160a01b038b16916323b872dd9160648083019260209291908290030181600087803b158015611afd57600080fd5b505af1158015611b11573d6000803e3d6000fd5b505050506040513d6020811015611b2757600080fd5b5051611b3257600080fd5b505b611b3c614337565b6040805160c0810182528581526001600160a01b038b166020820152815160018082528184018452919283019181602001602082028036833750505081526040805160018082528183019092526020928301929091908083019080368337505050815260408051600180825281830190925260209283019290919080830190803683370190505081526020018767ffffffffffffffff168152509050828160400151600081518110611bea57fe5b602002602001018181525050878160600151600081518110611c0857fe5b60200260200101906001600160a01b031690816001600160a01b031681525050338160800151600081518110611c3a57fe5b6001600160a01b039092166020928302919091019091015261200063f7a251d76003611c65846125d9565b611c7a866402540be40063ffffffff6124fc16565b6040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b83811015611cd8578181015183820152602001611cc0565b50505050905090810190601f168015611d055780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b158015611d2657600080fd5b505af1158015611d3a573d6000803e3d6000fd5b5050604080516001600160a01b038d1681523360208201528082018b90526060810186905290517f74eab09b0e53aefc23f2e1b16da593f95c2dd49c6f5a23720463d10d9c330b2a9350908190036080019150a150600198975050505050505050565b3361100714611ddd5760405162461bcd60e51b815260040180806020018281038252602e8152602001806146c9602e913960400191505060405180910390fd5b60208114611e32576040805162461bcd60e51b815260206004820152601b60248201527f65787065637465642076616c7565206c656e6774682069732033320000000000604482015290519081900360640190fd5b606084848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8801819004810282018101909252868152939450606093925086915085908190840183828082843760009201919091525050505060208301519091506772656c617946656560c01b811415611f3a576020820151670de0b6b3a76400008111801590611ee157506402540be4008106155b611f32576040805162461bcd60e51b815260206004820152601960248201527f7468652072656c6179466565206f7574206f662072616e676500000000000000604482015290519081900360640190fd5b600155611f77565b6040805162461bcd60e51b815260206004820152600d60248201526c756e6b6e6f776e20706172616d60981b604482015290519081900360640190fd5b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a878787876040518080602001806020018381038352878782818152602001925080828437600083820152601f01601f191690910184810383528581526020019050858580828437600083820152604051601f909101601f19169092018290039850909650505050505050a150505050505050565b336110081461204c5760405162461bcd60e51b81526004018080602001828103825260238152602001806147856023913960400191505060405180910390fd5b600091825260046020908152604080842080546001600160a01b03191690556001600160a01b0392909216835260039052812055565b6221272160e91b81565b61c35081565b60026020526000908152604090205481565b6001600160a01b031660009081526003602052604090205490565b61100281565b60005460ff1661210a576040805162461bcd60e51b815260206004820152601960248201526000805160206147a8833981519152604482015290519081900360640190fd5b336120001461214a5760405162461bcd60e51b815260040180806020018281038252602f815260200180614756602f913960400191505060405180910390fd5b60ff8316600314156114745761146f82828080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612a7892505050565b61100381565b60005460ff16156121f3576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b66071afd498d000060019081556000808052600260205260127fac33ff75c19e70fe83507db0d683fd3465c996598dc972688b7ace676c89077b55805460ff19169091179055565b600481565b600581565b61100081565b61271081565b6001600160a01b03811660009081526003602090815260409182902054825182815280840190935260609290918391906020820181803683375050506020810183905290506000805b60208160ff1610156122e157828160ff16815181106122b557fe5b01602001516001600160f81b031916156122d4576001909101906122d9565b6122e1565b60010161229a565b5060608160ff166040519080825280601f01601f191660200182016040528015612312576020820181803683370190505b50905060005b8260ff168160ff16101561236e57838160ff168151811061233557fe5b602001015160f81c60f81b828260ff168151811061234f57fe5b60200101906001600160f81b031916908160001a905350600101612318565b5095945050505050565b61100481565b6060612388614383565b600061239384612b76565b91509150806123e9576040805162461bcd60e51b815260206004820152601f60248201527f756e7265636f676e697a6564207472616e73666572496e207061636b61676500604482015290519081900360640190fd5b60006123f483612cb5565b905063ffffffff811615612488576040808401516020808601516001600160a01b0316600090815260029091529182205461242f9190612932565b90506124396143b8565b60405180608001604052808660000151815260200183815260200186608001516001600160a01b031681526020018463ffffffff16815250905061247c81613002565b95505050505050610e53565b50506040805160008152602081019091529150610e539050565b6000828201838110156116b4576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60006116b483836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506130de565b60008261254d575060006116b7565b8282028284828161255a57fe5b04146116b45760405162461bcd60e51b81526004018080602001828103825260218152602001806146696021913960400191505060405180910390fd5b60006116b483836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613180565b60408051600680825260e08201909252606091829190816020015b60608152602001906001900390816125f45750508351909150612616906131da565b8160008151811061262357fe5b602002602001018190525061264483602001516001600160a01b03166131ed565b8160018151811061265157fe5b60200260200101819052506000836040015151905060608160405190808252806020026020018201604052801561269c57816020015b60608152602001906001900390816126875790505b50905060005b828110156126e9576126ca866040015182815181106126bd57fe5b60200260200101516131da565b8282815181106126d657fe5b60209081029190910101526001016126a2565b506126f381613210565b8360028151811061270057fe5b602002602001018190525060608260405190808252806020026020018201604052801561274157816020015b606081526020019060019003908161272c5790505b50905060005b83811015612797576127788760600151828151811061276257fe5b60200260200101516001600160a01b03166131ed565b82828151811061278457fe5b6020908102919091010152600101612747565b506127a181613210565b846003815181106127ae57fe5b60200260200101819052506060836040519080825280602002602001820160405280156127ef57816020015b60608152602001906001900390816127da5790505b50905060005b8481101561282f576128108860800151828151811061276257fe5b82828151811061281c57fe5b60209081029190910101526001016127f5565b5061283981613210565b8560048151811061284657fe5b60200260200101819052506128688760a0015167ffffffffffffffff166131da565b8560058151811061287557fe5b602002602001018190525061288985613210565b979650505050505050565b61289c6143df565b60006128a78361329a565b91509150806128e75760405162461bcd60e51b81526004018080602001828103825260248152602001806146f76024913960400191505060405180910390fd5b6114e382613465565b60006116b483836040518060400160405280601881526020017f536166654d6174683a206d6f64756c6f206279207a65726f00000000000000008152506138e9565b6000600882111561295b57612954836007198401600a0a63ffffffff6124fc16565b90506116b7565b6116b4836008849003600a0a63ffffffff61253e16565b604080516020808252818301909252600091606091906020820181803683375050506020810184905290506000805b60208160ff1610156129e857828160ff16815181106129bc57fe5b01602001516001600160f81b031916156129db576001909101906129e0565b6129e8565b6001016129a1565b50600760ff82161015612a0057600092505050610e53565b816005820360ff1681518110612a1257fe5b6020910101516001600160f81b031916602d60f81b14612a3757600092505050610e53565b816001820360ff1681518110612a4957fe5b6020910101516001600160f81b031916604d60f81b14612a6e57600092505050610e53565b5060019392505050565b612a80614337565b6000612a8b8361394b565b9150915080612acb5760405162461bcd60e51b81526004018080602001828103825260248152602001806144ba6024913960400191505060405180910390fd5b612ad36143df565b602080840180516001600160a01b0390811684526040808701518585015291511660009081526002909252812054905b846040015151811015612b5457612b3185604001518281518110612b2357fe5b602002602001015183613baf565b85604001518281518110612b4157fe5b6020908102919091010152600101612b03565b506080840151604083015260056060830152612b6f82613465565b5050505050565b612b7e614383565b6000612b88614383565b612b90614416565b612ba1612b9c86613be8565b613c0d565b90506000805b612bb083613c57565b15612ca85780612bd257612bcb612bc684613c78565b613cc6565b8452612ca0565b8060011415612bff57612bec612be784613c78565b613d7d565b6001600160a01b03166020850152612ca0565b8060021415612c1e57612c14612bc684613c78565b6040850152612ca0565b8060031415612c4657612c33612be784613c78565b6001600160a01b03166060850152612ca0565b8060041415612c6e57612c5b612be784613c78565b6001600160a01b03166080850152612ca0565b8060051415612c9b57612c83612bc684613c78565b67ffffffffffffffff1660a085015260019150612ca0565b612ca8565b600101612ba7565b5091935090915050915091565b60208101516000906001600160a01b0316612dec578160a0015167ffffffffffffffff16421115612ce857506001610e53565b8160400151471015612cfc57506003610e53565b606082015160408084015190516000926001600160a01b0316916127109184818181858888f193505050503d8060008114612d53576040519150601f19603f3d011682016040523d82523d6000602084013e612d58565b606091505b5050905080612d6b575060049050610e53565b7f471eb9cc1ffe55ffadf15b32595415eb9d80f22e761d24bd6dffc607e1284d5983602001518460600151856040015160405180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b03168152602001828152602001935050505060405180910390a15060009050610e53565b8160a0015167ffffffffffffffff16421115612e0a57506001610e53565b81516020808401516001600160a01b031660009081526003909152604090205414612e3757506002610e53565b602080830151604080516370a0823160e01b815230600482015290516000936001600160a01b03909316926370a082319261c3509260248083019392829003018187803b158015612e8757600080fd5b5086fa158015612e9b573d6000803e3d6000fd5b50505050506040513d6020811015612eb257600080fd5b50516040840151909150811015612ecd575060039050610e53565b600083602001516001600160a01b031663a9059cbb61c350866060015187604001516040518463ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600088803b158015612f3e57600080fd5b5087f1158015612f52573d6000803e3d6000fd5b50505050506040513d6020811015612f6957600080fd5b505190508015612ff6577f471eb9cc1ffe55ffadf15b32595415eb9d80f22e761d24bd6dffc607e1284d5984602001518560600151866040015160405180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b03168152602001828152602001935050505060405180910390a15060009150610e539050565b5060059150610e539050565b60408051600480825260a08201909252606091829190816020015b606081526020019060019003908161301d575050835190915061303f906131da565b8160008151811061304c57fe5b602002602001018190525061306483602001516131da565b8160018151811061307157fe5b602002602001018190525061309283604001516001600160a01b03166131ed565b8160028151811061309f57fe5b60200260200101819052506130bd836060015163ffffffff166131da565b816003815181106130ca57fe5b6020026020010181905250610e2781613210565b6000818361316a5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561312f578181015183820152602001613117565b50505050905090810190601f16801561315c5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858161317657fe5b0495945050505050565b600081848411156131d25760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561312f578181015183820152602001613117565b505050900390565b60606116b76131e883613d97565b613e7d565b60408051600560a21b8318601482015260348101909152606090610e2781613e7d565b60608151600014156132315750604080516000815260208101909152610e53565b60608260008151811061324057fe5b602002602001015190506000600190505b8351811015613281576132778285838151811061326a57fe5b6020026020010151613ecf565b9150600101613251565b50610e27613294825160c060ff16613f4c565b82613ecf565b6132a26143df565b60006132ac6143df565b6132b4614416565b6132c0612b9c86613be8565b90506000805b6132cf83613c57565b15612ca857806132f5576132e5612be784613c78565b6001600160a01b0316845261345d565b806001141561339657606061331161330c85613c78565b614044565b9050805160405190808252806020026020018201604052801561333e578160200160208202803683370190505b50602086015260005b815181101561338f5761336c82828151811061335f57fe5b6020026020010151613cc6565b8660200151828151811061337c57fe5b6020908102919091010152600101613347565b505061345d565b80600214156134385760606133ad61330c85613c78565b905080516040519080825280602002602001820160405280156133da578160200160208202803683370190505b50604086015260005b815181101561338f576134088282815181106133fb57fe5b6020026020010151613d7d565b8660400151828151811061341857fe5b6001600160a01b03909216602092830291909101909101526001016133e3565b8060031415612c9b5761344d612bc684613c78565b63ffffffff166060850152600191505b6001016132c6565b80516001600160a01b031661368f5760005b8160200151518110156136895760008260400151828151811061349657fe5b60200260200101516001600160a01b0316612710846020015184815181106134ba57fe5b60209081029190910101516040516000818181858888f193505050503d8060008114613502576040519150601f19603f3d011682016040523d82523d6000602084013e613507565b606091505b50509050806135ca577f203f9f67a785f4f81be4d48b109aa0c498d1bc8097ecc2627063f480cc5fe73e83600001518460400151848151811061354657fe5b60200260200101518560200151858151811061355e57fe5b6020026020010151866060015160405180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b031681526020018381526020018263ffffffff1663ffffffff16815260200194505050505060405180910390a1613680565b7fd468d4fa5e8fb4adc119b29a983fd0785e04af5cb8b7a3a69a47270c54b6901a83600001518460400151848151811061360057fe5b60200260200101518560200151858151811061361857fe5b6020026020010151866060015160405180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b031681526020018381526020018263ffffffff1663ffffffff16815260200194505050505060405180910390a15b50600101613477565b506138e6565b60005b8160200151518110156138e457600082600001516001600160a01b031663a9059cbb61c350856040015185815181106136c757fe5b6020026020010151866020015186815181106136df57fe5b60200260200101516040518463ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600088803b15801561373657600080fd5b5087f115801561374a573d6000803e3d6000fd5b50505050506040513d602081101561376157600080fd5b505190508015613825577fd468d4fa5e8fb4adc119b29a983fd0785e04af5cb8b7a3a69a47270c54b6901a8360000151846040015184815181106137a157fe5b6020026020010151856020015185815181106137b957fe5b6020026020010151866060015160405180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b031681526020018381526020018263ffffffff1663ffffffff16815260200194505050505060405180910390a16138db565b7f203f9f67a785f4f81be4d48b109aa0c498d1bc8097ecc2627063f480cc5fe73e83600001518460400151848151811061385b57fe5b60200260200101518560200151858151811061387357fe5b6020026020010151866060015160405180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b031681526020018381526020018263ffffffff1663ffffffff16815260200194505050505060405180910390a15b50600101613692565b505b50565b600081836139385760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561312f578181015183820152602001613117565b5082848161394257fe5b06949350505050565b613953614337565b600061395d614337565b613965614416565b613971612b9c86613be8565b90506000805b61398083613c57565b15612ca8578061399d57613996612bc684613c78565b8452613ba7565b80600114156139c5576139b2612be784613c78565b6001600160a01b03166020850152613ba7565b8060021415613a545760606139dc61330c85613c78565b90508051604051908082528060200260200182016040528015613a09578160200160208202803683370190505b50604086015260005b8151811015613a4d57613a2a82828151811061335f57fe5b86604001518281518110613a3a57fe5b6020908102919091010152600101613a12565b5050613ba7565b8060031415613ae9576060613a6b61330c85613c78565b90508051604051908082528060200260200182016040528015613a98578160200160208202803683370190505b50606086015260005b8151811015613a4d57613ab98282815181106133fb57fe5b86606001518281518110613ac957fe5b6001600160a01b0390921660209283029190910190910152600101613aa1565b8060041415613b7e576060613b0061330c85613c78565b90508051604051908082528060200260200182016040528015613b2d578160200160208202803683370190505b50608086015260005b8151811015613a4d57613b4e8282815181106133fb57fe5b86608001518281518110613b5e57fe5b6001600160a01b0390921660209283029190910190910152600101613b36565b8060051415612c9b57613b93612bc684613c78565b67ffffffffffffffff1660a0850152600191505b600101613977565b60006008821115613bd157612954836007198401600a0a63ffffffff61253e16565b6116b4836008849003600a0a63ffffffff6124fc16565b613bf0614436565b506040805180820190915281518152602082810190820152919050565b613c15614416565b613c1e82614115565b613c2757600080fd5b6000613c368360200151614145565b60208085015160408051808201909152868152920190820152915050919050565b6000613c61614436565b505080518051602091820151919092015191011190565b613c80614436565b613c8982613c57565b613c9257600080fd5b60208201516000613ca2826141a8565b80830160209586015260408051808201909152908152938401919091525090919050565b805160009015801590613cdb57508151602110155b613ce457600080fd5b6000613cf38360200151614145565b90508083600001511015613d4e576040805162461bcd60e51b815260206004820152601a60248201527f6c656e677468206973206c657373207468616e206f6666736574000000000000604482015290519081900360640190fd5b825160208085015183018051928490039291831015613d7457826020036101000a820491505b50949350505050565b8051600090601514613d8e57600080fd5b6116b782613cc6565b604080516020808252818301909252606091829190602082018180368337505050602081018490529050600067ffffffffffffffff198416613ddb57506018613dff565b6fffffffffffffffffffffffffffffffff198416613dfb57506010613dff565b5060005b6020811015613e3557818181518110613e1457fe5b01602001516001600160f81b03191615613e2d57613e35565b600101613dff565b60008160200390506060816040519080825280601f01601f191660200182016040528015613e6a576020820181803683370190505b5080830196909652508452509192915050565b606081516001148015613eaf5750607f60f81b82600081518110613e9d57fe5b01602001516001600160f81b03191611155b15613ebb575080610e53565b6116b7613ecd8351608060ff16613f4c565b835b6060806040519050835180825260208201818101602087015b81831015613f00578051835260209283019201613ee8565b50855184518101855292509050808201602086015b81831015613f2d578051835260209283019201613f15565b508651929092011591909101601f01601f191660405250905092915050565b6060680100000000000000008310613f9c576040805162461bcd60e51b815260206004820152600e60248201526d696e70757420746f6f206c6f6e6760901b604482015290519081900360640190fd5b60408051600180825281830190925260609160208201818036833701905050905060378411613ff65782840160f81b81600081518110613fd857fe5b60200101906001600160f81b031916908160001a90535090506116b7565b606061400185613d97565b90508381510160370160f81b8260008151811061401a57fe5b60200101906001600160f81b031916908160001a90535061403b8282613ecf565b95945050505050565b606061404f82614115565b61405857600080fd5b6000614063836142db565b90506060816040519080825280602002602001820160405280156140a157816020015b61408e614436565b8152602001906001900390816140865790505b50905060006140b38560200151614145565b60208601510190506000805b8481101561410a576140d0836141a8565b91506040518060400160405280838152602001848152508482815181106140f357fe5b6020908102919091010152918101916001016140bf565b509195945050505050565b805160009061412657506000610e53565b6020820151805160001a9060c0821015612a6e57600092505050610e53565b8051600090811a608081101561415f576000915050610e53565b60b881108061417a575060c0811080159061417a575060f881105b15614189576001915050610e53565b60c081101561419d5760b519019050610e53565b60f519019050610e53565b80516000908190811a60808110156141c357600191506142d4565b60b88110156141d857607e19810191506142d4565b60c081101561425257600060b78203600186019550806020036101000a86510491506001810182019350508083101561424c576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b506142d4565b60f88110156142675760be19810191506142d4565b600060f78203600186019550806020036101000a8651049150600181018201935050808310156142d2576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b505b5092915050565b80516000906142ec57506000610e53565b600080905060006143008460200151614145565b602085015185519181019250015b8082101561432e5761431f826141a8565b6001909301929091019061430e565b50909392505050565b6040518060c001604052806000801916815260200160006001600160a01b03168152602001606081526020016060815260200160608152602001600067ffffffffffffffff1681525090565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915290565b60408051608081018252600080825260208201819052918101829052606081019190915290565b604051806080016040528060006001600160a01b031681526020016060815260200160608152602001600063ffffffff1681525090565b6040518060400160405280614429614436565b8152602001600081525090565b60405180604001604052806000815260200160008152509056fe746865206d6573736167652073656e646572206d75737420626520696e63656e746976697a6520636f6e7472616374466f72206d696e69546f6b656e2c20746865207472616e7366657220616d6f756e74206d757374206e6f74206265206c657373207468616e2031756e7265636f676e697a6564207472616e736665724f75742073796e207061636b61676565787069726554696d65206d7573742062652074776f206d696e75746573206c61746572616d6f756e7420697320746f6f206c617267652c20657863656564206d6178696d756d206265703220746f6b656e20616d6f756e7474686520636f6e747261637420686173206e6f74206265656e20626f756e6420746f20616e79206265703220746f6b656e726563656976656420424e4220616d6f756e742073686f756c64206265206e6f206c657373207468616e207468652073756d206f66207472616e736665724f757420424e4220616d6f756e7420616e64206d696e696d756d2072656c6179466565616d6f756e7420697320746f6f206c617267652c2075696e74323536206f766572666c6f774c656e677468206f6620726563697069656e74416464727320646f65736e277420657175616c20746f206c656e677468206f6620726566756e644164647273696e76616c6964207472616e7366657220616d6f756e743a20707265636973696f6e206c6f737320696e20616d6f756e7420636f6e76657273696f6e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77726563656976656420424e4220616d6f756e742073686f756c64206265206e6f206c657373207468616e20746865206d696e696d756d2072656c6179466565746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e7472616374756e7265636f676e697a6564207472616e736665724f75742061636b207061636b6167654c656e677468206f6620726563697069656e74416464727320646f65736e277420657175616c20746f206c656e677468206f6620616d6f756e7473746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e7472616374746865206d73672073656e646572206d75737420626520746f6b656e4d616e6167657274686520636f6e7472616374206e6f7420696e69742079657400000000000000726563656976656420424e4220616d6f756e742073686f756c64206265206e6f206c657373207468616e207468652073756d206f66207472616e7366657220424e4220616d6f756e7420616e642072656c6179466565696e76616c696420726563656976656420424e4220616d6f756e743a20707265636973696f6e206c6f737320696e20616d6f756e7420636f6e76657273696f6ea2646970667358221220c72f4ad63f8f84b0b15ae9d71fffb0d09b3b3b97a728e64b385305ecb6431b0e64736f6c63430006040033", + }, + UpgradeConfig { + contract_addr: "0000000000000000000000000000000000001005", + code: "6080604052600436106102815760003560e01c8063930e1b091161014f578063bd4cc830116100c1578063e75d72c71161007a578063e75d72c7146107b5578063e89a3020146107e8578063f9a2bbc714610812578063fc3e590814610827578063fd6a68791461083c578063fdd31fcd1461085157610288565b8063bd4cc83014610722578063c81b16621461074c578063d0ab528a14610761578063dc927faf14610776578063dcae76ab1461078b578063e1c7392a146107a057610288565b8063a78abc1611610113578063a78abc16146105d3578063a7c6a59d146105e8578063ab51bb96146105fd578063ac43175114610612578063ace9fcc2146106e3578063af400681146106f857610288565b8063930e1b091461054c57806396713da91461057f5780639dc0926214610594578063a1a11bf5146105a9578063a3c3c0ad146105be57610288565b806343756e5c116101f35780636f93d2e6116101ac5780636f93d2e61461048457806370fd5bad146104e357806374f2272d146104f857806375d47a0a1461050d5780637942fd05146105225780637e146cc51461053757610288565b806343756e5c146103ef578063493279b1146104045780634bf6c8821461043057806351e8067214610445578063541333071461045a5780636e47b4821461046f57610288565b806312950c461161024557806312950c46146103215780631b20087c146103365780631c6433121461034b5780633a9756121461028d5780633dffc3871461039157806340bb43c0146103bc57610288565b8063081e9d131461028d57806308f2ec06146102b4578063093f2fc4146102c95780630bee7a67146102de57806310e06a761461030c57610288565b3661028857005b600080fd5b34801561029957600080fd5b506102a2610884565b60408051918252519081900360200190f35b3480156102c057600080fd5b506102a2610889565b3480156102d557600080fd5b506102a261088e565b3480156102ea57600080fd5b506102f3610893565b6040805163ffffffff9092168252519081900360200190f35b34801561031857600080fd5b506102a2610898565b34801561032d57600080fd5b506102a261089e565b34801561034257600080fd5b506102a26108a4565b34801561035757600080fd5b506103756004803603602081101561036e57600080fd5b50356108aa565b604080516001600160a01b039092168252519081900360200190f35b34801561039d57600080fd5b506103a6610884565b6040805160ff9092168252519081900360200190f35b3480156103c857600080fd5b506102a2600480360360208110156103df57600080fd5b50356001600160a01b03166108d1565b3480156103fb57600080fd5b506103756108e3565b34801561041057600080fd5b506104196108e9565b6040805161ffff9092168252519081900360200190f35b34801561043c57600080fd5b506103a66108ee565b34801561045157600080fd5b506103756108f3565b34801561046657600080fd5b506102a2610893565b34801561047b57600080fd5b506103756108f9565b34801561049057600080fd5b506104cf600480360360808110156104a757600080fd5b506001600160a01b0381358116916020810135909116906040810135906060013515156108ff565b604080519115158252519081900360200190f35b3480156104ef57600080fd5b506103a6610d91565b34801561050457600080fd5b506102a2610d96565b34801561051957600080fd5b50610375610d9c565b34801561052e57600080fd5b506103a6610da2565b34801561054357600080fd5b506102a2610da7565b34801561055857600080fd5b506102a26004803603602081101561056f57600080fd5b50356001600160a01b0316610dac565b34801561058b57600080fd5b506103a6610dbe565b3480156105a057600080fd5b50610375610dc3565b3480156105b557600080fd5b50610375610dc9565b3480156105ca57600080fd5b506102a2610dcf565b3480156105df57600080fd5b506104cf610dd5565b3480156105f457600080fd5b506102a2610dde565b34801561060957600080fd5b506102f3610de4565b34801561061e57600080fd5b506106e16004803603604081101561063557600080fd5b81019060208101813564010000000081111561065057600080fd5b82018360208201111561066257600080fd5b8035906020019184600183028401116401000000008311171561068457600080fd5b9193909290916020810190356401000000008111156106a257600080fd5b8201836020820111156106b457600080fd5b803590602001918460018302840111640100000000831117156106d657600080fd5b509092509050610de9565b005b3480156106ef57600080fd5b506102a2611537565b34801561070457600080fd5b506102a26004803603602081101561071b57600080fd5b503561153d565b34801561072e57600080fd5b506102a26004803603602081101561074557600080fd5b5035611598565b34801561075857600080fd5b506103756115b1565b34801561076d57600080fd5b506102a26115b7565b34801561078257600080fd5b506103756115bd565b34801561079757600080fd5b506102a26115c3565b3480156107ac57600080fd5b506106e16115c9565b3480156107c157600080fd5b506106e1600480360360208110156107d857600080fd5b50356001600160a01b0316611692565b3480156107f457600080fd5b506103756004803603602081101561080b57600080fd5b50356117eb565b34801561081e57600080fd5b506103756117f8565b34801561083357600080fd5b506103a66117fe565b34801561084857600080fd5b50610375611803565b34801561085d57600080fd5b506102a26004803603602081101561087457600080fd5b50356001600160a01b0316611809565b600181565b602881565b605081565b606481565b600b5481565b60015481565b600c5481565b600681815481106108b757fe5b6000918252602090912001546001600160a01b0316905081565b60076020526000908152604090205481565b61100181565b603881565b600881565b61200081565b61100581565b6000805460ff16610957576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e7472616374206e6f7420696e69742079657400000000000000604482015290519081900360640190fd5b33612000146109975760405162461bcd60e51b815260040180806020018281038252602f815260200180612377602f913960400191505060405180910390fd5b60008215610a4a576110026001600160a01b0316639a99b4f06110056109c8600e548861181b90919063ffffffff16565b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015610a1757600080fd5b505af1158015610a2b573d6000803e3d6000fd5b505050506040513d6020811015610a4157600080fd5b50519050610b59565b604080516309a99b4f60e41b8152611005600482015260248101869052905161100491639a99b4f09160448083019260209291908290030181600087803b158015610a9457600080fd5b505af1158015610aa8573d6000803e3d6000fd5b505050506040513d6020811015610abe57600080fd5b5051600e5490915015610b5957600e54604080516309a99b4f60e41b81526110056004820152602481019290925251610b569161100291639a99b4f0916044808201926020929091908290030181600087803b158015610b1d57600080fd5b505af1158015610b31573d6000803e3d6000fd5b505050506040513d6020811015610b4757600080fd5b5051829063ffffffff61181b16565b90505b600c805460010190556000610b6d8261187e565b600954909150610b83908263ffffffff61181b16565b600955600a54610bab908290610b9f908563ffffffff61181b16565b9063ffffffff6118a716565b600a556001600160a01b038716600090815260056020526040902054610c1757600680546001810182556000919091527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0180546001600160a01b0319166001600160a01b0389161790555b6001600160a01b038088166000908152600560209081526040808320805460010190559289168252600790522054610c9557600880546001810182556000919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30180546001600160a01b0319166001600160a01b0388161790555b6001600160a01b038616600090815260076020526040902080546001019055600c54606411610d8457600b54600954600a5460408051938452602084019290925282820152517f2649b1b772a1a74bd332a67695e285317dd722941166595741c60a00fa65bb759181900360600190a16000610d0f6118e9565b90506000610d1b611bcd565b6001600160a01b0389166000908152600d6020526040902054909150610d59908290610d4d908563ffffffff61181b16565b9063ffffffff61181b16565b6001600160a01b0389166000908152600d6020526040812091909155600b80546001019055600c5550505b5060019695505050505050565b600281565b60035481565b61100881565b600b81565b600581565b60056020526000908152604090205481565b600981565b61100781565b61100681565b600a5481565b60005460ff1681565b60045481565b600081565b3361100714610e295760405162461bcd60e51b815260040180806020018281038252602e8152602001806122bc602e913960400191505060405180910390fd5b60005460ff16610e6a5760405162461bcd60e51b81526004018080602001828103825260218152602001806122ea6021913960400191505060405180910390fd5b610ede84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601f81527f68656164657252656c61796572526577617264526174654d6f6c6563756c650060208201529150611e4b9050565b15610fab5760208114610f225760405162461bcd60e51b81526004018080602001828103825260328152602001806123a66032913960400191505060405180910390fd5b604080516020601f8401819004810282018101909252828152600091610f6091858580838501838280828437600092019190915250611f3292505050565b9050600254811115610fa35760405162461bcd60e51b81526004018080602001828103825260608152602001806121956060913960600191505060405180910390fd5b6001556114a5565b61100484848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051606081019091526022808252909250905061229a6020830139611e4b565b156110dc57602081146110485760405162461bcd60e51b815260040180806020018281038252602e81526020018061224b602e913960400191505060405180910390fd5b604080516020601f840181900481028201810190925282815260009161108691858580838501838280828437600092019190915250611f3292505050565b9050801580159061109957506001548110155b6110d45760405162461bcd60e51b815260040180806020018281038252606c81526020018061230b606c913960800191505060405180910390fd5b6002556114a5565b61115084848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601a81527f63616c6c6572436f6d70656e736174696f6e4d6f6c6563756c6500000000000060208201529150611e4b9050565b1561121d57602081146111945760405162461bcd60e51b815260040180806020018281038252602e81526020018061224b602e913960400191505060405180910390fd5b604080516020601f84018190048102820181019092528281526000916111d291858580838501838280828437600092019190915250611f3292505050565b90506004548111156112155760405162461bcd60e51b81526004018080602001828103825260568152602001806121f56056913960600191505060405180910390fd5b6003556114a5565b61129184848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601d81527f63616c6c6572436f6d70656e736174696f6e44656e6f6d696e61746f7200000060208201529150611e4b9050565b1561136957602081146112d55760405162461bcd60e51b815260040180806020018281038252602e81526020018061224b602e913960400191505060405180910390fd5b604080516020601f840181900481028201810190925282815260009161131391858580838501838280828437600092019190915250611f3292505050565b9050801580159061132657506003548110155b6113615760405162461bcd60e51b81526004018080602001828103825260618152602001806121066061913960800191505060405180910390fd5b6004556114a5565b6113dd84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601b81527f64796e616d69634578747261496e63656e74697665416d6f756e74000000000060208201529150611e4b9050565b1561146857602081146114215760405162461bcd60e51b815260040180806020018281038252602e815260200180612167602e913960400191505060405180910390fd5b604080516020601f840181900481028201810190925282815260009161145f91858580838501838280828437600092019190915250611f3292505050565b600e55506114a5565b6040805162461bcd60e51b815260206004820152600d60248201526c756e6b6e6f776e20706172616d60981b604482015290519081900360640190fd5b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a848484846040518080602001806020018381038352878782818152602001925080828437600083820152601f01601f191690910184810383528581526020019050858580828437600083820152604051601f909101601f19169092018290039850909650505050505050a150505050565b60025481565b60006028821161154e575080611593565b81602810801561155f575060508211155b1561156c57506028611593565b60508211801561157d5750606e8211155b1561158d57506078819003611593565b50600481045b919050565b6000602882116115a9575080611593565b506028611593565b61100281565b600e5481565b61100381565b60095481565b60005460ff1615611621576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b60005460ff161561166f576040805162461bcd60e51b8152602060048201526013602482015272185b1c9958591e481a5b9a5d1a585b1a5e9959606a1b604482015290519081900360640190fd5b60018080556005600255600381905560506004556000805460ff19169091179055565b6001600160a01b0381166000908152600d6020526040902054806116f1576040805162461bcd60e51b81526020600482015260116024820152701b9bc81c995b185e595c881c995dd85c99607a1b604482015290519081900360640190fd5b6001600160a01b0382166000818152600d60205260408082208290555184929184156108fc02918591818181858888f193505050506117a15760405161100290819084156108fc029085906000818181858888f1935050505015801561175b573d6000803e3d6000fd5b506040805161100281526020810185905281517f24502838a334c8f2bb2ee1f8262a4fa7183e4489a717e96cc824e325f8b39e11929181900390910190a15050506117e8565b604080516001600160a01b03851681526020810184905281517f24502838a334c8f2bb2ee1f8262a4fa7183e4489a717e96cc824e325f8b39e11929181900390910190a150505b50565b600881815481106108b757fe5b61100081565b600381565b61100481565b600d6020526000908152604090205481565b600082820183811015611875576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b90505b92915050565b600061187860025461189b60015485611f3790919063ffffffff16565b9063ffffffff611f9016565b600061187583836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611fd2565b600954600680546040805160208084028201810190925282815260009493859360609383018282801561194557602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611927575b5050505050905060608151604051908082528060200260200182016040528015611979578160200160208202803683370190505b50905060005b8251811015611a0657600083828151811061199657fe5b6020026020010151905060006119d060056000846001600160a01b03166001600160a01b0316815260200190815260200160002054611598565b9050808484815181106119df57fe5b60209081029190910101526119fa868263ffffffff61181b16565b9550505060010161197f565b506000611a2460045461189b60035488611f3790919063ffffffff16565b9050611a36858263ffffffff6118a716565b94508460015b8451811015611b0d576000611a718761189b8a888681518110611a5b57fe5b6020026020010151611f3790919063ffffffff16565b9050611abe81600d6000898681518110611a8757fe5b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000205461181b90919063ffffffff16565b600d6000888581518110611ace57fe5b6020908102919091018101516001600160a01b0316825281019190915260400160002055611b02838263ffffffff6118a716565b925050600101611a3c565b50611b2381600d600087600081518110611a8757fe5b600d600086600081518110611b3457fe5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002081905550600060098190555060008090505b8451811015611bb55760056000868381518110611b8757fe5b6020908102919091018101516001600160a01b03168252810191909152604001600090812055600101611b6e565b50611bc2600660006120ce565b509450505050505b90565b600a546008805460408051602080840282018101909252828152600094938593606093830182828015611c2957602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611c0b575b5050505050905060608151604051908082528060200260200182016040528015611c5d578160200160208202803683370190505b50905060005b8251811015611cdc576000838281518110611c7a57fe5b602002602001015190506000611cb460076000846001600160a01b03166001600160a01b031681526020019081526020016000205461153d565b905080848481518110611cc357fe5b6020908102919091010152949094019350600101611c63565b506000611cfa60045461189b60035488611f3790919063ffffffff16565b9050611d0c858263ffffffff6118a716565b94508460015b8451811015611d96576000611d318761189b8a888681518110611a5b57fe5b9050611d4781600d6000898681518110611a8757fe5b600d6000888581518110611d5757fe5b6020908102919091018101516001600160a01b0316825281019190915260400160002055611d8b838263ffffffff6118a716565b925050600101611d12565b50611dac81600d600087600081518110611a8757fe5b600d600086600081518110611dbd57fe5b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020819055506000600a8190555060008090505b8451811015611e3e5760076000868381518110611e1057fe5b6020908102919091018101516001600160a01b03168252810191909152604001600090812055600101611df7565b50611bc2600860006120ce565b6000816040516020018082805190602001908083835b60208310611e805780518252601f199092019160209182019101611e61565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120836040516020018082805190602001908083835b60208310611eee5780518252601f199092019160209182019101611ecf565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040528051906020012014905092915050565b015190565b600082611f4657506000611878565b82820282848281611f5357fe5b04146118755760405162461bcd60e51b81526004018080602001828103825260218152602001806122796021913960400191505060405180910390fd5b600061187583836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612069565b600081848411156120615760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561202657818101518382015260200161200e565b50505050905090810190601f1680156120535780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600081836120b85760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561202657818101518382015260200161200e565b5060008385816120c457fe5b0495945050505050565b50805460008255906000526020600020908101906117e89190611bca91905b8082111561210157600081556001016120ed565b509056fe746865206e657743616c6c6572436f6d70656e736174696f6e44656e6f6d696e61746f72206d757374206e6f74206265207a65726f20616e64206e6f206c657373207468616e2063616c6c6572436f6d70656e736174696f6e4d6f6c6563756c656c656e677468206f662064796e616d69634578747261496e63656e74697665416d6f756e74206d69736d617463686e65772068656164657252656c61796572526577617264526174654d6f6c6563756c652073686f756c646e27742062652067726561746572207468616e2068656164657252656c617965725265776172645261746544656e6f6d696e61746f726e65772063616c6c6572436f6d70656e736174696f6e4d6f6c6563756c652073686f756c646e27742062652067726561746572207468616e2063616c6c6572436f6d70656e736174696f6e44656e6f6d696e61746f726c656e677468206f6620726577617264466f7256616c696461746f725365744368616e6765206d69736d61746368536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7768656164657252656c617965725265776172645261746544656e6f6d696e61746f72746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e7472616374636f6e747261637420686173206e6f74206265656e20696e697469616c697a6564746865206e65772068656164657252656c617965725265776172645261746544656e6f6d696e61746f72206d757374206e6f74206265207a65726f20616e64206e6f206c657373207468616e2068656164657252656c61796572526577617264526174654d6f6c6563756c65746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e74726163746c656e677468206f662068656164657252656c61796572526577617264526174654d6f6c6563756c65206d69736d61746368a2646970667358221220ed761a0a8bb4eac3f5f94897efb6059f8cb261a19ed73bef336cbc05af2a532064736f6c63430006040033", + }, + ], + ), + ( + 97, + vec![ + UpgradeConfig { + contract_addr: "0000000000000000000000000000000000001008", + code: "6080604052600436106103815760003560e01c80637d078e13116101d1578063b795031711610102578063d9e6dae9116100a0578063fa9e91591161006f578063fa9e915914610d38578063fc3e5908146105b2578063fd6a687914610d4d578063fe3a2af514610d6257610381565b8063d9e6dae9146106fc578063dc927faf14610cf9578063e605bca014610d0e578063f9a2bbc714610d2357610381565b8063c8509d81116100dc578063c8509d8114610bdf578063c8e704a4146105b2578063d117a11014610c64578063d7109ce614610ce457610381565b8063b79503171461073b578063bd32d3f9146104d9578063c81b166214610bca57610381565b80639a854bbd1161016f578063a78abc1611610149578063a78abc1614610ad5578063ab51bb9614610aea578063ab67a4851461073b578063ac43175114610aff57610381565b80639a854bbd14610a965780639dc0926214610aab578063a1a11bf514610ac057610381565b8063859180fb116101ab578063859180fb146106e757806394553a4e14610a3757806395b9ad2614610a6c57806396713da914610a8157610381565b80637d078e13146104ee5780637ec816dd1461099b578063831d65d1146109b057610381565b8063493279b1116102b657806366dea52a1161025457806372c4e0861161022357806372c4e0861461081957806375d47a0a146108bd57806377d9dae8146108d25780637942fd051461098657610381565b806366dea52a1461073b5780636b3f1307146107505780636e47b4821461080457806370fd5bad1461073b57610381565b806351e806721161029057806351e80672146107115780635d499b1b146107265780635f558f861461073b57806361368475146106fc57610381565b8063493279b1146106bb5780634bc81c00146106e75780634bf6c882146106fc57610381565b80632e02d77611610323578063401809f9116102fd578063401809f9146105b257806343756e5c146105c7578063445fcefe146105f8578063487c88ac146104ee57610381565b80632e02d7761461054c57806337e6ecda1461057f5780633dffc387146104ee57610381565b80631f91600b1161035f5780631f91600b146104d957806323996b53146104ee57806325c751b7146105035780632d89ac32146104ee57610381565b80630bee7a67146103865780630f212b1b146103b45780631182b875146103df575b600080fd5b34801561039257600080fd5b5061039b610d77565b6040805163ffffffff9092168252519081900360200190f35b3480156103c057600080fd5b506103c9610d7c565b6040805160ff9092168252519081900360200190f35b3480156103eb57600080fd5b506104646004803603604081101561040257600080fd5b60ff8235169190810190604081016020820135600160201b81111561042657600080fd5b82018360208201111561043857600080fd5b803590602001918460018302840111600160201b8311171561045957600080fd5b509092509050610d81565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561049e578181015183820152602001610486565b50505050905090810190601f1680156104cb5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156104e557600080fd5b506103c9610e9b565b3480156104fa57600080fd5b506103c9610ea0565b6105386004803603604081101561051957600080fd5b5080356001600160a01b031690602001356001600160401b0316610ea5565b604080519115158252519081900360200190f35b34801561055857600080fd5b506105386004803603602081101561056f57600080fd5b50356001600160a01b03166113f1565b34801561058b57600080fd5b50610538600480360360208110156105a257600080fd5b50356001600160a01b0316611406565b3480156105be57600080fd5b506103c961141b565b3480156105d357600080fd5b506105dc611420565b604080516001600160a01b039092168252519081900360200190f35b34801561060457600080fd5b506106a96004803603602081101561061b57600080fd5b810190602081018135600160201b81111561063557600080fd5b82018360208201111561064757600080fd5b803590602001918460018302840111600160201b8311171561066857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611426945050505050565b60408051918252519081900360200190f35b3480156106c757600080fd5b506106d0611584565b6040805161ffff9092168252519081900360200190f35b3480156106f357600080fd5b506103c9611589565b34801561070857600080fd5b506103c961158e565b34801561071d57600080fd5b506105dc611593565b34801561073257600080fd5b506106a9611599565b34801561074757600080fd5b506103c96115a2565b6105386004803603604081101561076657600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561079057600080fd5b8201836020820111156107a257600080fd5b803590602001918460018302840111600160201b831117156107c357600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506115a7945050505050565b34801561081057600080fd5b506105dc611e7d565b6105386004803603602081101561082f57600080fd5b810190602081018135600160201b81111561084957600080fd5b82018360208201111561085b57600080fd5b803590602001918460018302840111600160201b8311171561087c57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611e83945050505050565b3480156108c957600080fd5b506105dc6122cf565b610538600480360360408110156108e857600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561091257600080fd5b82018360208201111561092457600080fd5b803590602001918460018302840111600160201b8311171561094557600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506122d5945050505050565b34801561099257600080fd5b506103c96127db565b3480156109a757600080fd5b506106a96127e0565b3480156109bc57600080fd5b50610a35600480360360408110156109d357600080fd5b60ff8235169190810190604081016020820135600160201b8111156109f757600080fd5b820183602082011115610a0957600080fd5b803590602001918460018302840111600160201b83111715610a2a57600080fd5b5090925090506127e6565b005b61053860048036036040811015610a4d57600080fd5b5080356001600160a01b031690602001356001600160401b0316612935565b348015610a7857600080fd5b506103c961332c565b348015610a8d57600080fd5b506103c9613331565b348015610aa257600080fd5b506106a9613336565b348015610ab757600080fd5b506105dc613342565b348015610acc57600080fd5b506105dc613348565b348015610ae157600080fd5b5061053861334e565b348015610af657600080fd5b5061039b613357565b348015610b0b57600080fd5b50610a3560048036036040811015610b2257600080fd5b810190602081018135600160201b811115610b3c57600080fd5b820183602082011115610b4e57600080fd5b803590602001918460018302840111600160201b83111715610b6f57600080fd5b919390929091602081019035600160201b811115610b8c57600080fd5b820183602082011115610b9e57600080fd5b803590602001918460018302840111600160201b83111715610bbf57600080fd5b50909250905061335c565b348015610bd657600080fd5b506105dc613631565b348015610beb57600080fd5b50610a3560048036036040811015610c0257600080fd5b60ff8235169190810190604081016020820135600160201b811115610c2657600080fd5b820183602082011115610c3857600080fd5b803590602001918460018302840111600160201b83111715610c5957600080fd5b509092509050613637565b348015610c7057600080fd5b50610c8e60048036036020811015610c8757600080fd5b503561370d565b6040805160ff988916815260208101979097526001600160a01b03909516868601526060860193909352608085019190915290931660a08301526001600160401b0390921660c082015290519081900360e00190f35b348015610cf057600080fd5b506106a9613764565b348015610d0557600080fd5b506105dc613769565b348015610d1a57600080fd5b506106a961376f565b348015610d2f57600080fd5b506105dc613775565b348015610d4457600080fd5b506106a961377b565b348015610d5957600080fd5b506105dc613781565b348015610d6e57600080fd5b506103c9613357565b606481565b600681565b60603361200014610dc35760405162461bcd60e51b815260040180806020018281038252602f815260200180615b89602f913960400191505060405180910390fd5b60ff841660011415610e1557610e0e83838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061378792505050565b9050610e94565b7f41ce201247b6ceb957dcdb217d0b8acb50b9ea0e12af9af4f5e7f38902101605848484604051808460ff1660ff168152602001806020018281038252848482818152602001925080828437600083820152604051601f909101601f1916909201829003965090945050505050a1506040805160008152602081019091525b9392505050565b600481565b600181565b6040805163bd46646160e01b81526001600160a01b0384166004820152905160009182916110049163bd466461916024808301926020929190829003018186803b158015610ef257600080fd5b505afa158015610f06573d6000803e3d6000fd5b505050506040513d6020811015610f1c57600080fd5b5051905080610f5e576040805162461bcd60e51b81526020600482015260096024820152681b9bdd08189bdd5b9960ba1b604482015290519081900360640190fd5b6001600160a01b03841660009081526003602052604090205460ff16610fc1576040805162461bcd60e51b81526020600482015260136024820152723737ba103137bab73210313c9036b4b93937b960691b604482015290519081900360640190fd5b60006110046001600160a01b031663149d14d96040518163ffffffff1660e01b815260040160206040518083038186803b158015610ffe57600080fd5b505afa158015611012573d6000803e3d6000fd5b505050506040513d602081101561102857600080fd5b505190506402540be4003406158015611053575060055461104f908263ffffffff613a1716565b3410155b61108e5760405162461bcd60e51b8152600401808060200182810382526046815260200180615b156046913960600191505060405180910390fd5b42607801846001600160401b0316101580156110b85750426201518001846001600160401b031611155b6110f35760405162461bcd60e51b8152600401808060200182810382526038815260200180615a126038913960400191505060405180910390fd5b6000856001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561112e57600080fd5b505afa158015611142573d6000803e3d6000fd5b505050506040513d602081101561115857600080fd5b50516040805163313ce56760e01b815290519192506000916001600160a01b0389169163313ce567916004808301926020929190829003018186803b1580156111a057600080fd5b505afa1580156111b4573d6000803e3d6000fd5b505050506040513d60208110156111ca57600080fd5b50519050677ce66c50e28400006111e48360ff8416613a71565b1115611230576040805162461bcd60e51b8152602060048201526016602482015275746f6f206c6172676520746f74616c20737570706c7960501b604482015290519081900360640190fd5b600554611004906108fc9061124c90349063ffffffff613b0016565b6040518115909202916000818181858888f19350505050158015611274573d6000803e3d6000fd5b5061127d615869565b6040518060c00160405280336001600160a01b03168152602001896001600160a01b031681526020018681526020018481526020016112cc6402540be400600554613b4290919063ffffffff16565b81526001600160401b038916602090910152905061200063f7a251d760056112f384613b84565b61131d6402540be40061131160055434613b0090919063ffffffff16565b9063ffffffff613b4216565b6040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b8381101561137b578181015183820152602001611363565b50505050905090810190601f1680156113a85780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b1580156113c957600080fd5b505af11580156113dd573d6000803e3d6000fd5b505050506001955050505050505b92915050565b60036020526000908152604090205460ff1681565b60026020526000908152604090205460ff1681565b600381565b61100181565b602081015160009061143661589e565b50600081815260016020818152604092839020835160e081018552815460ff9081168252938201549281019290925260028101546001600160a01b031693820184905260038101546060830152600481015460808301526005015491821660a08201526101009091046001600160401b031660c0820152906114bd5760009250505061157f565b600081604001516001600160a01b03166370a082316110046040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561151b57600080fd5b505afa15801561152f573d6000803e3d6000fd5b505050506040513d602081101561154557600080fd5b5051608083015160608401519192506000916115669163ffffffff613b0016565b9050611578818363ffffffff613b0016565b9450505050505b919050565b606181565b600581565b600881565b61200081565b6402540be40081565b600281565b6001600160a01b03821660009081526002602052604081205460ff16156115ff5760405162461bcd60e51b815260040180806020018281038252602b815260200180615bb8602b913960400191505060405180910390fd5b600061160a83613cb9565b905061161461589e565b50600081815260016020818152604092839020835160e081018552815460ff90811682529382015492810183905260028201546001600160a01b03169481019490945260038101546060850152600481015460808501526005015491821660a08401526101009091046001600160401b031660c08301526116d9576040805162461bcd60e51b815260206004820152601a602482015279189a5b99081c995c5d595cdd08191bd95cdb89dd08195e1a5cdd60321b604482015290519081900360640190fd5b60006116f682608001518360600151613b0090919063ffffffff16565b905081604001516001600160a01b0316866001600160a01b03161461174c5760405162461bcd60e51b8152600401808060200182810382526045815260200180615a816045913960600191505060405180910390fd5b336001600160a01b0316866001600160a01b031663893d20e86040518163ffffffff1660e01b815260040160206040518083038186803b15801561178f57600080fd5b505afa1580156117a3573d6000803e3d6000fd5b505050506040513d60208110156117b957600080fd5b50516001600160a01b0316146118005760405162461bcd60e51b815260040180806020018281038252602e8152602001806159e4602e913960400191505060405180910390fd5b604080516370a0823160e01b8152611004600482015290516000916001600160a01b038916916370a0823191602480820192602092909190829003018186803b15801561184c57600080fd5b505afa158015611860573d6000803e3d6000fd5b505050506040513d602081101561187657600080fd5b505160408051636eb1769f60e11b8152336004820152306024820152905191925083916119079184916001600160a01b038c169163dd62ed3e916044808301926020929190829003018186803b1580156118cf57600080fd5b505afa1580156118e3573d6000803e3d6000fd5b505050506040513d60208110156118f957600080fd5b50519063ffffffff613a1716565b101561195a576040805162461bcd60e51b815260206004820152601760248201527f616c6c6f77616e6365206973206e6f7420656e6f756768000000000000000000604482015290519081900360640190fd5b600034905060006110046001600160a01b031663149d14d96040518163ffffffff1660e01b815260040160206040518083038186803b15801561199c57600080fd5b505afa1580156119b0573d6000803e3d6000fd5b505050506040513d60208110156119c657600080fd5b505190508082108015906119df57506402540be4008206155b611a1a5760405162461bcd60e51b8152600401808060200182810382526037815260200180615a4a6037913960400191505060405180910390fd5b6000611a26868b613cc0565b905063ffffffff8116611c25576001600160a01b038a166323b872dd33611004611a56898963ffffffff613b0016565b6040518463ffffffff1660e01b815260040180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b031681526020018281526020019350505050602060405180830381600087803b158015611abe57600080fd5b505af1158015611ad2573d6000803e3d6000fd5b505050506040513d6020811015611ae857600080fd5b5050602086015160408088015160a089015182516323bfccdb60e21b815260048101949094526001600160a01b03909116602484015260ff1660448301525161100491638eff336c91606480830192600092919082900301818387803b158015611b5157600080fd5b505af1158015611b65573d6000803e3d6000fd5b50505050896001600160a01b03167f78e7dd9aefcdbf795c4936a66f7dc6d41bb56637b54f561a6bf7829dca3348a88a8860600151886040518080602001848152602001838152602001828103825285818151815260200191508051906020019080838360005b83811015611be4578181015183820152602001611bcc565b50505050905090810190601f168015611c115780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a2611cdd565b896001600160a01b03167f831c0ef4d93bda3bce08b69ae3f29ef1a6e052b833200988554158494405a1078a8360405180806020018363ffffffff1663ffffffff168152602001828103825284818151815260200191508051906020019080838360005b83811015611ca1578181015183820152602001611c89565b50505050905090810190601f168015611cce5780820380516001836020036101000a031916815260200191505b50935050505060405180910390a25b60008781526001602081905260408220805460ff191681559081018290556002810180546001600160a01b0319169055600381018290556004810191909155600501805468ffffffffffffffffff19169055611d376158da565b5060408051808201825263ffffffff831681526020810189905290516110049085156108fc029086906000818181858888f19350505050158015611d7f573d6000803e3d6000fd5b5061200063f7a251d76001611d938461411a565b611da8886402540be40063ffffffff613b4216565b6040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b83811015611e06578181015183820152602001611dee565b50505050905090810190601f168015611e335780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b158015611e5457600080fd5b505af1158015611e68573d6000803e3d6000fd5b5060019e9d5050505050505050505050505050565b61100581565b600080611e8f83613cb9565b9050611e9961589e565b50600081815260016020818152604092839020835160e081018552815460ff90811682529382015492810183905260028201546001600160a01b03169481019490945260038101546060850152600481015460808501526005015491821660a08401526101009091046001600160401b031660c0830152611f5e576040805162461bcd60e51b815260206004820152601a602482015279189a5b99081c995c5d595cdd08191bd95cdb89dd08195e1a5cdd60321b604482015290519081900360640190fd5b428160c001516001600160401b031610611fbf576040805162461bcd60e51b815260206004820152601b60248201527f62696e642072657175657374206973206e6f7420657870697265640000000000604482015290519081900360640190fd5b600034905060006110046001600160a01b031663149d14d96040518163ffffffff1660e01b815260040160206040518083038186803b15801561200157600080fd5b505afa158015612015573d6000803e3d6000fd5b505050506040513d602081101561202b57600080fd5b5051905080821080159061204457506402540be4008206155b61207f5760405162461bcd60e51b8152600401808060200182810382526037815260200180615a4a6037913960400191505060405180910390fd5b60008481526001602081905260408220805460ff191681559081018290556002810180546001600160a01b0319169055600381018290556004810191909155600501805468ffffffffffffffffff191690556120d96158da565b50604080518082018252600181526020810186905290516110049084156108fc029085906000818181858888f1935050505015801561211c573d6000803e3d6000fd5b5061200063f7a251d760016121308461411a565b612145876402540be40063ffffffff613b4216565b6040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b838110156121a357818101518382015260200161218b565b50505050905090810190601f1680156121d05780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b1580156121f157600080fd5b505af1158015612205573d6000803e3d6000fd5b5050505083604001516001600160a01b03167f831c0ef4d93bda3bce08b69ae3f29ef1a6e052b833200988554158494405a10788600160405180806020018360ff1663ffffffff168152602001828103825284818151815260200191508051906020019080838360005b8381101561228757818101518382015260200161226f565b50505050905090810190601f1680156122b45780820380516001836020036101000a031916815260200191505b50935050505060405180910390a25060019695505050505050565b61100881565b6000806122e183613cb9565b90506122eb61589e565b50600081815260016020818152604092839020835160e081018552815460ff90811682529382015492810183905260028201546001600160a01b03169481019490945260038101546060850152600481015460808501526005015491821660a08401526101009091046001600160401b031660c08301526123b0576040805162461bcd60e51b815260206004820152601a602482015279189a5b99081c995c5d595cdd08191bd95cdb89dd08195e1a5cdd60321b604482015290519081900360640190fd5b80604001516001600160a01b0316856001600160a01b0316146124045760405162461bcd60e51b8152600401808060200182810382526045815260200180615a816045913960600191505060405180910390fd5b336001600160a01b0316856001600160a01b031663893d20e86040518163ffffffff1660e01b815260040160206040518083038186803b15801561244757600080fd5b505afa15801561245b573d6000803e3d6000fd5b505050506040513d602081101561247157600080fd5b50516001600160a01b0316146124ce576040805162461bcd60e51b815260206004820152601b60248201527f6f6e6c79206265703230206f776e65722063616e2072656a6563740000000000604482015290519081900360640190fd5b600034905060006110046001600160a01b031663149d14d96040518163ffffffff1660e01b815260040160206040518083038186803b15801561251057600080fd5b505afa158015612524573d6000803e3d6000fd5b505050506040513d602081101561253a57600080fd5b5051905080821080159061255357506402540be4008206155b61258e5760405162461bcd60e51b8152600401808060200182810382526037815260200180615a4a6037913960400191505060405180910390fd5b60008481526001602081905260408220805460ff191681559081018290556002810180546001600160a01b0319169055600381018290556004810191909155600501805468ffffffffffffffffff191690556125e86158da565b50604080518082018252600781526020810186905290516110049084156108fc029085906000818181858888f1935050505015801561262b573d6000803e3d6000fd5b5061200063f7a251d7600161263f8461411a565b612654876402540be40063ffffffff613b4216565b6040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b838110156126b257818101518382015260200161269a565b50505050905090810190601f1680156126df5780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b15801561270057600080fd5b505af1158015612714573d6000803e3d6000fd5b50505050876001600160a01b03167f831c0ef4d93bda3bce08b69ae3f29ef1a6e052b833200988554158494405a10788600760405180806020018360ff1663ffffffff168152602001828103825284818151815260200191508051906020019080838360005b8381101561279257818101518382015260200161277a565b50505050905090810190601f1680156127bf5780820380516001836020036101000a031916815260200191505b50935050505060405180910390a2506001979650505050505050565b600b81565b60045481565b33612000146128265760405162461bcd60e51b815260040180806020018281038252602f815260200180615b89602f913960400191505060405180910390fd5b60ff8316600414156128765761287182828080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061419092505050565b612930565b60ff8316600514156128c15761287182828080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061443d92505050565b7f41ce201247b6ceb957dcdb217d0b8acb50b9ea0e12af9af4f5e7f38902101605838383604051808460ff1660ff168152602001806020018281038252848482818152602001925080828437600083820152604051601f909101601f1916909201829003965090945050505050a15b505050565b6040805163bd46646160e01b81526001600160a01b0384166004820152905160009182916110049163bd466461916024808301926020929190829003018186803b15801561298257600080fd5b505afa158015612996573d6000803e3d6000fd5b505050506040513d60208110156129ac57600080fd5b5051146129f0576040805162461bcd60e51b815260206004820152600d60248201526c185b1c9958591e48189bdd5b99609a1b604482015290519081900360640190fd5b6001600160a01b03831660009081526002602052604090205460ff1615612a4f576040805162461bcd60e51b815260206004820152600e60248201526d6d6972726f722070656e64696e6760901b604482015290519081900360640190fd5b60006110046001600160a01b031663149d14d96040518163ffffffff1660e01b815260040160206040518083038186803b158015612a8c57600080fd5b505afa158015612aa0573d6000803e3d6000fd5b505050506040513d6020811015612ab657600080fd5b505190506402540be4003406158015612ae15750600454612add908263ffffffff613a1716565b3410155b612b1c5760405162461bcd60e51b815260040180806020018281038252604d815260200180615997604d913960600191505060405180910390fd5b42607801836001600160401b031610158015612b465750426201518001836001600160401b031611155b612b815760405162461bcd60e51b8152600401808060200182810382526038815260200180615a126038913960400191505060405180910390fd5b6000846001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015612bbc57600080fd5b505afa158015612bd0573d6000803e3d6000fd5b505050506040513d6020811015612be657600080fd5b5051604080516318160ddd60e01b815290519192506000916001600160a01b038816916318160ddd916004808301926020929190829003018186803b158015612c2e57600080fd5b505afa158015612c42573d6000803e3d6000fd5b505050506040513d6020811015612c5857600080fd5b50519050677ce66c50e2840000612c728260ff8516613a71565b1115612cbe576040805162461bcd60e51b8152602060048201526016602482015275746f6f206c6172676520746f74616c20737570706c7960501b604482015290519081900360640190fd5b6060866001600160a01b03166306fdde036040518163ffffffff1660e01b815260040160006040518083038186803b158015612cf957600080fd5b505afa158015612d0d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015612d3657600080fd5b8101908080516040519392919084600160201b821115612d5557600080fd5b908301906020820185811115612d6a57600080fd5b8251600160201b811182820188101715612d8357600080fd5b82525081516020918201929091019080838360005b83811015612db0578181015183820152602001612d98565b50505050905090810190601f168015612ddd5780820380516001836020036101000a031916815260200191505b50604052505050905060608190506001815110158015612dff57506020815111155b612e50576040805162461bcd60e51b815260206004820152601d60248201527f6e616d65206c656e677468206d75737420626520696e205b312c33325d000000604482015290519081900360640190fd5b6060886001600160a01b03166395d89b416040518163ffffffff1660e01b815260040160006040518083038186803b158015612e8b57600080fd5b505afa158015612e9f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015612ec857600080fd5b8101908080516040519392919084600160201b821115612ee757600080fd5b908301906020820185811115612efc57600080fd5b8251600160201b811182820188101715612f1557600080fd5b82525081516020918201929091019080838360005b83811015612f42578181015183820152602001612f2a565b50505050905090810190601f168015612f6f5780820380516001836020036101000a031916815260200191505b5060405250508151919250829160021180159150612f8f57508051600810155b612fe0576040805162461bcd60e51b815260206004820152601e60248201527f73796d626f6c206c656e677468206d75737420626520696e205b322c385d0000604482015290519081900360640190fd5b60005b81518160ff16101561313457604160f81b828260ff168151811061300357fe5b01602001516001600160f81b031916108015906130415750602d60f91b828260ff168151811061302f57fe5b01602001516001600160f81b03191611155b806130995750606160f81b828260ff168151811061305b57fe5b01602001516001600160f81b031916108015906130995750603d60f91b828260ff168151811061308757fe5b01602001516001600160f81b03191611155b806130f15750600360fc1b828260ff16815181106130b357fe5b01602001516001600160f81b031916108015906130f15750603960f81b828260ff16815181106130df57fe5b01602001516001600160f81b03191611155b61312c5760405162461bcd60e51b815260040180806020018281038252602e815260200180615ac6602e913960400191505060405180910390fd5b600101612fe3565b50600454611004906108fc9061315190349063ffffffff613b0016565b6040518115909202916000818181858888f19350505050158015613179573d6000803e3d6000fd5b506001600160a01b038a166000908152600260209081526040909120805460ff1916600117905584810151908301516131b06158f1565b604051806101000160405280336001600160a01b031681526020018e6001600160a01b031681526020018481526020018381526020018981526020018a60ff16815260200161320f6402540be400600454613b4290919063ffffffff16565b81526001600160401b038e16602090910152905061200063f7a251d7600461323684614608565b6132546402540be40061131160045434613b0090919063ffffffff16565b6040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b838110156132b257818101518382015260200161329a565b50505050905090810190601f1680156132df5780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b15801561330057600080fd5b505af1158015613314573d6000803e3d6000fd5b5050505060019a505050505050505050505092915050565b600781565b600981565b677ce66c50e284000081565b61100781565b61100681565b60005460ff1681565b600081565b336110071461339c5760405162461bcd60e51b815260040180806020018281038252602e815260200180615b5b602e913960400191505060405180910390fd5b602081146133f1576040805162461bcd60e51b815260206004820152601860248201527f65787065637465642076616c7565206c656e6774682033320000000000000000604482015290519081900360640190fd5b606084848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f880181900481028201810190925286815293945060609392508691508590819084018382808284376000920191909152505050506020830151909150686d6972726f7246656560b81b8114156134e65760208201516402540be4008106156134de576040805162461bcd60e51b815260206004820152601a60248201527f6d6972726f72466565206d757374206265204e202a2031653130000000000000604482015290519081900360640190fd5b60045561359c565b6673796e6346656560c81b81141561355f5760208201516402540be400810615613557576040805162461bcd60e51b815260206004820152601860248201527f73796e63466565206d757374206265204e202a20316531300000000000000000604482015290519081900360640190fd5b60055561359c565b6040805162461bcd60e51b815260206004820152600d60248201526c756e6b6e6f776e20706172616d60981b604482015290519081900360640190fd5b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a878787876040518080602001806020018381038352878782818152602001925080828437600083820152601f01601f191690910184810383528581526020019050858580828437600083820152604051601f909101601f19169092018290039850909650505050505050a150505050505050565b61100281565b33612000146136775760405162461bcd60e51b815260040180806020018281038252602f815260200180615b89602f913960400191505060405180910390fd5b60ff8316600414156136c25761287182828080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061477a92505050565b60ff8316600514156128c15761287182828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506148b992505050565b600160208190526000918252604090912080549181015460028201546003830154600484015460059094015460ff9586169593946001600160a01b039093169391929181169061010090046001600160401b031687565b604d81565b61100381565b60055481565b61100081565b61271081565b61100481565b606061379161589e565b600061379c846149b3565b91509150806137f2576040805162461bcd60e51b815260206004820152601f60248201527f756e7265636f676e697a6564207472616e73666572496e207061636b61676500604482015290519081900360640190fd5b815160ff166138a5576020828101805160009081526001928390526040908190208551815460ff1990811660ff928316178355935194820194909455908501516002820180546001600160a01b0319166001600160a01b03909216919091179055606085015160038201556080850151600482015560a08501516005909101805460c08701519316919093161768ffffffffffffffff0019166101006001600160401b03909216919091021790556139fc565b815160ff16600114156139af5760006110046001600160a01b03166359b9278984602001516040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b1580156138fe57600080fd5b505afa158015613912573d6000803e3d6000fd5b505050506040513d602081101561392857600080fd5b505190506001600160a01b038116156139a95760208301516040805163b99328c560e01b815260048101929092526001600160a01b0383166024830152516110049163b99328c591604480830192600092919082900301818387803b15801561399057600080fd5b505af11580156139a4573d6000803e3d6000fd5b505050505b506139fc565b6040805162461bcd60e51b815260206004820152601960248201527f756e7265636f676e697a65642062696e64207061636b61676500000000000000604482015290519081900360640190fd5b60408051600080825260208201909252905b50949350505050565b600082820183811015610e94576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60006008821115613ae957604d60071983011115613acb576040805162461bcd60e51b8152602060048201526012602482015271746f6f206c6172676520646563696d616c7360701b604482015290519081900360640190fd5b613ae2836007198401600a0a63ffffffff613b4216565b90506113eb565b610e94836008849003600a0a63ffffffff614b0416565b6000610e9483836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250614b5d565b6000610e9483836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250614bf4565b60408051600680825260e08201909252606091829190816020015b6060815260200190600190039081613b9f5750508351909150613bca906001600160a01b0316614c59565b81600081518110613bd757fe5b6020026020010181905250613bf883602001516001600160a01b0316614c59565b81600181518110613c0557fe5b6020026020010181905250613c20836040015160001c614c7c565b81600281518110613c2d57fe5b6020026020010181905250613c458360600151614c7c565b81600381518110613c5257fe5b6020026020010181905250613c6a8360800151614c7c565b81600481518110613c7757fe5b6020026020010181905250613c988360a001516001600160401b0316614c7c565b81600581518110613ca557fe5b6020026020010181905250610e9481614c8f565b6020015190565b600080826001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015613cfc57600080fd5b505afa158015613d10573d6000803e3d6000fd5b505050506040513d6020811015613d2657600080fd5b5051604080516395d89b4160e01b8152905160ff90921692506060916001600160a01b038616916395d89b41916004808301926000929190829003018186803b158015613d7257600080fd5b505afa158015613d86573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015613daf57600080fd5b8101908080516040519392919084600160201b821115613dce57600080fd5b908301906020820185811115613de357600080fd5b8251600160201b811182820188101715613dfc57600080fd5b82525081516020918201929091019080838360005b83811015613e29578181015183820152602001613e11565b50505050905090810190601f168015613e565780820380516001836020036101000a031916815260200191505b5060408181526370a0823160e01b82526110046004830152519495506000946001600160a01b038a1694506370a08231935060248083019350602092829003018186803b158015613ea657600080fd5b505afa158015613eba573d6000803e3d6000fd5b505050506040513d6020811015613ed057600080fd5b505160808701516060880151919250600091613ef19163ffffffff613b0016565b9050428760c001516001600160401b03161015613f165750600193506113eb92505050565b613f24838860200151614d19565b613f365750600293506113eb92505050565b80821115613f4c5750600393506113eb92505050565b866060015187604001516001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015613f8e57600080fd5b505afa158015613fa2573d6000803e3d6000fd5b505050506040513d6020811015613fb857600080fd5b505114613fcd5750600493506113eb92505050565b8660a0015160ff168414613fe95750600593506113eb92505050565b602080880151604080516359b9278960e01b8152600481019290925251600092611004926359b927899260248083019392829003018186803b15801561402e57600080fd5b505afa158015614042573d6000803e3d6000fd5b505050506040513d602081101561405857600080fd5b50516001600160a01b03161415806140fa57506000801b6110046001600160a01b031663bd46646189604001516040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b1580156140cb57600080fd5b505afa1580156140df573d6000803e3d6000fd5b505050506040513d60208110156140f557600080fd5b505114155b1561410d5750600693506113eb92505050565b5060009695505050505050565b6040805160028082526060828101909352829190816020015b6060815260200190600190039081614133575050835190915061415b9063ffffffff16614c7c565b8160008151811061416857fe5b6020026020010181905250614183836020015160001c614c7c565b81600181518110613ca557fe5b614198615869565b60006141a383614e01565b91509150806141f0576040805162461bcd60e51b8152602060048201526014602482015273756e7265636f676e697a6564207061636b61676560601b604482015290519081900360640190fd5b6020808301516001600160a01b03166000908152600290915260409020805460ff1916905560a082015160ff166143515760808201516040516110049180156108fc02916000818181858888f19350505050158015614253573d6000803e3d6000fd5b506110046001600160a01b0316638eff336c8360600151846020015185604001516040518463ffffffff1660e01b815260040180848152602001836001600160a01b03166001600160a01b031681526020018260ff1681526020019350505050600060405180830381600087803b1580156142cd57600080fd5b505af11580156142e1573d6000803e3d6000fd5b50505050602082810180516001600160a01b03908116600090815260038452604090819020805460ff1916600117905591516060860151835190815292519116927f41787d7db08fc5907641ee8343379f28215727eb123d4b462099afab4300b036928290030190a2505061443a565b815160808301516040516000926001600160a01b0316916127109184818181858888f193505050503d80600081146143a5576040519150601f19603f3d011682016040523d82523d6000602084013e6143aa565b606091505b50509050806143e75760808301516040516110029180156108fc02916000818181858888f193505050501580156143e5573d6000803e3d6000fd5b505b82602001516001600160a01b03167fefe400ad0042ebf81a245de9ae669616105e0ca9fc946352c085da0c2bc524e58460a00151604051808260ff1660ff16815260200191505060405180910390a25050505b50565b614445615935565b600061445083614f0e565b915091508061449d576040805162461bcd60e51b8152602060048201526014602482015273756e7265636f676e697a6564207061636b61676560601b604482015290519081900360640190fd5b606082015160ff1661451d5760408083015190516110049180156108fc02916000818181858888f193505050501580156144db573d6000803e3d6000fd5b5081602001516001600160a01b03167fbb7d3a9a559080d8281b0e4fb39dacbe2fdcafd5ef765e9a6ed871c9167dc60f60405160405180910390a2505061443a565b81602001516001600160a01b03167ff1e25fa536da84053644fd788b1d6a27ea6edd1f3af80c7d36ca253c4c82c9c38360600151604051808260ff1660ff16815260200191505060405180910390a2815160408084015190516000926001600160a01b0316916127109184818181858888f193505050503d80600081146145c0576040519150601f19603f3d011682016040523d82523d6000602084013e6145c5565b606091505b50509050806146025760408084015190516110029180156108fc02916000818181858888f19350505050158015614600573d6000803e3d6000fd5b505b50505050565b6040805160088082526101208201909252606091829190816020015b6060815260200190600190039081614624575050835190915061464f906001600160a01b0316614c59565b8160008151811061465c57fe5b602002602001018190525061467d83602001516001600160a01b0316614c59565b8160018151811061468a57fe5b60200260200101819052506146a5836040015160001c614c7c565b816002815181106146b257fe5b60200260200101819052506146cd836060015160001c614c7c565b816003815181106146da57fe5b60200260200101819052506146f28360800151614c7c565b816004815181106146ff57fe5b602002602001018190525061471a8360a0015160ff16614c7c565b8160058151811061472757fe5b602002602001018190525061473f8360c00151614c7c565b8160068151811061474c57fe5b602002602001018190525061476d8360e001516001600160401b0316614c7c565b81600781518110613ca557fe5b6147826158f1565b600061478d83614fda565b91509150806147da576040805162461bcd60e51b8152602060048201526014602482015273756e7265636f676e697a6564207061636b61676560601b604482015290519081900360640190fd5b6020808301516001600160a01b039081166000908152600290925260408220805460ff19169055835160c085015191169061271090614824906402540be40063ffffffff614b0416565b6040516000818181858888f193505050503d8060008114614861576040519150601f19603f3d011682016040523d82523d6000602084013e614866565b606091505b50509050806146025760c0830151611002906108fc90614891906402540be40063ffffffff614b0416565b6040518115909202916000818181858888f19350505050158015614600573d6000803e3d6000fd5b6148c1615869565b60006148cc8361512b565b9150915080614919576040805162461bcd60e51b8152602060048201526014602482015273756e7265636f676e697a6564207061636b61676560601b604482015290519081900360640190fd5b815160808301516000916001600160a01b03169061271090614946906402540be40063ffffffff614b0416565b6040516000818181858888f193505050503d8060008114614983576040519150601f19603f3d011682016040523d82523d6000602084013e614988565b606091505b5050905080614602576080830151611002906108fc90614891906402540be40063ffffffff614b0416565b6149bb61589e565b60006149c561589e565b6149cd61595c565b6149de6149d98661523b565b615260565b90506000805b6149ed836152aa565b15614af75780614a1257614a08614a03846152cb565b615319565b60ff168452614aef565b8060011415614a3157614a27614a03846152cb565b6020850152614aef565b8060021415614a5e57614a4b614a46846152cb565b6153ce565b6001600160a01b03166040850152614aef565b8060031415614a7d57614a73614a03846152cb565b6060850152614aef565b8060041415614a9c57614a92614a03846152cb565b6080850152614aef565b8060051415614abe57614ab1614a03846152cb565b60ff1660a0850152614aef565b8060061415614aea57614ad3614a03846152cb565b6001600160401b031660c085015260019150614aef565b614af7565b6001016149e4565b5091935090915050915091565b600082614b13575060006113eb565b82820282848281614b2057fe5b0414610e945760405162461bcd60e51b8152600401808060200182810382526021815260200180615af46021913960400191505060405180910390fd5b60008184841115614bec5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015614bb1578181015183820152602001614b99565b50505050905090810190601f168015614bde5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60008183614c435760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315614bb1578181015183820152602001614b99565b506000838581614c4f57fe5b0495945050505050565b60408051600560a21b8318601482015260348101909152606090610e94816153e8565b60606113eb614c8a8361543e565b6153e8565b6060815160001415614cb0575060408051600081526020810190915261157f565b606082600081518110614cbf57fe5b602002602001015190506000600190505b8351811015614d0057614cf682858381518110614ce957fe5b6020026020010151615524565b9150600101614cd0565b50610e94614d13825160c060ff166155a1565b82615524565b8151600090839060081080614d2f575080516002115b15614d3e5760009150506113eb565b60408051602080825281830190925260609160208201818036833701905050905083602082015280825181518110614d7257fe5b6020910101516001600160f81b031916602d60f81b14614d97576000925050506113eb565b600160005b8351811015614df757828181518110614db157fe5b602001015160f81c60f81b6001600160f81b031916848281518110614dd257fe5b01602001516001600160f81b03191614614def5760009150614df7565b600101614d9c565b5095945050505050565b614e09615869565b6000614e13615869565b614e1b61595c565b614e276149d98661523b565b90506000805b614e36836152aa565b15614af75780614e5c57614e4c614a46846152cb565b6001600160a01b03168452614f06565b8060011415614e8457614e71614a46846152cb565b6001600160a01b03166020850152614f06565b8060021415614ea657614e99614a03846152cb565b60ff166040850152614f06565b8060031415614ec557614ebb614a03846152cb565b6060850152614f06565b8060041415614ee457614eda614a03846152cb565b6080850152614f06565b8060051415614aea57614ef9614a03846152cb565b60ff1660a0850152600191505b600101614e2d565b614f16615935565b6000614f20615935565b614f2861595c565b614f346149d98661523b565b90506000805b614f43836152aa565b15614af75780614f6957614f59614a46846152cb565b6001600160a01b03168452614fd2565b8060011415614f9157614f7e614a46846152cb565b6001600160a01b03166020850152614fd2565b8060021415614fb057614fa6614a03846152cb565b6040850152614fd2565b8060031415614aea57614fc5614a03846152cb565b60ff166060850152600191505b600101614f3a565b614fe26158f1565b6000614fec6158f1565b614ff461595c565b6150006149d98661523b565b90506000805b61500f836152aa565b15614af7578061503557615025614a46846152cb565b6001600160a01b03168452615123565b806001141561505d5761504a614a46846152cb565b6001600160a01b03166020850152615123565b806002141561507c57615072614a03846152cb565b6040850152615123565b806003141561509b57615091614a03846152cb565b6060850152615123565b80600414156150ba576150b0614a03846152cb565b6080850152615123565b80600514156150dc576150cf614a03846152cb565b60ff1660a0850152615123565b80600614156150fb576150f1614a03846152cb565b60c0850152615123565b8060071415614aea57615110614a03846152cb565b6001600160401b031660e0850152600191505b600101615006565b615133615869565b600061513d615869565b61514561595c565b6151516149d98661523b565b90506000805b615160836152aa565b15614af7578061518657615176614a46846152cb565b6001600160a01b03168452615233565b80600114156151ae5761519b614a46846152cb565b6001600160a01b03166020850152615233565b80600214156151cd576151c3614a03846152cb565b6040850152615233565b80600314156151ec576151e2614a03846152cb565b6060850152615233565b806004141561520b57615201614a03846152cb565b6080850152615233565b8060051415614aea57615220614a03846152cb565b6001600160401b031660a0850152600191505b600101615157565b61524361597c565b506040805180820190915281518152602082810190820152919050565b61526861595c565b61527182615699565b61527a57600080fd5b600061528983602001516156d3565b60208085015160408051808201909152868152920190820152915050919050565b60006152b461597c565b505080518051602091820151919092015191011190565b6152d361597c565b6152dc826152aa565b6152e557600080fd5b602082015160006152f582615736565b80830160209586015260408051808201909152908152938401919091525090919050565b80516000901580159061532e57508151602110155b61533757600080fd5b600061534683602001516156d3565b905080836000015110156153a1576040805162461bcd60e51b815260206004820152601a60248201527f6c656e677468206973206c657373207468616e206f6666736574000000000000604482015290519081900360640190fd5b825160208085015183018051928490039291831015613a0e57506020919091036101000a90049392505050565b80516000906015146153df57600080fd5b6113eb82615319565b60608151600114801561541a5750607f60f81b8260008151811061540857fe5b01602001516001600160f81b03191611155b1561542657508061157f565b6113eb6154388351608060ff166155a1565b83615524565b604080516020808252818301909252606091829190602082018180368337505050602081018490529050600067ffffffffffffffff198416615482575060186154a6565b6fffffffffffffffffffffffffffffffff1984166154a2575060106154a6565b5060005b60208110156154dc578181815181106154bb57fe5b01602001516001600160f81b031916156154d4576154dc565b6001016154a6565b60008160200390506060816040519080825280601f01601f191660200182016040528015615511576020820181803683370190505b5080830196909652508452509192915050565b6060806040519050835180825260208201818101602087015b8183101561555557805183526020928301920161553d565b50855184518101855292509050808201602086015b8183101561558257805183526020928301920161556a565b508651929092011591909101601f01601f191660405250905092915050565b60606801000000000000000083106155f1576040805162461bcd60e51b815260206004820152600e60248201526d696e70757420746f6f206c6f6e6760901b604482015290519081900360640190fd5b6040805160018082528183019092526060916020820181803683370190505090506037841161564b5782840160f81b8160008151811061562d57fe5b60200101906001600160f81b031916908160001a90535090506113eb565b60606156568561543e565b90508381510160370160f81b8260008151811061566f57fe5b60200101906001600160f81b031916908160001a9053506156908282615524565b95945050505050565b80516000906156aa5750600061157f565b6020820151805160001a9060c08210156156c95760009250505061157f565b5060019392505050565b8051600090811a60808110156156ed57600091505061157f565b60b8811080615708575060c08110801590615708575060f881105b1561571757600191505061157f565b60c081101561572b5760b51901905061157f565b60f51901905061157f565b80516000908190811a60808110156157515760019150615862565b60b881101561576657607e1981019150615862565b60c08110156157e057600060b78203600186019550806020036101000a8651049150600181018201935050808310156157da576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b50615862565b60f88110156157f55760be1981019150615862565b600060f78203600186019550806020036101000a865104915060018101820193505080831015615860576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b505b5092915050565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915290565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081019190915290565b604080518082019091526000808252602082015290565b6040805161010081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081019190915290565b60408051608081018252600080825260208201819052918101829052606081019190915290565b604051806040016040528061596f61597c565b8152602001600081525090565b60405180604001604052806000815260200160008152509056fe6d73672e76616c7565206d757374206265204e202a203165313020616e642067726561746572207468616e2073756d206f66206d696e6952656c617946656520616e64206d6972726f724665656f6e6c79206265703230206f776e65722063616e20617070726f766520746869732062696e64207265717565737465787069726554696d65206d7573742062652074776f206d696e75746573206c6174657220616e64206f6e6520646179206561726c69657272656c6179466565206d757374206265204e202a203165313020616e642067726561746572207468616e206d696e6952656c6179466565636f6e74616374206164647265737320646f65736e277420657175616c20746f2074686520636f6e7472616374206164647265737320696e2062696e64207265717565737473796d626f6c2073686f756c64206f6e6c7920636f6e7461696e20616c70686162657420616e64206e756d626572536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f776d73672e76616c7565206d757374206265204e202a203165313020616e64206e6f206c6573732073756d206f66206d696e6952656c617946656520616e642073796e63466565746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e7472616374746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e747261637474686520626570323020746f6b656e20697320696e206d6972726f722070656e64696e6720737461747573a2646970667358221220d5a978e7f66cfd1df68dce9198b278a4a761278f29fe7aab4682c9ea36b909d264736f6c63430006040033", + }, + UpgradeConfig { + contract_addr: "0000000000000000000000000000000000001004", + code: "60806040526004361061031e5760003560e01c80639a99b4f0116101ab578063bd466461116100f7578063f014847211610095578063fc1a598f1161006f578063fc1a598f14610cb3578063fc3e590814610996578063fd6a687914610ce6578063ff9c00271461068657610366565b8063f014847214610c74578063f9a2bbc714610c89578063fa9e915914610c9e57610366565b8063d9e6dae9116100d1578063d9e6dae914610608578063dc927faf14610c35578063e1c7392a14610c4a578063ebf71d5314610c5f57610366565b8063bd46646114610b68578063c81b166214610b9b578063c8509d8114610bb057610366565b8063aa7415f511610164578063b99328c51161013e578063b99328c514610ad2578063b9fd21e314610b0b578063ba35ead614610b20578063bbface1f14610b3557610366565b8063aa7415f5146109ab578063ab51bb96146109f2578063ac43175114610a0757610366565b80639a99b4f0146109095780639dc0926214610942578063a1a11bf514610957578063a496fba21461096c578063a78abc1614610981578063a7c9f02d1461099657610366565b8063613684751161026a57806375d47a0a116102235780638b87b21f116101fd5780638b87b21f146105875780638eff336c146108a057806396713da9146108df5780639a854bbd146108f457610366565b806375d47a0a146107f15780637942fd0514610806578063831d65d11461081b57610366565b8063613684751461060857806366dea52a146106865780636e0565201461069b5780636e47b482146107c757806370fd5bad1461068657806371d30863146107dc57610366565b806343a368b9116102d757806350432d32116102b157806350432d321461061d57806351e806721461063257806359b92789146106475780635d499b1b1461067157610366565b806343a368b9146105c7578063493279b1146105dc5780634bf6c8821461060857610366565b80630bee7a671461036b5780631182b87514610399578063149d14d9146104935780633d713223146104ba5780633dffc3871461058757806343756e5c146105b257610366565b36610366573415610364576040805133815234602082015281517f6c98249d85d88c3753a04a22230f595e4dc8d3dc86c34af35deeeedc861b89db929181900390910190a15b005b600080fd5b34801561037757600080fd5b50610380610cfb565b6040805163ffffffff9092168252519081900360200190f35b3480156103a557600080fd5b5061041e600480360360408110156103bc57600080fd5b60ff8235169190810190604081016020820135600160201b8111156103e057600080fd5b8201836020820111156103f257600080fd5b803590602001918460018302840111600160201b8311171561041357600080fd5b509092509050610d00565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610458578181015183820152602001610440565b50505050905090810190601f1680156104855780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561049f57600080fd5b506104a8610e2e565b60408051918252519081900360200190f35b3480156104c657600080fd5b5061056b600480360360208110156104dd57600080fd5b810190602081018135600160201b8111156104f757600080fd5b82018360208201111561050957600080fd5b803590602001918460018302840111600160201b8311171561052a57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610e34945050505050565b604080516001600160a01b039092168252519081900360200190f35b34801561059357600080fd5b5061059c610e58565b6040805160ff9092168252519081900360200190f35b3480156105be57600080fd5b5061056b610e5d565b3480156105d357600080fd5b506104a8610e63565b3480156105e857600080fd5b506105f1610e6f565b6040805161ffff9092168252519081900360200190f35b34801561061457600080fd5b5061059c610e74565b34801561062957600080fd5b506104a8610e79565b34801561063e57600080fd5b5061056b610e84565b34801561065357600080fd5b5061056b6004803603602081101561066a57600080fd5b5035610e8a565b34801561067d57600080fd5b506104a8610ea5565b34801561069257600080fd5b5061059c610eae565b6107b3600480360360808110156106b157600080fd5b810190602081018135600160201b8111156106cb57600080fd5b8201836020820111156106dd57600080fd5b803590602001918460208302840111600160201b831117156106fe57600080fd5b919390929091602081019035600160201b81111561071b57600080fd5b82018360208201111561072d57600080fd5b803590602001918460208302840111600160201b8311171561074e57600080fd5b919390929091602081019035600160201b81111561076b57600080fd5b82018360208201111561077d57600080fd5b803590602001918460208302840111600160201b8311171561079e57600080fd5b91935091503567ffffffffffffffff16610eb3565b604080519115158252519081900360200190f35b3480156107d357600080fd5b5061056b611388565b3480156107e857600080fd5b506104a861138e565b3480156107fd57600080fd5b5061056b611394565b34801561081257600080fd5b5061059c61139a565b34801561082757600080fd5b506103646004803603604081101561083e57600080fd5b60ff8235169190810190604081016020820135600160201b81111561086257600080fd5b82018360208201111561087457600080fd5b803590602001918460018302840111600160201b8311171561089557600080fd5b50909250905061139f565b3480156108ac57600080fd5b50610364600480360360608110156108c357600080fd5b508035906001600160a01b0360208201351690604001356114e8565b3480156108eb57600080fd5b5061059c61156e565b34801561090057600080fd5b506104a8611573565b34801561091557600080fd5b506104a86004803603604081101561092c57600080fd5b506001600160a01b03813516906020013561157f565b34801561094e57600080fd5b5061056b6116bd565b34801561096357600080fd5b5061056b6116c3565b34801561097857600080fd5b5061059c6116c9565b34801561098d57600080fd5b506107b36116ce565b3480156109a257600080fd5b5061059c6116d7565b6107b3600480360360808110156109c157600080fd5b5080356001600160a01b03908116916020810135909116906040810135906060013567ffffffffffffffff166116dc565b3480156109fe57600080fd5b506103806116c9565b348015610a1357600080fd5b5061036460048036036040811015610a2a57600080fd5b810190602081018135600160201b811115610a4457600080fd5b820183602082011115610a5657600080fd5b803590602001918460018302840111600160201b83111715610a7757600080fd5b919390929091602081019035600160201b811115610a9457600080fd5b820183602082011115610aa657600080fd5b803590602001918460018302840111600160201b83111715610ac757600080fd5b509092509050611d9d565b348015610ade57600080fd5b5061036460048036036040811015610af557600080fd5b50803590602001356001600160a01b031661200c565b348015610b1757600080fd5b506104a8612082565b348015610b2c57600080fd5b506104a861208c565b348015610b4157600080fd5b506104a860048036036020811015610b5857600080fd5b50356001600160a01b0316612092565b348015610b7457600080fd5b506104a860048036036020811015610b8b57600080fd5b50356001600160a01b03166120a4565b348015610ba757600080fd5b5061056b6120bf565b348015610bbc57600080fd5b5061036460048036036040811015610bd357600080fd5b60ff8235169190810190604081016020820135600160201b811115610bf757600080fd5b820183602082011115610c0957600080fd5b803590602001918460018302840111600160201b83111715610c2a57600080fd5b5090925090506120c5565b348015610c4157600080fd5b5061056b612195565b348015610c5657600080fd5b5061036461219b565b348015610c6b57600080fd5b5061059c61223b565b348015610c8057600080fd5b5061059c612240565b348015610c9557600080fd5b5061056b612245565b348015610caa57600080fd5b506104a861224b565b348015610cbf57600080fd5b5061041e60048036036020811015610cd657600080fd5b50356001600160a01b0316612251565b348015610cf257600080fd5b5061056b612378565b606481565b60005460609060ff16610d48576040805162461bcd60e51b815260206004820152601960248201526000805160206147a8833981519152604482015290519081900360640190fd5b3361200014610d885760405162461bcd60e51b815260040180806020018281038252602f815260200180614756602f913960400191505060405180910390fd5b60ff841660021415610dda57610dd383838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061237e92505050565b9050610e27565b6040805162461bcd60e51b815260206004820152601860248201527f756e7265636f676e697a65642073796e207061636b6167650000000000000000604482015290519081900360640190fd5b9392505050565b60015490565b6020818101516000908152600490915260409020546001600160a01b03165b919050565b600181565b61100181565b670de0b6b3a764000081565b606181565b600881565b66071afd498d000081565b61200081565b6000908152600460205260409020546001600160a01b031690565b6402540be40081565b600281565b6000805460ff16610ef9576040805162461bcd60e51b815260206004820152601960248201526000805160206147a8833981519152604482015290519081900360640190fd5b868514610f375760405162461bcd60e51b815260040180806020018281038252603b81526020018061471b603b913960400191505060405180910390fd5b868314610f755760405162461bcd60e51b815260040180806020018281038252603f8152602001806145ee603f913960400191505060405180910390fd5b426078018267ffffffffffffffff161015610fc15760405162461bcd60e51b81526004018080602001828103825260248152602001806144de6024913960400191505060405180910390fd5b6402540be4003406156110055760405162461bcd60e51b815260040180806020018281038252604081526020018061481e6040913960400191505060405180910390fd5b60408051868152602080880282010190915285906000908190606090848015611038578160200160208202803683370190505b50905060005b84811015611113576402540be4008b8b8381811061105857fe5b905060200201358161106657fe5b06156110a35760405162461bcd60e51b815260040180806020018281038252603c81526020018061462d603c913960400191505060405180910390fd5b6110c88b8b838181106110b257fe5b90506020020135856124a290919063ffffffff16565b93506110f46402540be4008c8c848181106110df57fe5b905060200201356124fc90919063ffffffff16565b82828151811061110057fe5b602090810291909101015260010161103e565b506001546111389061112b908663ffffffff61253e16565b849063ffffffff6124a216565b3410156111765760405162461bcd60e51b81526004018080602001828103825260568152602001806147c86056913960600191505060405180910390fd5b611186348463ffffffff61259716565b9150611190614337565b6040518060c001604052806221272160e91b60001b815260200160006001600160a01b031681526020018381526020018e8e808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505050908252506040805160208c810282810182019093528c82529283019290918d918d91829185019084908082843760009201919091525050509082525067ffffffffffffffff8916602090910152905061200063f7a251d76003611254846125d9565b611269876402540be40063ffffffff6124fc16565b6040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b838110156112c75781810151838201526020016112af565b50505050905090810190601f1680156112f45780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b15801561131557600080fd5b505af1158015611329573d6000803e3d6000fd5b505060408051600081523360208201528082018890526060810187905290517f74eab09b0e53aefc23f2e1b16da593f95c2dd49c6f5a23720463d10d9c330b2a9350908190036080019150a15060019c9b505050505050505050505050565b61100581565b60015481565b61100881565b600b81565b60005460ff166113e4576040805162461bcd60e51b815260206004820152601960248201526000805160206147a8833981519152604482015290519081900360640190fd5b33612000146114245760405162461bcd60e51b815260040180806020018281038252602f815260200180614756602f913960400191505060405180910390fd5b60ff8316600314156114745761146f82828080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061289492505050565b6114e3565b7f41ce201247b6ceb957dcdb217d0b8acb50b9ea0e12af9af4f5e7f38902101605838383604051808460ff1660ff168152602001806020018281038252848482818152602001925080828437600083820152604051601f909101601f1916909201829003965090945050505050a15b505050565b33611008146115285760405162461bcd60e51b81526004018080602001828103825260238152602001806147856023913960400191505060405180910390fd5b600083815260046020908152604080832080546001600160a01b039096166001600160a01b03199096168617905593825260038152838220949094556002909352912055565b600981565b677ce66c50e284000081565b6000805460ff166115c5576040805162461bcd60e51b815260206004820152601960248201526000805160206147a8833981519152604482015290519081900360640190fd5b33611005146116055760405162461bcd60e51b815260040180806020018281038252602f815260200180614451602f913960400191505060405180910390fd5b60004783106116145747611616565b825b9050670de0b6b3a76400008111156116325760009150506116b7565b80156116b4576040516001600160a01b0385169082156108fc029083906000818181858888f1935050505015801561166e573d6000803e3d6000fd5b50604080516001600160a01b03861681526020810183905281517ff8b71c64315fc33b2ead2adfa487955065152a8ac33d9d5193aafd7f45dc15a0929181900390910190a15b90505b92915050565b61100781565b61100681565b600081565b60005460ff1681565b600381565b6000805460ff16611722576040805162461bcd60e51b815260206004820152601960248201526000805160206147a8833981519152604482015290519081900360640190fd5b426078018267ffffffffffffffff16101561176e5760405162461bcd60e51b81526004018080602001828103825260248152602001806144de6024913960400191505060405180910390fd5b6402540be4003406156117b25760405162461bcd60e51b815260040180806020018281038252604081526020018061481e6040913960400191505060405180910390fd5b600080806001600160a01b038816611891576001546117d890879063ffffffff6124a216565b3410156118165760405162461bcd60e51b81526004018080602001828103825260618152602001806145686061913960800191505060405180910390fd5b6402540be40086061561185a5760405162461bcd60e51b815260040180806020018281038252603c81526020018061462d603c913960400191505060405180910390fd5b61186a348763ffffffff61259716565b9050611881866402540be40063ffffffff6124fc16565b6221272160e91b93509150611b34565b6001600160a01b0388166000908152600360205260409020549250826118e85760405162461bcd60e51b81526004018080602001828103825260318152602001806145376031913960400191505060405180910390fd5b6001543410156119295760405162461bcd60e51b815260040180806020018281038252603f81526020018061468a603f913960400191505060405180910390fd5b506001600160a01b038716600090815260026020526040902054349060088111158061197457506008811180156119745750611972876007198301600a0a63ffffffff6128f016565b155b6119af5760405162461bcd60e51b815260040180806020018281038252603c81526020018061462d603c913960400191505060405180910390fd5b6119b98782612932565b92506119c484612972565b15611a0c576305f5e100831015611a0c5760405162461bcd60e51b815260040180806020018281038252603a815260200180614480603a913960400191505060405180910390fd5b600881101580611a265750600881108015611a2657508683115b611a615760405162461bcd60e51b81526004018080602001828103825260258152602001806145c96025913960400191505060405180910390fd5b677ce66c50e2840000831115611aa85760405162461bcd60e51b81526004018080602001828103825260358152602001806145026035913960400191505060405180910390fd5b604080516323b872dd60e01b81523360048201523060248201526044810189905290516001600160a01b038b16916323b872dd9160648083019260209291908290030181600087803b158015611afd57600080fd5b505af1158015611b11573d6000803e3d6000fd5b505050506040513d6020811015611b2757600080fd5b5051611b3257600080fd5b505b611b3c614337565b6040805160c0810182528581526001600160a01b038b166020820152815160018082528184018452919283019181602001602082028036833750505081526040805160018082528183019092526020928301929091908083019080368337505050815260408051600180825281830190925260209283019290919080830190803683370190505081526020018767ffffffffffffffff168152509050828160400151600081518110611bea57fe5b602002602001018181525050878160600151600081518110611c0857fe5b60200260200101906001600160a01b031690816001600160a01b031681525050338160800151600081518110611c3a57fe5b6001600160a01b039092166020928302919091019091015261200063f7a251d76003611c65846125d9565b611c7a866402540be40063ffffffff6124fc16565b6040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b83811015611cd8578181015183820152602001611cc0565b50505050905090810190601f168015611d055780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b158015611d2657600080fd5b505af1158015611d3a573d6000803e3d6000fd5b5050604080516001600160a01b038d1681523360208201528082018b90526060810186905290517f74eab09b0e53aefc23f2e1b16da593f95c2dd49c6f5a23720463d10d9c330b2a9350908190036080019150a150600198975050505050505050565b3361100714611ddd5760405162461bcd60e51b815260040180806020018281038252602e8152602001806146c9602e913960400191505060405180910390fd5b60208114611e32576040805162461bcd60e51b815260206004820152601b60248201527f65787065637465642076616c7565206c656e6774682069732033320000000000604482015290519081900360640190fd5b606084848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8801819004810282018101909252868152939450606093925086915085908190840183828082843760009201919091525050505060208301519091506772656c617946656560c01b811415611f3a576020820151670de0b6b3a76400008111801590611ee157506402540be4008106155b611f32576040805162461bcd60e51b815260206004820152601960248201527f7468652072656c6179466565206f7574206f662072616e676500000000000000604482015290519081900360640190fd5b600155611f77565b6040805162461bcd60e51b815260206004820152600d60248201526c756e6b6e6f776e20706172616d60981b604482015290519081900360640190fd5b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a878787876040518080602001806020018381038352878782818152602001925080828437600083820152601f01601f191690910184810383528581526020019050858580828437600083820152604051601f909101601f19169092018290039850909650505050505050a150505050505050565b336110081461204c5760405162461bcd60e51b81526004018080602001828103825260238152602001806147856023913960400191505060405180910390fd5b600091825260046020908152604080842080546001600160a01b03191690556001600160a01b0392909216835260039052812055565b6221272160e91b81565b61c35081565b60026020526000908152604090205481565b6001600160a01b031660009081526003602052604090205490565b61100281565b60005460ff1661210a576040805162461bcd60e51b815260206004820152601960248201526000805160206147a8833981519152604482015290519081900360640190fd5b336120001461214a5760405162461bcd60e51b815260040180806020018281038252602f815260200180614756602f913960400191505060405180910390fd5b60ff8316600314156114745761146f82828080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612a7892505050565b61100381565b60005460ff16156121f3576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b66071afd498d000060019081556000808052600260205260127fac33ff75c19e70fe83507db0d683fd3465c996598dc972688b7ace676c89077b55805460ff19169091179055565b600481565b600581565b61100081565b61271081565b6001600160a01b03811660009081526003602090815260409182902054825182815280840190935260609290918391906020820181803683375050506020810183905290506000805b60208160ff1610156122e157828160ff16815181106122b557fe5b01602001516001600160f81b031916156122d4576001909101906122d9565b6122e1565b60010161229a565b5060608160ff166040519080825280601f01601f191660200182016040528015612312576020820181803683370190505b50905060005b8260ff168160ff16101561236e57838160ff168151811061233557fe5b602001015160f81c60f81b828260ff168151811061234f57fe5b60200101906001600160f81b031916908160001a905350600101612318565b5095945050505050565b61100481565b6060612388614383565b600061239384612b76565b91509150806123e9576040805162461bcd60e51b815260206004820152601f60248201527f756e7265636f676e697a6564207472616e73666572496e207061636b61676500604482015290519081900360640190fd5b60006123f483612cb5565b905063ffffffff811615612488576040808401516020808601516001600160a01b0316600090815260029091529182205461242f9190612932565b90506124396143b8565b60405180608001604052808660000151815260200183815260200186608001516001600160a01b031681526020018463ffffffff16815250905061247c81613002565b95505050505050610e53565b50506040805160008152602081019091529150610e539050565b6000828201838110156116b4576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60006116b483836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506130de565b60008261254d575060006116b7565b8282028284828161255a57fe5b04146116b45760405162461bcd60e51b81526004018080602001828103825260218152602001806146696021913960400191505060405180910390fd5b60006116b483836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613180565b60408051600680825260e08201909252606091829190816020015b60608152602001906001900390816125f45750508351909150612616906131da565b8160008151811061262357fe5b602002602001018190525061264483602001516001600160a01b03166131ed565b8160018151811061265157fe5b60200260200101819052506000836040015151905060608160405190808252806020026020018201604052801561269c57816020015b60608152602001906001900390816126875790505b50905060005b828110156126e9576126ca866040015182815181106126bd57fe5b60200260200101516131da565b8282815181106126d657fe5b60209081029190910101526001016126a2565b506126f381613210565b8360028151811061270057fe5b602002602001018190525060608260405190808252806020026020018201604052801561274157816020015b606081526020019060019003908161272c5790505b50905060005b83811015612797576127788760600151828151811061276257fe5b60200260200101516001600160a01b03166131ed565b82828151811061278457fe5b6020908102919091010152600101612747565b506127a181613210565b846003815181106127ae57fe5b60200260200101819052506060836040519080825280602002602001820160405280156127ef57816020015b60608152602001906001900390816127da5790505b50905060005b8481101561282f576128108860800151828151811061276257fe5b82828151811061281c57fe5b60209081029190910101526001016127f5565b5061283981613210565b8560048151811061284657fe5b60200260200101819052506128688760a0015167ffffffffffffffff166131da565b8560058151811061287557fe5b602002602001018190525061288985613210565b979650505050505050565b61289c6143df565b60006128a78361329a565b91509150806128e75760405162461bcd60e51b81526004018080602001828103825260248152602001806146f76024913960400191505060405180910390fd5b6114e382613465565b60006116b483836040518060400160405280601881526020017f536166654d6174683a206d6f64756c6f206279207a65726f00000000000000008152506138e9565b6000600882111561295b57612954836007198401600a0a63ffffffff6124fc16565b90506116b7565b6116b4836008849003600a0a63ffffffff61253e16565b604080516020808252818301909252600091606091906020820181803683375050506020810184905290506000805b60208160ff1610156129e857828160ff16815181106129bc57fe5b01602001516001600160f81b031916156129db576001909101906129e0565b6129e8565b6001016129a1565b50600760ff82161015612a0057600092505050610e53565b816005820360ff1681518110612a1257fe5b6020910101516001600160f81b031916602d60f81b14612a3757600092505050610e53565b816001820360ff1681518110612a4957fe5b6020910101516001600160f81b031916604d60f81b14612a6e57600092505050610e53565b5060019392505050565b612a80614337565b6000612a8b8361394b565b9150915080612acb5760405162461bcd60e51b81526004018080602001828103825260248152602001806144ba6024913960400191505060405180910390fd5b612ad36143df565b602080840180516001600160a01b0390811684526040808701518585015291511660009081526002909252812054905b846040015151811015612b5457612b3185604001518281518110612b2357fe5b602002602001015183613baf565b85604001518281518110612b4157fe5b6020908102919091010152600101612b03565b506080840151604083015260056060830152612b6f82613465565b5050505050565b612b7e614383565b6000612b88614383565b612b90614416565b612ba1612b9c86613be8565b613c0d565b90506000805b612bb083613c57565b15612ca85780612bd257612bcb612bc684613c78565b613cc6565b8452612ca0565b8060011415612bff57612bec612be784613c78565b613d7d565b6001600160a01b03166020850152612ca0565b8060021415612c1e57612c14612bc684613c78565b6040850152612ca0565b8060031415612c4657612c33612be784613c78565b6001600160a01b03166060850152612ca0565b8060041415612c6e57612c5b612be784613c78565b6001600160a01b03166080850152612ca0565b8060051415612c9b57612c83612bc684613c78565b67ffffffffffffffff1660a085015260019150612ca0565b612ca8565b600101612ba7565b5091935090915050915091565b60208101516000906001600160a01b0316612dec578160a0015167ffffffffffffffff16421115612ce857506001610e53565b8160400151471015612cfc57506003610e53565b606082015160408084015190516000926001600160a01b0316916127109184818181858888f193505050503d8060008114612d53576040519150601f19603f3d011682016040523d82523d6000602084013e612d58565b606091505b5050905080612d6b575060049050610e53565b7f471eb9cc1ffe55ffadf15b32595415eb9d80f22e761d24bd6dffc607e1284d5983602001518460600151856040015160405180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b03168152602001828152602001935050505060405180910390a15060009050610e53565b8160a0015167ffffffffffffffff16421115612e0a57506001610e53565b81516020808401516001600160a01b031660009081526003909152604090205414612e3757506002610e53565b602080830151604080516370a0823160e01b815230600482015290516000936001600160a01b03909316926370a082319261c3509260248083019392829003018187803b158015612e8757600080fd5b5086fa158015612e9b573d6000803e3d6000fd5b50505050506040513d6020811015612eb257600080fd5b50516040840151909150811015612ecd575060039050610e53565b600083602001516001600160a01b031663a9059cbb61c350866060015187604001516040518463ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600088803b158015612f3e57600080fd5b5087f1158015612f52573d6000803e3d6000fd5b50505050506040513d6020811015612f6957600080fd5b505190508015612ff6577f471eb9cc1ffe55ffadf15b32595415eb9d80f22e761d24bd6dffc607e1284d5984602001518560600151866040015160405180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b03168152602001828152602001935050505060405180910390a15060009150610e539050565b5060059150610e539050565b60408051600480825260a08201909252606091829190816020015b606081526020019060019003908161301d575050835190915061303f906131da565b8160008151811061304c57fe5b602002602001018190525061306483602001516131da565b8160018151811061307157fe5b602002602001018190525061309283604001516001600160a01b03166131ed565b8160028151811061309f57fe5b60200260200101819052506130bd836060015163ffffffff166131da565b816003815181106130ca57fe5b6020026020010181905250610e2781613210565b6000818361316a5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561312f578181015183820152602001613117565b50505050905090810190601f16801561315c5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858161317657fe5b0495945050505050565b600081848411156131d25760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561312f578181015183820152602001613117565b505050900390565b60606116b76131e883613d97565b613e7d565b60408051600560a21b8318601482015260348101909152606090610e2781613e7d565b60608151600014156132315750604080516000815260208101909152610e53565b60608260008151811061324057fe5b602002602001015190506000600190505b8351811015613281576132778285838151811061326a57fe5b6020026020010151613ecf565b9150600101613251565b50610e27613294825160c060ff16613f4c565b82613ecf565b6132a26143df565b60006132ac6143df565b6132b4614416565b6132c0612b9c86613be8565b90506000805b6132cf83613c57565b15612ca857806132f5576132e5612be784613c78565b6001600160a01b0316845261345d565b806001141561339657606061331161330c85613c78565b614044565b9050805160405190808252806020026020018201604052801561333e578160200160208202803683370190505b50602086015260005b815181101561338f5761336c82828151811061335f57fe5b6020026020010151613cc6565b8660200151828151811061337c57fe5b6020908102919091010152600101613347565b505061345d565b80600214156134385760606133ad61330c85613c78565b905080516040519080825280602002602001820160405280156133da578160200160208202803683370190505b50604086015260005b815181101561338f576134088282815181106133fb57fe5b6020026020010151613d7d565b8660400151828151811061341857fe5b6001600160a01b03909216602092830291909101909101526001016133e3565b8060031415612c9b5761344d612bc684613c78565b63ffffffff166060850152600191505b6001016132c6565b80516001600160a01b031661368f5760005b8160200151518110156136895760008260400151828151811061349657fe5b60200260200101516001600160a01b0316612710846020015184815181106134ba57fe5b60209081029190910101516040516000818181858888f193505050503d8060008114613502576040519150601f19603f3d011682016040523d82523d6000602084013e613507565b606091505b50509050806135ca577f203f9f67a785f4f81be4d48b109aa0c498d1bc8097ecc2627063f480cc5fe73e83600001518460400151848151811061354657fe5b60200260200101518560200151858151811061355e57fe5b6020026020010151866060015160405180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b031681526020018381526020018263ffffffff1663ffffffff16815260200194505050505060405180910390a1613680565b7fd468d4fa5e8fb4adc119b29a983fd0785e04af5cb8b7a3a69a47270c54b6901a83600001518460400151848151811061360057fe5b60200260200101518560200151858151811061361857fe5b6020026020010151866060015160405180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b031681526020018381526020018263ffffffff1663ffffffff16815260200194505050505060405180910390a15b50600101613477565b506138e6565b60005b8160200151518110156138e457600082600001516001600160a01b031663a9059cbb61c350856040015185815181106136c757fe5b6020026020010151866020015186815181106136df57fe5b60200260200101516040518463ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600088803b15801561373657600080fd5b5087f115801561374a573d6000803e3d6000fd5b50505050506040513d602081101561376157600080fd5b505190508015613825577fd468d4fa5e8fb4adc119b29a983fd0785e04af5cb8b7a3a69a47270c54b6901a8360000151846040015184815181106137a157fe5b6020026020010151856020015185815181106137b957fe5b6020026020010151866060015160405180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b031681526020018381526020018263ffffffff1663ffffffff16815260200194505050505060405180910390a16138db565b7f203f9f67a785f4f81be4d48b109aa0c498d1bc8097ecc2627063f480cc5fe73e83600001518460400151848151811061385b57fe5b60200260200101518560200151858151811061387357fe5b6020026020010151866060015160405180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b031681526020018381526020018263ffffffff1663ffffffff16815260200194505050505060405180910390a15b50600101613692565b505b50565b600081836139385760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561312f578181015183820152602001613117565b5082848161394257fe5b06949350505050565b613953614337565b600061395d614337565b613965614416565b613971612b9c86613be8565b90506000805b61398083613c57565b15612ca8578061399d57613996612bc684613c78565b8452613ba7565b80600114156139c5576139b2612be784613c78565b6001600160a01b03166020850152613ba7565b8060021415613a545760606139dc61330c85613c78565b90508051604051908082528060200260200182016040528015613a09578160200160208202803683370190505b50604086015260005b8151811015613a4d57613a2a82828151811061335f57fe5b86604001518281518110613a3a57fe5b6020908102919091010152600101613a12565b5050613ba7565b8060031415613ae9576060613a6b61330c85613c78565b90508051604051908082528060200260200182016040528015613a98578160200160208202803683370190505b50606086015260005b8151811015613a4d57613ab98282815181106133fb57fe5b86606001518281518110613ac957fe5b6001600160a01b0390921660209283029190910190910152600101613aa1565b8060041415613b7e576060613b0061330c85613c78565b90508051604051908082528060200260200182016040528015613b2d578160200160208202803683370190505b50608086015260005b8151811015613a4d57613b4e8282815181106133fb57fe5b86608001518281518110613b5e57fe5b6001600160a01b0390921660209283029190910190910152600101613b36565b8060051415612c9b57613b93612bc684613c78565b67ffffffffffffffff1660a0850152600191505b600101613977565b60006008821115613bd157612954836007198401600a0a63ffffffff61253e16565b6116b4836008849003600a0a63ffffffff6124fc16565b613bf0614436565b506040805180820190915281518152602082810190820152919050565b613c15614416565b613c1e82614115565b613c2757600080fd5b6000613c368360200151614145565b60208085015160408051808201909152868152920190820152915050919050565b6000613c61614436565b505080518051602091820151919092015191011190565b613c80614436565b613c8982613c57565b613c9257600080fd5b60208201516000613ca2826141a8565b80830160209586015260408051808201909152908152938401919091525090919050565b805160009015801590613cdb57508151602110155b613ce457600080fd5b6000613cf38360200151614145565b90508083600001511015613d4e576040805162461bcd60e51b815260206004820152601a60248201527f6c656e677468206973206c657373207468616e206f6666736574000000000000604482015290519081900360640190fd5b825160208085015183018051928490039291831015613d7457826020036101000a820491505b50949350505050565b8051600090601514613d8e57600080fd5b6116b782613cc6565b604080516020808252818301909252606091829190602082018180368337505050602081018490529050600067ffffffffffffffff198416613ddb57506018613dff565b6fffffffffffffffffffffffffffffffff198416613dfb57506010613dff565b5060005b6020811015613e3557818181518110613e1457fe5b01602001516001600160f81b03191615613e2d57613e35565b600101613dff565b60008160200390506060816040519080825280601f01601f191660200182016040528015613e6a576020820181803683370190505b5080830196909652508452509192915050565b606081516001148015613eaf5750607f60f81b82600081518110613e9d57fe5b01602001516001600160f81b03191611155b15613ebb575080610e53565b6116b7613ecd8351608060ff16613f4c565b835b6060806040519050835180825260208201818101602087015b81831015613f00578051835260209283019201613ee8565b50855184518101855292509050808201602086015b81831015613f2d578051835260209283019201613f15565b508651929092011591909101601f01601f191660405250905092915050565b6060680100000000000000008310613f9c576040805162461bcd60e51b815260206004820152600e60248201526d696e70757420746f6f206c6f6e6760901b604482015290519081900360640190fd5b60408051600180825281830190925260609160208201818036833701905050905060378411613ff65782840160f81b81600081518110613fd857fe5b60200101906001600160f81b031916908160001a90535090506116b7565b606061400185613d97565b90508381510160370160f81b8260008151811061401a57fe5b60200101906001600160f81b031916908160001a90535061403b8282613ecf565b95945050505050565b606061404f82614115565b61405857600080fd5b6000614063836142db565b90506060816040519080825280602002602001820160405280156140a157816020015b61408e614436565b8152602001906001900390816140865790505b50905060006140b38560200151614145565b60208601510190506000805b8481101561410a576140d0836141a8565b91506040518060400160405280838152602001848152508482815181106140f357fe5b6020908102919091010152918101916001016140bf565b509195945050505050565b805160009061412657506000610e53565b6020820151805160001a9060c0821015612a6e57600092505050610e53565b8051600090811a608081101561415f576000915050610e53565b60b881108061417a575060c0811080159061417a575060f881105b15614189576001915050610e53565b60c081101561419d5760b519019050610e53565b60f519019050610e53565b80516000908190811a60808110156141c357600191506142d4565b60b88110156141d857607e19810191506142d4565b60c081101561425257600060b78203600186019550806020036101000a86510491506001810182019350508083101561424c576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b506142d4565b60f88110156142675760be19810191506142d4565b600060f78203600186019550806020036101000a8651049150600181018201935050808310156142d2576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b505b5092915050565b80516000906142ec57506000610e53565b600080905060006143008460200151614145565b602085015185519181019250015b8082101561432e5761431f826141a8565b6001909301929091019061430e565b50909392505050565b6040518060c001604052806000801916815260200160006001600160a01b03168152602001606081526020016060815260200160608152602001600067ffffffffffffffff1681525090565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915290565b60408051608081018252600080825260208201819052918101829052606081019190915290565b604051806080016040528060006001600160a01b031681526020016060815260200160608152602001600063ffffffff1681525090565b6040518060400160405280614429614436565b8152602001600081525090565b60405180604001604052806000815260200160008152509056fe746865206d6573736167652073656e646572206d75737420626520696e63656e746976697a6520636f6e7472616374466f72206d696e69546f6b656e2c20746865207472616e7366657220616d6f756e74206d757374206e6f74206265206c657373207468616e2031756e7265636f676e697a6564207472616e736665724f75742073796e207061636b61676565787069726554696d65206d7573742062652074776f206d696e75746573206c61746572616d6f756e7420697320746f6f206c617267652c20657863656564206d6178696d756d206265703220746f6b656e20616d6f756e7474686520636f6e747261637420686173206e6f74206265656e20626f756e6420746f20616e79206265703220746f6b656e726563656976656420424e4220616d6f756e742073686f756c64206265206e6f206c657373207468616e207468652073756d206f66207472616e736665724f757420424e4220616d6f756e7420616e64206d696e696d756d2072656c6179466565616d6f756e7420697320746f6f206c617267652c2075696e74323536206f766572666c6f774c656e677468206f6620726563697069656e74416464727320646f65736e277420657175616c20746f206c656e677468206f6620726566756e644164647273696e76616c6964207472616e7366657220616d6f756e743a20707265636973696f6e206c6f737320696e20616d6f756e7420636f6e76657273696f6e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77726563656976656420424e4220616d6f756e742073686f756c64206265206e6f206c657373207468616e20746865206d696e696d756d2072656c6179466565746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e7472616374756e7265636f676e697a6564207472616e736665724f75742061636b207061636b6167654c656e677468206f6620726563697069656e74416464727320646f65736e277420657175616c20746f206c656e677468206f6620616d6f756e7473746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e7472616374746865206d73672073656e646572206d75737420626520746f6b656e4d616e6167657274686520636f6e7472616374206e6f7420696e69742079657400000000000000726563656976656420424e4220616d6f756e742073686f756c64206265206e6f206c657373207468616e207468652073756d206f66207472616e7366657220424e4220616d6f756e7420616e642072656c6179466565696e76616c696420726563656976656420424e4220616d6f756e743a20707265636973696f6e206c6f737320696e20616d6f756e7420636f6e76657273696f6ea2646970667358221220835eacc2107a8d1718a0f05e56e1f7d7731256afbbcfccbe6551048c3c72819b64736f6c63430006040033", + }, + UpgradeConfig { + contract_addr: "0000000000000000000000000000000000001005", + code: "6080604052600436106102815760003560e01c8063930e1b091161014f578063bd4cc830116100c1578063e75d72c71161007a578063e75d72c7146107b5578063e89a3020146107e8578063f9a2bbc714610812578063fc3e590814610827578063fd6a68791461083c578063fdd31fcd1461085157610288565b8063bd4cc83014610722578063c81b16621461074c578063d0ab528a14610761578063dc927faf14610776578063dcae76ab1461078b578063e1c7392a146107a057610288565b8063a78abc1611610113578063a78abc16146105d3578063a7c6a59d146105e8578063ab51bb96146105fd578063ac43175114610612578063ace9fcc2146106e3578063af400681146106f857610288565b8063930e1b091461054c57806396713da91461057f5780639dc0926214610594578063a1a11bf5146105a9578063a3c3c0ad146105be57610288565b806343756e5c116101f35780636f93d2e6116101ac5780636f93d2e61461048457806370fd5bad146104e357806374f2272d146104f857806375d47a0a1461050d5780637942fd05146105225780637e146cc51461053757610288565b806343756e5c146103ef578063493279b1146104045780634bf6c8821461043057806351e8067214610445578063541333071461045a5780636e47b4821461046f57610288565b806312950c461161024557806312950c46146103215780631b20087c146103365780631c6433121461034b5780633a9756121461028d5780633dffc3871461039157806340bb43c0146103bc57610288565b8063081e9d131461028d57806308f2ec06146102b4578063093f2fc4146102c95780630bee7a67146102de57806310e06a761461030c57610288565b3661028857005b600080fd5b34801561029957600080fd5b506102a2610884565b60408051918252519081900360200190f35b3480156102c057600080fd5b506102a2610889565b3480156102d557600080fd5b506102a261088e565b3480156102ea57600080fd5b506102f3610893565b6040805163ffffffff9092168252519081900360200190f35b34801561031857600080fd5b506102a2610898565b34801561032d57600080fd5b506102a261089e565b34801561034257600080fd5b506102a26108a4565b34801561035757600080fd5b506103756004803603602081101561036e57600080fd5b50356108aa565b604080516001600160a01b039092168252519081900360200190f35b34801561039d57600080fd5b506103a6610884565b6040805160ff9092168252519081900360200190f35b3480156103c857600080fd5b506102a2600480360360208110156103df57600080fd5b50356001600160a01b03166108d1565b3480156103fb57600080fd5b506103756108e3565b34801561041057600080fd5b506104196108e9565b6040805161ffff9092168252519081900360200190f35b34801561043c57600080fd5b506103a66108ee565b34801561045157600080fd5b506103756108f3565b34801561046657600080fd5b506102a2610893565b34801561047b57600080fd5b506103756108f9565b34801561049057600080fd5b506104cf600480360360808110156104a757600080fd5b506001600160a01b0381358116916020810135909116906040810135906060013515156108ff565b604080519115158252519081900360200190f35b3480156104ef57600080fd5b506103a6610d91565b34801561050457600080fd5b506102a2610d96565b34801561051957600080fd5b50610375610d9c565b34801561052e57600080fd5b506103a6610da2565b34801561054357600080fd5b506102a2610da7565b34801561055857600080fd5b506102a26004803603602081101561056f57600080fd5b50356001600160a01b0316610dac565b34801561058b57600080fd5b506103a6610dbe565b3480156105a057600080fd5b50610375610dc3565b3480156105b557600080fd5b50610375610dc9565b3480156105ca57600080fd5b506102a2610dcf565b3480156105df57600080fd5b506104cf610dd5565b3480156105f457600080fd5b506102a2610dde565b34801561060957600080fd5b506102f3610de4565b34801561061e57600080fd5b506106e16004803603604081101561063557600080fd5b81019060208101813564010000000081111561065057600080fd5b82018360208201111561066257600080fd5b8035906020019184600183028401116401000000008311171561068457600080fd5b9193909290916020810190356401000000008111156106a257600080fd5b8201836020820111156106b457600080fd5b803590602001918460018302840111640100000000831117156106d657600080fd5b509092509050610de9565b005b3480156106ef57600080fd5b506102a2611537565b34801561070457600080fd5b506102a26004803603602081101561071b57600080fd5b503561153d565b34801561072e57600080fd5b506102a26004803603602081101561074557600080fd5b5035611598565b34801561075857600080fd5b506103756115b1565b34801561076d57600080fd5b506102a26115b7565b34801561078257600080fd5b506103756115bd565b34801561079757600080fd5b506102a26115c3565b3480156107ac57600080fd5b506106e16115c9565b3480156107c157600080fd5b506106e1600480360360208110156107d857600080fd5b50356001600160a01b0316611692565b3480156107f457600080fd5b506103756004803603602081101561080b57600080fd5b50356117eb565b34801561081e57600080fd5b506103756117f8565b34801561083357600080fd5b506103a66117fe565b34801561084857600080fd5b50610375611803565b34801561085d57600080fd5b506102a26004803603602081101561087457600080fd5b50356001600160a01b0316611809565b600181565b602881565b605081565b606481565b600b5481565b60015481565b600c5481565b600681815481106108b757fe5b6000918252602090912001546001600160a01b0316905081565b60076020526000908152604090205481565b61100181565b606181565b600881565b61200081565b61100581565b6000805460ff16610957576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e7472616374206e6f7420696e69742079657400000000000000604482015290519081900360640190fd5b33612000146109975760405162461bcd60e51b815260040180806020018281038252602f815260200180612377602f913960400191505060405180910390fd5b60008215610a4a576110026001600160a01b0316639a99b4f06110056109c8600e548861181b90919063ffffffff16565b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015610a1757600080fd5b505af1158015610a2b573d6000803e3d6000fd5b505050506040513d6020811015610a4157600080fd5b50519050610b59565b604080516309a99b4f60e41b8152611005600482015260248101869052905161100491639a99b4f09160448083019260209291908290030181600087803b158015610a9457600080fd5b505af1158015610aa8573d6000803e3d6000fd5b505050506040513d6020811015610abe57600080fd5b5051600e5490915015610b5957600e54604080516309a99b4f60e41b81526110056004820152602481019290925251610b569161100291639a99b4f0916044808201926020929091908290030181600087803b158015610b1d57600080fd5b505af1158015610b31573d6000803e3d6000fd5b505050506040513d6020811015610b4757600080fd5b5051829063ffffffff61181b16565b90505b600c805460010190556000610b6d8261187e565b600954909150610b83908263ffffffff61181b16565b600955600a54610bab908290610b9f908563ffffffff61181b16565b9063ffffffff6118a716565b600a556001600160a01b038716600090815260056020526040902054610c1757600680546001810182556000919091527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0180546001600160a01b0319166001600160a01b0389161790555b6001600160a01b038088166000908152600560209081526040808320805460010190559289168252600790522054610c9557600880546001810182556000919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30180546001600160a01b0319166001600160a01b0388161790555b6001600160a01b038616600090815260076020526040902080546001019055600c54606411610d8457600b54600954600a5460408051938452602084019290925282820152517f2649b1b772a1a74bd332a67695e285317dd722941166595741c60a00fa65bb759181900360600190a16000610d0f6118e9565b90506000610d1b611bcd565b6001600160a01b0389166000908152600d6020526040902054909150610d59908290610d4d908563ffffffff61181b16565b9063ffffffff61181b16565b6001600160a01b0389166000908152600d6020526040812091909155600b80546001019055600c5550505b5060019695505050505050565b600281565b60035481565b61100881565b600b81565b600581565b60056020526000908152604090205481565b600981565b61100781565b61100681565b600a5481565b60005460ff1681565b60045481565b600081565b3361100714610e295760405162461bcd60e51b815260040180806020018281038252602e8152602001806122bc602e913960400191505060405180910390fd5b60005460ff16610e6a5760405162461bcd60e51b81526004018080602001828103825260218152602001806122ea6021913960400191505060405180910390fd5b610ede84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601f81527f68656164657252656c61796572526577617264526174654d6f6c6563756c650060208201529150611e4b9050565b15610fab5760208114610f225760405162461bcd60e51b81526004018080602001828103825260328152602001806123a66032913960400191505060405180910390fd5b604080516020601f8401819004810282018101909252828152600091610f6091858580838501838280828437600092019190915250611f3292505050565b9050600254811115610fa35760405162461bcd60e51b81526004018080602001828103825260608152602001806121956060913960600191505060405180910390fd5b6001556114a5565b61100484848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051606081019091526022808252909250905061229a6020830139611e4b565b156110dc57602081146110485760405162461bcd60e51b815260040180806020018281038252602e81526020018061224b602e913960400191505060405180910390fd5b604080516020601f840181900481028201810190925282815260009161108691858580838501838280828437600092019190915250611f3292505050565b9050801580159061109957506001548110155b6110d45760405162461bcd60e51b815260040180806020018281038252606c81526020018061230b606c913960800191505060405180910390fd5b6002556114a5565b61115084848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601a81527f63616c6c6572436f6d70656e736174696f6e4d6f6c6563756c6500000000000060208201529150611e4b9050565b1561121d57602081146111945760405162461bcd60e51b815260040180806020018281038252602e81526020018061224b602e913960400191505060405180910390fd5b604080516020601f84018190048102820181019092528281526000916111d291858580838501838280828437600092019190915250611f3292505050565b90506004548111156112155760405162461bcd60e51b81526004018080602001828103825260568152602001806121f56056913960600191505060405180910390fd5b6003556114a5565b61129184848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601d81527f63616c6c6572436f6d70656e736174696f6e44656e6f6d696e61746f7200000060208201529150611e4b9050565b1561136957602081146112d55760405162461bcd60e51b815260040180806020018281038252602e81526020018061224b602e913960400191505060405180910390fd5b604080516020601f840181900481028201810190925282815260009161131391858580838501838280828437600092019190915250611f3292505050565b9050801580159061132657506003548110155b6113615760405162461bcd60e51b81526004018080602001828103825260618152602001806121066061913960800191505060405180910390fd5b6004556114a5565b6113dd84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601b81527f64796e616d69634578747261496e63656e74697665416d6f756e74000000000060208201529150611e4b9050565b1561146857602081146114215760405162461bcd60e51b815260040180806020018281038252602e815260200180612167602e913960400191505060405180910390fd5b604080516020601f840181900481028201810190925282815260009161145f91858580838501838280828437600092019190915250611f3292505050565b600e55506114a5565b6040805162461bcd60e51b815260206004820152600d60248201526c756e6b6e6f776e20706172616d60981b604482015290519081900360640190fd5b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a848484846040518080602001806020018381038352878782818152602001925080828437600083820152601f01601f191690910184810383528581526020019050858580828437600083820152604051601f909101601f19169092018290039850909650505050505050a150505050565b60025481565b60006028821161154e575080611593565b81602810801561155f575060508211155b1561156c57506028611593565b60508211801561157d5750606e8211155b1561158d57506078819003611593565b50600481045b919050565b6000602882116115a9575080611593565b506028611593565b61100281565b600e5481565b61100381565b60095481565b60005460ff1615611621576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b60005460ff161561166f576040805162461bcd60e51b8152602060048201526013602482015272185b1c9958591e481a5b9a5d1a585b1a5e9959606a1b604482015290519081900360640190fd5b60018080556005600255600381905560506004556000805460ff19169091179055565b6001600160a01b0381166000908152600d6020526040902054806116f1576040805162461bcd60e51b81526020600482015260116024820152701b9bc81c995b185e595c881c995dd85c99607a1b604482015290519081900360640190fd5b6001600160a01b0382166000818152600d60205260408082208290555184929184156108fc02918591818181858888f193505050506117a15760405161100290819084156108fc029085906000818181858888f1935050505015801561175b573d6000803e3d6000fd5b506040805161100281526020810185905281517f24502838a334c8f2bb2ee1f8262a4fa7183e4489a717e96cc824e325f8b39e11929181900390910190a15050506117e8565b604080516001600160a01b03851681526020810184905281517f24502838a334c8f2bb2ee1f8262a4fa7183e4489a717e96cc824e325f8b39e11929181900390910190a150505b50565b600881815481106108b757fe5b61100081565b600381565b61100481565b600d6020526000908152604090205481565b600082820183811015611875576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b90505b92915050565b600061187860025461189b60015485611f3790919063ffffffff16565b9063ffffffff611f9016565b600061187583836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611fd2565b600954600680546040805160208084028201810190925282815260009493859360609383018282801561194557602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611927575b5050505050905060608151604051908082528060200260200182016040528015611979578160200160208202803683370190505b50905060005b8251811015611a0657600083828151811061199657fe5b6020026020010151905060006119d060056000846001600160a01b03166001600160a01b0316815260200190815260200160002054611598565b9050808484815181106119df57fe5b60209081029190910101526119fa868263ffffffff61181b16565b9550505060010161197f565b506000611a2460045461189b60035488611f3790919063ffffffff16565b9050611a36858263ffffffff6118a716565b94508460015b8451811015611b0d576000611a718761189b8a888681518110611a5b57fe5b6020026020010151611f3790919063ffffffff16565b9050611abe81600d6000898681518110611a8757fe5b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000205461181b90919063ffffffff16565b600d6000888581518110611ace57fe5b6020908102919091018101516001600160a01b0316825281019190915260400160002055611b02838263ffffffff6118a716565b925050600101611a3c565b50611b2381600d600087600081518110611a8757fe5b600d600086600081518110611b3457fe5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002081905550600060098190555060008090505b8451811015611bb55760056000868381518110611b8757fe5b6020908102919091018101516001600160a01b03168252810191909152604001600090812055600101611b6e565b50611bc2600660006120ce565b509450505050505b90565b600a546008805460408051602080840282018101909252828152600094938593606093830182828015611c2957602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611c0b575b5050505050905060608151604051908082528060200260200182016040528015611c5d578160200160208202803683370190505b50905060005b8251811015611cdc576000838281518110611c7a57fe5b602002602001015190506000611cb460076000846001600160a01b03166001600160a01b031681526020019081526020016000205461153d565b905080848481518110611cc357fe5b6020908102919091010152949094019350600101611c63565b506000611cfa60045461189b60035488611f3790919063ffffffff16565b9050611d0c858263ffffffff6118a716565b94508460015b8451811015611d96576000611d318761189b8a888681518110611a5b57fe5b9050611d4781600d6000898681518110611a8757fe5b600d6000888581518110611d5757fe5b6020908102919091018101516001600160a01b0316825281019190915260400160002055611d8b838263ffffffff6118a716565b925050600101611d12565b50611dac81600d600087600081518110611a8757fe5b600d600086600081518110611dbd57fe5b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020819055506000600a8190555060008090505b8451811015611e3e5760076000868381518110611e1057fe5b6020908102919091018101516001600160a01b03168252810191909152604001600090812055600101611df7565b50611bc2600860006120ce565b6000816040516020018082805190602001908083835b60208310611e805780518252601f199092019160209182019101611e61565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120836040516020018082805190602001908083835b60208310611eee5780518252601f199092019160209182019101611ecf565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040528051906020012014905092915050565b015190565b600082611f4657506000611878565b82820282848281611f5357fe5b04146118755760405162461bcd60e51b81526004018080602001828103825260218152602001806122796021913960400191505060405180910390fd5b600061187583836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612069565b600081848411156120615760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561202657818101518382015260200161200e565b50505050905090810190601f1680156120535780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600081836120b85760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561202657818101518382015260200161200e565b5060008385816120c457fe5b0495945050505050565b50805460008255906000526020600020908101906117e89190611bca91905b8082111561210157600081556001016120ed565b509056fe746865206e657743616c6c6572436f6d70656e736174696f6e44656e6f6d696e61746f72206d757374206e6f74206265207a65726f20616e64206e6f206c657373207468616e2063616c6c6572436f6d70656e736174696f6e4d6f6c6563756c656c656e677468206f662064796e616d69634578747261496e63656e74697665416d6f756e74206d69736d617463686e65772068656164657252656c61796572526577617264526174654d6f6c6563756c652073686f756c646e27742062652067726561746572207468616e2068656164657252656c617965725265776172645261746544656e6f6d696e61746f726e65772063616c6c6572436f6d70656e736174696f6e4d6f6c6563756c652073686f756c646e27742062652067726561746572207468616e2063616c6c6572436f6d70656e736174696f6e44656e6f6d696e61746f726c656e677468206f6620726577617264466f7256616c696461746f725365744368616e6765206d69736d61746368536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7768656164657252656c617965725265776172645261746544656e6f6d696e61746f72746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e7472616374636f6e747261637420686173206e6f74206265656e20696e697469616c697a6564746865206e65772068656164657252656c617965725265776172645261746544656e6f6d696e61746f72206d757374206e6f74206265207a65726f20616e64206e6f206c657373207468616e2068656164657252656c61796572526577617264526174654d6f6c6563756c65746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e74726163746c656e677468206f662068656164657252656c61796572526577617264526174654d6f6c6563756c65206d69736d61746368a2646970667358221220627dba6e536686005f0eaa9f77c130ba330278d37049b690a78442862109871c64736f6c63430006040033", + }, + ], + )] + .iter() + .cloned() + .collect(); + + pub static ref BRUNO_UPGRADE_CONFIG: HashMap> = [( + 56, + vec![ + UpgradeConfig { + contract_addr: "0x0000000000000000000000000000000000001000", + code: "6080604052600436106102e45760003560e01c80638624988211610190578063c8509d81116100dc578063eb57e20211610095578063f9a2bbc71161006f578063f9a2bbc714610a54578063fc3e590814610a69578063fccc281314610a7e578063fd6a687914610a93576102e4565b8063eb57e202146109e6578063eda5868c14610a19578063f340fa0114610a2e576102e4565b8063c8509d81146106d8578063d86222d51461097d578063daacdb6614610992578063dc927faf146109a7578063e086c7b1146109bc578063e1c7392a146109d1576102e4565b8063aaf5eb6811610149578063ad3c9da611610123578063ad3c9da6146108d0578063b7ab4db514610903578063bf9f4995146104c0578063c81b166214610968576102e4565b8063aaf5eb68146107db578063ab51bb96146107f0578063ac43175114610805576102e4565b8063862498821461075d57806396713da9146107725780639dc0926214610787578063a1a11bf51461079c578063a5422d5c146107b1578063a78abc16146107c6576102e4565b806351e806721161024f57806370fd5bad116102085780637942fd05116101e25780637942fd05146106ae57806381650b62146106c3578063831d65d1146106d8578063853230aa14610699576102e4565b806370fd5bad1461066f57806375d47a0a1461068457806378dfed4a14610699576102e4565b806351e8067214610572578063565c56b3146105875780635667515a146105ba5780635d77156c146105cf5780636969a25c146105e45780636e47b4821461065a576102e4565b80633de0f0d8116102a15780633de0f0d8146104ab5780633dffc387146104c057806343756e5c146104eb578063493279b11461051c5780634bf6c882146105485780635192c82c1461055d576102e4565b80630bee7a67146102e95780631182b87514610317578063152ad3b8146104115780631ff180691461043a578063219f22d51461046157806335409f7f14610476575b600080fd5b3480156102f557600080fd5b506102fe610aa8565b6040805163ffffffff9092168252519081900360200190f35b34801561032357600080fd5b5061039c6004803603604081101561033a57600080fd5b60ff8235169190810190604081016020820135600160201b81111561035e57600080fd5b82018360208201111561037057600080fd5b803590602001918460018302840111600160201b8311171561039157600080fd5b509092509050610aad565b6040805160208082528351818301528351919283929083019185019080838360005b838110156103d65781810151838201526020016103be565b50505050905090810190601f1680156104035780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561041d57600080fd5b50610426610c9a565b604080519115158252519081900360200190f35b34801561044657600080fd5b5061044f610ca3565b60408051918252519081900360200190f35b34801561046d57600080fd5b506102fe610ca9565b34801561048257600080fd5b506104a96004803603602081101561049957600080fd5b50356001600160a01b0316610cae565b005b3480156104b757600080fd5b5061044f610fc2565b3480156104cc57600080fd5b506104d5610fc8565b6040805160ff9092168252519081900360200190f35b3480156104f757600080fd5b50610500610fcd565b604080516001600160a01b039092168252519081900360200190f35b34801561052857600080fd5b50610531610fd3565b6040805161ffff9092168252519081900360200190f35b34801561055457600080fd5b506104d5610fd8565b34801561056957600080fd5b5061044f610fdd565b34801561057e57600080fd5b50610500610fe3565b34801561059357600080fd5b5061044f600480360360208110156105aa57600080fd5b50356001600160a01b0316610fe9565b3480156105c657600080fd5b506104d561103b565b3480156105db57600080fd5b506102fe611040565b3480156105f057600080fd5b5061060e6004803603602081101561060757600080fd5b5035611045565b604080516001600160a01b039788168152958716602087015293909516848401526001600160401b0390911660608401521515608083015260a082019290925290519081900360c00190f35b34801561066657600080fd5b506105006110a9565b34801561067b57600080fd5b506104d56110af565b34801561069057600080fd5b506105006110b4565b3480156106a557600080fd5b5061044f6110ba565b3480156106ba57600080fd5b506104d56110c0565b3480156106cf57600080fd5b506102fe6110c5565b3480156106e457600080fd5b506104a9600480360360408110156106fb57600080fd5b60ff8235169190810190604081016020820135600160201b81111561071f57600080fd5b82018360208201111561073157600080fd5b803590602001918460018302840111600160201b8311171561075257600080fd5b5090925090506110ca565b34801561076957600080fd5b5061044f61117d565b34801561077e57600080fd5b506104d5611183565b34801561079357600080fd5b50610500611188565b3480156107a857600080fd5b5061050061118e565b3480156107bd57600080fd5b5061039c611194565b3480156107d257600080fd5b506104266111b3565b3480156107e757600080fd5b5061044f6111bc565b3480156107fc57600080fd5b506102fe61103b565b34801561081157600080fd5b506104a96004803603604081101561082857600080fd5b810190602081018135600160201b81111561084257600080fd5b82018360208201111561085457600080fd5b803590602001918460018302840111600160201b8311171561087557600080fd5b919390929091602081019035600160201b81111561089257600080fd5b8201836020820111156108a457600080fd5b803590602001918460018302840111600160201b831117156108c557600080fd5b5090925090506111c5565b3480156108dc57600080fd5b5061044f600480360360208110156108f357600080fd5b50356001600160a01b03166115bc565b34801561090f57600080fd5b506109186115ce565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561095457818101518382015260200161093c565b505050509050019250505060405180910390f35b34801561097457600080fd5b506105006116f4565b34801561098957600080fd5b5061044f6116fa565b34801561099e57600080fd5b5061044f611706565b3480156109b357600080fd5b5061050061170c565b3480156109c857600080fd5b5061044f611712565b3480156109dd57600080fd5b506104a9611717565b3480156109f257600080fd5b506104a960048036036020811015610a0957600080fd5b50356001600160a01b031661191a565b348015610a2557600080fd5b506102fe611ae9565b6104a960048036036020811015610a4457600080fd5b50356001600160a01b0316611aee565b348015610a6057600080fd5b50610500611df3565b348015610a7557600080fd5b506104d5611df9565b348015610a8a57600080fd5b50610500611dfe565b348015610a9f57600080fd5b50610500611e04565b606481565b60005460609060ff16610b03576040805162461bcd60e51b81526020600482015260196024820152781d1a194818dbdb9d1c9858dd081b9bdd081a5b9a5d081e595d603a1b604482015290519081900360640190fd5b3361200014610b435760405162461bcd60e51b815260040180806020018281038252602f815260200180614951602f913960400191505060405180910390fd5b610b4b614158565b6000610b8c85858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611e0a92505050565b9150915080610ba857610b9f6064611f63565b92505050610c93565b815160009060ff16610bc857610bc18360200151611fc4565b9050610c5f565b825160ff1660011415610c5b57826020015151600114610c35577f70e72399380dcfb0338abc03dc8d47f9f470ada8e769c9a78d644ea97385ecb26040518080602001828103825260258152602001806142866025913960400191505060405180910390a1506067610c56565b610bc18360200151600081518110610c4957fe5b6020026020010151612dca565b610c5f565b5060655b63ffffffff8116610c845750506040805160008152602081019091529150610c939050565b610c8d81611f63565b93505050505b9392505050565b60075460ff1681565b60035481565b606881565b3361100114610cee5760405162461bcd60e51b81526004018080602001828103825260298152602001806149ad6029913960400191505060405180910390fd5b6001600160a01b03811660009081526004602052604090205480610d125750610fbf565b600181039050600060018281548110610d2757fe5b60009182526020909120600360049092020101546001549091506000190180610d7657600060018481548110610d5957fe5b906000526020600020906004020160030181905550505050610fbf565b6040805183815290516001600160a01b038616917f3b6f9ef90462b512a1293ecec018670bf7b7f1876fb727590a8a6d7643130a70919081900360200190a26001600160a01b038416600090815260046020526040812055600154600019018314610ef857600180546000198101908110610ded57fe5b906000526020600020906004020160018481548110610e0857fe5b6000918252602082208354600492830290910180546001600160a01b03199081166001600160a01b0393841617825560018087015481840180548416918616919091179055600280880180549185018054909416919095161780835584546001600160401b03600160a01b91829004160267ffffffffffffffff60a01b1990911617808355935460ff600160e01b918290041615150260ff60e01b199094169390931790556003948501549401939093558254868401939192919087908110610ecd57fe5b600091825260208083206004909202909101546001600160a01b031683528201929092526040019020555b6001805480610f0357fe5b60008281526020812060046000199093019283020180546001600160a01b0319908116825560018201805490911690556002810180546001600160e81b03191690556003018190559155818381610f5657fe5b0490508015610fba5760015460005b81811015610fb7578260018281548110610f7b57fe5b9060005260206000209060040201600301540160018281548110610f9b57fe5b6000918252602090912060036004909202010155600101610f65565b50505b505050505b50565b61271081565b600181565b61100181565b603881565b600881565b60065481565b61200081565b6001600160a01b03811660009081526004602052604081205480611011576000915050611036565b60018082038154811061102057fe5b9060005260206000209060040201600301549150505b919050565b600081565b606781565b6001818154811061105257fe5b600091825260209091206004909102018054600182015460028301546003909301546001600160a01b0392831694509082169291821691600160a01b81046001600160401b031691600160e01b90910460ff169086565b61100581565b600281565b61100881565b6103e881565b600b81565b606681565b336120001461110a5760405162461bcd60e51b815260040180806020018281038252602f815260200180614951602f913960400191505060405180910390fd5b7f41ce201247b6ceb957dcdb217d0b8acb50b9ea0e12af9af4f5e7f38902101605838383604051808460ff1660ff168152602001806020018281038252848482818152602001925080828437600083820152604051601f909101601f1916909201829003965090945050505050a1505050565b60025481565b600981565b61100781565b61100681565b6040518061062001604052806105ef81526020016143626105ef913981565b60005460ff1681565b6402540be40081565b60005460ff16611218576040805162461bcd60e51b81526020600482015260196024820152781d1a194818dbdb9d1c9858dd081b9bdd081a5b9a5d081e595d603a1b604482015290519081900360640190fd5b33611007146112585760405162461bcd60e51b815260040180806020018281038252602e8152602001806142cc602e913960400191505060405180910390fd5b6112c284848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080518082019091526013815272065787069726554696d655365636f6e6447617606c1b60208201529150612f419050565b1561139d57602081146113065760405162461bcd60e51b815260040180806020018281038252602681526020018061431b6026913960400191505060405180910390fd5b604080516020601f84018190048102820181019092528281526000916113449185858083850183828082843760009201919091525061302992505050565b90506064811015801561135a5750620186a08111155b6113955760405162461bcd60e51b815260040180806020018281038252602781526020018061425f6027913960400191505060405180910390fd5b60025561152a565b6113fd84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260098152686275726e526174696f60b81b60208201529150612f419050565b156114ed5760208114611457576040805162461bcd60e51b815260206004820152601c60248201527f6c656e677468206f66206275726e526174696f206d69736d6174636800000000604482015290519081900360640190fd5b604080516020601f84018190048102820181019092528281526000916114959185858083850183828082843760009201919091525061302992505050565b90506127108111156114d85760405162461bcd60e51b815260040180806020018281038252602b815260200180614209602b913960400191505060405180910390fd5b6006556007805460ff1916600117905561152a565b6040805162461bcd60e51b815260206004820152600d60248201526c756e6b6e6f776e20706172616d60981b604482015290519081900360640190fd5b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a848484846040518080602001806020018381038352878782818152602001925080828437600083820152601f01601f191690910184810383528581526020019050858580828437600083820152604051601f909101601f19169092018290039850909650505050505050a150505050565b60046020526000908152604090205481565b6001546060906000805b8281101561161f57600181815481106115ed57fe5b9060005260206000209060040201600201601c9054906101000a900460ff16611617576001909101905b6001016115d8565b5060608160405190808252806020026020018201604052801561164c578160200160208202803683370190505b50600092509050815b838110156116ec576001818154811061166a57fe5b9060005260206000209060040201600201601c9054906101000a900460ff166116e4576001818154811061169a57fe5b600091825260209091206004909102015482516001600160a01b03909116908390859081106116c557fe5b6001600160a01b03909216602092830291909101909101526001909201915b600101611655565b509250505090565b61100281565b67016345785d8a000081565b60055481565b61100381565b602981565b60005460ff161561176f576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b611777614158565b600061179d6040518061062001604052806105ef81526020016143626105ef9139611e0a565b91509150806117dd5760405162461bcd60e51b81526004018080602001828103825260218152602001806143416021913960400191505060405180910390fd5b60005b826020015151811015611902576001836020015182815181106117ff57fe5b60209081029190910181015182546001818101855560009485528385208351600493840290910180546001600160a01b039283166001600160a01b03199182161782558587015182850180549185169183169190911790556040860151600283018054606089015160808a01511515600160e01b0260ff60e01b196001600160401b03909216600160a01b0267ffffffffffffffff60a01b199590981692909516919091179290921694909417161790915560a0909301516003909301929092559186015180519185019391859081106118d557fe5b602090810291909101810151516001600160a01b03168252810191909152604001600020556001016117e0565b50506103e8600255506000805460ff19166001179055565b336110011461195a5760405162461bcd60e51b81526004018080602001828103825260298152602001806149ad6029913960400191505060405180910390fd5b6001600160a01b0381166000908152600460205260409020548061197e5750610fbf565b60018103905060006001828154811061199357fe5b90600052602060002090600402016003015490506000600183815481106119b657fe5b906000526020600020906004020160030181905550600060018080549050039050836001600160a01b03167f8cd4e147d8af98a9e3b6724021b8bf6aed2e5dac71c38f2dce8161b82585b25d836040518082815260200191505060405180910390a280611a2557505050610fbf565b6000818381611a3057fe5b0490508015610fba5760005b84811015611a8e578160018281548110611a5257fe5b9060005260206000209060040201600301540160018281548110611a7257fe5b6000918252602090912060036004909202010155600101611a3c565b50600180549085015b81811015610fb7578260018281548110611aad57fe5b9060005260206000209060040201600301540160018281548110611acd57fe5b6000918252602090912060036004909202010155600101611a97565b606581565b334114611b2c5760405162461bcd60e51b815260040180806020018281038252602d815260200180614980602d913960400191505060405180910390fd5b60005460ff16611b7f576040805162461bcd60e51b81526020600482015260196024820152781d1a194818dbdb9d1c9858dd081b9bdd081a5b9a5d081e595d603a1b604482015290519081900360640190fd5b60003411611bcc576040805162461bcd60e51b81526020600482015260156024820152746465706f7369742076616c7565206973207a65726f60581b604482015290519081900360640190fd5b6001600160a01b0381166000908152600460205260409020546007543491906103e89060ff1615611bfc57506006545b600083118015611c0c5750600081115b15611cb5576000611c35612710611c29868563ffffffff61302e16565b9063ffffffff61308716565b90508015611cb35760405161dead9082156108fc029083906000818181858888f19350505050158015611c6c573d6000803e3d6000fd5b506040805182815290517f627059660ea01c4733a328effb2294d2f86905bf806da763a89cee254de8bee59181900360200190a1611cb0848263ffffffff6130c916565b93505b505b8115611dad576000600180840381548110611ccc57fe5b9060005260206000209060040201905080600201601c9054906101000a900460ff1615611d37576040805185815290516001600160a01b038716917ff177e5d6c5764d79c32883ed824111d9b13f5668cf6ab1cc12dd36791dd955b4919081900360200190a2611da7565b600354611d4a908563ffffffff61310b16565b6003908155810154611d62908563ffffffff61310b16565b60038201556040805185815290516001600160a01b038716917f93a090ecc682c002995fad3c85b30c5651d7fd29b0be5da9d784a3302aedc055919081900360200190a25b50611ded565b6040805184815290516001600160a01b038616917ff177e5d6c5764d79c32883ed824111d9b13f5668cf6ab1cc12dd36791dd955b4919081900360200190a25b50505050565b61100081565b600381565b61dead81565b61100481565b611e12614158565b6000611e1c614158565b611e24614170565b611e35611e3086613165565b61318a565b90506000805b611e44836131d4565b15611f555780611e6957611e5f611e5a846131f5565b613243565b60ff168452611f4d565b8060011415611f48576060611e85611e80856131f5565b6132fa565b90508051604051908082528060200260200182016040528015611ec257816020015b611eaf614190565b815260200190600190039081611ea75790505b50602086015260005b8151811015611f3d57611edc614190565b6000611efa848481518110611eed57fe5b60200260200101516133cb565b9150915080611f1757876000995099505050505050505050611f5e565b8188602001518481518110611f2857fe5b60209081029190910101525050600101611ecb565b506001925050611f4d565b611f55565b600101611e3b565b50919350909150505b915091565b604080516001808252818301909252606091829190816020015b6060815260200190600190039081611f7d579050509050611fa38363ffffffff166134a8565b81600081518110611fb057fe5b6020026020010181905250610c93816134bb565b6000806060611fd284613545565b915091508161207f577f70e72399380dcfb0338abc03dc8d47f9f470ada8e769c9a78d644ea97385ecb2816040518080602001828103825283818151815260200191508051906020019080838360005b8381101561203a578181015183820152602001612022565b50505050905090810190601f1680156120675780820380516001836020036101000a031916815260200191505b509250505060405180910390a1606692505050611036565b600080805b6001548110156120fc5767016345785d8a0000600182815481106120a457fe5b906000526020600020906004020160030154106120c6576001909201916120f4565b6000600182815481106120d557fe5b90600052602060002090600402016003015411156120f4576001909101905b600101612084565b50606082604051908082528060200260200182016040528015612129578160200160208202803683370190505b509050606083604051908082528060200260200182016040528015612158578160200160208202803683370190505b509050606084604051908082528060200260200182016040528015612187578160200160208202803683370190505b5090506060856040519080825280602002602001820160405280156121b6578160200160208202803683370190505b50905060006060866040519080825280602002602001820160405280156121e7578160200160208202803683370190505b509050606087604051908082528060200260200182016040528015612216578160200160208202803683370190505b509050600098506000975060608d905060006110046001600160a01b031663149d14d96040518163ffffffff1660e01b815260040160206040518083038186803b15801561226357600080fd5b505afa158015612277573d6000803e3d6000fd5b505050506040513d602081101561228d57600080fd5b5051905067016345785d8a0000811115612302577f70e72399380dcfb0338abc03dc8d47f9f470ada8e769c9a78d644ea97385ecb26040518080602001828103825260218152602001806142fa6021913960400191505060405180910390a160689d5050505050505050505050505050611036565b60005b6001548110156125755767016345785d8a00006001828154811061232557fe5b906000526020600020906004020160030154106124ab576001818154811061234957fe5b906000526020600020906004020160020160009054906101000a90046001600160a01b03168a8d8151811061237a57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060006402540be400600183815481106123af57fe5b906000526020600020906004020160030154816123c857fe5b06600183815481106123d657fe5b9060005260206000209060040201600301540390506123fe83826130c990919063ffffffff16565b8a8e8151811061240a57fe5b6020026020010181815250506001828154811061242357fe5b906000526020600020906004020160020160009054906101000a90046001600160a01b0316888e8151811061245457fe5b60200260200101906001600160a01b031690816001600160a01b03168152505081898e8151811061248157fe5b602090810291909101015261249c878263ffffffff61310b16565b6001909d019c965061256d9050565b6000600182815481106124ba57fe5b906000526020600020906004020160030154111561256d57600181815481106124df57fe5b906000526020600020906004020160010160009054906101000a90046001600160a01b0316858c8151811061251057fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506001818154811061253d57fe5b906000526020600020906004020160030154848c8151811061255b57fe5b60209081029190910101526001909a01995b600101612305565b50600085156129b3576110046001600160a01b0316636e056520878c8c8b60025442016040518663ffffffff1660e01b815260040180806020018060200180602001856001600160401b03166001600160401b03168152602001848103845288818151815260200191508051906020019060200280838360005b838110156126075781810151838201526020016125ef565b50505050905001848103835287818151815260200191508051906020019060200280838360005b8381101561264657818101518382015260200161262e565b50505050905001848103825286818151815260200191508051906020019060200280838360005b8381101561268557818101518382015260200161266d565b505050509050019750505050505050506020604051808303818588803b1580156126ae57600080fd5b505af1935050505080156126d457506040513d60208110156126cf57600080fd5b505160015b61290f576040516000815260443d10156126f05750600061278b565b60046000803e60005160e01c6308c379a0811461271157600091505061278b565b60043d036004833e81513d60248201116001600160401b038211171561273c5760009250505061278b565b80830180516001600160401b0381111561275d57600094505050505061278b565b8060208301013d860181111561277b5760009550505050505061278b565b601f01601f191660405250925050505b80612796575061283a565b60019150867fa7cdeed7d0db45e3219a6e5d60838824c16f1d39991fcfe3f963029c844bf280826040518080602001828103825283818151815260200191508051906020019080838360005b838110156127fa5781810151838201526020016127e2565b50505050905090810190601f1680156128275780820380516001836020036101000a031916815260200191505b509250505060405180910390a25061290a565b3d808015612864576040519150601f19603f3d011682016040523d82523d6000602084013e612869565b606091505b5060019150867fbfa884552dd8921b6ce90bfe906952ae5b3b29be0cc1a951d4f62697635a3a45826040518080602001828103825283818151815260200191508051906020019080838360005b838110156128ce5781810151838201526020016128b6565b50505050905090810190601f1680156128fb5780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505b6129b3565b801561294d576040805188815290517fa217d08e65f80c73121cd9db834d81652d544bfbf452f6d04922b16c90a37b709181900360200190a16129b1565b604080516020808252601b908201527f6261746368207472616e736665722072657475726e2066616c7365000000000081830152905188917fa7cdeed7d0db45e3219a6e5d60838824c16f1d39991fcfe3f963029c844bf280919081900360600190a25b505b8015612b695760005b8851811015612b675760008982815181106129d357fe5b602002602001015190506000600182815481106129ec57fe5b60009182526020909120600160049092020181015481546001600160a01b03909116916108fc9185908110612a1d57fe5b9060005260206000209060040201600301549081150290604051600060405180830381858888f1935050505090508015612ad95760018281548110612a5e57fe5b60009182526020909120600160049092020181015481546001600160a01b03909116917f6c61d60f69a7beb3e1c80db7f39f37b208537cbb19da3174511b477812b2fc7d9185908110612aad57fe5b9060005260206000209060040201600301546040518082815260200191505060405180910390a2612b5d565b60018281548110612ae657fe5b60009182526020909120600160049092020181015481546001600160a01b03909116917f25d0ce7d2f0cec669a8c17efe49d195c13455bb8872b65fa610ac7f53fe4ca7d9185908110612b3557fe5b9060005260206000209060040201600301546040518082815260200191505060405180910390a25b50506001016129bc565b505b845115612cb35760005b8551811015612cb1576000868281518110612b8a57fe5b60200260200101516001600160a01b03166108fc878481518110612baa57fe5b60200260200101519081150290604051600060405180830381858888f1935050505090508015612c4057868281518110612be057fe5b60200260200101516001600160a01b03167f6c61d60f69a7beb3e1c80db7f39f37b208537cbb19da3174511b477812b2fc7d878481518110612c1e57fe5b60200260200101516040518082815260200191505060405180910390a2612ca8565b868281518110612c4c57fe5b60200260200101516001600160a01b03167f25d0ce7d2f0cec669a8c17efe49d195c13455bb8872b65fa610ac7f53fe4ca7d878481518110612c8a57fe5b60200260200101516040518082815260200191505060405180910390a25b50600101612b73565b505b4715612d1c576040805147815290517f6ecc855f9440a9282c90913bbc91619fd44f5ec0b462af28d127b116f130aa4d9181900360200190a1604051611002904780156108fc02916000818181858888f19350505050158015612d1a573d6000803e3d6000fd5b505b60006003819055600555825115612d3657612d3683613627565b6110016001600160a01b031663fc4333cd6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612d7357600080fd5b505af1158015612d87573d6000803e3d6000fd5b50506040517fedd8d7296956dd970ab4de3f2fc03be2b0ffc615d20cd4c72c6e44f928630ebf925060009150a15060009f9e505050505050505050505050505050565b80516001600160a01b0316600090815260046020526040812054801580612e1b5750600180820381548110612dfb57fe5b9060005260206000209060040201600201601c9054906101000a900460ff165b15612e615782516040516001600160a01b03909116907fe209c46bebf57cf265d5d9009a00870e256d9150f3ed5281ab9d9eb3cec6e4be90600090a26000915050611036565b600154600554600019820111801590612eb75784516040516001600160a01b03909116907fe209c46bebf57cf265d5d9009a00870e256d9150f3ed5281ab9d9eb3cec6e4be90600090a260009350505050611036565b600580546001908101909155805481906000198601908110612ed557fe5b6000918252602082206002600490920201018054921515600160e01b0260ff60e01b199093169290921790915585516040516001600160a01b03909116917ff226e7d8f547ff903d9d419cf5f54e0d7d07efa9584135a53a057c5f1f27f49a91a2506000949350505050565b6000816040516020018082805190602001908083835b60208310612f765780518252601f199092019160209182019101612f57565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120836040516020018082805190602001908083835b60208310612fe45780518252601f199092019160209182019101612fc5565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051602081830303815290604052805190602001201490505b92915050565b015190565b60008261303d57506000613023565b8282028284828161304a57fe5b0414610c935760405162461bcd60e51b81526004018080602001828103825260218152602001806142ab6021913960400191505060405180910390fd5b6000610c9383836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613ae8565b6000610c9383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613b8a565b600082820183811015610c93576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b61316d6141c5565b506040805180820190915281518152602082810190820152919050565b613192614170565b61319b82613be4565b6131a457600080fd5b60006131b38360200151613c1e565b60208085015160408051808201909152868152920190820152915050919050565b60006131de6141c5565b505080518051602091820151919092015191011190565b6131fd6141c5565b613206826131d4565b61320f57600080fd5b6020820151600061321f82613c81565b80830160209586015260408051808201909152908152938401919091525090919050565b80516000901580159061325857508151602110155b61326157600080fd5b60006132708360200151613c1e565b905080836000015110156132cb576040805162461bcd60e51b815260206004820152601a60248201527f6c656e677468206973206c657373207468616e206f6666736574000000000000604482015290519081900360640190fd5b8251602080850151830180519284900392918310156132f157826020036101000a820491505b50949350505050565b606061330582613be4565b61330e57600080fd5b600061331983613db4565b905060608160405190808252806020026020018201604052801561335757816020015b6133446141c5565b81526020019060019003908161333c5790505b50905060006133698560200151613c1e565b60208601510190506000805b848110156133c05761338683613c81565b91506040518060400160405280838152602001848152508482815181106133a957fe5b602090810291909101015291810191600101613375565b509195945050505050565b6133d3614190565b60006133dd614190565b6133e5614170565b6133ee8561318a565b90506000805b6133fd836131d4565b15611f55578061342857613418613413846131f5565b613e10565b6001600160a01b031684526134a0565b80600114156134505761343d613413846131f5565b6001600160a01b031660208501526134a0565b806002141561347857613465613413846131f5565b6001600160a01b031660408501526134a0565b8060031415611f485761348d611e5a846131f5565b6001600160401b03166060850152600191505b6001016133f4565b60606130236134b683613e2a565b613f10565b60608151600014156134dc5750604080516000815260208101909152611036565b6060826000815181106134eb57fe5b602002602001015190506000600190505b835181101561352c576135228285838151811061351557fe5b6020026020010151613f62565b91506001016134fc565b50610c9361353f825160c060ff16613fdf565b82613f62565b600060606029835111156135775760006040518060600160405280602981526020016141e06029913991509150611f5e565b60005b835181101561360d5760005b818110156136045784818151811061359a57fe5b6020026020010151600001516001600160a01b03168583815181106135bb57fe5b6020026020010151600001516001600160a01b031614156135fc5760006040518060600160405280602b8152602001614234602b9139935093505050611f5e565b600101613586565b5060010161357a565b505060408051602081019091526000815260019150915091565b600154815160005b82811015613744576001613641614190565b6001838154811061364e57fe5b600091825260208083206040805160c08101825260049490940290910180546001600160a01b0390811685526001820154811693850193909352600281015492831691840191909152600160a01b82046001600160401b03166060840152600160e01b90910460ff16151560808301526003015460a082015291505b84811015613718578681815181106136de57fe5b6020026020010151600001516001600160a01b031682600001516001600160a01b031614156137105760009250613718565b6001016136ca565b50811561373a5780516001600160a01b03166000908152600460205260408120555b505060010161362f565b50808211156137b957805b828110156137b757600180548061376257fe5b60008281526020812060046000199093019283020180546001600160a01b03199081168255600182810180549092169091556002820180546001600160e81b031916905560039091019190915591550161374f565b505b60008183106137c857816137ca565b825b905060005b818110156139c45761387c8582815181106137e657fe5b6020026020010151600183815481106137fb57fe5b60009182526020918290206040805160c08101825260049390930290910180546001600160a01b0390811684526001820154811694840194909452600281015493841691830191909152600160a01b83046001600160401b03166060830152600160e01b90920460ff161515608082015260039091015460a08201526140d7565b61399757806001016004600087848151811061389457fe5b6020026020010151600001516001600160a01b03166001600160a01b03168152602001908152602001600020819055508481815181106138d057fe5b6020026020010151600182815481106138e557fe5b6000918252602091829020835160049092020180546001600160a01b039283166001600160a01b0319918216178255928401516001820180549184169185169190911790556040840151600282018054606087015160808801511515600160e01b0260ff60e01b196001600160401b03909216600160a01b0267ffffffffffffffff60a01b1995909716929097169190911792909216939093171692909217905560a0909101516003909101556139bc565b6000600182815481106139a657fe5b9060005260206000209060040201600301819055505b6001016137cf565b5082821115611ded57825b82811015610fba5760018582815181106139e557fe5b60209081029190910181015182546001818101855560009485528385208351600493840290910180546001600160a01b039283166001600160a01b03199182161782559585015181840180549184169188169190911790556040850151600282018054606088015160808901511515600160e01b0260ff60e01b196001600160401b03909216600160a01b0267ffffffffffffffff60a01b199590971692909a169190911792909216939093171695909517905560a09092015160039093019290925587519084019290889085908110613abb57fe5b602090810291909101810151516001600160a01b03168252810191909152604001600020556001016139cf565b60008183613b745760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613b39578181015183820152602001613b21565b50505050905090810190601f168015613b665780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581613b8057fe5b0495945050505050565b60008184841115613bdc5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315613b39578181015183820152602001613b21565b505050900390565b8051600090613bf557506000611036565b6020820151805160001a9060c0821015613c1457600092505050611036565b5060019392505050565b8051600090811a6080811015613c38576000915050611036565b60b8811080613c53575060c08110801590613c53575060f881105b15613c62576001915050611036565b60c0811015613c765760b519019050611036565b60f519019050611036565b80516000908190811a6080811015613c9c5760019150613dad565b60b8811015613cb157607e1981019150613dad565b60c0811015613d2b57600060b78203600186019550806020036101000a865104915060018101820193505080831015613d25576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b50613dad565b60f8811015613d405760be1981019150613dad565b600060f78203600186019550806020036101000a865104915060018101820193505080831015613dab576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b505b5092915050565b8051600090613dc557506000611036565b60008090506000613dd98460200151613c1e565b602085015185519181019250015b80821015613e0757613df882613c81565b60019093019290910190613de7565b50909392505050565b8051600090601514613e2157600080fd5b61302382613243565b604080516020808252818301909252606091829190602082018180368337505050602081018490529050600067ffffffffffffffff198416613e6e57506018613e92565b6fffffffffffffffffffffffffffffffff198416613e8e57506010613e92565b5060005b6020811015613ec857818181518110613ea757fe5b01602001516001600160f81b03191615613ec057613ec8565b600101613e92565b60008160200390506060816040519080825280601f01601f191660200182016040528015613efd576020820181803683370190505b5080830196909652508452509192915050565b606081516001148015613f425750607f60f81b82600081518110613f3057fe5b01602001516001600160f81b03191611155b15613f4e575080611036565b613023613f608351608060ff16613fdf565b835b6060806040519050835180825260208201818101602087015b81831015613f93578051835260209283019201613f7b565b50855184518101855292509050808201602086015b81831015613fc0578051835260209283019201613fa8565b508651929092011591909101601f01601f191660405250905092915050565b606068010000000000000000831061402f576040805162461bcd60e51b815260206004820152600e60248201526d696e70757420746f6f206c6f6e6760901b604482015290519081900360640190fd5b604080516001808252818301909252606091602082018180368337019050509050603784116140895782840160f81b8160008151811061406b57fe5b60200101906001600160f81b031916908160001a9053509050613023565b606061409485613e2a565b90508381510160370160f81b826000815181106140ad57fe5b60200101906001600160f81b031916908160001a9053506140ce8282613f62565b95945050505050565b805182516000916001600160a01b039182169116148015614111575081602001516001600160a01b031683602001516001600160a01b0316145b8015614136575081604001516001600160a01b031683604001516001600160a01b0316145b8015610c935750506060908101519101516001600160401b0390811691161490565b60408051808201909152600081526060602082015290565b60405180604001604052806141836141c5565b8152602001600081525090565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915290565b60405180604001604052806000815260200160008152509056fe746865206e756d626572206f662076616c696461746f72732065786365656420746865206c696d6974746865206275726e526174696f206d757374206265206e6f2067726561746572207468616e2031303030306475706c696361746520636f6e73656e7375732061646472657373206f662076616c696461746f725365747468652065787069726554696d655365636f6e64476170206973206f7574206f662072616e67656c656e677468206f66206a61696c2076616c696461746f7273206d757374206265206f6e65536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e7472616374666565206973206c6172676572207468616e2044555354595f494e434f4d494e476c656e677468206f662065787069726554696d655365636f6e64476170206d69736d617463686661696c656420746f20706172736520696e69742076616c696461746f72536574f905ec80f905e8f846942a7cdd959bfe8d9487b2a43b33565295a698f7e294b6a7edd747c0554875d3fc531d19ba1497992c5e941ff80f3f7f110ffd8920a3ac38fdef318fe94a3f86048c27395000f846946488aa4d1955ee33403f8ccb1d4de5fb97c7ade294220f003d8bdfaadf52aa1e55ae4cc485e6794875941a87e90e440a39c99aa9cb5cea0ad6a3f0b2407b86048c27395000f846949ef9f4360c606c7ab4db26b016007d3ad0ab86a0946103af86a874b705854033438383c82575f25bc29418e2db06cbff3e3c5f856410a1838649e760175786048c27395000f84694ee01c3b1283aa067c58eab4709f85e99d46de5fe94ee4b9bfb1871c64e2bcabb1dc382dc8b7c4218a29415904ab26ab0e99d70b51c220ccdcccabee6e29786048c27395000f84694685b1ded8013785d6623cc18d214320b6bb6475994a20ef4e5e4e7e36258dbf51f4d905114cb1b34bc9413e39085dc88704f4394d35209a02b1a9520320c86048c27395000f8469478f3adfc719c99674c072166708589033e2d9afe9448a30d5eaa7b64492a160f139e2da2800ec3834e94055838358c29edf4dcc1ba1985ad58aedbb6be2b86048c27395000f84694c2be4ec20253b8642161bc3f444f53679c1f3d479466f50c616d737e60d7ca6311ff0d9c434197898a94d1d678a2506eeaa365056fe565df8bc8659f28b086048c27395000f846942f7be8361c80a4c1e7e9aaf001d0877f1cfde218945f93992ac37f3e61db2ef8a587a436a161fd210b94ecbc4fb1a97861344dad0867ca3cba2b860411f086048c27395000f84694ce2fd7544e0b2cc94692d4a704debef7bcb613289444abc67b4b2fba283c582387f54c9cba7c34bafa948acc2ab395ded08bb75ce85bf0f95ad2abc51ad586048c27395000f84694b8f7166496996a7da21cf1f1b04d9b3e26a3d077946770572763289aac606e4f327c2f6cc1aa3b3e3b94882d745ed97d4422ca8da1c22ec49d880c4c097286048c27395000f846942d4c407bbe49438ed859fe965b140dcf1aab71a9943ad0939e120f33518fbba04631afe7a3ed6327b194b2bbb170ca4e499a2b0f3cc85ebfa6e8c4dfcbea86048c27395000f846946bbad7cf34b5fa511d8e963dbba288b1960e75d694853b0f6c324d1f4e76c8266942337ac1b0af1a229442498946a51ca5924552ead6fc2af08b94fcba648601d1a94a2000f846944430b3230294d12c6ab2aac5c2cd68e80b16b581947b107f4976a252a6939b771202c28e64e03f52d694795811a7f214084116949fc4f53cedbf189eeab28601d1a94a2000f84694ea0a6e3c511bbd10f4519ece37dc24887e11b55d946811ca77acfb221a49393c193f3a22db829fcc8e9464feb7c04830dd9ace164fc5c52b3f5a29e5018a8601d1a94a2000f846947ae2f5b9e386cd1b50a4550696d957cb4900f03a94e83bcc5077e6b873995c24bac871b5ad856047e19464e48d4057a90b233e026c1041e6012ada897fe88601d1a94a2000f8469482012708dafc9e1b880fd083b32182b869be8e09948e5adc73a2d233a1b496ed3115464dd6c7b887509428b383d324bc9a37f4e276190796ba5a8947f5ed8601d1a94a2000f8469422b81f8e175ffde54d797fe11eb03f9e3bf75f1d94a1c3ef7ca38d8ba80cce3bfc53ebd2903ed21658942767f7447f7b9b70313d4147b795414aecea54718601d1a94a2000f8469468bf0b8b6fb4e317a0f9d6f03eaf8ce6675bc60d94675cfe570b7902623f47e7f59c9664b5f5065dcf94d84f0d2e50bcf00f2fc476e1c57f5ca2d57f625b8601d1a94a2000f846948c4d90829ce8f72d0163c1d5cf348a862d5506309485c42a7b34309bee2ed6a235f86d16f059deec5894cc2cedc53f0fa6d376336efb67e43d167169f3b78601d1a94a2000f8469435e7a025f4da968de7e4d7e4004197917f4070f194b1182abaeeb3b4d8eba7e6a4162eac7ace23d57394c4fd0d870da52e73de2dd8ded19fe3d26f43a1138601d1a94a2000f84694d6caa02bbebaebb5d7e581e4b66559e635f805ff94c07335cf083c1c46a487f0325769d88e163b653694efaff03b42e41f953a925fc43720e45fb61a19938601d1a94a2000746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e7472616374746865206d6573736167652073656e646572206d7573742062652074686520626c6f636b2070726f6475636572746865206d6573736167652073656e646572206d75737420626520736c61736820636f6e7472616374a2646970667358221220b806ba3d9dd9e078bac9726f79b32c9b62db327924a189cc1a9e4e106ffbe50d64736f6c63430006040033", + }, + ], + ), + ( + 97, + vec![ + UpgradeConfig { + contract_addr: "0x0000000000000000000000000000000000001000", + code: "6080604052600436106102e45760003560e01c80638624988211610190578063c8509d81116100dc578063eb57e20211610095578063f9a2bbc71161006f578063f9a2bbc714610a54578063fc3e590814610a69578063fccc281314610a7e578063fd6a687914610a93576102e4565b8063eb57e202146109e6578063eda5868c14610a19578063f340fa0114610a2e576102e4565b8063c8509d81146106d8578063d86222d51461097d578063daacdb6614610992578063dc927faf146109a7578063e086c7b1146109bc578063e1c7392a146109d1576102e4565b8063aaf5eb6811610149578063ad3c9da611610123578063ad3c9da6146108d0578063b7ab4db514610903578063bf9f4995146104c0578063c81b166214610968576102e4565b8063aaf5eb68146107db578063ab51bb96146107f0578063ac43175114610805576102e4565b8063862498821461075d57806396713da9146107725780639dc0926214610787578063a1a11bf51461079c578063a5422d5c146107b1578063a78abc16146107c6576102e4565b806351e806721161024f57806370fd5bad116102085780637942fd05116101e25780637942fd05146106ae57806381650b62146106c3578063831d65d1146106d8578063853230aa14610699576102e4565b806370fd5bad1461066f57806375d47a0a1461068457806378dfed4a14610699576102e4565b806351e8067214610572578063565c56b3146105875780635667515a146105ba5780635d77156c146105cf5780636969a25c146105e45780636e47b4821461065a576102e4565b80633de0f0d8116102a15780633de0f0d8146104ab5780633dffc387146104c057806343756e5c146104eb578063493279b11461051c5780634bf6c882146105485780635192c82c1461055d576102e4565b80630bee7a67146102e95780631182b87514610317578063152ad3b8146104115780631ff180691461043a578063219f22d51461046157806335409f7f14610476575b600080fd5b3480156102f557600080fd5b506102fe610aa8565b6040805163ffffffff9092168252519081900360200190f35b34801561032357600080fd5b5061039c6004803603604081101561033a57600080fd5b60ff8235169190810190604081016020820135600160201b81111561035e57600080fd5b82018360208201111561037057600080fd5b803590602001918460018302840111600160201b8311171561039157600080fd5b509092509050610aad565b6040805160208082528351818301528351919283929083019185019080838360005b838110156103d65781810151838201526020016103be565b50505050905090810190601f1680156104035780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561041d57600080fd5b50610426610c9a565b604080519115158252519081900360200190f35b34801561044657600080fd5b5061044f610ca3565b60408051918252519081900360200190f35b34801561046d57600080fd5b506102fe610ca9565b34801561048257600080fd5b506104a96004803603602081101561049957600080fd5b50356001600160a01b0316610cae565b005b3480156104b757600080fd5b5061044f610fc2565b3480156104cc57600080fd5b506104d5610fc8565b6040805160ff9092168252519081900360200190f35b3480156104f757600080fd5b50610500610fcd565b604080516001600160a01b039092168252519081900360200190f35b34801561052857600080fd5b50610531610fd3565b6040805161ffff9092168252519081900360200190f35b34801561055457600080fd5b506104d5610fd8565b34801561056957600080fd5b5061044f610fdd565b34801561057e57600080fd5b50610500610fe3565b34801561059357600080fd5b5061044f600480360360208110156105aa57600080fd5b50356001600160a01b0316610fe9565b3480156105c657600080fd5b506104d561103b565b3480156105db57600080fd5b506102fe611040565b3480156105f057600080fd5b5061060e6004803603602081101561060757600080fd5b5035611045565b604080516001600160a01b039788168152958716602087015293909516848401526001600160401b0390911660608401521515608083015260a082019290925290519081900360c00190f35b34801561066657600080fd5b506105006110a9565b34801561067b57600080fd5b506104d56110af565b34801561069057600080fd5b506105006110b4565b3480156106a557600080fd5b5061044f6110ba565b3480156106ba57600080fd5b506104d56110c0565b3480156106cf57600080fd5b506102fe6110c5565b3480156106e457600080fd5b506104a9600480360360408110156106fb57600080fd5b60ff8235169190810190604081016020820135600160201b81111561071f57600080fd5b82018360208201111561073157600080fd5b803590602001918460018302840111600160201b8311171561075257600080fd5b5090925090506110ca565b34801561076957600080fd5b5061044f61117d565b34801561077e57600080fd5b506104d5611183565b34801561079357600080fd5b50610500611188565b3480156107a857600080fd5b5061050061118e565b3480156107bd57600080fd5b5061039c611194565b3480156107d257600080fd5b506104266111b3565b3480156107e757600080fd5b5061044f6111bc565b3480156107fc57600080fd5b506102fe61103b565b34801561081157600080fd5b506104a96004803603604081101561082857600080fd5b810190602081018135600160201b81111561084257600080fd5b82018360208201111561085457600080fd5b803590602001918460018302840111600160201b8311171561087557600080fd5b919390929091602081019035600160201b81111561089257600080fd5b8201836020820111156108a457600080fd5b803590602001918460018302840111600160201b831117156108c557600080fd5b5090925090506111c5565b3480156108dc57600080fd5b5061044f600480360360208110156108f357600080fd5b50356001600160a01b03166115bc565b34801561090f57600080fd5b506109186115ce565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561095457818101518382015260200161093c565b505050509050019250505060405180910390f35b34801561097457600080fd5b506105006116f4565b34801561098957600080fd5b5061044f6116fa565b34801561099e57600080fd5b5061044f611706565b3480156109b357600080fd5b5061050061170c565b3480156109c857600080fd5b5061044f611712565b3480156109dd57600080fd5b506104a9611717565b3480156109f257600080fd5b506104a960048036036020811015610a0957600080fd5b50356001600160a01b031661191a565b348015610a2557600080fd5b506102fe611ae9565b6104a960048036036020811015610a4457600080fd5b50356001600160a01b0316611aee565b348015610a6057600080fd5b50610500611df3565b348015610a7557600080fd5b506104d5611df9565b348015610a8a57600080fd5b50610500611dfe565b348015610a9f57600080fd5b50610500611e04565b606481565b60005460609060ff16610b03576040805162461bcd60e51b81526020600482015260196024820152781d1a194818dbdb9d1c9858dd081b9bdd081a5b9a5d081e595d603a1b604482015290519081900360640190fd5b3361200014610b435760405162461bcd60e51b815260040180806020018281038252602f81526020018061450d602f913960400191505060405180910390fd5b610b4b614158565b6000610b8c85858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611e0a92505050565b9150915080610ba857610b9f6064611f63565b92505050610c93565b815160009060ff16610bc857610bc18360200151611fc4565b9050610c5f565b825160ff1660011415610c5b57826020015151600114610c35577f70e72399380dcfb0338abc03dc8d47f9f470ada8e769c9a78d644ea97385ecb26040518080602001828103825260258152602001806144316025913960400191505060405180910390a1506067610c56565b610bc18360200151600081518110610c4957fe5b6020026020010151612dca565b610c5f565b5060655b63ffffffff8116610c845750506040805160008152602081019091529150610c939050565b610c8d81611f63565b93505050505b9392505050565b60075460ff1681565b60035481565b606881565b3361100114610cee5760405162461bcd60e51b81526004018080602001828103825260298152602001806145696029913960400191505060405180910390fd5b6001600160a01b03811660009081526004602052604090205480610d125750610fbf565b600181039050600060018281548110610d2757fe5b60009182526020909120600360049092020101546001549091506000190180610d7657600060018481548110610d5957fe5b906000526020600020906004020160030181905550505050610fbf565b6040805183815290516001600160a01b038616917f3b6f9ef90462b512a1293ecec018670bf7b7f1876fb727590a8a6d7643130a70919081900360200190a26001600160a01b038416600090815260046020526040812055600154600019018314610ef857600180546000198101908110610ded57fe5b906000526020600020906004020160018481548110610e0857fe5b6000918252602082208354600492830290910180546001600160a01b03199081166001600160a01b0393841617825560018087015481840180548416918616919091179055600280880180549185018054909416919095161780835584546001600160401b03600160a01b91829004160267ffffffffffffffff60a01b1990911617808355935460ff600160e01b918290041615150260ff60e01b199094169390931790556003948501549401939093558254868401939192919087908110610ecd57fe5b600091825260208083206004909202909101546001600160a01b031683528201929092526040019020555b6001805480610f0357fe5b60008281526020812060046000199093019283020180546001600160a01b0319908116825560018201805490911690556002810180546001600160e81b03191690556003018190559155818381610f5657fe5b0490508015610fba5760015460005b81811015610fb7578260018281548110610f7b57fe5b9060005260206000209060040201600301540160018281548110610f9b57fe5b6000918252602090912060036004909202010155600101610f65565b50505b505050505b50565b61271081565b600181565b61100181565b606181565b600881565b60065481565b61200081565b6001600160a01b03811660009081526004602052604081205480611011576000915050611036565b60018082038154811061102057fe5b9060005260206000209060040201600301549150505b919050565b600081565b606781565b6001818154811061105257fe5b600091825260209091206004909102018054600182015460028301546003909301546001600160a01b0392831694509082169291821691600160a01b81046001600160401b031691600160e01b90910460ff169086565b61100581565b600281565b61100881565b6103e881565b600b81565b606681565b336120001461110a5760405162461bcd60e51b815260040180806020018281038252602f81526020018061450d602f913960400191505060405180910390fd5b7f41ce201247b6ceb957dcdb217d0b8acb50b9ea0e12af9af4f5e7f38902101605838383604051808460ff1660ff168152602001806020018281038252848482818152602001925080828437600083820152604051601f909101601f1916909201829003965090945050505050a1505050565b60025481565b600981565b61100781565b61100681565b604051806101e001604052806101ab81526020016141e06101ab913981565b60005460ff1681565b6402540be40081565b60005460ff16611218576040805162461bcd60e51b81526020600482015260196024820152781d1a194818dbdb9d1c9858dd081b9bdd081a5b9a5d081e595d603a1b604482015290519081900360640190fd5b33611007146112585760405162461bcd60e51b815260040180806020018281038252602e815260200180614477602e913960400191505060405180910390fd5b6112c284848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080518082019091526013815272065787069726554696d655365636f6e6447617606c1b60208201529150612f419050565b1561139d57602081146113065760405162461bcd60e51b81526004018080602001828103825260268152602001806144c66026913960400191505060405180910390fd5b604080516020601f84018190048102820181019092528281526000916113449185858083850183828082843760009201919091525061302992505050565b90506064811015801561135a5750620186a08111155b6113955760405162461bcd60e51b815260040180806020018281038252602781526020018061440a6027913960400191505060405180910390fd5b60025561152a565b6113fd84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260098152686275726e526174696f60b81b60208201529150612f419050565b156114ed5760208114611457576040805162461bcd60e51b815260206004820152601c60248201527f6c656e677468206f66206275726e526174696f206d69736d6174636800000000604482015290519081900360640190fd5b604080516020601f84018190048102820181019092528281526000916114959185858083850183828082843760009201919091525061302992505050565b90506127108111156114d85760405162461bcd60e51b815260040180806020018281038252602b8152602001806143b4602b913960400191505060405180910390fd5b6006556007805460ff1916600117905561152a565b6040805162461bcd60e51b815260206004820152600d60248201526c756e6b6e6f776e20706172616d60981b604482015290519081900360640190fd5b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a848484846040518080602001806020018381038352878782818152602001925080828437600083820152601f01601f191690910184810383528581526020019050858580828437600083820152604051601f909101601f19169092018290039850909650505050505050a150505050565b60046020526000908152604090205481565b6001546060906000805b8281101561161f57600181815481106115ed57fe5b9060005260206000209060040201600201601c9054906101000a900460ff16611617576001909101905b6001016115d8565b5060608160405190808252806020026020018201604052801561164c578160200160208202803683370190505b50600092509050815b838110156116ec576001818154811061166a57fe5b9060005260206000209060040201600201601c9054906101000a900460ff166116e4576001818154811061169a57fe5b600091825260209091206004909102015482516001600160a01b03909116908390859081106116c557fe5b6001600160a01b03909216602092830291909101909101526001909201915b600101611655565b509250505090565b61100281565b67016345785d8a000081565b60055481565b61100381565b602981565b60005460ff161561176f576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b611777614158565b600061179d604051806101e001604052806101ab81526020016141e06101ab9139611e0a565b91509150806117dd5760405162461bcd60e51b81526004018080602001828103825260218152602001806144ec6021913960400191505060405180910390fd5b60005b826020015151811015611902576001836020015182815181106117ff57fe5b60209081029190910181015182546001818101855560009485528385208351600493840290910180546001600160a01b039283166001600160a01b03199182161782558587015182850180549185169183169190911790556040860151600283018054606089015160808a01511515600160e01b0260ff60e01b196001600160401b03909216600160a01b0267ffffffffffffffff60a01b199590981692909516919091179290921694909417161790915560a0909301516003909301929092559186015180519185019391859081106118d557fe5b602090810291909101810151516001600160a01b03168252810191909152604001600020556001016117e0565b50506103e8600255506000805460ff19166001179055565b336110011461195a5760405162461bcd60e51b81526004018080602001828103825260298152602001806145696029913960400191505060405180910390fd5b6001600160a01b0381166000908152600460205260409020548061197e5750610fbf565b60018103905060006001828154811061199357fe5b90600052602060002090600402016003015490506000600183815481106119b657fe5b906000526020600020906004020160030181905550600060018080549050039050836001600160a01b03167f8cd4e147d8af98a9e3b6724021b8bf6aed2e5dac71c38f2dce8161b82585b25d836040518082815260200191505060405180910390a280611a2557505050610fbf565b6000818381611a3057fe5b0490508015610fba5760005b84811015611a8e578160018281548110611a5257fe5b9060005260206000209060040201600301540160018281548110611a7257fe5b6000918252602090912060036004909202010155600101611a3c565b50600180549085015b81811015610fb7578260018281548110611aad57fe5b9060005260206000209060040201600301540160018281548110611acd57fe5b6000918252602090912060036004909202010155600101611a97565b606581565b334114611b2c5760405162461bcd60e51b815260040180806020018281038252602d81526020018061453c602d913960400191505060405180910390fd5b60005460ff16611b7f576040805162461bcd60e51b81526020600482015260196024820152781d1a194818dbdb9d1c9858dd081b9bdd081a5b9a5d081e595d603a1b604482015290519081900360640190fd5b60003411611bcc576040805162461bcd60e51b81526020600482015260156024820152746465706f7369742076616c7565206973207a65726f60581b604482015290519081900360640190fd5b6001600160a01b0381166000908152600460205260409020546007543491906103e89060ff1615611bfc57506006545b600083118015611c0c5750600081115b15611cb5576000611c35612710611c29868563ffffffff61302e16565b9063ffffffff61308716565b90508015611cb35760405161dead9082156108fc029083906000818181858888f19350505050158015611c6c573d6000803e3d6000fd5b506040805182815290517f627059660ea01c4733a328effb2294d2f86905bf806da763a89cee254de8bee59181900360200190a1611cb0848263ffffffff6130c916565b93505b505b8115611dad576000600180840381548110611ccc57fe5b9060005260206000209060040201905080600201601c9054906101000a900460ff1615611d37576040805185815290516001600160a01b038716917ff177e5d6c5764d79c32883ed824111d9b13f5668cf6ab1cc12dd36791dd955b4919081900360200190a2611da7565b600354611d4a908563ffffffff61310b16565b6003908155810154611d62908563ffffffff61310b16565b60038201556040805185815290516001600160a01b038716917f93a090ecc682c002995fad3c85b30c5651d7fd29b0be5da9d784a3302aedc055919081900360200190a25b50611ded565b6040805184815290516001600160a01b038616917ff177e5d6c5764d79c32883ed824111d9b13f5668cf6ab1cc12dd36791dd955b4919081900360200190a25b50505050565b61100081565b600381565b61dead81565b61100481565b611e12614158565b6000611e1c614158565b611e24614170565b611e35611e3086613165565b61318a565b90506000805b611e44836131d4565b15611f555780611e6957611e5f611e5a846131f5565b613243565b60ff168452611f4d565b8060011415611f48576060611e85611e80856131f5565b6132fa565b90508051604051908082528060200260200182016040528015611ec257816020015b611eaf614190565b815260200190600190039081611ea75790505b50602086015260005b8151811015611f3d57611edc614190565b6000611efa848481518110611eed57fe5b60200260200101516133cb565b9150915080611f1757876000995099505050505050505050611f5e565b8188602001518481518110611f2857fe5b60209081029190910101525050600101611ecb565b506001925050611f4d565b611f55565b600101611e3b565b50919350909150505b915091565b604080516001808252818301909252606091829190816020015b6060815260200190600190039081611f7d579050509050611fa38363ffffffff166134a8565b81600081518110611fb057fe5b6020026020010181905250610c93816134bb565b6000806060611fd284613545565b915091508161207f577f70e72399380dcfb0338abc03dc8d47f9f470ada8e769c9a78d644ea97385ecb2816040518080602001828103825283818151815260200191508051906020019080838360005b8381101561203a578181015183820152602001612022565b50505050905090810190601f1680156120675780820380516001836020036101000a031916815260200191505b509250505060405180910390a1606692505050611036565b600080805b6001548110156120fc5767016345785d8a0000600182815481106120a457fe5b906000526020600020906004020160030154106120c6576001909201916120f4565b6000600182815481106120d557fe5b90600052602060002090600402016003015411156120f4576001909101905b600101612084565b50606082604051908082528060200260200182016040528015612129578160200160208202803683370190505b509050606083604051908082528060200260200182016040528015612158578160200160208202803683370190505b509050606084604051908082528060200260200182016040528015612187578160200160208202803683370190505b5090506060856040519080825280602002602001820160405280156121b6578160200160208202803683370190505b50905060006060866040519080825280602002602001820160405280156121e7578160200160208202803683370190505b509050606087604051908082528060200260200182016040528015612216578160200160208202803683370190505b509050600098506000975060608d905060006110046001600160a01b031663149d14d96040518163ffffffff1660e01b815260040160206040518083038186803b15801561226357600080fd5b505afa158015612277573d6000803e3d6000fd5b505050506040513d602081101561228d57600080fd5b5051905067016345785d8a0000811115612302577f70e72399380dcfb0338abc03dc8d47f9f470ada8e769c9a78d644ea97385ecb26040518080602001828103825260218152602001806144a56021913960400191505060405180910390a160689d5050505050505050505050505050611036565b60005b6001548110156125755767016345785d8a00006001828154811061232557fe5b906000526020600020906004020160030154106124ab576001818154811061234957fe5b906000526020600020906004020160020160009054906101000a90046001600160a01b03168a8d8151811061237a57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060006402540be400600183815481106123af57fe5b906000526020600020906004020160030154816123c857fe5b06600183815481106123d657fe5b9060005260206000209060040201600301540390506123fe83826130c990919063ffffffff16565b8a8e8151811061240a57fe5b6020026020010181815250506001828154811061242357fe5b906000526020600020906004020160020160009054906101000a90046001600160a01b0316888e8151811061245457fe5b60200260200101906001600160a01b031690816001600160a01b03168152505081898e8151811061248157fe5b602090810291909101015261249c878263ffffffff61310b16565b6001909d019c965061256d9050565b6000600182815481106124ba57fe5b906000526020600020906004020160030154111561256d57600181815481106124df57fe5b906000526020600020906004020160010160009054906101000a90046001600160a01b0316858c8151811061251057fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506001818154811061253d57fe5b906000526020600020906004020160030154848c8151811061255b57fe5b60209081029190910101526001909a01995b600101612305565b50600085156129b3576110046001600160a01b0316636e056520878c8c8b60025442016040518663ffffffff1660e01b815260040180806020018060200180602001856001600160401b03166001600160401b03168152602001848103845288818151815260200191508051906020019060200280838360005b838110156126075781810151838201526020016125ef565b50505050905001848103835287818151815260200191508051906020019060200280838360005b8381101561264657818101518382015260200161262e565b50505050905001848103825286818151815260200191508051906020019060200280838360005b8381101561268557818101518382015260200161266d565b505050509050019750505050505050506020604051808303818588803b1580156126ae57600080fd5b505af1935050505080156126d457506040513d60208110156126cf57600080fd5b505160015b61290f576040516000815260443d10156126f05750600061278b565b60046000803e60005160e01c6308c379a0811461271157600091505061278b565b60043d036004833e81513d60248201116001600160401b038211171561273c5760009250505061278b565b80830180516001600160401b0381111561275d57600094505050505061278b565b8060208301013d860181111561277b5760009550505050505061278b565b601f01601f191660405250925050505b80612796575061283a565b60019150867fa7cdeed7d0db45e3219a6e5d60838824c16f1d39991fcfe3f963029c844bf280826040518080602001828103825283818151815260200191508051906020019080838360005b838110156127fa5781810151838201526020016127e2565b50505050905090810190601f1680156128275780820380516001836020036101000a031916815260200191505b509250505060405180910390a25061290a565b3d808015612864576040519150601f19603f3d011682016040523d82523d6000602084013e612869565b606091505b5060019150867fbfa884552dd8921b6ce90bfe906952ae5b3b29be0cc1a951d4f62697635a3a45826040518080602001828103825283818151815260200191508051906020019080838360005b838110156128ce5781810151838201526020016128b6565b50505050905090810190601f1680156128fb5780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505b6129b3565b801561294d576040805188815290517fa217d08e65f80c73121cd9db834d81652d544bfbf452f6d04922b16c90a37b709181900360200190a16129b1565b604080516020808252601b908201527f6261746368207472616e736665722072657475726e2066616c7365000000000081830152905188917fa7cdeed7d0db45e3219a6e5d60838824c16f1d39991fcfe3f963029c844bf280919081900360600190a25b505b8015612b695760005b8851811015612b675760008982815181106129d357fe5b602002602001015190506000600182815481106129ec57fe5b60009182526020909120600160049092020181015481546001600160a01b03909116916108fc9185908110612a1d57fe5b9060005260206000209060040201600301549081150290604051600060405180830381858888f1935050505090508015612ad95760018281548110612a5e57fe5b60009182526020909120600160049092020181015481546001600160a01b03909116917f6c61d60f69a7beb3e1c80db7f39f37b208537cbb19da3174511b477812b2fc7d9185908110612aad57fe5b9060005260206000209060040201600301546040518082815260200191505060405180910390a2612b5d565b60018281548110612ae657fe5b60009182526020909120600160049092020181015481546001600160a01b03909116917f25d0ce7d2f0cec669a8c17efe49d195c13455bb8872b65fa610ac7f53fe4ca7d9185908110612b3557fe5b9060005260206000209060040201600301546040518082815260200191505060405180910390a25b50506001016129bc565b505b845115612cb35760005b8551811015612cb1576000868281518110612b8a57fe5b60200260200101516001600160a01b03166108fc878481518110612baa57fe5b60200260200101519081150290604051600060405180830381858888f1935050505090508015612c4057868281518110612be057fe5b60200260200101516001600160a01b03167f6c61d60f69a7beb3e1c80db7f39f37b208537cbb19da3174511b477812b2fc7d878481518110612c1e57fe5b60200260200101516040518082815260200191505060405180910390a2612ca8565b868281518110612c4c57fe5b60200260200101516001600160a01b03167f25d0ce7d2f0cec669a8c17efe49d195c13455bb8872b65fa610ac7f53fe4ca7d878481518110612c8a57fe5b60200260200101516040518082815260200191505060405180910390a25b50600101612b73565b505b4715612d1c576040805147815290517f6ecc855f9440a9282c90913bbc91619fd44f5ec0b462af28d127b116f130aa4d9181900360200190a1604051611002904780156108fc02916000818181858888f19350505050158015612d1a573d6000803e3d6000fd5b505b60006003819055600555825115612d3657612d3683613627565b6110016001600160a01b031663fc4333cd6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612d7357600080fd5b505af1158015612d87573d6000803e3d6000fd5b50506040517fedd8d7296956dd970ab4de3f2fc03be2b0ffc615d20cd4c72c6e44f928630ebf925060009150a15060009f9e505050505050505050505050505050565b80516001600160a01b0316600090815260046020526040812054801580612e1b5750600180820381548110612dfb57fe5b9060005260206000209060040201600201601c9054906101000a900460ff165b15612e615782516040516001600160a01b03909116907fe209c46bebf57cf265d5d9009a00870e256d9150f3ed5281ab9d9eb3cec6e4be90600090a26000915050611036565b600154600554600019820111801590612eb75784516040516001600160a01b03909116907fe209c46bebf57cf265d5d9009a00870e256d9150f3ed5281ab9d9eb3cec6e4be90600090a260009350505050611036565b600580546001908101909155805481906000198601908110612ed557fe5b6000918252602082206002600490920201018054921515600160e01b0260ff60e01b199093169290921790915585516040516001600160a01b03909116917ff226e7d8f547ff903d9d419cf5f54e0d7d07efa9584135a53a057c5f1f27f49a91a2506000949350505050565b6000816040516020018082805190602001908083835b60208310612f765780518252601f199092019160209182019101612f57565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120836040516020018082805190602001908083835b60208310612fe45780518252601f199092019160209182019101612fc5565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051602081830303815290604052805190602001201490505b92915050565b015190565b60008261303d57506000613023565b8282028284828161304a57fe5b0414610c935760405162461bcd60e51b81526004018080602001828103825260218152602001806144566021913960400191505060405180910390fd5b6000610c9383836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613ae8565b6000610c9383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613b8a565b600082820183811015610c93576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b61316d6141c5565b506040805180820190915281518152602082810190820152919050565b613192614170565b61319b82613be4565b6131a457600080fd5b60006131b38360200151613c1e565b60208085015160408051808201909152868152920190820152915050919050565b60006131de6141c5565b505080518051602091820151919092015191011190565b6131fd6141c5565b613206826131d4565b61320f57600080fd5b6020820151600061321f82613c81565b80830160209586015260408051808201909152908152938401919091525090919050565b80516000901580159061325857508151602110155b61326157600080fd5b60006132708360200151613c1e565b905080836000015110156132cb576040805162461bcd60e51b815260206004820152601a60248201527f6c656e677468206973206c657373207468616e206f6666736574000000000000604482015290519081900360640190fd5b8251602080850151830180519284900392918310156132f157826020036101000a820491505b50949350505050565b606061330582613be4565b61330e57600080fd5b600061331983613db4565b905060608160405190808252806020026020018201604052801561335757816020015b6133446141c5565b81526020019060019003908161333c5790505b50905060006133698560200151613c1e565b60208601510190506000805b848110156133c05761338683613c81565b91506040518060400160405280838152602001848152508482815181106133a957fe5b602090810291909101015291810191600101613375565b509195945050505050565b6133d3614190565b60006133dd614190565b6133e5614170565b6133ee8561318a565b90506000805b6133fd836131d4565b15611f55578061342857613418613413846131f5565b613e10565b6001600160a01b031684526134a0565b80600114156134505761343d613413846131f5565b6001600160a01b031660208501526134a0565b806002141561347857613465613413846131f5565b6001600160a01b031660408501526134a0565b8060031415611f485761348d611e5a846131f5565b6001600160401b03166060850152600191505b6001016133f4565b60606130236134b683613e2a565b613f10565b60608151600014156134dc5750604080516000815260208101909152611036565b6060826000815181106134eb57fe5b602002602001015190506000600190505b835181101561352c576135228285838151811061351557fe5b6020026020010151613f62565b91506001016134fc565b50610c9361353f825160c060ff16613fdf565b82613f62565b6000606060298351111561357757600060405180606001604052806029815260200161438b6029913991509150611f5e565b60005b835181101561360d5760005b818110156136045784818151811061359a57fe5b6020026020010151600001516001600160a01b03168583815181106135bb57fe5b6020026020010151600001516001600160a01b031614156135fc5760006040518060600160405280602b81526020016143df602b9139935093505050611f5e565b600101613586565b5060010161357a565b505060408051602081019091526000815260019150915091565b600154815160005b82811015613744576001613641614190565b6001838154811061364e57fe5b600091825260208083206040805160c08101825260049490940290910180546001600160a01b0390811685526001820154811693850193909352600281015492831691840191909152600160a01b82046001600160401b03166060840152600160e01b90910460ff16151560808301526003015460a082015291505b84811015613718578681815181106136de57fe5b6020026020010151600001516001600160a01b031682600001516001600160a01b031614156137105760009250613718565b6001016136ca565b50811561373a5780516001600160a01b03166000908152600460205260408120555b505060010161362f565b50808211156137b957805b828110156137b757600180548061376257fe5b60008281526020812060046000199093019283020180546001600160a01b03199081168255600182810180549092169091556002820180546001600160e81b031916905560039091019190915591550161374f565b505b60008183106137c857816137ca565b825b905060005b818110156139c45761387c8582815181106137e657fe5b6020026020010151600183815481106137fb57fe5b60009182526020918290206040805160c08101825260049390930290910180546001600160a01b0390811684526001820154811694840194909452600281015493841691830191909152600160a01b83046001600160401b03166060830152600160e01b90920460ff161515608082015260039091015460a08201526140d7565b61399757806001016004600087848151811061389457fe5b6020026020010151600001516001600160a01b03166001600160a01b03168152602001908152602001600020819055508481815181106138d057fe5b6020026020010151600182815481106138e557fe5b6000918252602091829020835160049092020180546001600160a01b039283166001600160a01b0319918216178255928401516001820180549184169185169190911790556040840151600282018054606087015160808801511515600160e01b0260ff60e01b196001600160401b03909216600160a01b0267ffffffffffffffff60a01b1995909716929097169190911792909216939093171692909217905560a0909101516003909101556139bc565b6000600182815481106139a657fe5b9060005260206000209060040201600301819055505b6001016137cf565b5082821115611ded57825b82811015610fba5760018582815181106139e557fe5b60209081029190910181015182546001818101855560009485528385208351600493840290910180546001600160a01b039283166001600160a01b03199182161782559585015181840180549184169188169190911790556040850151600282018054606088015160808901511515600160e01b0260ff60e01b196001600160401b03909216600160a01b0267ffffffffffffffff60a01b199590971692909a169190911792909216939093171695909517905560a09092015160039093019290925587519084019290889085908110613abb57fe5b602090810291909101810151516001600160a01b03168252810191909152604001600020556001016139cf565b60008183613b745760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613b39578181015183820152602001613b21565b50505050905090810190601f168015613b665780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581613b8057fe5b0495945050505050565b60008184841115613bdc5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315613b39578181015183820152602001613b21565b505050900390565b8051600090613bf557506000611036565b6020820151805160001a9060c0821015613c1457600092505050611036565b5060019392505050565b8051600090811a6080811015613c38576000915050611036565b60b8811080613c53575060c08110801590613c53575060f881105b15613c62576001915050611036565b60c0811015613c765760b519019050611036565b60f519019050611036565b80516000908190811a6080811015613c9c5760019150613dad565b60b8811015613cb157607e1981019150613dad565b60c0811015613d2b57600060b78203600186019550806020036101000a865104915060018101820193505080831015613d25576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b50613dad565b60f8811015613d405760be1981019150613dad565b600060f78203600186019550806020036101000a865104915060018101820193505080831015613dab576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b505b5092915050565b8051600090613dc557506000611036565b60008090506000613dd98460200151613c1e565b602085015185519181019250015b80821015613e0757613df882613c81565b60019093019290910190613de7565b50909392505050565b8051600090601514613e2157600080fd5b61302382613243565b604080516020808252818301909252606091829190602082018180368337505050602081018490529050600067ffffffffffffffff198416613e6e57506018613e92565b6fffffffffffffffffffffffffffffffff198416613e8e57506010613e92565b5060005b6020811015613ec857818181518110613ea757fe5b01602001516001600160f81b03191615613ec057613ec8565b600101613e92565b60008160200390506060816040519080825280601f01601f191660200182016040528015613efd576020820181803683370190505b5080830196909652508452509192915050565b606081516001148015613f425750607f60f81b82600081518110613f3057fe5b01602001516001600160f81b03191611155b15613f4e575080611036565b613023613f608351608060ff16613fdf565b835b6060806040519050835180825260208201818101602087015b81831015613f93578051835260209283019201613f7b565b50855184518101855292509050808201602086015b81831015613fc0578051835260209283019201613fa8565b508651929092011591909101601f01601f191660405250905092915050565b606068010000000000000000831061402f576040805162461bcd60e51b815260206004820152600e60248201526d696e70757420746f6f206c6f6e6760901b604482015290519081900360640190fd5b604080516001808252818301909252606091602082018180368337019050509050603784116140895782840160f81b8160008151811061406b57fe5b60200101906001600160f81b031916908160001a9053509050613023565b606061409485613e2a565b90508381510160370160f81b826000815181106140ad57fe5b60200101906001600160f81b031916908160001a9053506140ce8282613f62565b95945050505050565b805182516000916001600160a01b039182169116148015614111575081602001516001600160a01b031683602001516001600160a01b0316145b8015614136575081604001516001600160a01b031683604001516001600160a01b0316145b8015610c935750506060908101519101516001600160401b0390811691161490565b60408051808201909152600081526060602082015290565b60405180604001604052806141836141c5565b8152602001600081525090565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915290565b60405180604001604052806000815260200160008152509056fef901a880f901a4f844941284214b9b9c85549ab3d2b972df0deef66ac2c9946ddf42a51534fc98d0c0a3b42c963cace8441ddf946ddf42a51534fc98d0c0a3b42c963cace8441ddf8410000000f84494a2959d3f95eae5dc7d70144ce1b73b403b7eb6e0948081ef03f1d9e0bb4a5bf38f16285c879299f07f948081ef03f1d9e0bb4a5bf38f16285c879299f07f8410000000f8449435552c16704d214347f29fa77f77da6d75d7c75294dc4973e838e3949c77aced16ac2315dc2d7ab11194dc4973e838e3949c77aced16ac2315dc2d7ab1118410000000f84494980a75ecd1309ea12fa2ed87a8744fbfc9b863d594cc6ac05c95a99c1f7b5f88de0e3486c82293b27094cc6ac05c95a99c1f7b5f88de0e3486c82293b2708410000000f84494f474cf03cceff28abc65c9cbae594f725c80e12d94e61a183325a18a173319dd8e19c8d069459e217594e61a183325a18a173319dd8e19c8d069459e21758410000000f84494b71b214cb885500844365e95cd9942c7276e7fd894d22ca3ba2141d23adab65ce4940eb7665ea2b6a794d22ca3ba2141d23adab65ce4940eb7665ea2b6a78410000000746865206e756d626572206f662076616c696461746f72732065786365656420746865206c696d6974746865206275726e526174696f206d757374206265206e6f2067726561746572207468616e2031303030306475706c696361746520636f6e73656e7375732061646472657373206f662076616c696461746f725365747468652065787069726554696d655365636f6e64476170206973206f7574206f662072616e67656c656e677468206f66206a61696c2076616c696461746f7273206d757374206265206f6e65536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e7472616374666565206973206c6172676572207468616e2044555354595f494e434f4d494e476c656e677468206f662065787069726554696d655365636f6e64476170206d69736d617463686661696c656420746f20706172736520696e69742076616c696461746f72536574746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e7472616374746865206d6573736167652073656e646572206d7573742062652074686520626c6f636b2070726f6475636572746865206d6573736167652073656e646572206d75737420626520736c61736820636f6e7472616374a26469706673582212206138cbef6a4ba7db6b97f06990dc0d96f124bc0b841fa4a56690968e7b85982b64736f6c63430006040033", + }, + ], + )] + .iter() + .cloned() + .collect(); + + pub static ref EULER_UPGRADE_CONFIG: HashMap> = [( + 56, + vec![ + UpgradeConfig { + contract_addr: "0x0000000000000000000000000000000000001000", + code: "6080604052600436106104055760003560e01c80638d19a41011610213578063c81b166211610123578063eb57e202116100ab578063f9a2bbc71161007a578063f9a2bbc714610d55578063fc3e590814610d6a578063fccc281314610d7f578063fd4ad81f14610d94578063fd6a687914610dd757610405565b8063eb57e20214610cd2578063eda5868c14610d05578063f340fa0114610d1a578063f92eb86b14610d4057610405565b8063daacdb66116100f2578063daacdb6614610c69578063dc927faf14610c7e578063e086c7b114610c93578063e1c7392a14610ca8578063e40716a114610cbd57610405565b8063c81b166214610c2a578063c8509d8114610939578063d68fb56a14610c3f578063d86222d514610c5457610405565b8063a78abc16116101a6578063ad3c9da611610175578063ad3c9da614610bb8578063b7ab4db514610beb578063b8cf4ef114610c00578063bf9f49951461065f578063c6d3394514610c1557610405565b8063a78abc1614610aae578063aaf5eb6814610ac3578063ab51bb9614610ad8578063ac43175114610aed57610405565b80639fe0f816116101e25780639fe0f81614610a5a578063a0dc275814610a6f578063a1a11bf514610a84578063a5422d5c14610a9957610405565b80638d19a410146109e85780639369d7de14610a1b57806396713da914610a305780639dc0926214610a4557610405565b80635192c82c1161031957806375d47a0a116102a157806381650b621161027057806381650b6214610924578063831d65d114610939578063853230aa146108e557806386249882146109be5780638b5ad0c9146109d357610405565b806375d47a0a146108d057806378dfed4a146108e55780637942fd05146108fa5780637a84ca2a1461090f57610405565b80635667515a116102e85780635667515a146108065780635d77156c1461081b5780636969a25c146108305780636e47b482146108a657806370fd5bad146108bb57610405565b80635192c82c1461077657806351e806721461078b57806355614fcc146107a0578063565c56b3146107d357610405565b80633365af3a1161039c57806343756e5c1161036b57806343756e5c1461068a57806345cf9daf146106bb578063493279b1146106d05780634bf6c882146106fc5780634df6e0c31461071157610405565b80633365af3a146105ed57806335409f7f146106175780633de0f0d81461064a5780633dffc3871461065f57610405565b8063152ad3b8116103d8578063152ad3b8146105705780631ff1806914610599578063219f22d5146105ae578063321d398a146105c357610405565b806304c4fec61461040a57806307a56847146104215780630bee7a67146104485780631182b87514610476575b600080fd5b34801561041657600080fd5b5061041f610dec565b005b34801561042d57600080fd5b50610436610e7f565b60408051918252519081900360200190f35b34801561045457600080fd5b5061045d610e85565b6040805163ffffffff9092168252519081900360200190f35b34801561048257600080fd5b506104fb6004803603604081101561049957600080fd5b60ff8235169190810190604081016020820135600160201b8111156104bd57600080fd5b8201836020820111156104cf57600080fd5b803590602001918460018302840111600160201b831117156104f057600080fd5b509092509050610e8a565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561053557818101518382015260200161051d565b50505050905090810190601f1680156105625780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561057c57600080fd5b5061058561111c565b604080519115158252519081900360200190f35b3480156105a557600080fd5b50610436611125565b3480156105ba57600080fd5b5061045d61112b565b3480156105cf57600080fd5b50610585600480360360208110156105e657600080fd5b5035611130565b3480156105f957600080fd5b506105856004803603602081101561061057600080fd5b50356111ff565b34801561062357600080fd5b5061041f6004803603602081101561063a57600080fd5b50356001600160a01b03166112b0565b34801561065657600080fd5b5061043661140f565b34801561066b57600080fd5b50610674611415565b6040805160ff9092168252519081900360200190f35b34801561069657600080fd5b5061069f61141a565b604080516001600160a01b039092168252519081900360200190f35b3480156106c757600080fd5b50610436611420565b3480156106dc57600080fd5b506106e5611426565b6040805161ffff9092168252519081900360200190f35b34801561070857600080fd5b5061067461142b565b34801561071d57600080fd5b50610726611430565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561076257818101518382015260200161074a565b505050509050019250505060405180910390f35b34801561078257600080fd5b5061043661152b565b34801561079757600080fd5b5061069f611531565b3480156107ac57600080fd5b50610585600480360360208110156107c357600080fd5b50356001600160a01b0316611537565b3480156107df57600080fd5b50610436600480360360208110156107f657600080fd5b50356001600160a01b031661156c565b34801561081257600080fd5b506106746115bd565b34801561082757600080fd5b5061045d6115c2565b34801561083c57600080fd5b5061085a6004803603602081101561085357600080fd5b50356115c7565b604080516001600160a01b039788168152958716602087015293909516848401526001600160401b0390911660608401521515608083015260a082019290925290519081900360c00190f35b3480156108b257600080fd5b5061069f61162b565b3480156108c757600080fd5b50610674611631565b3480156108dc57600080fd5b5061069f611636565b3480156108f157600080fd5b5061043661163c565b34801561090657600080fd5b50610674611642565b34801561091b57600080fd5b50610436611647565b34801561093057600080fd5b5061045d61164d565b34801561094557600080fd5b5061041f6004803603604081101561095c57600080fd5b60ff8235169190810190604081016020820135600160201b81111561098057600080fd5b82018360208201111561099257600080fd5b803590602001918460018302840111600160201b831117156109b357600080fd5b509092509050611652565b3480156109ca57600080fd5b50610436611705565b3480156109df57600080fd5b5061043661170b565b3480156109f457600080fd5b5061043660048036036020811015610a0b57600080fd5b50356001600160a01b0316611711565b348015610a2757600080fd5b5061041f611786565b348015610a3c57600080fd5b506106746118a0565b348015610a5157600080fd5b5061069f6118a5565b348015610a6657600080fd5b506104366118ab565b348015610a7b57600080fd5b506104366118b0565b348015610a9057600080fd5b5061069f6118b5565b348015610aa557600080fd5b506104fb6118bb565b348015610aba57600080fd5b506105856118da565b348015610acf57600080fd5b506104366118e3565b348015610ae457600080fd5b5061045d6115bd565b348015610af957600080fd5b5061041f60048036036040811015610b1057600080fd5b810190602081018135600160201b811115610b2a57600080fd5b820183602082011115610b3c57600080fd5b803590602001918460018302840111600160201b83111715610b5d57600080fd5b919390929091602081019035600160201b811115610b7a57600080fd5b820183602082011115610b8c57600080fd5b803590602001918460018302840111600160201b83111715610bad57600080fd5b5090925090506118ec565b348015610bc457600080fd5b5061043660048036036020811015610bdb57600080fd5b50356001600160a01b0316612329565b348015610bf757600080fd5b5061072661233b565b348015610c0c57600080fd5b5061043661241e565b348015610c2157600080fd5b50610436611631565b348015610c3657600080fd5b5061069f612423565b348015610c4b57600080fd5b50610436612429565b348015610c6057600080fd5b50610436612468565b348015610c7557600080fd5b50610436612474565b348015610c8a57600080fd5b5061069f61247a565b348015610c9f57600080fd5b50610436612480565b348015610cb457600080fd5b5061041f612485565b348015610cc957600080fd5b50610436612688565b348015610cde57600080fd5b5061041f60048036036020811015610cf557600080fd5b50356001600160a01b031661268e565b348015610d1157600080fd5b5061045d61279c565b61041f60048036036020811015610d3057600080fd5b50356001600160a01b03166127a1565b348015610d4c57600080fd5b50610436612aa6565b348015610d6157600080fd5b5061069f612aac565b348015610d7657600080fd5b506106746118ab565b348015610d8b57600080fd5b5061069f612ab2565b348015610da057600080fd5b50610dbe60048036036020811015610db757600080fd5b5035612ab8565b6040805192835290151560208301528051918290030190f35b348015610de357600080fd5b5061069f612ae6565b6000610df733611711565b9050600b8181548110610e0657fe5b600091825260209091206001601690920201015460ff16610e63576040805162461bcd60e51b81526020600482015260126024820152716e6f7420696e206d61696e74656e616e636560701b604482015290519081900360640190fd5b6000610e6d612429565b9050610e7a338383612aec565b505050565b60095481565b606481565b60005460609060ff16610ee0576040805162461bcd60e51b81526020600482015260196024820152781d1a194818dbdb9d1c9858dd081b9bdd081a5b9a5d081e595d603a1b604482015290519081900360640190fd5b3361200014610f205760405162461bcd60e51b815260040180806020018281038252602f81526020018061648b602f913960400191505060405180910390fd5b600b54610fc557610f2f6159e0565b60015460005b81811015610fc157600b80546001810182556000919091528351600080516020615e15833981519152601690920291820190815560208501516000805160206165148339815191528301805460ff191691151591909117905560408501518592610fb391600080516020615e5b833981519152909101906014615a04565b505050806001019050610f35565b5050505b610fcd615a3e565b600061100e85858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612ce092505050565b915091508061102a576110216064612e39565b92505050611115565b815160009060ff1661104a576110438360200151612e9a565b90506110e1565b825160ff16600114156110dd578260200151516001146110b7577f70e72399380dcfb0338abc03dc8d47f9f470ada8e769c9a78d644ea97385ecb2604051808060200182810382526025815260200180615d5b6025913960400191505060405180910390a15060676110d8565b61104383602001516000815181106110cb57fe5b6020026020010151613caa565b6110e1565b5060655b63ffffffff811661110657505060408051600081526020810190915291506111159050565b61110f81612e39565b93505050505b9392505050565b60075460ff1681565b60035481565b606881565b6001546000908210611144575060006111fa565b60006001600160a01b03166001838154811061115c57fe5b60009182526020909120600490910201546001600160a01b0316148061118c5750600854158061118c5750600a54155b8061119b575060085460095410155b806111ac57506111aa826111ff565b155b806111d557506000600b83815481106111c157fe5b906000526020600020906016020160000154115b806111e9575060016111e561233b565b5111155b156111f6575060006111fa565b5060015b919050565b6001546000908210611213575060006111fa565b600b548210611250576001828154811061122957fe5b9060005260206000209060040201600201601c9054906101000a900460ff161590506111fa565b6001828154811061125d57fe5b9060005260206000209060040201600201601c9054906101000a900460ff161580156112aa5750600b828154811061129157fe5b600091825260209091206001601690920201015460ff16155b92915050565b33611001146112f05760405162461bcd60e51b81526004018080602001828103825260298152602001806165346029913960400191505060405180910390fd5b600b54611395576112ff6159e0565b60015460005b8181101561139157600b80546001810182556000919091528351600080516020615e15833981519152601690920291820190815560208501516000805160206165148339815191528301805460ff19169115159190911790556040850151859261138391600080516020615e5b833981519152909101906014615a04565b505050806001019050611305565b5050505b6001600160a01b038116600090815260046020526040902054806113b9575061140c565b6001810390506000600b82815481106113ce57fe5b600091825260209091206001601690920201015460ff1690506113f18383613e21565b80156113fa5750805b15610e7a576009805460001901905550505b50565b61271081565b600181565b61100181565b60085481565b603881565b600881565b600e54600c546060919080611443575060155b606061144d61233b565b905081815111611461579250611528915050565b82828251031015611473578181510392505b82156114a75760c8430461148e82828686036000888861419d565b6114a582828686038787038889898951030161419d565b505b6060826040519080825280602002602001820160405280156114d3578160200160208202803683370190505b50905060005b83811015611521578281815181106114ed57fe5b602002602001015182828151811061150157fe5b6001600160a01b03909216602092830291909101909101526001016114d9565b5093505050505b90565b60065481565b61200081565b6001600160a01b0381166000908152600460205260408120548061155f5760009150506111fa565b60001901611115816111ff565b6001600160a01b038116600090815260046020526040812054806115945760009150506111fa565b6001808203815481106115a357fe5b906000526020600020906004020160030154915050919050565b600081565b606781565b600181815481106115d457fe5b600091825260209091206004909102018054600182015460028301546003909301546001600160a01b0392831694509082169291821691600160a01b81046001600160401b031691600160e01b90910460ff169086565b61100581565b600281565b61100881565b6103e881565b600b81565b600c5481565b606681565b33612000146116925760405162461bcd60e51b815260040180806020018281038252602f81526020018061648b602f913960400191505060405180910390fd5b7f41ce201247b6ceb957dcdb217d0b8acb50b9ea0e12af9af4f5e7f38902101605838383604051808460ff1660ff168152602001806020018281038252848482818152602001925080828437600083820152604051601f909101601f1916909201829003965090945050505050a1505050565b60025481565b600a5481565b6001600160a01b0381166000908152600460205260408120548061177c576040805162461bcd60e51b815260206004820152601760248201527f6f6e6c792063757272656e742076616c696461746f7273000000000000000000604482015290519081900360640190fd5b6000190192915050565b600b5461182b576117956159e0565b60015460005b8181101561182757600b80546001810182556000919091528351600080516020615e15833981519152601690920291820190815560208501516000805160206165148339815191528301805460ff19169115159190911790556040850151859261181991600080516020615e5b833981519152909101906014615a04565b50505080600101905061179b565b5050505b6008546118385760036008555b600a54611845576002600a555b600061185033611711565b905061185b81611130565b6118965760405162461bcd60e51b8152600401808060200182810382526023815260200180615d386023913960400191505060405180910390fd5b61140c338261428c565b600981565b61100781565b600381565b60c881565b61100681565b6040518061062001604052806105ef8152602001615e9c6105ef913981565b60005460ff1681565b6402540be40081565b60005460ff1661193f576040805162461bcd60e51b81526020600482015260196024820152781d1a194818dbdb9d1c9858dd081b9bdd081a5b9a5d081e595d603a1b604482015290519081900360640190fd5b336110071461197f5760405162461bcd60e51b815260040180806020018281038252602e815260200180615da1602e913960400191505060405180910390fd5b6119e984848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080518082019091526013815272065787069726554696d655365636f6e6447617606c1b602082015291506143249050565b15611ac45760208114611a2d5760405162461bcd60e51b8152600401808060200182810382526026815260200180615e356026913960400191505060405180910390fd5b604080516020601f8401819004810282018101909252828152600091611a6b9185858083850183828082843760009201919091525061440b92505050565b905060648110158015611a815750620186a08111155b611abc5760405162461bcd60e51b8152600401808060200182810382526027815260200180615cc86027913960400191505060405180910390fd5b600255612297565b611b2484848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260098152686275726e526174696f60b81b602082015291506143249050565b15611c145760208114611b7e576040805162461bcd60e51b815260206004820152601c60248201527f6c656e677468206f66206275726e526174696f206d69736d6174636800000000604482015290519081900360640190fd5b604080516020601f8401819004810282018101909252828152600091611bbc9185858083850183828082843760009201919091525061440b92505050565b9050612710811115611bff5760405162461bcd60e51b815260040180806020018281038252602b815260200180615c72602b913960400191505060405180910390fd5b6006556007805460ff19166001179055612297565b611c7e84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260138152726d61784e756d4f664d61696e7461696e696e6760681b602082015291506143249050565b15611d565760208114611cc25760405162461bcd60e51b8152600401808060200182810382526026815260200180615b396026913960400191505060405180910390fd5b604080516020601f8401819004810282018101909252828152600091611d009185858083850183828082843760009201919091525061440b92505050565b600c5490915080611d0f575060155b808210611d4d5760405162461bcd60e51b8152600401808060200182810382526038815260200180615bb06038913960400191505060405180910390fd5b50600855612297565b611dbf84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260128152716d61696e7461696e536c6173685363616c6560701b602082015291506143249050565b15611e8a5760208114611e035760405162461bcd60e51b8152600401808060200182810382526025815260200180615b8b6025913960400191505060405180910390fd5b604080516020601f8401819004810282018101909252828152600091611e419185858083850183828082843760009201919091525061440b92505050565b905060008111611e825760405162461bcd60e51b815260040180806020018281038252602d8152602001806164e7602d913960400191505060405180910390fd5b600a55612297565b611efe84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601981527f6d61784e756d4f66576f726b696e6743616e6469646174657300000000000000602082015291506143249050565b15611fcb5760208114611f425760405162461bcd60e51b815260040180806020018281038252602c815260200180615b5f602c913960400191505060405180910390fd5b604080516020601f8401819004810282018101909252828152600091611f809185858083850183828082843760009201919091525061440b92505050565b9050600d54811115611fc35760405162461bcd60e51b8152600401808060200182810382526049815260200180615cef6049913960600191505060405180910390fd5b600e55612297565b61203484848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260128152716d61784e756d4f6643616e6469646174657360701b602082015291506143249050565b156120d557602081146120785760405162461bcd60e51b8152600401808060200182810382526025815260200180615dcf6025913960400191505060405180910390fd5b604080516020601f84018190048102820181019092528281526000916120b69185858083850183828082843760009201919091525061440b92505050565b600d819055600e549091508110156120cf57600d54600e555b50612297565b61213984848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600d81526c6e756d4f66436162696e65747360981b602082015291506143249050565b1561225a5760208114612193576040805162461bcd60e51b815260206004820181905260248201527f6c656e677468206f66206e756d4f66436162696e657473206d69736d61746368604482015290519081900360640190fd5b604080516020601f84018190048102820181019092528281526000916121d19185858083850183828082843760009201919091525061440b92505050565b9050600081116122125760405162461bcd60e51b8152600401808060200182810382526028815260200180615be86028913960400191505060405180910390fd5b60298111156122525760405162461bcd60e51b8152600401808060200182810382526039815260200180615c106039913960400191505060405180910390fd5b600c55612297565b6040805162461bcd60e51b815260206004820152600d60248201526c756e6b6e6f776e20706172616d60981b604482015290519081900360640190fd5b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a848484846040518080602001806020018381038352878782818152602001925080828437600083820152601f01601f191690910184810383528581526020019050858580828437600083820152604051601f909101601f19169092018290039850909650505050505050a150505050565b60046020526000908152604090205481565b6001546060906000805b8281101561236a57612356816111ff565b15612362576001909101905b600101612345565b50606081604051908082528060200260200182016040528015612397578160200160208202803683370190505b5090506000915060005b83811015612416576123b2816111ff565b1561240e57600181815481106123c457fe5b600091825260209091206004909102015482516001600160a01b03909116908390859081106123ef57fe5b6001600160a01b03909216602092830291909101909101526001909201915b6001016123a1565b509250505090565b601581565b61100281565b600061243361233b565b519050600080600c541161244857601561244c565b600c545b90508082111561245a578091505b8161246457600191505b5090565b67016345785d8a000081565b60055481565b61100381565b602981565b60005460ff16156124dd576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b6124e5615a3e565b600061250b6040518061062001604052806105ef8152602001615e9c6105ef9139612ce0565b915091508061254b5760405162461bcd60e51b8152600401808060200182810382526021815260200180615e7b6021913960400191505060405180910390fd5b60005b8260200151518110156126705760018360200151828151811061256d57fe5b60209081029190910181015182546001818101855560009485528385208351600493840290910180546001600160a01b039283166001600160a01b03199182161782558587015182850180549185169183169190911790556040860151600283018054606089015160808a01511515600160e01b0260ff60e01b196001600160401b03909216600160a01b0267ffffffffffffffff60a01b199590981692909516919091179290921694909417161790915560a09093015160039093019290925591860151805191850193918590811061264357fe5b602090810291909101810151516001600160a01b031682528101919091526040016000205560010161254e565b50506103e8600255506000805460ff19166001179055565b600d5481565b33611001146126ce5760405162461bcd60e51b81526004018080602001828103825260298152602001806165346029913960400191505060405180910390fd5b600b54612773576126dd6159e0565b60015460005b8181101561276f57600b80546001810182556000919091528351600080516020615e15833981519152601690920291820190815560208501516000805160206165148339815191528301805460ff19169115159190911790556040850151859261276191600080516020615e5b833981519152909101906014615a04565b5050508060010190506126e3565b5050505b600061277e82614410565b905061278981611130565b1561279857612798828261428c565b5050565b606581565b3341146127df5760405162461bcd60e51b815260040180806020018281038252602d8152602001806164ba602d913960400191505060405180910390fd5b60005460ff16612832576040805162461bcd60e51b81526020600482015260196024820152781d1a194818dbdb9d1c9858dd081b9bdd081a5b9a5d081e595d603a1b604482015290519081900360640190fd5b6000341161287f576040805162461bcd60e51b81526020600482015260156024820152746465706f7369742076616c7565206973207a65726f60581b604482015290519081900360640190fd5b6001600160a01b0381166000908152600460205260409020546007543491906103e89060ff16156128af57506006545b6000831180156128bf5750600081115b156129685760006128e86127106128dc868563ffffffff6145b416565b9063ffffffff61460d16565b905080156129665760405161dead9082156108fc029083906000818181858888f1935050505015801561291f573d6000803e3d6000fd5b506040805182815290517f627059660ea01c4733a328effb2294d2f86905bf806da763a89cee254de8bee59181900360200190a1612963848263ffffffff61464f16565b93505b505b8115612a6057600060018084038154811061297f57fe5b9060005260206000209060040201905080600201601c9054906101000a900460ff16156129ea576040805185815290516001600160a01b038716917ff177e5d6c5764d79c32883ed824111d9b13f5668cf6ab1cc12dd36791dd955b4919081900360200190a2612a5a565b6003546129fd908563ffffffff61469116565b6003908155810154612a15908563ffffffff61469116565b60038201556040805185815290516001600160a01b038716917f93a090ecc682c002995fad3c85b30c5651d7fd29b0be5da9d784a3302aedc055919081900360200190a25b50612aa0565b6040805184815290516001600160a01b038616917ff177e5d6c5764d79c32883ed824111d9b13f5668cf6ab1cc12dd36791dd955b4919081900360200190a25b50505050565b600e5481565b61100081565b61dead81565b600b8181548110612ac557fe5b60009182526020909120601690910201805460019091015490915060ff1682565b61100481565b6000600a5460001480612afd575081155b80612b085750600954155b15612b1557506000611115565b600960008154809291906001900391905055506000612b62600a546128dc856128dc600b8981548110612b4457fe5b6000918252602090912060169091020154439063ffffffff61464f16565b90506000600b8581548110612b7357fe5b906000526020600020906016020160010160006101000a81548160ff0219169083151502179055506000806110016001600160a01b0316638256ace66040518163ffffffff1660e01b8152600401604080518083038186803b158015612bd857600080fd5b505afa158015612bec573d6000803e3d6000fd5b505050506040513d6040811015612c0257600080fd5b508051602090910151600095509092509050808310612c9057612c258787613e21565b50604080516305bfb49960e41b81526001600160a01b0389166004820152905161100191635bfb499091602480830192600092919082900301818387803b158015612c6f57600080fd5b505af1158015612c83573d6000803e3d6000fd5b5050505060019350612ca2565b818310612ca257612ca087614410565b505b6040516001600160a01b038816907fb9d38178dc641ff1817967a63c9078cbcd955a9f1fcd75e0e3636de615d44d3b90600090a25050509392505050565b612ce8615a3e565b6000612cf2615a3e565b612cfa615a56565b612d0b612d06866146eb565b614710565b90506000805b612d1a8361475a565b15612e2b5780612d3f57612d35612d308461477b565b6147c9565b60ff168452612e23565b8060011415612e1e576060612d5b612d568561477b565b614880565b90508051604051908082528060200260200182016040528015612d9857816020015b612d85615a76565b815260200190600190039081612d7d5790505b50602086015260005b8151811015612e1357612db2615a76565b6000612dd0848481518110612dc357fe5b6020026020010151614951565b9150915080612ded57876000995099505050505050505050612e34565b8188602001518481518110612dfe57fe5b60209081029190910101525050600101612da1565b506001925050612e23565b612e2b565b600101612d11565b50919350909150505b915091565b604080516001808252818301909252606091829190816020015b6060815260200190600190039081612e53579050509050612e798363ffffffff16614a2e565b81600081518110612e8657fe5b602002602001018190525061111581614a41565b6000806060612ea884614acb565b9150915081612f55577f70e72399380dcfb0338abc03dc8d47f9f470ada8e769c9a78d644ea97385ecb2816040518080602001828103825283818151815260200191508051906020019080838360005b83811015612f10578181015183820152602001612ef8565b50505050905090810190601f168015612f3d5780820380516001836020036101000a031916815260200191505b509250505060405180910390a16066925050506111fa565b50506060612f6283614bad565b6001549091506000908190815b81811015612fe55767016345785d8a000060018281548110612f8d57fe5b90600052602060002090600402016003015410612faf57600190930192612fdd565b600060018281548110612fbe57fe5b9060005260206000209060040201600301541115612fdd576001909201915b600101612f6f565b50606083604051908082528060200260200182016040528015613012578160200160208202803683370190505b509050606084604051908082528060200260200182016040528015613041578160200160208202803683370190505b509050606085604051908082528060200260200182016040528015613070578160200160208202803683370190505b50905060608660405190808252806020026020018201604052801561309f578160200160208202803683370190505b50905060006060876040519080825280602002602001820160405280156130d0578160200160208202803683370190505b5090506060886040519080825280602002602001820160405280156130ff578160200160208202803683370190505b509050600099506000985060006110046001600160a01b031663149d14d96040518163ffffffff1660e01b815260040160206040518083038186803b15801561314757600080fd5b505afa15801561315b573d6000803e3d6000fd5b505050506040513d602081101561317157600080fd5b5051905067016345785d8a00008111156131e5577f70e72399380dcfb0338abc03dc8d47f9f470ada8e769c9a78d644ea97385ecb2604051808060200182810382526021815260200180615df46021913960400191505060405180910390a160689c505050505050505050505050506111fa565b60005b898110156134565767016345785d8a00006001828154811061320657fe5b9060005260206000209060040201600301541061338c576001818154811061322a57fe5b906000526020600020906004020160020160009054906101000a90046001600160a01b0316898d8151811061325b57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060006402540be4006001838154811061329057fe5b906000526020600020906004020160030154816132a957fe5b06600183815481106132b757fe5b9060005260206000209060040201600301540390506132df838261464f90919063ffffffff16565b898e815181106132eb57fe5b6020026020010181815250506001828154811061330457fe5b906000526020600020906004020160020160009054906101000a90046001600160a01b0316878e8151811061333557fe5b60200260200101906001600160a01b031690816001600160a01b03168152505081888e8151811061336257fe5b602090810291909101015261337d868263ffffffff61469116565b6001909d019c955061344e9050565b60006001828154811061339b57fe5b906000526020600020906004020160030154111561344e57600181815481106133c057fe5b906000526020600020906004020160010160009054906101000a90046001600160a01b0316848c815181106133f157fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506001818154811061341e57fe5b906000526020600020906004020160030154838c8151811061343c57fe5b60209081029190910101526001909a01995b6001016131e8565b5060008415613894576110046001600160a01b0316636e056520868b8b8a60025442016040518663ffffffff1660e01b815260040180806020018060200180602001856001600160401b03166001600160401b03168152602001848103845288818151815260200191508051906020019060200280838360005b838110156134e85781810151838201526020016134d0565b50505050905001848103835287818151815260200191508051906020019060200280838360005b8381101561352757818101518382015260200161350f565b50505050905001848103825286818151815260200191508051906020019060200280838360005b8381101561356657818101518382015260200161354e565b505050509050019750505050505050506020604051808303818588803b15801561358f57600080fd5b505af1935050505080156135b557506040513d60208110156135b057600080fd5b505160015b6137f0576040516000815260443d10156135d15750600061366c565b60046000803e60005160e01c6308c379a081146135f257600091505061366c565b60043d036004833e81513d60248201116001600160401b038211171561361d5760009250505061366c565b80830180516001600160401b0381111561363e57600094505050505061366c565b8060208301013d860181111561365c5760009550505050505061366c565b601f01601f191660405250925050505b80613677575061371b565b60019150857fa7cdeed7d0db45e3219a6e5d60838824c16f1d39991fcfe3f963029c844bf280826040518080602001828103825283818151815260200191508051906020019080838360005b838110156136db5781810151838201526020016136c3565b50505050905090810190601f1680156137085780820380516001836020036101000a031916815260200191505b509250505060405180910390a2506137eb565b3d808015613745576040519150601f19603f3d011682016040523d82523d6000602084013e61374a565b606091505b5060019150857fbfa884552dd8921b6ce90bfe906952ae5b3b29be0cc1a951d4f62697635a3a45826040518080602001828103825283818151815260200191508051906020019080838360005b838110156137af578181015183820152602001613797565b50505050905090810190601f1680156137dc5780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505b613894565b801561382e576040805187815290517fa217d08e65f80c73121cd9db834d81652d544bfbf452f6d04922b16c90a37b709181900360200190a1613892565b604080516020808252601b908201527f6261746368207472616e736665722072657475726e2066616c7365000000000081830152905187917fa7cdeed7d0db45e3219a6e5d60838824c16f1d39991fcfe3f963029c844bf280919081900360600190a25b505b8015613a4a5760005b8751811015613a485760008882815181106138b457fe5b602002602001015190506000600182815481106138cd57fe5b60009182526020909120600160049092020181015481546001600160a01b03909116916108fc91859081106138fe57fe5b9060005260206000209060040201600301549081150290604051600060405180830381858888f19350505050905080156139ba576001828154811061393f57fe5b60009182526020909120600160049092020181015481546001600160a01b03909116917f6c61d60f69a7beb3e1c80db7f39f37b208537cbb19da3174511b477812b2fc7d918590811061398e57fe5b9060005260206000209060040201600301546040518082815260200191505060405180910390a2613a3e565b600182815481106139c757fe5b60009182526020909120600160049092020181015481546001600160a01b03909116917f25d0ce7d2f0cec669a8c17efe49d195c13455bb8872b65fa610ac7f53fe4ca7d9185908110613a1657fe5b9060005260206000209060040201600301546040518082815260200191505060405180910390a25b505060010161389d565b505b835115613b945760005b8451811015613b92576000858281518110613a6b57fe5b60200260200101516001600160a01b03166108fc868481518110613a8b57fe5b60200260200101519081150290604051600060405180830381858888f1935050505090508015613b2157858281518110613ac157fe5b60200260200101516001600160a01b03167f6c61d60f69a7beb3e1c80db7f39f37b208537cbb19da3174511b477812b2fc7d868481518110613aff57fe5b60200260200101516040518082815260200191505060405180910390a2613b89565b858281518110613b2d57fe5b60200260200101516001600160a01b03167f25d0ce7d2f0cec669a8c17efe49d195c13455bb8872b65fa610ac7f53fe4ca7d868481518110613b6b57fe5b60200260200101516040518082815260200191505060405180910390a25b50600101613a54565b505b4715613bfd576040805147815290517f6ecc855f9440a9282c90913bbc91619fd44f5ec0b462af28d127b116f130aa4d9181900360200190a1604051611002904780156108fc02916000818181858888f19350505050158015613bfb573d6000803e3d6000fd5b505b600060038190556005558c5115613c1757613c178d614d7d565b6110016001600160a01b031663fc4333cd6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015613c5457600080fd5b505af1158015613c68573d6000803e3d6000fd5b50506040517fedd8d7296956dd970ab4de3f2fc03be2b0ffc615d20cd4c72c6e44f928630ebf925060009150a15060009e9d5050505050505050505050505050565b80516001600160a01b0316600090815260046020526040812054801580613cfb5750600180820381548110613cdb57fe5b9060005260206000209060040201600201601c9054906101000a900460ff165b15613d415782516040516001600160a01b03909116907fe209c46bebf57cf265d5d9009a00870e256d9150f3ed5281ab9d9eb3cec6e4be90600090a260009150506111fa565b600154600554600019820111801590613d975784516040516001600160a01b03909116907fe209c46bebf57cf265d5d9009a00870e256d9150f3ed5281ab9d9eb3cec6e4be90600090a2600093505050506111fa565b600580546001908101909155805481906000198601908110613db557fe5b6000918252602082206002600490920201018054921515600160e01b0260ff60e01b199093169290921790915585516040516001600160a01b03909116917ff226e7d8f547ff903d9d419cf5f54e0d7d07efa9584135a53a057c5f1f27f49a91a2506000949350505050565b60008060018381548110613e3157fe5b90600052602060002090600402016003015490506000600180805490500390506001613e5b61233b565b5111613e9057600060018581548110613e7057fe5b9060005260206000209060040201600301819055506000925050506112aa565b6040805183815290516001600160a01b038716917f3b6f9ef90462b512a1293ecec018670bf7b7f1876fb727590a8a6d7643130a70919081900360200190a26001600160a01b038516600090815260046020526040812055835b6001546000190181101561408d5760018160010181548110613f0857fe5b906000526020600020906004020160018281548110613f2357fe5b60009182526020909120825460049092020180546001600160a01b03199081166001600160a01b0393841617825560018085015481840180548416918616919091179055600280860180549185018054909416919095161780835584546001600160401b03600160a01b91829004160267ffffffffffffffff60a01b1990911617808355935460ff600160e01b918290041615150260ff60e01b19909416939093179055600392830154920191909155600b805490918301908110613fe457fe5b9060005260206000209060160201600b8281548110613fff57fe5b600091825260209091208254601690920201908155600180830154908201805460ff191660ff909216151591909117905561404260028083019084016014615aab565b5090505080600101600460006001848154811061405b57fe5b600091825260208083206004909202909101546001600160a01b03168352820192909252604001902055600101613eea565b50600180548061409957fe5b60008281526020812060046000199093019283020180546001600160a01b0319908116825560018201805490911690556002810180546001600160e81b0319169055600301559055600b8054806140ec57fe5b60008281526020812060166000199093019283020181815560018101805460ff191690559061411e6002830182615ad6565b50509055600081838161412d57fe5b04905080156141915760015460005b8181101561418e57826001828154811061415257fe5b906000526020600020906004020160030154016001828154811061417257fe5b600091825260209091206003600490920201015560010161413c565b50505b50600195945050505050565b60005b828110156142835760408051602080820189905287840182840152825180830384018152606090920190925280519101206000908390816141dd57fe5b0690508085018287011461427a57600088838801815181106141fb57fe5b60200260200101519050888287018151811061421357fe5b6020026020010151898489018151811061422957fe5b60200260200101906001600160a01b031690816001600160a01b03168152505080898388018151811061425857fe5b60200260200101906001600160a01b031690816001600160a01b031681525050505b506001016141a0565b50505050505050565b600980546001908101909155600b8054839081106142a657fe5b906000526020600020906016020160010160006101000a81548160ff02191690831515021790555043600b82815481106142dc57fe5b600091825260208220601690910201919091556040516001600160a01b038416917ff62981a567ec3cec866c6fa93c55bcdf841d6292d18b8d522ececa769375d82d91a25050565b6000816040516020018082805190602001908083835b602083106143595780518252601f19909201916020918201910161433a565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120836040516020018082805190602001908083835b602083106143c75780518252601f1990920191602091820191016143a8565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040528051906020012014905092915050565b015190565b6001600160a01b03811660009081526004602052604081205480614439575060001990506111fa565b60018103905060006001828154811061444e57fe5b906000526020600020906004020160030154905060006001838154811061447157fe5b906000526020600020906004020160030181905550600060018080549050039050846001600160a01b03167f8cd4e147d8af98a9e3b6724021b8bf6aed2e5dac71c38f2dce8161b82585b25d836040518082815260200191505060405180910390a2806144e3578293505050506111fa565b60008183816144ee57fe5b04905080156145aa5760005b8481101561454c57816001828154811061451057fe5b906000526020600020906004020160030154016001828154811061453057fe5b60009182526020909120600360049092020101556001016144fa565b50600180549085015b818110156145a757826001828154811061456b57fe5b906000526020600020906004020160030154016001828154811061458b57fe5b6000918252602090912060036004909202010155600101614555565b50505b5091949350505050565b6000826145c3575060006112aa565b828202828482816145d057fe5b04146111155760405162461bcd60e51b8152600401808060200182810382526021815260200180615d806021913960400191505060405180910390fd5b600061111583836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250615370565b600061111583836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250615412565b600082820183811015611115576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6146f3615ae5565b506040805180820190915281518152602082810190820152919050565b614718615a56565b6147218261546c565b61472a57600080fd5b600061473983602001516154a6565b60208085015160408051808201909152868152920190820152915050919050565b6000614764615ae5565b505080518051602091820151919092015191011190565b614783615ae5565b61478c8261475a565b61479557600080fd5b602082015160006147a582615509565b80830160209586015260408051808201909152908152938401919091525090919050565b8051600090158015906147de57508151602110155b6147e757600080fd5b60006147f683602001516154a6565b90508083600001511015614851576040805162461bcd60e51b815260206004820152601a60248201527f6c656e677468206973206c657373207468616e206f6666736574000000000000604482015290519081900360640190fd5b82516020808501518301805192849003929183101561487757826020036101000a820491505b50949350505050565b606061488b8261546c565b61489457600080fd5b600061489f8361563c565b90506060816040519080825280602002602001820160405280156148dd57816020015b6148ca615ae5565b8152602001906001900390816148c25790505b50905060006148ef85602001516154a6565b60208601510190506000805b848110156149465761490c83615509565b915060405180604001604052808381526020018481525084828151811061492f57fe5b6020908102919091010152918101916001016148fb565b509195945050505050565b614959615a76565b6000614963615a76565b61496b615a56565b61497485614710565b90506000805b6149838361475a565b15612e2b57806149ae5761499e6149998461477b565b615698565b6001600160a01b03168452614a26565b80600114156149d6576149c36149998461477b565b6001600160a01b03166020850152614a26565b80600214156149fe576149eb6149998461477b565b6001600160a01b03166040850152614a26565b8060031415612e1e57614a13612d308461477b565b6001600160401b03166060850152600191505b60010161497a565b60606112aa614a3c836156b2565b615798565b6060815160001415614a6257506040805160008152602081019091526111fa565b606082600081518110614a7157fe5b602002602001015190506000600190505b8351811015614ab257614aa882858381518110614a9b57fe5b60200260200101516157ea565b9150600101614a82565b50611115614ac5825160c060ff16615867565b826157ea565b60006060602983511115614afd576000604051806060016040528060298152602001615c496029913991509150612e34565b60005b8351811015614b935760005b81811015614b8a57848181518110614b2057fe5b6020026020010151600001516001600160a01b0316858381518110614b4157fe5b6020026020010151600001516001600160a01b03161415614b825760006040518060600160405280602b8152602001615c9d602b9139935093505050612e34565b600101614b0c565b50600101614b00565b505060408051602081019091526000815260019150915091565b6060600080808080614bbd612429565b6001549091505b8015614ccb57600181039250600b8381548110614bdd57fe5b600091825260209091206001601690920201015460ff16614bfd57614cc2565b60018381548110614c0a57fe5b60009182526020909120600490910201546001600160a01b03169450614c31858484612aec565b9350831580614c44575060018851038610155b15614c4e57614cc2565b60005b8851811015614cc057856001600160a01b0316898281518110614c7057fe5b6020026020010151600001516001600160a01b03161415614cb8576001898281518110614c9957fe5b6020908102919091010151901515608090910152600190960195614cc0565b600101614c51565b505b60001901614bc4565b5084875103604051908082528060200260200182016040528015614d0957816020015b614cf6615a76565b815260200190600190039081614cee5790505b5095506000915060005b8751811015614d7257878181518110614d2857fe5b602002602001015160800151614d6a57878181518110614d4457fe5b6020026020010151878481518110614d5857fe5b60209081029190910101526001909201915b600101614d13565b505050505050919050565b600154815160005b82811015614e9a576001614d97615a76565b60018381548110614da457fe5b600091825260208083206040805160c08101825260049490940290910180546001600160a01b0390811685526001820154811693850193909352600281015492831691840191909152600160a01b82046001600160401b03166060840152600160e01b90910460ff16151560808301526003015460a082015291505b84811015614e6e57868181518110614e3457fe5b6020026020010151600001516001600160a01b031682600001516001600160a01b03161415614e665760009250614e6e565b600101614e20565b508115614e905780516001600160a01b03166000908152600460205260408120555b5050600101614d85565b5080821115614f4b57805b82811015614f49576001805480614eb857fe5b60008281526020812060046000199093019283020180546001600160a01b0319908116825560018201805490911690556002810180546001600160e81b0319169055600301559055600b805480614f0b57fe5b60008281526020812060166000199093019283020181815560018101805460ff1916905590614f3d6002830182615ad6565b50509055600101614ea5565b505b6000818310614f5a5781614f5c565b825b905060005b818110156151565761500e858281518110614f7857fe5b602002602001015160018381548110614f8d57fe5b60009182526020918290206040805160c08101825260049390930290910180546001600160a01b0390811684526001820154811694840194909452600281015493841691830191909152600160a01b83046001600160401b03166060830152600160e01b90920460ff161515608082015260039091015460a082015261595f565b61512957806001016004600087848151811061502657fe5b6020026020010151600001516001600160a01b03166001600160a01b031681526020019081526020016000208190555084818151811061506257fe5b60200260200101516001828154811061507757fe5b6000918252602091829020835160049092020180546001600160a01b039283166001600160a01b0319918216178255928401516001820180549184169185169190911790556040840151600282018054606087015160808801511515600160e01b0260ff60e01b196001600160401b03909216600160a01b0267ffffffffffffffff60a01b1995909716929097169190911792909216939093171692909217905560a09091015160039091015561514e565b60006001828154811061513857fe5b9060005260206000209060040201600301819055505b600101614f61565b50828211156152fb576151676159e0565b835b838110156152f857600186828151811061517f57fe5b6020908102919091018101518254600181810185556000948552838520835160049093020180546001600160a01b039384166001600160a01b0319918216178255848601518284018054918616918316919091179055604080860151600284018054606089015160808a01511515600160e01b0260ff60e01b196001600160401b03909216600160a01b0267ffffffffffffffff60a01b1995909a1692909616919091179290921696909617169190911790935560a090930151600390930192909255600b8054928301815590935284516016909102600080516020615e158339815191528101918255918501516000805160206165148339815191528301805491151560ff19909216919091179055918401518492916152b491600080516020615e5b833981519152909101906014615a04565b50505080600101600460008884815181106152cb57fe5b602090810291909101810151516001600160a01b0316825281019190915260400160002055600101615169565b50505b6000600981905560015493505b83811015615369576000600b828154811061531f57fe5b60009182526020822060169190910201600101805460ff191692151592909217909155600b80548390811061535057fe5b6000918252602090912060169091020155600101615308565b5050505050565b600081836153fc5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156153c15781810151838201526020016153a9565b50505050905090810190601f1680156153ee5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858161540857fe5b0495945050505050565b600081848411156154645760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156153c15781810151838201526020016153a9565b505050900390565b805160009061547d575060006111fa565b6020820151805160001a9060c082101561549c576000925050506111fa565b5060019392505050565b8051600090811a60808110156154c05760009150506111fa565b60b88110806154db575060c081108015906154db575060f881105b156154ea5760019150506111fa565b60c08110156154fe5760b5190190506111fa565b60f5190190506111fa565b80516000908190811a60808110156155245760019150615635565b60b881101561553957607e1981019150615635565b60c08110156155b357600060b78203600186019550806020036101000a8651049150600181018201935050808310156155ad576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b50615635565b60f88110156155c85760be1981019150615635565b600060f78203600186019550806020036101000a865104915060018101820193505080831015615633576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b505b5092915050565b805160009061564d575060006111fa565b6000809050600061566184602001516154a6565b602085015185519181019250015b8082101561568f5761568082615509565b6001909301929091019061566f565b50909392505050565b80516000906015146156a957600080fd5b6112aa826147c9565b604080516020808252818301909252606091829190602082018180368337505050602081018490529050600067ffffffffffffffff1984166156f65750601861571a565b6fffffffffffffffffffffffffffffffff1984166157165750601061571a565b5060005b60208110156157505781818151811061572f57fe5b01602001516001600160f81b0319161561574857615750565b60010161571a565b60008160200390506060816040519080825280601f01601f191660200182016040528015615785576020820181803683370190505b5080830196909652508452509192915050565b6060815160011480156157ca5750607f60f81b826000815181106157b857fe5b01602001516001600160f81b03191611155b156157d65750806111fa565b6112aa6157e88351608060ff16615867565b835b6060806040519050835180825260208201818101602087015b8183101561581b578051835260209283019201615803565b50855184518101855292509050808201602086015b81831015615848578051835260209283019201615830565b508651929092011591909101601f01601f191660405250905092915050565b60606801000000000000000083106158b7576040805162461bcd60e51b815260206004820152600e60248201526d696e70757420746f6f206c6f6e6760901b604482015290519081900360640190fd5b604080516001808252818301909252606091602082018180368337019050509050603784116159115782840160f81b816000815181106158f357fe5b60200101906001600160f81b031916908160001a90535090506112aa565b606061591c856156b2565b90508381510160370160f81b8260008151811061593557fe5b60200101906001600160f81b031916908160001a90535061595682826157ea565b95945050505050565b805182516000916001600160a01b039182169116148015615999575081602001516001600160a01b031683602001516001600160a01b0316145b80156159be575081604001516001600160a01b031683604001516001600160a01b0316145b80156111155750506060908101519101516001600160401b0390811691161490565b60408051606081018252600080825260208201529081016159ff615aff565b905290565b8260148101928215615a32579160200282015b82811115615a32578251825591602001919060010190615a17565b50612464929150615b1e565b60408051808201909152600081526060602082015290565b6040518060400160405280615a69615ae5565b8152602001600081525090565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915290565b8260148101928215615a32579182015b82811115615a32578254825591600101919060010190615abb565b5061140c906014810190615b1e565b604051806040016040528060008152602001600081525090565b6040518061028001604052806014906020820280368337509192915050565b61152891905b808211156124645760008155600101615b2456fe6c656e677468206f66206d61784e756d4f664d61696e7461696e696e67206d69736d617463686c656e677468206f66206d61784e756d4f66576f726b696e6743616e64696461746573206d69736d617463686c656e677468206f66206d61696e7461696e536c6173685363616c65206d69736d61746368746865206d61784e756d4f664d61696e7461696e696e67206d757374206265206c657373207468616e206e756d4f6643616e696e61746573746865206e756d4f66436162696e657473206d7573742062652067726561746572207468616e2030746865206e756d4f66436162696e657473206d757374206265206c657373207468616e204d41585f4e554d5f4f465f56414c494441544f5253746865206e756d626572206f662076616c696461746f72732065786365656420746865206c696d6974746865206275726e526174696f206d757374206265206e6f2067726561746572207468616e2031303030306475706c696361746520636f6e73656e7375732061646472657373206f662076616c696461746f725365747468652065787069726554696d655365636f6e64476170206973206f7574206f662072616e6765746865206d61784e756d4f66576f726b696e6743616e64696461746573206d757374206265206e6f742067726561746572207468616e206d61784e756d4f6643616e6469646174657363616e206e6f7420656e7465722054656d706f72617279204d61696e74656e616e63656c656e677468206f66206a61696c2076616c696461746f7273206d757374206265206f6e65536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e74726163746c656e677468206f66206d61784e756d4f6643616e64696461746573206d69736d61746368666565206973206c6172676572207468616e2044555354595f494e434f4d494e470175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db96c656e677468206f662065787069726554696d655365636f6e64476170206d69736d617463680175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dbb6661696c656420746f20706172736520696e69742076616c696461746f72536574f905ec80f905e8f846942a7cdd959bfe8d9487b2a43b33565295a698f7e294b6a7edd747c0554875d3fc531d19ba1497992c5e941ff80f3f7f110ffd8920a3ac38fdef318fe94a3f86048c27395000f846946488aa4d1955ee33403f8ccb1d4de5fb97c7ade294220f003d8bdfaadf52aa1e55ae4cc485e6794875941a87e90e440a39c99aa9cb5cea0ad6a3f0b2407b86048c27395000f846949ef9f4360c606c7ab4db26b016007d3ad0ab86a0946103af86a874b705854033438383c82575f25bc29418e2db06cbff3e3c5f856410a1838649e760175786048c27395000f84694ee01c3b1283aa067c58eab4709f85e99d46de5fe94ee4b9bfb1871c64e2bcabb1dc382dc8b7c4218a29415904ab26ab0e99d70b51c220ccdcccabee6e29786048c27395000f84694685b1ded8013785d6623cc18d214320b6bb6475994a20ef4e5e4e7e36258dbf51f4d905114cb1b34bc9413e39085dc88704f4394d35209a02b1a9520320c86048c27395000f8469478f3adfc719c99674c072166708589033e2d9afe9448a30d5eaa7b64492a160f139e2da2800ec3834e94055838358c29edf4dcc1ba1985ad58aedbb6be2b86048c27395000f84694c2be4ec20253b8642161bc3f444f53679c1f3d479466f50c616d737e60d7ca6311ff0d9c434197898a94d1d678a2506eeaa365056fe565df8bc8659f28b086048c27395000f846942f7be8361c80a4c1e7e9aaf001d0877f1cfde218945f93992ac37f3e61db2ef8a587a436a161fd210b94ecbc4fb1a97861344dad0867ca3cba2b860411f086048c27395000f84694ce2fd7544e0b2cc94692d4a704debef7bcb613289444abc67b4b2fba283c582387f54c9cba7c34bafa948acc2ab395ded08bb75ce85bf0f95ad2abc51ad586048c27395000f84694b8f7166496996a7da21cf1f1b04d9b3e26a3d077946770572763289aac606e4f327c2f6cc1aa3b3e3b94882d745ed97d4422ca8da1c22ec49d880c4c097286048c27395000f846942d4c407bbe49438ed859fe965b140dcf1aab71a9943ad0939e120f33518fbba04631afe7a3ed6327b194b2bbb170ca4e499a2b0f3cc85ebfa6e8c4dfcbea86048c27395000f846946bbad7cf34b5fa511d8e963dbba288b1960e75d694853b0f6c324d1f4e76c8266942337ac1b0af1a229442498946a51ca5924552ead6fc2af08b94fcba648601d1a94a2000f846944430b3230294d12c6ab2aac5c2cd68e80b16b581947b107f4976a252a6939b771202c28e64e03f52d694795811a7f214084116949fc4f53cedbf189eeab28601d1a94a2000f84694ea0a6e3c511bbd10f4519ece37dc24887e11b55d946811ca77acfb221a49393c193f3a22db829fcc8e9464feb7c04830dd9ace164fc5c52b3f5a29e5018a8601d1a94a2000f846947ae2f5b9e386cd1b50a4550696d957cb4900f03a94e83bcc5077e6b873995c24bac871b5ad856047e19464e48d4057a90b233e026c1041e6012ada897fe88601d1a94a2000f8469482012708dafc9e1b880fd083b32182b869be8e09948e5adc73a2d233a1b496ed3115464dd6c7b887509428b383d324bc9a37f4e276190796ba5a8947f5ed8601d1a94a2000f8469422b81f8e175ffde54d797fe11eb03f9e3bf75f1d94a1c3ef7ca38d8ba80cce3bfc53ebd2903ed21658942767f7447f7b9b70313d4147b795414aecea54718601d1a94a2000f8469468bf0b8b6fb4e317a0f9d6f03eaf8ce6675bc60d94675cfe570b7902623f47e7f59c9664b5f5065dcf94d84f0d2e50bcf00f2fc476e1c57f5ca2d57f625b8601d1a94a2000f846948c4d90829ce8f72d0163c1d5cf348a862d5506309485c42a7b34309bee2ed6a235f86d16f059deec5894cc2cedc53f0fa6d376336efb67e43d167169f3b78601d1a94a2000f8469435e7a025f4da968de7e4d7e4004197917f4070f194b1182abaeeb3b4d8eba7e6a4162eac7ace23d57394c4fd0d870da52e73de2dd8ded19fe3d26f43a1138601d1a94a2000f84694d6caa02bbebaebb5d7e581e4b66559e635f805ff94c07335cf083c1c46a487f0325769d88e163b653694efaff03b42e41f953a925fc43720e45fb61a19938601d1a94a2000746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e7472616374746865206d6573736167652073656e646572206d7573742062652074686520626c6f636b2070726f6475636572746865206d61696e7461696e536c6173685363616c65206d7573742062652067726561746572207468616e20300175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dba746865206d6573736167652073656e646572206d75737420626520736c61736820636f6e7472616374a264697066735822122091dd90b1dd27923c787e9f55bd1bebe31e8416465e6ce432022dfeb252e6701e64736f6c63430006040033", + }, + UpgradeConfig { + contract_addr: "0x0000000000000000000000000000000000001001", + code: "608060405234801561001057600080fd5b506004361061023d5760003560e01c80638256ace61161013b578063c80d4b8f116100b8578063e1c7392a1161007c578063e1c7392a1461071d578063f9a2bbc714610725578063fc3e59081461072d578063fc4333cd14610735578063fd6a68791461073d5761023d565b8063c80d4b8f14610667578063c81b16621461066f578063c8509d8114610677578063c96be4cb146106ef578063dc927faf146107155761023d565b8063a1a11bf5116100ff578063a1a11bf514610575578063a78abc161461057d578063ab51bb9614610599578063ac0af629146105a1578063ac431751146105a95761023d565b80638256ace6146104dd578063831d65d1146104e557806396713da91461055d5780639bc8e4f2146105655780639dc092621461056d5761023d565b80634bf6c882116101c95780636e47b4821161018d5780636e47b482146104b557806370fd5bad146104bd57806375d47a0a146104c55780637912a65d146104cd5780637942fd05146104d55761023d565b80634bf6c8821461046d57806351e8067214610475578063567a372d1461047d5780635bfb49901461048557806362b72cf5146104ad5761023d565b806337c8dab91161021057806337c8dab9146103cf578063389f4f711461040e5780633dffc3871461042857806343756e5c14610446578063493279b11461044e5761023d565b80630bee7a67146102425780631182b8751461026357806323bac5a21461035057806335aa2e4414610396575b600080fd5b61024a610745565b6040805163ffffffff9092168252519081900360200190f35b6102db6004803603604081101561027957600080fd5b60ff8235169190810190604081016020820135600160201b81111561029d57600080fd5b8201836020820111156102af57600080fd5b803590602001918460018302840111600160201b831117156102d057600080fd5b50909250905061074a565b6040805160208082528351818301528351919283929083019185019080838360005b838110156103155781810151838201526020016102fd565b50505050905090810190601f1680156103425780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6103766004803603602081101561036657600080fd5b50356001600160a01b031661081e565b604080519384526020840192909252151582820152519081900360600190f35b6103b3600480360360208110156103ac57600080fd5b5035610841565b604080516001600160a01b039092168252519081900360200190f35b6103f5600480360360208110156103e557600080fd5b50356001600160a01b0316610868565b6040805192835260208301919091528051918290030190f35b6104166108bf565b60408051918252519081900360200190f35b6104306108c5565b6040805160ff9092168252519081900360200190f35b6103b36108ca565b6104566108d0565b6040805161ffff9092168252519081900360200190f35b6104306108d5565b6103b36108da565b6104166108e0565b6104ab6004803603602081101561049b57600080fd5b50356001600160a01b03166108e6565b005b610416610a47565b6103b3610a4d565b610430610a53565b6103b3610a58565b610416610a5e565b610430610a63565b6103f5610a68565b6104ab600480360360408110156104fb57600080fd5b60ff8235169190810190604081016020820135600160201b81111561051f57600080fd5b82018360208201111561053157600080fd5b803590602001918460018302840111600160201b8311171561055257600080fd5b509092509050610a72565b610430610bcc565b610416610bd1565b6103b3610bdc565b6103b3610be2565b610585610be8565b604080519115158252519081900360200190f35b61024a610bf1565b610416610bf6565b6104ab600480360360408110156105bf57600080fd5b810190602081018135600160201b8111156105d957600080fd5b8201836020820111156105eb57600080fd5b803590602001918460018302840111600160201b8311171561060c57600080fd5b919390929091602081019035600160201b81111561062957600080fd5b82018360208201111561063b57600080fd5b803590602001918460018302840111600160201b8311171561065c57600080fd5b509092509050610bfb565b610416610fe9565b6103b3610fee565b6104ab6004803603604081101561068d57600080fd5b60ff8235169190810190604081016020820135600160201b8111156106b157600080fd5b8201836020820111156106c357600080fd5b803590602001918460018302840111600160201b831117156106e457600080fd5b509092509050610ff4565b6104ab6004803603602081101561070557600080fd5b50356001600160a01b03166110a7565b6103b361154a565b6104ab611550565b6103b36115c1565b6104306115c7565b6104ab6115cc565b6103b3611a57565b606481565b6060336120001461078c5760405162461bcd60e51b815260040180806020018281038252602f8152602001806124ae602f913960400191505060405180910390fd5b60005460ff166107d1576040805162461bcd60e51b8152602060048201526019602482015260008051602061250a833981519152604482015290519081900360640190fd5b6040805162461bcd60e51b815260206004820152601e60248201527f7265636569766520756e65787065637465642073796e207061636b6167650000604482015290519081900360640190fd5b600260208190526000918252604090912080546001820154919092015460ff1683565b6001818154811061084e57fe5b6000918252602090912001546001600160a01b0316905081565b600080610873612372565b5050506001600160a01b0316600090815260026020818152604092839020835160608101855281548082526001830154938201849052919093015460ff16151592909301919091529091565b60055481565b600181565b61100181565b603881565b600881565b61200081565b60045481565b33611000146109265760405162461bcd60e51b81526004018080602001828103825260308152602001806124096030913960400191505060405180910390fd5b60005460ff1661096b576040805162461bcd60e51b8152602060048201526019602482015260008051602061250a833981519152604482015290519081900360640190fd5b61200063f7a251d7600b61097e84611a5d565b60006040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b838110156109de5781810151838201526020016109c6565b50505050905090810190601f168015610a0b5780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b158015610a2c57600080fd5b505af1158015610a40573d6000803e3d6000fd5b5050505050565b60035481565b61100581565b600281565b61100881565b603281565b600b81565b6004546005549091565b3361200014610ab25760405162461bcd60e51b815260040180806020018281038252602f8152602001806124ae602f913960400191505060405180910390fd5b60005460ff16610af7576040805162461bcd60e51b8152602060048201526019602482015260008051602061250a833981519152604482015290519081900360640190fd5b610aff612395565b6000610b4084848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611b2f92505050565b915091508015610b8a5781516040805163ffffffff9092168252517f7f0956d47419b9525356e7111652b653b530ec6f5096dccc04589bc38e6299679181900360200190a1610a40565b81516040805163ffffffff9092168252517f7d45f62d17443dd4547bca8a8112c60e2385669318dc300ec61a5d2492f262e79181900360200190a15050505050565b600981565b662386f26fc1000081565b61100781565b61100681565b60005460ff1681565b600081565b600481565b60005460ff16610c40576040805162461bcd60e51b8152602060048201526019602482015260008051602061250a833981519152604482015290519081900360640190fd5b3361100714610c805760405162461bcd60e51b815260040180806020018281038252602e815260200180612439602e913960400191505060405180910390fd5b610ceb84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260148152731b5a5cd9195b59585b9bdc951a1c995cda1bdb1960621b60208201529150611baf9050565b15610dc45760208114610d2f5760405162461bcd60e51b81526004018080602001828103825260278152602001806123e26027913960400191505060405180910390fd5b604080516020601f8401819004810282018101909252828152600091610d6d91858580838501838280828437600092019190915250611c9792505050565b905060018110158015610d81575060055481105b610dbc5760405162461bcd60e51b81526004018080602001828103825260258152602001806124896025913960400191505060405180910390fd5b600455610f57565b610e2a84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600f81526e19995b1bdb9e551a1c995cda1bdb19608a1b60208201529150611baf9050565b15610f1a5760208114610e6e5760405162461bcd60e51b81526004018080602001828103825260228152602001806124676022913960400191505060405180910390fd5b604080516020601f8401819004810282018101909252828152600091610eac91858580838501838280828437600092019190915250611c9792505050565b90506103e88111158015610ec1575060045481115b610f12576040805162461bcd60e51b815260206004820181905260248201527f7468652066656c6f6e795468726573686f6c64206f7574206f662072616e6765604482015290519081900360640190fd5b600555610f57565b6040805162461bcd60e51b815260206004820152600d60248201526c756e6b6e6f776e20706172616d60981b604482015290519081900360640190fd5b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a848484846040518080602001806020018381038352878782818152602001925080828437600083820152601f01601f191690910184810383528581526020019050858580828437600083820152604051601f909101601f19169092018290039850909650505050505050a150505050565b609681565b61100281565b33612000146110345760405162461bcd60e51b815260040180806020018281038252602f8152602001806124ae602f913960400191505060405180910390fd5b60005460ff16611079576040805162461bcd60e51b8152602060048201526019602482015260008051602061250a833981519152604482015290519081900360640190fd5b6040517f07db600eebe2ac176be8dcebad61858c245a4961bb32ca2aa3d159b09aa0810e90600090a1505050565b3341146110e55760405162461bcd60e51b815260040180806020018281038252602d8152602001806124dd602d913960400191505060405180910390fd5b60005460ff1661112a576040805162461bcd60e51b8152602060048201526019602482015260008051602061250a833981519152604482015290519081900360640190fd5b6003544311611180576040805162461bcd60e51b815260206004820181905260248201527f63616e206e6f7420736c61736820747769636520696e206f6e6520626c6f636b604482015290519081900360640190fd5b3a156111ca576040805162461bcd60e51b81526020600482015260146024820152736761737072696365206973206e6f74207a65726f60601b604482015290519081900360640190fd5b6040805163155853f360e21b81526001600160a01b03831660048201529051611000916355614fcc916024808301926020929190829003018186803b15801561121257600080fd5b505afa158015611226573d6000803e3d6000fd5b505050506040513d602081101561123c57600080fd5b505161124757611543565b61124f612372565b506001600160a01b0381166000908152600260208181526040928390208351606081018552815481526001820154928101929092529091015460ff1615801592820192909252906112aa576020810180516001019052611303565b60016040820181905260208201819052805480820182556000919091527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf60180546001600160a01b0319166001600160a01b0384161790555b43815260055460208201518161131557fe5b0661146757600060208201819052604080516335409f7f60e01b81526001600160a01b03851660048201529051611000926335409f7f926024808201939182900301818387803b15801561136857600080fd5b505af115801561137c573d6000803e3d6000fd5b505050506120006001600160a01b031663f7a251d7600b61139c85611a5d565b60006040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b838110156113fc5781810151838201526020016113e4565b50505050905090810190601f1680156114295780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b15801561144a57600080fd5b505af115801561145e573d6000803e3d6000fd5b505050506114dd565b60045481602001518161147657fe5b066114dd57604080516375abf10160e11b81526001600160a01b038416600482015290516110009163eb57e20291602480830192600092919082900301818387803b1580156114c457600080fd5b505af11580156114d8573d6000803e3d6000fd5b505050505b6001600160a01b0382166000818152600260208181526040808420865181559186015160018301558581015191909201805460ff1916911515919091179055517fddb6012116e51abf5436d956a4f0ebd927e92c576ff96d7918290c8782291e3e9190a2505b5043600355565b61100381565b60005460ff16156115a8576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b603260045560966005556000805460ff19166001179055565b61100081565b600381565b336110001461160c5760405162461bcd60e51b81526004018080602001828103825260308152602001806124096030913960400191505060405180910390fd5b60005460ff16611651576040805162461bcd60e51b8152602060048201526019602482015260008051602061250a833981519152604482015290519081900360640190fd5b60015461165d57611a55565b600154600090600019015b808211611a29576000805b8284101561178c57611683612372565b600260006001878154811061169457fe5b60009182526020808320909101546001600160a01b0316835282810193909352604091820190208151606081018352815481526001820154938101939093526002015460ff1615159082015260055490915060049004816020015111156117765760046005548161170157fe5b0481602001510381602001818152505080600260006001888154811061172357fe5b6000918252602080832091909101546001600160a01b0316835282810193909352604091820190208351815591830151600183015591909101516002909101805460ff1916911515919091179055611780565b600192505061178c565b50600190930192611673565b8284116119235761179b612372565b60026000600186815481106117ac57fe5b60009182526020808320909101546001600160a01b0316835282810193909352604091820190208151606081018352815481526001820154938101939093526002015460ff1615159082015260055490915060049004816020015111156118945760046005548161181957fe5b0481602001510381602001818152505080600260006001878154811061183b57fe5b6000918252602080832091909101546001600160a01b03168352828101939093526040918201902083518155918301516001808401919091559201516002909101805460ff191691151591909117905591506119239050565b60026000600186815481106118a557fe5b60009182526020808320909101546001600160a01b031683528201929092526040018120818155600181810192909255600201805460ff191690558054806118e957fe5b600082815260209020810160001990810180546001600160a01b0319169055019055836119165750611923565b506000199092019161178c565b81801561192d5750805b15611a0c57600260006001868154811061194357fe5b60009182526020808320909101546001600160a01b031683528201929092526040018120818155600181810192909255600201805460ff1916905580548490811061198a57fe5b600091825260209091200154600180546001600160a01b0390921691869081106119b057fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060018054806119e957fe5b600082815260209020810160001990810180546001600160a01b03191690550190555b82611a18575050611a29565b505060019091019060001901611668565b6040517fcfdb3b6ccaeccbdc68be3c59c840e3b3c90f0a7c491f5fff1cf56cfda200dd9c90600090a150505b565b61100481565b60408051600480825260a08201909252606091829190816020015b6060815260200190600190039081611a78579050509050611aa1836001600160a01b0316611c9c565b81600081518110611aae57fe5b6020026020010181905250611ac243611cbf565b81600181518110611acf57fe5b6020908102919091010152611ae46038611cbf565b81600281518110611af157fe5b6020026020010181905250611b0542611cbf565b81600381518110611b1257fe5b6020026020010181905250611b2681611cd2565b9150505b919050565b611b37612395565b6000611b41612395565b611b496123a7565b611b5a611b5586611d5c565b611d81565b90506000805b611b6983611dcb565b15611ba25780611b9557611b84611b7f84611dec565b611e3a565b63ffffffff16845260019150611b9a565b611ba2565b600101611b60565b5091935090915050915091565b6000816040516020018082805190602001908083835b60208310611be45780518252601f199092019160209182019101611bc5565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120836040516020018082805190602001908083835b60208310611c525780518252601f199092019160209182019101611c33565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051602081830303815290604052805190602001201490505b92915050565b015190565b60408051600560a21b8318601482015260348101909152606090611b2681611ef1565b6060611c91611ccd83611f47565b611ef1565b6060815160001415611cf35750604080516000815260208101909152611b2a565b606082600081518110611d0257fe5b602002602001015190506000600190505b8351811015611d4357611d3982858381518110611d2c57fe5b602002602001015161202d565b9150600101611d13565b50611b26611d56825160c060ff166120aa565b8261202d565b611d646123c7565b506040805180820190915281518152602082810190820152919050565b611d896123a7565b611d92826121a2565b611d9b57600080fd5b6000611daa83602001516121dc565b60208085015160408051808201909152868152920190820152915050919050565b6000611dd56123c7565b505080518051602091820151919092015191011190565b611df46123c7565b611dfd82611dcb565b611e0657600080fd5b60208201516000611e168261223f565b80830160209586015260408051808201909152908152938401919091525090919050565b805160009015801590611e4f57508151602110155b611e5857600080fd5b6000611e6783602001516121dc565b90508083600001511015611ec2576040805162461bcd60e51b815260206004820152601a60248201527f6c656e677468206973206c657373207468616e206f6666736574000000000000604482015290519081900360640190fd5b825160208085015183018051928490039291831015611ee857826020036101000a820491505b50949350505050565b606081516001148015611f235750607f60f81b82600081518110611f1157fe5b01602001516001600160f81b03191611155b15611f2f575080611b2a565b611c91611f418351608060ff166120aa565b8361202d565b604080516020808252818301909252606091829190602082018180368337505050602081018490529050600067ffffffffffffffff198416611f8b57506018611faf565b6fffffffffffffffffffffffffffffffff198416611fab57506010611faf565b5060005b6020811015611fe557818181518110611fc457fe5b01602001516001600160f81b03191615611fdd57611fe5565b600101611faf565b60008160200390506060816040519080825280601f01601f19166020018201604052801561201a576020820181803683370190505b5080830196909652508452509192915050565b6060806040519050835180825260208201818101602087015b8183101561205e578051835260209283019201612046565b50855184518101855292509050808201602086015b8183101561208b578051835260209283019201612073565b508651929092011591909101601f01601f191660405250905092915050565b60606801000000000000000083106120fa576040805162461bcd60e51b815260206004820152600e60248201526d696e70757420746f6f206c6f6e6760901b604482015290519081900360640190fd5b604080516001808252818301909252606091602082018180368337019050509050603784116121545782840160f81b8160008151811061213657fe5b60200101906001600160f81b031916908160001a9053509050611c91565b606061215f85611f47565b90508381510160370160f81b8260008151811061217857fe5b60200101906001600160f81b031916908160001a905350612199828261202d565b95945050505050565b80516000906121b357506000611b2a565b6020820151805160001a9060c08210156121d257600092505050611b2a565b5060019392505050565b8051600090811a60808110156121f6576000915050611b2a565b60b8811080612211575060c08110801590612211575060f881105b15612220576001915050611b2a565b60c08110156122345760b519019050611b2a565b60f519019050611b2a565b80516000908190811a608081101561225a576001915061236b565b60b881101561226f57607e198101915061236b565b60c08110156122e957600060b78203600186019550806020036101000a8651049150600181018201935050808310156122e3576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b5061236b565b60f88110156122fe5760be198101915061236b565b600060f78203600186019550806020036101000a865104915060018101820193505080831015612369576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b505b5092915050565b604051806060016040528060008152602001600081526020016000151581525090565b60408051602081019091526000815290565b60405180604001604052806123ba6123c7565b8152602001600081525090565b60405180604001604052806000815260200160008152509056fe6c656e677468206f66206d697364656d65616e6f725468726573686f6c64206d69736d61746368746865206d6573736167652073656e646572206d7573742062652076616c696461746f7253657420636f6e7472616374746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e74726163746c656e677468206f662066656c6f6e795468726573686f6c64206d69736d61746368746865206d697364656d65616e6f725468726573686f6c64206f7574206f662072616e6765746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e7472616374746865206d6573736167652073656e646572206d7573742062652074686520626c6f636b2070726f647563657274686520636f6e7472616374206e6f7420696e69742079657400000000000000a264697066735822122018b8714d9e81a204e6cb56a28d2122ac3178937ed053b34fef2460106855598d64736f6c63430006040033", + }, + ], + ), + ( + 97, + vec![ + UpgradeConfig { + contract_addr: "0x0000000000000000000000000000000000001000", + code: "6080604052600436106104055760003560e01c80638d19a41011610213578063c81b166211610123578063eb57e202116100ab578063f9a2bbc71161007a578063f9a2bbc714610d55578063fc3e590814610d6a578063fccc281314610d7f578063fd4ad81f14610d94578063fd6a687914610dd757610405565b8063eb57e20214610cd2578063eda5868c14610d05578063f340fa0114610d1a578063f92eb86b14610d4057610405565b8063daacdb66116100f2578063daacdb6614610c69578063dc927faf14610c7e578063e086c7b114610c93578063e1c7392a14610ca8578063e40716a114610cbd57610405565b8063c81b166214610c2a578063c8509d8114610939578063d68fb56a14610c3f578063d86222d514610c5457610405565b8063a78abc16116101a6578063ad3c9da611610175578063ad3c9da614610bb8578063b7ab4db514610beb578063b8cf4ef114610c00578063bf9f49951461065f578063c6d3394514610c1557610405565b8063a78abc1614610aae578063aaf5eb6814610ac3578063ab51bb9614610ad8578063ac43175114610aed57610405565b80639fe0f816116101e25780639fe0f81614610a5a578063a0dc275814610a6f578063a1a11bf514610a84578063a5422d5c14610a9957610405565b80638d19a410146109e85780639369d7de14610a1b57806396713da914610a305780639dc0926214610a4557610405565b80635192c82c1161031957806375d47a0a116102a157806381650b621161027057806381650b6214610924578063831d65d114610939578063853230aa146108e557806386249882146109be5780638b5ad0c9146109d357610405565b806375d47a0a146108d057806378dfed4a146108e55780637942fd05146108fa5780637a84ca2a1461090f57610405565b80635667515a116102e85780635667515a146108065780635d77156c1461081b5780636969a25c146108305780636e47b482146108a657806370fd5bad146108bb57610405565b80635192c82c1461077657806351e806721461078b57806355614fcc146107a0578063565c56b3146107d357610405565b80633365af3a1161039c57806343756e5c1161036b57806343756e5c1461068a57806345cf9daf146106bb578063493279b1146106d05780634bf6c882146106fc5780634df6e0c31461071157610405565b80633365af3a146105ed57806335409f7f146106175780633de0f0d81461064a5780633dffc3871461065f57610405565b8063152ad3b8116103d8578063152ad3b8146105705780631ff1806914610599578063219f22d5146105ae578063321d398a146105c357610405565b806304c4fec61461040a57806307a56847146104215780630bee7a67146104485780631182b87514610476575b600080fd5b34801561041657600080fd5b5061041f610dec565b005b34801561042d57600080fd5b50610436610e7f565b60408051918252519081900360200190f35b34801561045457600080fd5b5061045d610e85565b6040805163ffffffff9092168252519081900360200190f35b34801561048257600080fd5b506104fb6004803603604081101561049957600080fd5b60ff8235169190810190604081016020820135600160201b8111156104bd57600080fd5b8201836020820111156104cf57600080fd5b803590602001918460018302840111600160201b831117156104f057600080fd5b509092509050610e8a565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561053557818101518382015260200161051d565b50505050905090810190601f1680156105625780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561057c57600080fd5b5061058561111c565b604080519115158252519081900360200190f35b3480156105a557600080fd5b50610436611125565b3480156105ba57600080fd5b5061045d61112b565b3480156105cf57600080fd5b50610585600480360360208110156105e657600080fd5b5035611130565b3480156105f957600080fd5b506105856004803603602081101561061057600080fd5b50356111ff565b34801561062357600080fd5b5061041f6004803603602081101561063a57600080fd5b50356001600160a01b03166112b0565b34801561065657600080fd5b5061043661140f565b34801561066b57600080fd5b50610674611415565b6040805160ff9092168252519081900360200190f35b34801561069657600080fd5b5061069f61141a565b604080516001600160a01b039092168252519081900360200190f35b3480156106c757600080fd5b50610436611420565b3480156106dc57600080fd5b506106e5611426565b6040805161ffff9092168252519081900360200190f35b34801561070857600080fd5b5061067461142b565b34801561071d57600080fd5b50610726611430565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561076257818101518382015260200161074a565b505050509050019250505060405180910390f35b34801561078257600080fd5b5061043661152b565b34801561079757600080fd5b5061069f611531565b3480156107ac57600080fd5b50610585600480360360208110156107c357600080fd5b50356001600160a01b0316611537565b3480156107df57600080fd5b50610436600480360360208110156107f657600080fd5b50356001600160a01b031661156c565b34801561081257600080fd5b506106746115bd565b34801561082757600080fd5b5061045d6115c2565b34801561083c57600080fd5b5061085a6004803603602081101561085357600080fd5b50356115c7565b604080516001600160a01b039788168152958716602087015293909516848401526001600160401b0390911660608401521515608083015260a082019290925290519081900360c00190f35b3480156108b257600080fd5b5061069f61162b565b3480156108c757600080fd5b50610674611631565b3480156108dc57600080fd5b5061069f611636565b3480156108f157600080fd5b5061043661163c565b34801561090657600080fd5b50610674611642565b34801561091b57600080fd5b50610436611647565b34801561093057600080fd5b5061045d61164d565b34801561094557600080fd5b5061041f6004803603604081101561095c57600080fd5b60ff8235169190810190604081016020820135600160201b81111561098057600080fd5b82018360208201111561099257600080fd5b803590602001918460018302840111600160201b831117156109b357600080fd5b509092509050611652565b3480156109ca57600080fd5b50610436611705565b3480156109df57600080fd5b5061043661170b565b3480156109f457600080fd5b5061043660048036036020811015610a0b57600080fd5b50356001600160a01b0316611711565b348015610a2757600080fd5b5061041f611786565b348015610a3c57600080fd5b506106746118a0565b348015610a5157600080fd5b5061069f6118a5565b348015610a6657600080fd5b506104366118ab565b348015610a7b57600080fd5b506104366118b0565b348015610a9057600080fd5b5061069f6118b5565b348015610aa557600080fd5b506104fb6118bb565b348015610aba57600080fd5b506105856118da565b348015610acf57600080fd5b506104366118e3565b348015610ae457600080fd5b5061045d6115bd565b348015610af957600080fd5b5061041f60048036036040811015610b1057600080fd5b810190602081018135600160201b811115610b2a57600080fd5b820183602082011115610b3c57600080fd5b803590602001918460018302840111600160201b83111715610b5d57600080fd5b919390929091602081019035600160201b811115610b7a57600080fd5b820183602082011115610b8c57600080fd5b803590602001918460018302840111600160201b83111715610bad57600080fd5b5090925090506118ec565b348015610bc457600080fd5b5061043660048036036020811015610bdb57600080fd5b50356001600160a01b0316612329565b348015610bf757600080fd5b5061072661233b565b348015610c0c57600080fd5b5061043661241e565b348015610c2157600080fd5b50610436611631565b348015610c3657600080fd5b5061069f612423565b348015610c4b57600080fd5b50610436612429565b348015610c6057600080fd5b50610436612468565b348015610c7557600080fd5b50610436612474565b348015610c8a57600080fd5b5061069f61247a565b348015610c9f57600080fd5b50610436612480565b348015610cb457600080fd5b5061041f612485565b348015610cc957600080fd5b50610436612688565b348015610cde57600080fd5b5061041f60048036036020811015610cf557600080fd5b50356001600160a01b031661268e565b348015610d1157600080fd5b5061045d61279c565b61041f60048036036020811015610d3057600080fd5b50356001600160a01b03166127a1565b348015610d4c57600080fd5b50610436612aa6565b348015610d6157600080fd5b5061069f612aac565b348015610d7657600080fd5b506106746118ab565b348015610d8b57600080fd5b5061069f612ab2565b348015610da057600080fd5b50610dbe60048036036020811015610db757600080fd5b5035612ab8565b6040805192835290151560208301528051918290030190f35b348015610de357600080fd5b5061069f612ae6565b6000610df733611711565b9050600b8181548110610e0657fe5b600091825260209091206001601690920201015460ff16610e63576040805162461bcd60e51b81526020600482015260126024820152716e6f7420696e206d61696e74656e616e636560701b604482015290519081900360640190fd5b6000610e6d612429565b9050610e7a338383612aec565b505050565b60095481565b606481565b60005460609060ff16610ee0576040805162461bcd60e51b81526020600482015260196024820152781d1a194818dbdb9d1c9858dd081b9bdd081a5b9a5d081e595d603a1b604482015290519081900360640190fd5b3361200014610f205760405162461bcd60e51b815260040180806020018281038252602f815260200180616047602f913960400191505060405180910390fd5b600b54610fc557610f2f6159e0565b60015460005b81811015610fc157600b80546001810182556000919091528351600080516020615fc0833981519152601690920291820190815560208501516000805160206160d08339815191528301805460ff191691151591909117905560408501518592610fb391600080516020616006833981519152909101906014615a04565b505050806001019050610f35565b5050505b610fcd615a3e565b600061100e85858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612ce092505050565b915091508061102a576110216064612e39565b92505050611115565b815160009060ff1661104a576110438360200151612e9a565b90506110e1565b825160ff16600114156110dd578260200151516001146110b7577f70e72399380dcfb0338abc03dc8d47f9f470ada8e769c9a78d644ea97385ecb2604051808060200182810382526025815260200180615f066025913960400191505060405180910390a15060676110d8565b61104383602001516000815181106110cb57fe5b6020026020010151613caa565b6110e1565b5060655b63ffffffff811661110657505060408051600081526020810190915291506111159050565b61110f81612e39565b93505050505b9392505050565b60075460ff1681565b60035481565b606881565b6001546000908210611144575060006111fa565b60006001600160a01b03166001838154811061115c57fe5b60009182526020909120600490910201546001600160a01b0316148061118c5750600854158061118c5750600a54155b8061119b575060085460095410155b806111ac57506111aa826111ff565b155b806111d557506000600b83815481106111c157fe5b906000526020600020906016020160000154115b806111e9575060016111e561233b565b5111155b156111f6575060006111fa565b5060015b919050565b6001546000908210611213575060006111fa565b600b548210611250576001828154811061122957fe5b9060005260206000209060040201600201601c9054906101000a900460ff161590506111fa565b6001828154811061125d57fe5b9060005260206000209060040201600201601c9054906101000a900460ff161580156112aa5750600b828154811061129157fe5b600091825260209091206001601690920201015460ff16155b92915050565b33611001146112f05760405162461bcd60e51b81526004018080602001828103825260298152602001806160f06029913960400191505060405180910390fd5b600b54611395576112ff6159e0565b60015460005b8181101561139157600b80546001810182556000919091528351600080516020615fc0833981519152601690920291820190815560208501516000805160206160d08339815191528301805460ff19169115159190911790556040850151859261138391600080516020616006833981519152909101906014615a04565b505050806001019050611305565b5050505b6001600160a01b038116600090815260046020526040902054806113b9575061140c565b6001810390506000600b82815481106113ce57fe5b600091825260209091206001601690920201015460ff1690506113f18383613e21565b80156113fa5750805b15610e7a576009805460001901905550505b50565b61271081565b600181565b61100181565b60085481565b606181565b600881565b600e54600c546060919080611443575060155b606061144d61233b565b905081815111611461579250611528915050565b82828251031015611473578181510392505b82156114a75760c8430461148e82828686036000888861419d565b6114a582828686038787038889898951030161419d565b505b6060826040519080825280602002602001820160405280156114d3578160200160208202803683370190505b50905060005b83811015611521578281815181106114ed57fe5b602002602001015182828151811061150157fe5b6001600160a01b03909216602092830291909101909101526001016114d9565b5093505050505b90565b60065481565b61200081565b6001600160a01b0381166000908152600460205260408120548061155f5760009150506111fa565b60001901611115816111ff565b6001600160a01b038116600090815260046020526040812054806115945760009150506111fa565b6001808203815481106115a357fe5b906000526020600020906004020160030154915050919050565b600081565b606781565b600181815481106115d457fe5b600091825260209091206004909102018054600182015460028301546003909301546001600160a01b0392831694509082169291821691600160a01b81046001600160401b031691600160e01b90910460ff169086565b61100581565b600281565b61100881565b6103e881565b600b81565b600c5481565b606681565b33612000146116925760405162461bcd60e51b815260040180806020018281038252602f815260200180616047602f913960400191505060405180910390fd5b7f41ce201247b6ceb957dcdb217d0b8acb50b9ea0e12af9af4f5e7f38902101605838383604051808460ff1660ff168152602001806020018281038252848482818152602001925080828437600083820152604051601f909101601f1916909201829003965090945050505050a1505050565b60025481565b600a5481565b6001600160a01b0381166000908152600460205260408120548061177c576040805162461bcd60e51b815260206004820152601760248201527f6f6e6c792063757272656e742076616c696461746f7273000000000000000000604482015290519081900360640190fd5b6000190192915050565b600b5461182b576117956159e0565b60015460005b8181101561182757600b80546001810182556000919091528351600080516020615fc0833981519152601690920291820190815560208501516000805160206160d08339815191528301805460ff19169115159190911790556040850151859261181991600080516020616006833981519152909101906014615a04565b50505080600101905061179b565b5050505b6008546118385760036008555b600a54611845576002600a555b600061185033611711565b905061185b81611130565b6118965760405162461bcd60e51b8152600401808060200182810382526023815260200180615ee36023913960400191505060405180910390fd5b61140c338261428c565b600981565b61100781565b600381565b60c881565b61100681565b604051806101e001604052806101ab8152602001615b396101ab913981565b60005460ff1681565b6402540be40081565b60005460ff1661193f576040805162461bcd60e51b81526020600482015260196024820152781d1a194818dbdb9d1c9858dd081b9bdd081a5b9a5d081e595d603a1b604482015290519081900360640190fd5b336110071461197f5760405162461bcd60e51b815260040180806020018281038252602e815260200180615f4c602e913960400191505060405180910390fd5b6119e984848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080518082019091526013815272065787069726554696d655365636f6e6447617606c1b602082015291506143249050565b15611ac45760208114611a2d5760405162461bcd60e51b8152600401808060200182810382526026815260200180615fe06026913960400191505060405180910390fd5b604080516020601f8401819004810282018101909252828152600091611a6b9185858083850183828082843760009201919091525061440b92505050565b905060648110158015611a815750620186a08111155b611abc5760405162461bcd60e51b8152600401808060200182810382526027815260200180615e736027913960400191505060405180910390fd5b600255612297565b611b2484848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260098152686275726e526174696f60b81b602082015291506143249050565b15611c145760208114611b7e576040805162461bcd60e51b815260206004820152601c60248201527f6c656e677468206f66206275726e526174696f206d69736d6174636800000000604482015290519081900360640190fd5b604080516020601f8401819004810282018101909252828152600091611bbc9185858083850183828082843760009201919091525061440b92505050565b9050612710811115611bff5760405162461bcd60e51b815260040180806020018281038252602b815260200180615e1d602b913960400191505060405180910390fd5b6006556007805460ff19166001179055612297565b611c7e84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260138152726d61784e756d4f664d61696e7461696e696e6760681b602082015291506143249050565b15611d565760208114611cc25760405162461bcd60e51b8152600401808060200182810382526026815260200180615ce46026913960400191505060405180910390fd5b604080516020601f8401819004810282018101909252828152600091611d009185858083850183828082843760009201919091525061440b92505050565b600c5490915080611d0f575060155b808210611d4d5760405162461bcd60e51b8152600401808060200182810382526038815260200180615d5b6038913960400191505060405180910390fd5b50600855612297565b611dbf84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260128152716d61696e7461696e536c6173685363616c6560701b602082015291506143249050565b15611e8a5760208114611e035760405162461bcd60e51b8152600401808060200182810382526025815260200180615d366025913960400191505060405180910390fd5b604080516020601f8401819004810282018101909252828152600091611e419185858083850183828082843760009201919091525061440b92505050565b905060008111611e825760405162461bcd60e51b815260040180806020018281038252602d8152602001806160a3602d913960400191505060405180910390fd5b600a55612297565b611efe84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601981527f6d61784e756d4f66576f726b696e6743616e6469646174657300000000000000602082015291506143249050565b15611fcb5760208114611f425760405162461bcd60e51b815260040180806020018281038252602c815260200180615d0a602c913960400191505060405180910390fd5b604080516020601f8401819004810282018101909252828152600091611f809185858083850183828082843760009201919091525061440b92505050565b9050600d54811115611fc35760405162461bcd60e51b8152600401808060200182810382526049815260200180615e9a6049913960600191505060405180910390fd5b600e55612297565b61203484848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260128152716d61784e756d4f6643616e6469646174657360701b602082015291506143249050565b156120d557602081146120785760405162461bcd60e51b8152600401808060200182810382526025815260200180615f7a6025913960400191505060405180910390fd5b604080516020601f84018190048102820181019092528281526000916120b69185858083850183828082843760009201919091525061440b92505050565b600d819055600e549091508110156120cf57600d54600e555b50612297565b61213984848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600d81526c6e756d4f66436162696e65747360981b602082015291506143249050565b1561225a5760208114612193576040805162461bcd60e51b815260206004820181905260248201527f6c656e677468206f66206e756d4f66436162696e657473206d69736d61746368604482015290519081900360640190fd5b604080516020601f84018190048102820181019092528281526000916121d19185858083850183828082843760009201919091525061440b92505050565b9050600081116122125760405162461bcd60e51b8152600401808060200182810382526028815260200180615d936028913960400191505060405180910390fd5b60298111156122525760405162461bcd60e51b8152600401808060200182810382526039815260200180615dbb6039913960400191505060405180910390fd5b600c55612297565b6040805162461bcd60e51b815260206004820152600d60248201526c756e6b6e6f776e20706172616d60981b604482015290519081900360640190fd5b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a848484846040518080602001806020018381038352878782818152602001925080828437600083820152601f01601f191690910184810383528581526020019050858580828437600083820152604051601f909101601f19169092018290039850909650505050505050a150505050565b60046020526000908152604090205481565b6001546060906000805b8281101561236a57612356816111ff565b15612362576001909101905b600101612345565b50606081604051908082528060200260200182016040528015612397578160200160208202803683370190505b5090506000915060005b83811015612416576123b2816111ff565b1561240e57600181815481106123c457fe5b600091825260209091206004909102015482516001600160a01b03909116908390859081106123ef57fe5b6001600160a01b03909216602092830291909101909101526001909201915b6001016123a1565b509250505090565b601581565b61100281565b600061243361233b565b519050600080600c541161244857601561244c565b600c545b90508082111561245a578091505b8161246457600191505b5090565b67016345785d8a000081565b60055481565b61100381565b602981565b60005460ff16156124dd576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b6124e5615a3e565b600061250b604051806101e001604052806101ab8152602001615b396101ab9139612ce0565b915091508061254b5760405162461bcd60e51b81526004018080602001828103825260218152602001806160266021913960400191505060405180910390fd5b60005b8260200151518110156126705760018360200151828151811061256d57fe5b60209081029190910181015182546001818101855560009485528385208351600493840290910180546001600160a01b039283166001600160a01b03199182161782558587015182850180549185169183169190911790556040860151600283018054606089015160808a01511515600160e01b0260ff60e01b196001600160401b03909216600160a01b0267ffffffffffffffff60a01b199590981692909516919091179290921694909417161790915560a09093015160039093019290925591860151805191850193918590811061264357fe5b602090810291909101810151516001600160a01b031682528101919091526040016000205560010161254e565b50506103e8600255506000805460ff19166001179055565b600d5481565b33611001146126ce5760405162461bcd60e51b81526004018080602001828103825260298152602001806160f06029913960400191505060405180910390fd5b600b54612773576126dd6159e0565b60015460005b8181101561276f57600b80546001810182556000919091528351600080516020615fc0833981519152601690920291820190815560208501516000805160206160d08339815191528301805460ff19169115159190911790556040850151859261276191600080516020616006833981519152909101906014615a04565b5050508060010190506126e3565b5050505b600061277e82614410565b905061278981611130565b1561279857612798828261428c565b5050565b606581565b3341146127df5760405162461bcd60e51b815260040180806020018281038252602d815260200180616076602d913960400191505060405180910390fd5b60005460ff16612832576040805162461bcd60e51b81526020600482015260196024820152781d1a194818dbdb9d1c9858dd081b9bdd081a5b9a5d081e595d603a1b604482015290519081900360640190fd5b6000341161287f576040805162461bcd60e51b81526020600482015260156024820152746465706f7369742076616c7565206973207a65726f60581b604482015290519081900360640190fd5b6001600160a01b0381166000908152600460205260409020546007543491906103e89060ff16156128af57506006545b6000831180156128bf5750600081115b156129685760006128e86127106128dc868563ffffffff6145b416565b9063ffffffff61460d16565b905080156129665760405161dead9082156108fc029083906000818181858888f1935050505015801561291f573d6000803e3d6000fd5b506040805182815290517f627059660ea01c4733a328effb2294d2f86905bf806da763a89cee254de8bee59181900360200190a1612963848263ffffffff61464f16565b93505b505b8115612a6057600060018084038154811061297f57fe5b9060005260206000209060040201905080600201601c9054906101000a900460ff16156129ea576040805185815290516001600160a01b038716917ff177e5d6c5764d79c32883ed824111d9b13f5668cf6ab1cc12dd36791dd955b4919081900360200190a2612a5a565b6003546129fd908563ffffffff61469116565b6003908155810154612a15908563ffffffff61469116565b60038201556040805185815290516001600160a01b038716917f93a090ecc682c002995fad3c85b30c5651d7fd29b0be5da9d784a3302aedc055919081900360200190a25b50612aa0565b6040805184815290516001600160a01b038616917ff177e5d6c5764d79c32883ed824111d9b13f5668cf6ab1cc12dd36791dd955b4919081900360200190a25b50505050565b600e5481565b61100081565b61dead81565b600b8181548110612ac557fe5b60009182526020909120601690910201805460019091015490915060ff1682565b61100481565b6000600a5460001480612afd575081155b80612b085750600954155b15612b1557506000611115565b600960008154809291906001900391905055506000612b62600a546128dc856128dc600b8981548110612b4457fe5b6000918252602090912060169091020154439063ffffffff61464f16565b90506000600b8581548110612b7357fe5b906000526020600020906016020160010160006101000a81548160ff0219169083151502179055506000806110016001600160a01b0316638256ace66040518163ffffffff1660e01b8152600401604080518083038186803b158015612bd857600080fd5b505afa158015612bec573d6000803e3d6000fd5b505050506040513d6040811015612c0257600080fd5b508051602090910151600095509092509050808310612c9057612c258787613e21565b50604080516305bfb49960e41b81526001600160a01b0389166004820152905161100191635bfb499091602480830192600092919082900301818387803b158015612c6f57600080fd5b505af1158015612c83573d6000803e3d6000fd5b5050505060019350612ca2565b818310612ca257612ca087614410565b505b6040516001600160a01b038816907fb9d38178dc641ff1817967a63c9078cbcd955a9f1fcd75e0e3636de615d44d3b90600090a25050509392505050565b612ce8615a3e565b6000612cf2615a3e565b612cfa615a56565b612d0b612d06866146eb565b614710565b90506000805b612d1a8361475a565b15612e2b5780612d3f57612d35612d308461477b565b6147c9565b60ff168452612e23565b8060011415612e1e576060612d5b612d568561477b565b614880565b90508051604051908082528060200260200182016040528015612d9857816020015b612d85615a76565b815260200190600190039081612d7d5790505b50602086015260005b8151811015612e1357612db2615a76565b6000612dd0848481518110612dc357fe5b6020026020010151614951565b9150915080612ded57876000995099505050505050505050612e34565b8188602001518481518110612dfe57fe5b60209081029190910101525050600101612da1565b506001925050612e23565b612e2b565b600101612d11565b50919350909150505b915091565b604080516001808252818301909252606091829190816020015b6060815260200190600190039081612e53579050509050612e798363ffffffff16614a2e565b81600081518110612e8657fe5b602002602001018190525061111581614a41565b6000806060612ea884614acb565b9150915081612f55577f70e72399380dcfb0338abc03dc8d47f9f470ada8e769c9a78d644ea97385ecb2816040518080602001828103825283818151815260200191508051906020019080838360005b83811015612f10578181015183820152602001612ef8565b50505050905090810190601f168015612f3d5780820380516001836020036101000a031916815260200191505b509250505060405180910390a16066925050506111fa565b50506060612f6283614bad565b6001549091506000908190815b81811015612fe55767016345785d8a000060018281548110612f8d57fe5b90600052602060002090600402016003015410612faf57600190930192612fdd565b600060018281548110612fbe57fe5b9060005260206000209060040201600301541115612fdd576001909201915b600101612f6f565b50606083604051908082528060200260200182016040528015613012578160200160208202803683370190505b509050606084604051908082528060200260200182016040528015613041578160200160208202803683370190505b509050606085604051908082528060200260200182016040528015613070578160200160208202803683370190505b50905060608660405190808252806020026020018201604052801561309f578160200160208202803683370190505b50905060006060876040519080825280602002602001820160405280156130d0578160200160208202803683370190505b5090506060886040519080825280602002602001820160405280156130ff578160200160208202803683370190505b509050600099506000985060006110046001600160a01b031663149d14d96040518163ffffffff1660e01b815260040160206040518083038186803b15801561314757600080fd5b505afa15801561315b573d6000803e3d6000fd5b505050506040513d602081101561317157600080fd5b5051905067016345785d8a00008111156131e5577f70e72399380dcfb0338abc03dc8d47f9f470ada8e769c9a78d644ea97385ecb2604051808060200182810382526021815260200180615f9f6021913960400191505060405180910390a160689c505050505050505050505050506111fa565b60005b898110156134565767016345785d8a00006001828154811061320657fe5b9060005260206000209060040201600301541061338c576001818154811061322a57fe5b906000526020600020906004020160020160009054906101000a90046001600160a01b0316898d8151811061325b57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060006402540be4006001838154811061329057fe5b906000526020600020906004020160030154816132a957fe5b06600183815481106132b757fe5b9060005260206000209060040201600301540390506132df838261464f90919063ffffffff16565b898e815181106132eb57fe5b6020026020010181815250506001828154811061330457fe5b906000526020600020906004020160020160009054906101000a90046001600160a01b0316878e8151811061333557fe5b60200260200101906001600160a01b031690816001600160a01b03168152505081888e8151811061336257fe5b602090810291909101015261337d868263ffffffff61469116565b6001909d019c955061344e9050565b60006001828154811061339b57fe5b906000526020600020906004020160030154111561344e57600181815481106133c057fe5b906000526020600020906004020160010160009054906101000a90046001600160a01b0316848c815181106133f157fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506001818154811061341e57fe5b906000526020600020906004020160030154838c8151811061343c57fe5b60209081029190910101526001909a01995b6001016131e8565b5060008415613894576110046001600160a01b0316636e056520868b8b8a60025442016040518663ffffffff1660e01b815260040180806020018060200180602001856001600160401b03166001600160401b03168152602001848103845288818151815260200191508051906020019060200280838360005b838110156134e85781810151838201526020016134d0565b50505050905001848103835287818151815260200191508051906020019060200280838360005b8381101561352757818101518382015260200161350f565b50505050905001848103825286818151815260200191508051906020019060200280838360005b8381101561356657818101518382015260200161354e565b505050509050019750505050505050506020604051808303818588803b15801561358f57600080fd5b505af1935050505080156135b557506040513d60208110156135b057600080fd5b505160015b6137f0576040516000815260443d10156135d15750600061366c565b60046000803e60005160e01c6308c379a081146135f257600091505061366c565b60043d036004833e81513d60248201116001600160401b038211171561361d5760009250505061366c565b80830180516001600160401b0381111561363e57600094505050505061366c565b8060208301013d860181111561365c5760009550505050505061366c565b601f01601f191660405250925050505b80613677575061371b565b60019150857fa7cdeed7d0db45e3219a6e5d60838824c16f1d39991fcfe3f963029c844bf280826040518080602001828103825283818151815260200191508051906020019080838360005b838110156136db5781810151838201526020016136c3565b50505050905090810190601f1680156137085780820380516001836020036101000a031916815260200191505b509250505060405180910390a2506137eb565b3d808015613745576040519150601f19603f3d011682016040523d82523d6000602084013e61374a565b606091505b5060019150857fbfa884552dd8921b6ce90bfe906952ae5b3b29be0cc1a951d4f62697635a3a45826040518080602001828103825283818151815260200191508051906020019080838360005b838110156137af578181015183820152602001613797565b50505050905090810190601f1680156137dc5780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505b613894565b801561382e576040805187815290517fa217d08e65f80c73121cd9db834d81652d544bfbf452f6d04922b16c90a37b709181900360200190a1613892565b604080516020808252601b908201527f6261746368207472616e736665722072657475726e2066616c7365000000000081830152905187917fa7cdeed7d0db45e3219a6e5d60838824c16f1d39991fcfe3f963029c844bf280919081900360600190a25b505b8015613a4a5760005b8751811015613a485760008882815181106138b457fe5b602002602001015190506000600182815481106138cd57fe5b60009182526020909120600160049092020181015481546001600160a01b03909116916108fc91859081106138fe57fe5b9060005260206000209060040201600301549081150290604051600060405180830381858888f19350505050905080156139ba576001828154811061393f57fe5b60009182526020909120600160049092020181015481546001600160a01b03909116917f6c61d60f69a7beb3e1c80db7f39f37b208537cbb19da3174511b477812b2fc7d918590811061398e57fe5b9060005260206000209060040201600301546040518082815260200191505060405180910390a2613a3e565b600182815481106139c757fe5b60009182526020909120600160049092020181015481546001600160a01b03909116917f25d0ce7d2f0cec669a8c17efe49d195c13455bb8872b65fa610ac7f53fe4ca7d9185908110613a1657fe5b9060005260206000209060040201600301546040518082815260200191505060405180910390a25b505060010161389d565b505b835115613b945760005b8451811015613b92576000858281518110613a6b57fe5b60200260200101516001600160a01b03166108fc868481518110613a8b57fe5b60200260200101519081150290604051600060405180830381858888f1935050505090508015613b2157858281518110613ac157fe5b60200260200101516001600160a01b03167f6c61d60f69a7beb3e1c80db7f39f37b208537cbb19da3174511b477812b2fc7d868481518110613aff57fe5b60200260200101516040518082815260200191505060405180910390a2613b89565b858281518110613b2d57fe5b60200260200101516001600160a01b03167f25d0ce7d2f0cec669a8c17efe49d195c13455bb8872b65fa610ac7f53fe4ca7d868481518110613b6b57fe5b60200260200101516040518082815260200191505060405180910390a25b50600101613a54565b505b4715613bfd576040805147815290517f6ecc855f9440a9282c90913bbc91619fd44f5ec0b462af28d127b116f130aa4d9181900360200190a1604051611002904780156108fc02916000818181858888f19350505050158015613bfb573d6000803e3d6000fd5b505b600060038190556005558c5115613c1757613c178d614d7d565b6110016001600160a01b031663fc4333cd6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015613c5457600080fd5b505af1158015613c68573d6000803e3d6000fd5b50506040517fedd8d7296956dd970ab4de3f2fc03be2b0ffc615d20cd4c72c6e44f928630ebf925060009150a15060009e9d5050505050505050505050505050565b80516001600160a01b0316600090815260046020526040812054801580613cfb5750600180820381548110613cdb57fe5b9060005260206000209060040201600201601c9054906101000a900460ff165b15613d415782516040516001600160a01b03909116907fe209c46bebf57cf265d5d9009a00870e256d9150f3ed5281ab9d9eb3cec6e4be90600090a260009150506111fa565b600154600554600019820111801590613d975784516040516001600160a01b03909116907fe209c46bebf57cf265d5d9009a00870e256d9150f3ed5281ab9d9eb3cec6e4be90600090a2600093505050506111fa565b600580546001908101909155805481906000198601908110613db557fe5b6000918252602082206002600490920201018054921515600160e01b0260ff60e01b199093169290921790915585516040516001600160a01b03909116917ff226e7d8f547ff903d9d419cf5f54e0d7d07efa9584135a53a057c5f1f27f49a91a2506000949350505050565b60008060018381548110613e3157fe5b90600052602060002090600402016003015490506000600180805490500390506001613e5b61233b565b5111613e9057600060018581548110613e7057fe5b9060005260206000209060040201600301819055506000925050506112aa565b6040805183815290516001600160a01b038716917f3b6f9ef90462b512a1293ecec018670bf7b7f1876fb727590a8a6d7643130a70919081900360200190a26001600160a01b038516600090815260046020526040812055835b6001546000190181101561408d5760018160010181548110613f0857fe5b906000526020600020906004020160018281548110613f2357fe5b60009182526020909120825460049092020180546001600160a01b03199081166001600160a01b0393841617825560018085015481840180548416918616919091179055600280860180549185018054909416919095161780835584546001600160401b03600160a01b91829004160267ffffffffffffffff60a01b1990911617808355935460ff600160e01b918290041615150260ff60e01b19909416939093179055600392830154920191909155600b805490918301908110613fe457fe5b9060005260206000209060160201600b8281548110613fff57fe5b600091825260209091208254601690920201908155600180830154908201805460ff191660ff909216151591909117905561404260028083019084016014615aab565b5090505080600101600460006001848154811061405b57fe5b600091825260208083206004909202909101546001600160a01b03168352820192909252604001902055600101613eea565b50600180548061409957fe5b60008281526020812060046000199093019283020180546001600160a01b0319908116825560018201805490911690556002810180546001600160e81b0319169055600301559055600b8054806140ec57fe5b60008281526020812060166000199093019283020181815560018101805460ff191690559061411e6002830182615ad6565b50509055600081838161412d57fe5b04905080156141915760015460005b8181101561418e57826001828154811061415257fe5b906000526020600020906004020160030154016001828154811061417257fe5b600091825260209091206003600490920201015560010161413c565b50505b50600195945050505050565b60005b828110156142835760408051602080820189905287840182840152825180830384018152606090920190925280519101206000908390816141dd57fe5b0690508085018287011461427a57600088838801815181106141fb57fe5b60200260200101519050888287018151811061421357fe5b6020026020010151898489018151811061422957fe5b60200260200101906001600160a01b031690816001600160a01b03168152505080898388018151811061425857fe5b60200260200101906001600160a01b031690816001600160a01b031681525050505b506001016141a0565b50505050505050565b600980546001908101909155600b8054839081106142a657fe5b906000526020600020906016020160010160006101000a81548160ff02191690831515021790555043600b82815481106142dc57fe5b600091825260208220601690910201919091556040516001600160a01b038416917ff62981a567ec3cec866c6fa93c55bcdf841d6292d18b8d522ececa769375d82d91a25050565b6000816040516020018082805190602001908083835b602083106143595780518252601f19909201916020918201910161433a565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120836040516020018082805190602001908083835b602083106143c75780518252601f1990920191602091820191016143a8565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040528051906020012014905092915050565b015190565b6001600160a01b03811660009081526004602052604081205480614439575060001990506111fa565b60018103905060006001828154811061444e57fe5b906000526020600020906004020160030154905060006001838154811061447157fe5b906000526020600020906004020160030181905550600060018080549050039050846001600160a01b03167f8cd4e147d8af98a9e3b6724021b8bf6aed2e5dac71c38f2dce8161b82585b25d836040518082815260200191505060405180910390a2806144e3578293505050506111fa565b60008183816144ee57fe5b04905080156145aa5760005b8481101561454c57816001828154811061451057fe5b906000526020600020906004020160030154016001828154811061453057fe5b60009182526020909120600360049092020101556001016144fa565b50600180549085015b818110156145a757826001828154811061456b57fe5b906000526020600020906004020160030154016001828154811061458b57fe5b6000918252602090912060036004909202010155600101614555565b50505b5091949350505050565b6000826145c3575060006112aa565b828202828482816145d057fe5b04146111155760405162461bcd60e51b8152600401808060200182810382526021815260200180615f2b6021913960400191505060405180910390fd5b600061111583836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250615370565b600061111583836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250615412565b600082820183811015611115576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6146f3615ae5565b506040805180820190915281518152602082810190820152919050565b614718615a56565b6147218261546c565b61472a57600080fd5b600061473983602001516154a6565b60208085015160408051808201909152868152920190820152915050919050565b6000614764615ae5565b505080518051602091820151919092015191011190565b614783615ae5565b61478c8261475a565b61479557600080fd5b602082015160006147a582615509565b80830160209586015260408051808201909152908152938401919091525090919050565b8051600090158015906147de57508151602110155b6147e757600080fd5b60006147f683602001516154a6565b90508083600001511015614851576040805162461bcd60e51b815260206004820152601a60248201527f6c656e677468206973206c657373207468616e206f6666736574000000000000604482015290519081900360640190fd5b82516020808501518301805192849003929183101561487757826020036101000a820491505b50949350505050565b606061488b8261546c565b61489457600080fd5b600061489f8361563c565b90506060816040519080825280602002602001820160405280156148dd57816020015b6148ca615ae5565b8152602001906001900390816148c25790505b50905060006148ef85602001516154a6565b60208601510190506000805b848110156149465761490c83615509565b915060405180604001604052808381526020018481525084828151811061492f57fe5b6020908102919091010152918101916001016148fb565b509195945050505050565b614959615a76565b6000614963615a76565b61496b615a56565b61497485614710565b90506000805b6149838361475a565b15612e2b57806149ae5761499e6149998461477b565b615698565b6001600160a01b03168452614a26565b80600114156149d6576149c36149998461477b565b6001600160a01b03166020850152614a26565b80600214156149fe576149eb6149998461477b565b6001600160a01b03166040850152614a26565b8060031415612e1e57614a13612d308461477b565b6001600160401b03166060850152600191505b60010161497a565b60606112aa614a3c836156b2565b615798565b6060815160001415614a6257506040805160008152602081019091526111fa565b606082600081518110614a7157fe5b602002602001015190506000600190505b8351811015614ab257614aa882858381518110614a9b57fe5b60200260200101516157ea565b9150600101614a82565b50611115614ac5825160c060ff16615867565b826157ea565b60006060602983511115614afd576000604051806060016040528060298152602001615df46029913991509150612e34565b60005b8351811015614b935760005b81811015614b8a57848181518110614b2057fe5b6020026020010151600001516001600160a01b0316858381518110614b4157fe5b6020026020010151600001516001600160a01b03161415614b825760006040518060600160405280602b8152602001615e48602b9139935093505050612e34565b600101614b0c565b50600101614b00565b505060408051602081019091526000815260019150915091565b6060600080808080614bbd612429565b6001549091505b8015614ccb57600181039250600b8381548110614bdd57fe5b600091825260209091206001601690920201015460ff16614bfd57614cc2565b60018381548110614c0a57fe5b60009182526020909120600490910201546001600160a01b03169450614c31858484612aec565b9350831580614c44575060018851038610155b15614c4e57614cc2565b60005b8851811015614cc057856001600160a01b0316898281518110614c7057fe5b6020026020010151600001516001600160a01b03161415614cb8576001898281518110614c9957fe5b6020908102919091010151901515608090910152600190960195614cc0565b600101614c51565b505b60001901614bc4565b5084875103604051908082528060200260200182016040528015614d0957816020015b614cf6615a76565b815260200190600190039081614cee5790505b5095506000915060005b8751811015614d7257878181518110614d2857fe5b602002602001015160800151614d6a57878181518110614d4457fe5b6020026020010151878481518110614d5857fe5b60209081029190910101526001909201915b600101614d13565b505050505050919050565b600154815160005b82811015614e9a576001614d97615a76565b60018381548110614da457fe5b600091825260208083206040805160c08101825260049490940290910180546001600160a01b0390811685526001820154811693850193909352600281015492831691840191909152600160a01b82046001600160401b03166060840152600160e01b90910460ff16151560808301526003015460a082015291505b84811015614e6e57868181518110614e3457fe5b6020026020010151600001516001600160a01b031682600001516001600160a01b03161415614e665760009250614e6e565b600101614e20565b508115614e905780516001600160a01b03166000908152600460205260408120555b5050600101614d85565b5080821115614f4b57805b82811015614f49576001805480614eb857fe5b60008281526020812060046000199093019283020180546001600160a01b0319908116825560018201805490911690556002810180546001600160e81b0319169055600301559055600b805480614f0b57fe5b60008281526020812060166000199093019283020181815560018101805460ff1916905590614f3d6002830182615ad6565b50509055600101614ea5565b505b6000818310614f5a5781614f5c565b825b905060005b818110156151565761500e858281518110614f7857fe5b602002602001015160018381548110614f8d57fe5b60009182526020918290206040805160c08101825260049390930290910180546001600160a01b0390811684526001820154811694840194909452600281015493841691830191909152600160a01b83046001600160401b03166060830152600160e01b90920460ff161515608082015260039091015460a082015261595f565b61512957806001016004600087848151811061502657fe5b6020026020010151600001516001600160a01b03166001600160a01b031681526020019081526020016000208190555084818151811061506257fe5b60200260200101516001828154811061507757fe5b6000918252602091829020835160049092020180546001600160a01b039283166001600160a01b0319918216178255928401516001820180549184169185169190911790556040840151600282018054606087015160808801511515600160e01b0260ff60e01b196001600160401b03909216600160a01b0267ffffffffffffffff60a01b1995909716929097169190911792909216939093171692909217905560a09091015160039091015561514e565b60006001828154811061513857fe5b9060005260206000209060040201600301819055505b600101614f61565b50828211156152fb576151676159e0565b835b838110156152f857600186828151811061517f57fe5b6020908102919091018101518254600181810185556000948552838520835160049093020180546001600160a01b039384166001600160a01b0319918216178255848601518284018054918616918316919091179055604080860151600284018054606089015160808a01511515600160e01b0260ff60e01b196001600160401b03909216600160a01b0267ffffffffffffffff60a01b1995909a1692909616919091179290921696909617169190911790935560a090930151600390930192909255600b8054928301815590935284516016909102600080516020615fc08339815191528101918255918501516000805160206160d08339815191528301805491151560ff19909216919091179055918401518492916152b491600080516020616006833981519152909101906014615a04565b50505080600101600460008884815181106152cb57fe5b602090810291909101810151516001600160a01b0316825281019190915260400160002055600101615169565b50505b6000600981905560015493505b83811015615369576000600b828154811061531f57fe5b60009182526020822060169190910201600101805460ff191692151592909217909155600b80548390811061535057fe5b6000918252602090912060169091020155600101615308565b5050505050565b600081836153fc5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156153c15781810151838201526020016153a9565b50505050905090810190601f1680156153ee5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858161540857fe5b0495945050505050565b600081848411156154645760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156153c15781810151838201526020016153a9565b505050900390565b805160009061547d575060006111fa565b6020820151805160001a9060c082101561549c576000925050506111fa565b5060019392505050565b8051600090811a60808110156154c05760009150506111fa565b60b88110806154db575060c081108015906154db575060f881105b156154ea5760019150506111fa565b60c08110156154fe5760b5190190506111fa565b60f5190190506111fa565b80516000908190811a60808110156155245760019150615635565b60b881101561553957607e1981019150615635565b60c08110156155b357600060b78203600186019550806020036101000a8651049150600181018201935050808310156155ad576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b50615635565b60f88110156155c85760be1981019150615635565b600060f78203600186019550806020036101000a865104915060018101820193505080831015615633576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b505b5092915050565b805160009061564d575060006111fa565b6000809050600061566184602001516154a6565b602085015185519181019250015b8082101561568f5761568082615509565b6001909301929091019061566f565b50909392505050565b80516000906015146156a957600080fd5b6112aa826147c9565b604080516020808252818301909252606091829190602082018180368337505050602081018490529050600067ffffffffffffffff1984166156f65750601861571a565b6fffffffffffffffffffffffffffffffff1984166157165750601061571a565b5060005b60208110156157505781818151811061572f57fe5b01602001516001600160f81b0319161561574857615750565b60010161571a565b60008160200390506060816040519080825280601f01601f191660200182016040528015615785576020820181803683370190505b5080830196909652508452509192915050565b6060815160011480156157ca5750607f60f81b826000815181106157b857fe5b01602001516001600160f81b03191611155b156157d65750806111fa565b6112aa6157e88351608060ff16615867565b835b6060806040519050835180825260208201818101602087015b8183101561581b578051835260209283019201615803565b50855184518101855292509050808201602086015b81831015615848578051835260209283019201615830565b508651929092011591909101601f01601f191660405250905092915050565b60606801000000000000000083106158b7576040805162461bcd60e51b815260206004820152600e60248201526d696e70757420746f6f206c6f6e6760901b604482015290519081900360640190fd5b604080516001808252818301909252606091602082018180368337019050509050603784116159115782840160f81b816000815181106158f357fe5b60200101906001600160f81b031916908160001a90535090506112aa565b606061591c856156b2565b90508381510160370160f81b8260008151811061593557fe5b60200101906001600160f81b031916908160001a90535061595682826157ea565b95945050505050565b805182516000916001600160a01b039182169116148015615999575081602001516001600160a01b031683602001516001600160a01b0316145b80156159be575081604001516001600160a01b031683604001516001600160a01b0316145b80156111155750506060908101519101516001600160401b0390811691161490565b60408051606081018252600080825260208201529081016159ff615aff565b905290565b8260148101928215615a32579160200282015b82811115615a32578251825591602001919060010190615a17565b50612464929150615b1e565b60408051808201909152600081526060602082015290565b6040518060400160405280615a69615ae5565b8152602001600081525090565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915290565b8260148101928215615a32579182015b82811115615a32578254825591600101919060010190615abb565b5061140c906014810190615b1e565b604051806040016040528060008152602001600081525090565b6040518061028001604052806014906020820280368337509192915050565b61152891905b808211156124645760008155600101615b2456fef901a880f901a4f844941284214b9b9c85549ab3d2b972df0deef66ac2c9946ddf42a51534fc98d0c0a3b42c963cace8441ddf946ddf42a51534fc98d0c0a3b42c963cace8441ddf8410000000f84494a2959d3f95eae5dc7d70144ce1b73b403b7eb6e0948081ef03f1d9e0bb4a5bf38f16285c879299f07f948081ef03f1d9e0bb4a5bf38f16285c879299f07f8410000000f8449435552c16704d214347f29fa77f77da6d75d7c75294dc4973e838e3949c77aced16ac2315dc2d7ab11194dc4973e838e3949c77aced16ac2315dc2d7ab1118410000000f84494980a75ecd1309ea12fa2ed87a8744fbfc9b863d594cc6ac05c95a99c1f7b5f88de0e3486c82293b27094cc6ac05c95a99c1f7b5f88de0e3486c82293b2708410000000f84494f474cf03cceff28abc65c9cbae594f725c80e12d94e61a183325a18a173319dd8e19c8d069459e217594e61a183325a18a173319dd8e19c8d069459e21758410000000f84494b71b214cb885500844365e95cd9942c7276e7fd894d22ca3ba2141d23adab65ce4940eb7665ea2b6a794d22ca3ba2141d23adab65ce4940eb7665ea2b6a784100000006c656e677468206f66206d61784e756d4f664d61696e7461696e696e67206d69736d617463686c656e677468206f66206d61784e756d4f66576f726b696e6743616e64696461746573206d69736d617463686c656e677468206f66206d61696e7461696e536c6173685363616c65206d69736d61746368746865206d61784e756d4f664d61696e7461696e696e67206d757374206265206c657373207468616e206e756d4f6643616e696e61746573746865206e756d4f66436162696e657473206d7573742062652067726561746572207468616e2030746865206e756d4f66436162696e657473206d757374206265206c657373207468616e204d41585f4e554d5f4f465f56414c494441544f5253746865206e756d626572206f662076616c696461746f72732065786365656420746865206c696d6974746865206275726e526174696f206d757374206265206e6f2067726561746572207468616e2031303030306475706c696361746520636f6e73656e7375732061646472657373206f662076616c696461746f725365747468652065787069726554696d655365636f6e64476170206973206f7574206f662072616e6765746865206d61784e756d4f66576f726b696e6743616e64696461746573206d757374206265206e6f742067726561746572207468616e206d61784e756d4f6643616e6469646174657363616e206e6f7420656e7465722054656d706f72617279204d61696e74656e616e63656c656e677468206f66206a61696c2076616c696461746f7273206d757374206265206f6e65536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e74726163746c656e677468206f66206d61784e756d4f6643616e64696461746573206d69736d61746368666565206973206c6172676572207468616e2044555354595f494e434f4d494e470175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db96c656e677468206f662065787069726554696d655365636f6e64476170206d69736d617463680175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dbb6661696c656420746f20706172736520696e69742076616c696461746f72536574746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e7472616374746865206d6573736167652073656e646572206d7573742062652074686520626c6f636b2070726f6475636572746865206d61696e7461696e536c6173685363616c65206d7573742062652067726561746572207468616e20300175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dba746865206d6573736167652073656e646572206d75737420626520736c61736820636f6e7472616374a2646970667358221220c0dc878fd08b0a4bf6659ead68604aefff201930a1931eca7eb88ebdf3b0a03e64736f6c63430006040033", + }, + UpgradeConfig { + contract_addr: "0x0000000000000000000000000000000000001001", + code: "608060405234801561001057600080fd5b506004361061023d5760003560e01c80638256ace61161013b578063c80d4b8f116100b8578063e1c7392a1161007c578063e1c7392a1461071d578063f9a2bbc714610725578063fc3e59081461072d578063fc4333cd14610735578063fd6a68791461073d5761023d565b8063c80d4b8f14610667578063c81b16621461066f578063c8509d8114610677578063c96be4cb146106ef578063dc927faf146107155761023d565b8063a1a11bf5116100ff578063a1a11bf514610575578063a78abc161461057d578063ab51bb9614610599578063ac0af629146105a1578063ac431751146105a95761023d565b80638256ace6146104dd578063831d65d1146104e557806396713da91461055d5780639bc8e4f2146105655780639dc092621461056d5761023d565b80634bf6c882116101c95780636e47b4821161018d5780636e47b482146104b557806370fd5bad146104bd57806375d47a0a146104c55780637912a65d146104cd5780637942fd05146104d55761023d565b80634bf6c8821461046d57806351e8067214610475578063567a372d1461047d5780635bfb49901461048557806362b72cf5146104ad5761023d565b806337c8dab91161021057806337c8dab9146103cf578063389f4f711461040e5780633dffc3871461042857806343756e5c14610446578063493279b11461044e5761023d565b80630bee7a67146102425780631182b8751461026357806323bac5a21461035057806335aa2e4414610396575b600080fd5b61024a610745565b6040805163ffffffff9092168252519081900360200190f35b6102db6004803603604081101561027957600080fd5b60ff8235169190810190604081016020820135600160201b81111561029d57600080fd5b8201836020820111156102af57600080fd5b803590602001918460018302840111600160201b831117156102d057600080fd5b50909250905061074a565b6040805160208082528351818301528351919283929083019185019080838360005b838110156103155781810151838201526020016102fd565b50505050905090810190601f1680156103425780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6103766004803603602081101561036657600080fd5b50356001600160a01b031661081e565b604080519384526020840192909252151582820152519081900360600190f35b6103b3600480360360208110156103ac57600080fd5b5035610841565b604080516001600160a01b039092168252519081900360200190f35b6103f5600480360360208110156103e557600080fd5b50356001600160a01b0316610868565b6040805192835260208301919091528051918290030190f35b6104166108bf565b60408051918252519081900360200190f35b6104306108c5565b6040805160ff9092168252519081900360200190f35b6103b36108ca565b6104566108d0565b6040805161ffff9092168252519081900360200190f35b6104306108d5565b6103b36108da565b6104166108e0565b6104ab6004803603602081101561049b57600080fd5b50356001600160a01b03166108e6565b005b610416610a47565b6103b3610a4d565b610430610a53565b6103b3610a58565b610416610a5e565b610430610a63565b6103f5610a68565b6104ab600480360360408110156104fb57600080fd5b60ff8235169190810190604081016020820135600160201b81111561051f57600080fd5b82018360208201111561053157600080fd5b803590602001918460018302840111600160201b8311171561055257600080fd5b509092509050610a72565b610430610bcc565b610416610bd1565b6103b3610bdc565b6103b3610be2565b610585610be8565b604080519115158252519081900360200190f35b61024a610bf1565b610416610bf6565b6104ab600480360360408110156105bf57600080fd5b810190602081018135600160201b8111156105d957600080fd5b8201836020820111156105eb57600080fd5b803590602001918460018302840111600160201b8311171561060c57600080fd5b919390929091602081019035600160201b81111561062957600080fd5b82018360208201111561063b57600080fd5b803590602001918460018302840111600160201b8311171561065c57600080fd5b509092509050610bfb565b610416610fe9565b6103b3610fee565b6104ab6004803603604081101561068d57600080fd5b60ff8235169190810190604081016020820135600160201b8111156106b157600080fd5b8201836020820111156106c357600080fd5b803590602001918460018302840111600160201b831117156106e457600080fd5b509092509050610ff4565b6104ab6004803603602081101561070557600080fd5b50356001600160a01b03166110a7565b6103b361154a565b6104ab611550565b6103b36115c1565b6104306115c7565b6104ab6115cc565b6103b3611a57565b606481565b6060336120001461078c5760405162461bcd60e51b815260040180806020018281038252602f8152602001806124ae602f913960400191505060405180910390fd5b60005460ff166107d1576040805162461bcd60e51b8152602060048201526019602482015260008051602061250a833981519152604482015290519081900360640190fd5b6040805162461bcd60e51b815260206004820152601e60248201527f7265636569766520756e65787065637465642073796e207061636b6167650000604482015290519081900360640190fd5b600260208190526000918252604090912080546001820154919092015460ff1683565b6001818154811061084e57fe5b6000918252602090912001546001600160a01b0316905081565b600080610873612372565b5050506001600160a01b0316600090815260026020818152604092839020835160608101855281548082526001830154938201849052919093015460ff16151592909301919091529091565b60055481565b600181565b61100181565b606181565b600881565b61200081565b60045481565b33611000146109265760405162461bcd60e51b81526004018080602001828103825260308152602001806124096030913960400191505060405180910390fd5b60005460ff1661096b576040805162461bcd60e51b8152602060048201526019602482015260008051602061250a833981519152604482015290519081900360640190fd5b61200063f7a251d7600b61097e84611a5d565b60006040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b838110156109de5781810151838201526020016109c6565b50505050905090810190601f168015610a0b5780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b158015610a2c57600080fd5b505af1158015610a40573d6000803e3d6000fd5b5050505050565b60035481565b61100581565b600281565b61100881565b603281565b600b81565b6004546005549091565b3361200014610ab25760405162461bcd60e51b815260040180806020018281038252602f8152602001806124ae602f913960400191505060405180910390fd5b60005460ff16610af7576040805162461bcd60e51b8152602060048201526019602482015260008051602061250a833981519152604482015290519081900360640190fd5b610aff612395565b6000610b4084848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611b2f92505050565b915091508015610b8a5781516040805163ffffffff9092168252517f7f0956d47419b9525356e7111652b653b530ec6f5096dccc04589bc38e6299679181900360200190a1610a40565b81516040805163ffffffff9092168252517f7d45f62d17443dd4547bca8a8112c60e2385669318dc300ec61a5d2492f262e79181900360200190a15050505050565b600981565b662386f26fc1000081565b61100781565b61100681565b60005460ff1681565b600081565b600481565b60005460ff16610c40576040805162461bcd60e51b8152602060048201526019602482015260008051602061250a833981519152604482015290519081900360640190fd5b3361100714610c805760405162461bcd60e51b815260040180806020018281038252602e815260200180612439602e913960400191505060405180910390fd5b610ceb84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260148152731b5a5cd9195b59585b9bdc951a1c995cda1bdb1960621b60208201529150611baf9050565b15610dc45760208114610d2f5760405162461bcd60e51b81526004018080602001828103825260278152602001806123e26027913960400191505060405180910390fd5b604080516020601f8401819004810282018101909252828152600091610d6d91858580838501838280828437600092019190915250611c9792505050565b905060018110158015610d81575060055481105b610dbc5760405162461bcd60e51b81526004018080602001828103825260258152602001806124896025913960400191505060405180910390fd5b600455610f57565b610e2a84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600f81526e19995b1bdb9e551a1c995cda1bdb19608a1b60208201529150611baf9050565b15610f1a5760208114610e6e5760405162461bcd60e51b81526004018080602001828103825260228152602001806124676022913960400191505060405180910390fd5b604080516020601f8401819004810282018101909252828152600091610eac91858580838501838280828437600092019190915250611c9792505050565b90506103e88111158015610ec1575060045481115b610f12576040805162461bcd60e51b815260206004820181905260248201527f7468652066656c6f6e795468726573686f6c64206f7574206f662072616e6765604482015290519081900360640190fd5b600555610f57565b6040805162461bcd60e51b815260206004820152600d60248201526c756e6b6e6f776e20706172616d60981b604482015290519081900360640190fd5b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a848484846040518080602001806020018381038352878782818152602001925080828437600083820152601f01601f191690910184810383528581526020019050858580828437600083820152604051601f909101601f19169092018290039850909650505050505050a150505050565b609681565b61100281565b33612000146110345760405162461bcd60e51b815260040180806020018281038252602f8152602001806124ae602f913960400191505060405180910390fd5b60005460ff16611079576040805162461bcd60e51b8152602060048201526019602482015260008051602061250a833981519152604482015290519081900360640190fd5b6040517f07db600eebe2ac176be8dcebad61858c245a4961bb32ca2aa3d159b09aa0810e90600090a1505050565b3341146110e55760405162461bcd60e51b815260040180806020018281038252602d8152602001806124dd602d913960400191505060405180910390fd5b60005460ff1661112a576040805162461bcd60e51b8152602060048201526019602482015260008051602061250a833981519152604482015290519081900360640190fd5b6003544311611180576040805162461bcd60e51b815260206004820181905260248201527f63616e206e6f7420736c61736820747769636520696e206f6e6520626c6f636b604482015290519081900360640190fd5b3a156111ca576040805162461bcd60e51b81526020600482015260146024820152736761737072696365206973206e6f74207a65726f60601b604482015290519081900360640190fd5b6040805163155853f360e21b81526001600160a01b03831660048201529051611000916355614fcc916024808301926020929190829003018186803b15801561121257600080fd5b505afa158015611226573d6000803e3d6000fd5b505050506040513d602081101561123c57600080fd5b505161124757611543565b61124f612372565b506001600160a01b0381166000908152600260208181526040928390208351606081018552815481526001820154928101929092529091015460ff1615801592820192909252906112aa576020810180516001019052611303565b60016040820181905260208201819052805480820182556000919091527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf60180546001600160a01b0319166001600160a01b0384161790555b43815260055460208201518161131557fe5b0661146757600060208201819052604080516335409f7f60e01b81526001600160a01b03851660048201529051611000926335409f7f926024808201939182900301818387803b15801561136857600080fd5b505af115801561137c573d6000803e3d6000fd5b505050506120006001600160a01b031663f7a251d7600b61139c85611a5d565b60006040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b838110156113fc5781810151838201526020016113e4565b50505050905090810190601f1680156114295780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b15801561144a57600080fd5b505af115801561145e573d6000803e3d6000fd5b505050506114dd565b60045481602001518161147657fe5b066114dd57604080516375abf10160e11b81526001600160a01b038416600482015290516110009163eb57e20291602480830192600092919082900301818387803b1580156114c457600080fd5b505af11580156114d8573d6000803e3d6000fd5b505050505b6001600160a01b0382166000818152600260208181526040808420865181559186015160018301558581015191909201805460ff1916911515919091179055517fddb6012116e51abf5436d956a4f0ebd927e92c576ff96d7918290c8782291e3e9190a2505b5043600355565b61100381565b60005460ff16156115a8576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b603260045560966005556000805460ff19166001179055565b61100081565b600381565b336110001461160c5760405162461bcd60e51b81526004018080602001828103825260308152602001806124096030913960400191505060405180910390fd5b60005460ff16611651576040805162461bcd60e51b8152602060048201526019602482015260008051602061250a833981519152604482015290519081900360640190fd5b60015461165d57611a55565b600154600090600019015b808211611a29576000805b8284101561178c57611683612372565b600260006001878154811061169457fe5b60009182526020808320909101546001600160a01b0316835282810193909352604091820190208151606081018352815481526001820154938101939093526002015460ff1615159082015260055490915060049004816020015111156117765760046005548161170157fe5b0481602001510381602001818152505080600260006001888154811061172357fe5b6000918252602080832091909101546001600160a01b0316835282810193909352604091820190208351815591830151600183015591909101516002909101805460ff1916911515919091179055611780565b600192505061178c565b50600190930192611673565b8284116119235761179b612372565b60026000600186815481106117ac57fe5b60009182526020808320909101546001600160a01b0316835282810193909352604091820190208151606081018352815481526001820154938101939093526002015460ff1615159082015260055490915060049004816020015111156118945760046005548161181957fe5b0481602001510381602001818152505080600260006001878154811061183b57fe5b6000918252602080832091909101546001600160a01b03168352828101939093526040918201902083518155918301516001808401919091559201516002909101805460ff191691151591909117905591506119239050565b60026000600186815481106118a557fe5b60009182526020808320909101546001600160a01b031683528201929092526040018120818155600181810192909255600201805460ff191690558054806118e957fe5b600082815260209020810160001990810180546001600160a01b0319169055019055836119165750611923565b506000199092019161178c565b81801561192d5750805b15611a0c57600260006001868154811061194357fe5b60009182526020808320909101546001600160a01b031683528201929092526040018120818155600181810192909255600201805460ff1916905580548490811061198a57fe5b600091825260209091200154600180546001600160a01b0390921691869081106119b057fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060018054806119e957fe5b600082815260209020810160001990810180546001600160a01b03191690550190555b82611a18575050611a29565b505060019091019060001901611668565b6040517fcfdb3b6ccaeccbdc68be3c59c840e3b3c90f0a7c491f5fff1cf56cfda200dd9c90600090a150505b565b61100481565b60408051600480825260a08201909252606091829190816020015b6060815260200190600190039081611a78579050509050611aa1836001600160a01b0316611c9c565b81600081518110611aae57fe5b6020026020010181905250611ac243611cbf565b81600181518110611acf57fe5b6020908102919091010152611ae46061611cbf565b81600281518110611af157fe5b6020026020010181905250611b0542611cbf565b81600381518110611b1257fe5b6020026020010181905250611b2681611cd2565b9150505b919050565b611b37612395565b6000611b41612395565b611b496123a7565b611b5a611b5586611d5c565b611d81565b90506000805b611b6983611dcb565b15611ba25780611b9557611b84611b7f84611dec565b611e3a565b63ffffffff16845260019150611b9a565b611ba2565b600101611b60565b5091935090915050915091565b6000816040516020018082805190602001908083835b60208310611be45780518252601f199092019160209182019101611bc5565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120836040516020018082805190602001908083835b60208310611c525780518252601f199092019160209182019101611c33565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051602081830303815290604052805190602001201490505b92915050565b015190565b60408051600560a21b8318601482015260348101909152606090611b2681611ef1565b6060611c91611ccd83611f47565b611ef1565b6060815160001415611cf35750604080516000815260208101909152611b2a565b606082600081518110611d0257fe5b602002602001015190506000600190505b8351811015611d4357611d3982858381518110611d2c57fe5b602002602001015161202d565b9150600101611d13565b50611b26611d56825160c060ff166120aa565b8261202d565b611d646123c7565b506040805180820190915281518152602082810190820152919050565b611d896123a7565b611d92826121a2565b611d9b57600080fd5b6000611daa83602001516121dc565b60208085015160408051808201909152868152920190820152915050919050565b6000611dd56123c7565b505080518051602091820151919092015191011190565b611df46123c7565b611dfd82611dcb565b611e0657600080fd5b60208201516000611e168261223f565b80830160209586015260408051808201909152908152938401919091525090919050565b805160009015801590611e4f57508151602110155b611e5857600080fd5b6000611e6783602001516121dc565b90508083600001511015611ec2576040805162461bcd60e51b815260206004820152601a60248201527f6c656e677468206973206c657373207468616e206f6666736574000000000000604482015290519081900360640190fd5b825160208085015183018051928490039291831015611ee857826020036101000a820491505b50949350505050565b606081516001148015611f235750607f60f81b82600081518110611f1157fe5b01602001516001600160f81b03191611155b15611f2f575080611b2a565b611c91611f418351608060ff166120aa565b8361202d565b604080516020808252818301909252606091829190602082018180368337505050602081018490529050600067ffffffffffffffff198416611f8b57506018611faf565b6fffffffffffffffffffffffffffffffff198416611fab57506010611faf565b5060005b6020811015611fe557818181518110611fc457fe5b01602001516001600160f81b03191615611fdd57611fe5565b600101611faf565b60008160200390506060816040519080825280601f01601f19166020018201604052801561201a576020820181803683370190505b5080830196909652508452509192915050565b6060806040519050835180825260208201818101602087015b8183101561205e578051835260209283019201612046565b50855184518101855292509050808201602086015b8183101561208b578051835260209283019201612073565b508651929092011591909101601f01601f191660405250905092915050565b60606801000000000000000083106120fa576040805162461bcd60e51b815260206004820152600e60248201526d696e70757420746f6f206c6f6e6760901b604482015290519081900360640190fd5b604080516001808252818301909252606091602082018180368337019050509050603784116121545782840160f81b8160008151811061213657fe5b60200101906001600160f81b031916908160001a9053509050611c91565b606061215f85611f47565b90508381510160370160f81b8260008151811061217857fe5b60200101906001600160f81b031916908160001a905350612199828261202d565b95945050505050565b80516000906121b357506000611b2a565b6020820151805160001a9060c08210156121d257600092505050611b2a565b5060019392505050565b8051600090811a60808110156121f6576000915050611b2a565b60b8811080612211575060c08110801590612211575060f881105b15612220576001915050611b2a565b60c08110156122345760b519019050611b2a565b60f519019050611b2a565b80516000908190811a608081101561225a576001915061236b565b60b881101561226f57607e198101915061236b565b60c08110156122e957600060b78203600186019550806020036101000a8651049150600181018201935050808310156122e3576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b5061236b565b60f88110156122fe5760be198101915061236b565b600060f78203600186019550806020036101000a865104915060018101820193505080831015612369576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b505b5092915050565b604051806060016040528060008152602001600081526020016000151581525090565b60408051602081019091526000815290565b60405180604001604052806123ba6123c7565b8152602001600081525090565b60405180604001604052806000815260200160008152509056fe6c656e677468206f66206d697364656d65616e6f725468726573686f6c64206d69736d61746368746865206d6573736167652073656e646572206d7573742062652076616c696461746f7253657420636f6e7472616374746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e74726163746c656e677468206f662066656c6f6e795468726573686f6c64206d69736d61746368746865206d697364656d65616e6f725468726573686f6c64206f7574206f662072616e6765746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e7472616374746865206d6573736167652073656e646572206d7573742062652074686520626c6f636b2070726f647563657274686520636f6e7472616374206e6f7420696e69742079657400000000000000a2646970667358221220a288eb0fb37b1f80ed70929944f149856fbe848d775f3fe9d6a2f46faa67754564736f6c63430006040033", + }, + ], + )] + .iter() + .cloned() + .collect(); + + pub static ref GIBBS_UPGRADE_CONFIG: HashMap> = [ + ( + 97, + vec![ + UpgradeConfig { + contract_addr: "0x0000000000000000000000000000000000001004", + code: "60806040526004361061036f5760003560e01c80639a854bbd116101c6578063bd466461116100f7578063f014847211610095578063fc1a598f1161006f578063fc1a598f14610d58578063fc3e590814610a3b578063fd6a687914610d8b578063ff9c0027146106ec576103b7565b8063f014847214610d19578063f9a2bbc714610d2e578063fa9e915914610d43576103b7565b8063d9e6dae9116100d1578063d9e6dae91461066e578063dc927faf14610cda578063e1c7392a14610cef578063ebf71d5314610d04576103b7565b8063bd46646114610c0d578063c81b166214610c40578063c8509d8114610c55576103b7565b8063aa7415f511610164578063b99328c51161013e578063b99328c514610b77578063b9fd21e314610bb0578063ba35ead614610bc5578063bbface1f14610bda576103b7565b8063aa7415f514610a50578063ab51bb9614610a97578063ac43175114610aac576103b7565b8063a1a11bf5116101a0578063a1a11bf5146109fc578063a496fba214610a11578063a78abc1614610a26578063a7c9f02d14610a3b576103b7565b80639a854bbd146109995780639a99b4f0146109ae5780639dc09262146109e7576103b7565b806361368475116102a0578063727be1f81161023e578063831d65d111610218578063831d65d1146108c05780638b87b21f146105ed5780638eff336c1461094557806396713da914610984576103b7565b8063727be1f81461086c57806375d47a0a146108965780637942fd05146108ab576103b7565b80636e47b4821161027a5780636e47b4821461082d57806370fd5bad146106ec578063718a8aa81461084257806371d3086314610857576103b7565b8063613684751461066e57806366dea52a146106ec5780636e05652014610701576103b7565b806343a368b91161030d57806350432d32116102e757806350432d321461068357806351e806721461069857806359b92789146106ad5780635d499b1b146106d7576103b7565b806343a368b91461062d578063493279b1146106425780634bf6c8821461066e576103b7565b8063149d14d911610349578063149d14d9146105155780633d7132231461053c5780633dffc387146105ed57806343756e5c14610618576103b7565b80630bee7a67146103bc5780630e2374a5146103ea5780631182b8751461041b576103b7565b366103b75734156103b5576040805133815234602082015281517f6c98249d85d88c3753a04a22230f595e4dc8d3dc86c34af35deeeedc861b89db929181900390910190a15b005b600080fd5b3480156103c857600080fd5b506103d1610da0565b6040805163ffffffff9092168252519081900360200190f35b3480156103f657600080fd5b506103ff610da5565b604080516001600160a01b039092168252519081900360200190f35b34801561042757600080fd5b506104a06004803603604081101561043e57600080fd5b60ff8235169190810190604081016020820135600160201b81111561046257600080fd5b82018360208201111561047457600080fd5b803590602001918460018302840111600160201b8311171561049557600080fd5b509092509050610dab565b6040805160208082528351818301528351919283929083019185019080838360005b838110156104da5781810151838201526020016104c2565b50505050905090810190601f1680156105075780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561052157600080fd5b5061052a610ed9565b60408051918252519081900360200190f35b34801561054857600080fd5b506103ff6004803603602081101561055f57600080fd5b810190602081018135600160201b81111561057957600080fd5b82018360208201111561058b57600080fd5b803590602001918460018302840111600160201b831117156105ac57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610edf945050505050565b3480156105f957600080fd5b50610602610f03565b6040805160ff9092168252519081900360200190f35b34801561062457600080fd5b506103ff610f08565b34801561063957600080fd5b5061052a610f0e565b34801561064e57600080fd5b50610657610f1a565b6040805161ffff9092168252519081900360200190f35b34801561067a57600080fd5b50610602610f1f565b34801561068f57600080fd5b5061052a610f24565b3480156106a457600080fd5b506103ff610f2f565b3480156106b957600080fd5b506103ff600480360360208110156106d057600080fd5b5035610f35565b3480156106e357600080fd5b5061052a610f50565b3480156106f857600080fd5b50610602610f59565b6108196004803603608081101561071757600080fd5b810190602081018135600160201b81111561073157600080fd5b82018360208201111561074357600080fd5b803590602001918460208302840111600160201b8311171561076457600080fd5b919390929091602081019035600160201b81111561078157600080fd5b82018360208201111561079357600080fd5b803590602001918460208302840111600160201b831117156107b457600080fd5b919390929091602081019035600160201b8111156107d157600080fd5b8201836020820111156107e357600080fd5b803590602001918460208302840111600160201b8311171561080457600080fd5b91935091503567ffffffffffffffff16610f5e565b604080519115158252519081900360200190f35b34801561083957600080fd5b506103ff611433565b34801561084e57600080fd5b50610602611439565b34801561086357600080fd5b5061052a61143e565b34801561087857600080fd5b506108196004803603602081101561088f57600080fd5b5035611444565b3480156108a257600080fd5b506103ff6114be565b3480156108b757600080fd5b506106026114c4565b3480156108cc57600080fd5b506103b5600480360360408110156108e357600080fd5b60ff8235169190810190604081016020820135600160201b81111561090757600080fd5b82018360208201111561091957600080fd5b803590602001918460018302840111600160201b8311171561093a57600080fd5b5090925090506114c9565b34801561095157600080fd5b506103b56004803603606081101561096857600080fd5b508035906001600160a01b036020820135169060400135611612565b34801561099057600080fd5b50610602611698565b3480156109a557600080fd5b5061052a61169d565b3480156109ba57600080fd5b5061052a600480360360408110156109d157600080fd5b506001600160a01b0381351690602001356116a9565b3480156109f357600080fd5b506103ff6117e7565b348015610a0857600080fd5b506103ff6117ed565b348015610a1d57600080fd5b506106026117f3565b348015610a3257600080fd5b506108196117f8565b348015610a4757600080fd5b50610602611801565b61081960048036036080811015610a6657600080fd5b5080356001600160a01b03908116916020810135909116906040810135906060013567ffffffffffffffff16611806565b348015610aa357600080fd5b506103d16117f3565b348015610ab857600080fd5b506103b560048036036040811015610acf57600080fd5b810190602081018135600160201b811115610ae957600080fd5b820183602082011115610afb57600080fd5b803590602001918460018302840111600160201b83111715610b1c57600080fd5b919390929091602081019035600160201b811115610b3957600080fd5b820183602082011115610b4b57600080fd5b803590602001918460018302840111600160201b83111715610b6c57600080fd5b509092509050611ec7565b348015610b8357600080fd5b506103b560048036036040811015610b9a57600080fd5b50803590602001356001600160a01b0316612136565b348015610bbc57600080fd5b5061052a6121ac565b348015610bd157600080fd5b5061052a6121b6565b348015610be657600080fd5b5061052a60048036036020811015610bfd57600080fd5b50356001600160a01b03166121bc565b348015610c1957600080fd5b5061052a60048036036020811015610c3057600080fd5b50356001600160a01b03166121ce565b348015610c4c57600080fd5b506103ff6121e9565b348015610c6157600080fd5b506103b560048036036040811015610c7857600080fd5b60ff8235169190810190604081016020820135600160201b811115610c9c57600080fd5b820183602082011115610cae57600080fd5b803590602001918460018302840111600160201b83111715610ccf57600080fd5b5090925090506121ef565b348015610ce657600080fd5b506103ff6122bf565b348015610cfb57600080fd5b506103b56122c5565b348015610d1057600080fd5b50610602612365565b348015610d2557600080fd5b5061060261236a565b348015610d3a57600080fd5b506103ff61236f565b348015610d4f57600080fd5b5061052a612375565b348015610d6457600080fd5b506104a060048036036020811015610d7b57600080fd5b50356001600160a01b031661237b565b348015610d9757600080fd5b506103ff6124a2565b606481565b61200181565b60005460609060ff16610df3576040805162461bcd60e51b81526020600482015260196024820152600080516020614905833981519152604482015290519081900360640190fd5b3361200014610e335760405162461bcd60e51b815260040180806020018281038252602f8152602001806148b3602f913960400191505060405180910390fd5b60ff841660021415610e8557610e7e83838080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506124a892505050565b9050610ed2565b6040805162461bcd60e51b815260206004820152601860248201527f756e7265636f676e697a65642073796e207061636b6167650000000000000000604482015290519081900360640190fd5b9392505050565b60015490565b6020818101516000908152600490915260409020546001600160a01b03165b919050565b600181565b61100181565b670de0b6b3a764000081565b606181565b600881565b66071afd498d000081565b61200081565b6000908152600460205260409020546001600160a01b031690565b6402540be40081565b600281565b6000805460ff16610fa4576040805162461bcd60e51b81526020600482015260196024820152600080516020614905833981519152604482015290519081900360640190fd5b868514610fe25760405162461bcd60e51b815260040180806020018281038252603b815260200180614878603b913960400191505060405180910390fd5b8683146110205760405162461bcd60e51b815260040180806020018281038252603f81526020018061474b603f913960400191505060405180910390fd5b426078018267ffffffffffffffff16101561106c5760405162461bcd60e51b815260040180806020018281038252602481526020018061463b6024913960400191505060405180910390fd5b6402540be4003406156110b05760405162461bcd60e51b815260040180806020018281038252604081526020018061497b6040913960400191505060405180910390fd5b604080518681526020808802820101909152859060009081906060908480156110e3578160200160208202803683370190505b50905060005b848110156111be576402540be4008b8b8381811061110357fe5b905060200201358161111157fe5b061561114e5760405162461bcd60e51b815260040180806020018281038252603c81526020018061478a603c913960400191505060405180910390fd5b6111738b8b8381811061115d57fe5b90506020020135856125cc90919063ffffffff16565b935061119f6402540be4008c8c8481811061118a57fe5b9050602002013561262690919063ffffffff16565b8282815181106111ab57fe5b60209081029190910101526001016110e9565b506001546111e3906111d6908663ffffffff61266816565b849063ffffffff6125cc16565b3410156112215760405162461bcd60e51b81526004018080602001828103825260568152602001806149256056913960600191505060405180910390fd5b611231348463ffffffff6126c116565b915061123b614461565b6040518060c001604052806221272160e91b60001b815260200160006001600160a01b031681526020018381526020018e8e808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505050908252506040805160208c810282810182019093528c82529283019290918d918d91829185019084908082843760009201919091525050509082525067ffffffffffffffff8916602090910152905061200063f7a251d760036112ff84612703565b611314876402540be40063ffffffff61262616565b6040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b8381101561137257818101518382015260200161135a565b50505050905090810190601f16801561139f5780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b1580156113c057600080fd5b505af11580156113d4573d6000803e3d6000fd5b505060408051600081523360208201528082018890526060810187905290517f74eab09b0e53aefc23f2e1b16da593f95c2dd49c6f5a23720463d10d9c330b2a9350908190036080019150a15060019c9b505050505050505050505050565b61100581565b601081565b60015481565b600033612001146114865760405162461bcd60e51b815260040180806020018281038252603381526020018061457b6033913960400191505060405180910390fd5b6040516120019083156108fc029084906000818181858888f193505050501580156114b5573d6000803e3d6000fd5b50600192915050565b61100881565b600b81565b60005460ff1661150e576040805162461bcd60e51b81526020600482015260196024820152600080516020614905833981519152604482015290519081900360640190fd5b336120001461154e5760405162461bcd60e51b815260040180806020018281038252602f8152602001806148b3602f913960400191505060405180910390fd5b60ff83166003141561159e5761159982828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506129be92505050565b61160d565b7f41ce201247b6ceb957dcdb217d0b8acb50b9ea0e12af9af4f5e7f38902101605838383604051808460ff1660ff168152602001806020018281038252848482818152602001925080828437600083820152604051601f909101601f1916909201829003965090945050505050a15b505050565b33611008146116525760405162461bcd60e51b81526004018080602001828103825260238152602001806148e26023913960400191505060405180910390fd5b600083815260046020908152604080832080546001600160a01b039096166001600160a01b03199096168617905593825260038152838220949094556002909352912055565b600981565b677ce66c50e284000081565b6000805460ff166116ef576040805162461bcd60e51b81526020600482015260196024820152600080516020614905833981519152604482015290519081900360640190fd5b336110051461172f5760405162461bcd60e51b815260040180806020018281038252602f8152602001806145ae602f913960400191505060405180910390fd5b600047831061173e5747611740565b825b9050670de0b6b3a764000081111561175c5760009150506117e1565b80156117de576040516001600160a01b0385169082156108fc029083906000818181858888f19350505050158015611798573d6000803e3d6000fd5b50604080516001600160a01b03861681526020810183905281517ff8b71c64315fc33b2ead2adfa487955065152a8ac33d9d5193aafd7f45dc15a0929181900390910190a15b90505b92915050565b61100781565b61100681565b600081565b60005460ff1681565b600381565b6000805460ff1661184c576040805162461bcd60e51b81526020600482015260196024820152600080516020614905833981519152604482015290519081900360640190fd5b426078018267ffffffffffffffff1610156118985760405162461bcd60e51b815260040180806020018281038252602481526020018061463b6024913960400191505060405180910390fd5b6402540be4003406156118dc5760405162461bcd60e51b815260040180806020018281038252604081526020018061497b6040913960400191505060405180910390fd5b600080806001600160a01b0388166119bb5760015461190290879063ffffffff6125cc16565b3410156119405760405162461bcd60e51b81526004018080602001828103825260618152602001806146c56061913960800191505060405180910390fd5b6402540be4008606156119845760405162461bcd60e51b815260040180806020018281038252603c81526020018061478a603c913960400191505060405180910390fd5b611994348763ffffffff6126c116565b90506119ab866402540be40063ffffffff61262616565b6221272160e91b93509150611c5e565b6001600160a01b038816600090815260036020526040902054925082611a125760405162461bcd60e51b81526004018080602001828103825260318152602001806146946031913960400191505060405180910390fd5b600154341015611a535760405162461bcd60e51b815260040180806020018281038252603f8152602001806147e7603f913960400191505060405180910390fd5b506001600160a01b0387166000908152600260205260409020543490600881111580611a9e5750600881118015611a9e5750611a9c876007198301600a0a63ffffffff612a1a16565b155b611ad95760405162461bcd60e51b815260040180806020018281038252603c81526020018061478a603c913960400191505060405180910390fd5b611ae38782612a5c565b9250611aee84612a9c565b15611b36576305f5e100831015611b365760405162461bcd60e51b815260040180806020018281038252603a8152602001806145dd603a913960400191505060405180910390fd5b600881101580611b505750600881108015611b5057508683115b611b8b5760405162461bcd60e51b81526004018080602001828103825260258152602001806147266025913960400191505060405180910390fd5b677ce66c50e2840000831115611bd25760405162461bcd60e51b815260040180806020018281038252603581526020018061465f6035913960400191505060405180910390fd5b604080516323b872dd60e01b81523360048201523060248201526044810189905290516001600160a01b038b16916323b872dd9160648083019260209291908290030181600087803b158015611c2757600080fd5b505af1158015611c3b573d6000803e3d6000fd5b505050506040513d6020811015611c5157600080fd5b5051611c5c57600080fd5b505b611c66614461565b6040805160c0810182528581526001600160a01b038b166020820152815160018082528184018452919283019181602001602082028036833750505081526040805160018082528183019092526020928301929091908083019080368337505050815260408051600180825281830190925260209283019290919080830190803683370190505081526020018767ffffffffffffffff168152509050828160400151600081518110611d1457fe5b602002602001018181525050878160600151600081518110611d3257fe5b60200260200101906001600160a01b031690816001600160a01b031681525050338160800151600081518110611d6457fe5b6001600160a01b039092166020928302919091019091015261200063f7a251d76003611d8f84612703565b611da4866402540be40063ffffffff61262616565b6040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b83811015611e02578181015183820152602001611dea565b50505050905090810190601f168015611e2f5780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b158015611e5057600080fd5b505af1158015611e64573d6000803e3d6000fd5b5050604080516001600160a01b038d1681523360208201528082018b90526060810186905290517f74eab09b0e53aefc23f2e1b16da593f95c2dd49c6f5a23720463d10d9c330b2a9350908190036080019150a150600198975050505050505050565b3361100714611f075760405162461bcd60e51b815260040180806020018281038252602e815260200180614826602e913960400191505060405180910390fd5b60208114611f5c576040805162461bcd60e51b815260206004820152601b60248201527f65787065637465642076616c7565206c656e6774682069732033320000000000604482015290519081900360640190fd5b606084848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8801819004810282018101909252868152939450606093925086915085908190840183828082843760009201919091525050505060208301519091506772656c617946656560c01b811415612064576020820151670de0b6b3a7640000811180159061200b57506402540be4008106155b61205c576040805162461bcd60e51b815260206004820152601960248201527f7468652072656c6179466565206f7574206f662072616e676500000000000000604482015290519081900360640190fd5b6001556120a1565b6040805162461bcd60e51b815260206004820152600d60248201526c756e6b6e6f776e20706172616d60981b604482015290519081900360640190fd5b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a878787876040518080602001806020018381038352878782818152602001925080828437600083820152601f01601f191690910184810383528581526020019050858580828437600083820152604051601f909101601f19169092018290039850909650505050505050a150505050505050565b33611008146121765760405162461bcd60e51b81526004018080602001828103825260238152602001806148e26023913960400191505060405180910390fd5b600091825260046020908152604080842080546001600160a01b03191690556001600160a01b0392909216835260039052812055565b6221272160e91b81565b61c35081565b60026020526000908152604090205481565b6001600160a01b031660009081526003602052604090205490565b61100281565b60005460ff16612234576040805162461bcd60e51b81526020600482015260196024820152600080516020614905833981519152604482015290519081900360640190fd5b33612000146122745760405162461bcd60e51b815260040180806020018281038252602f8152602001806148b3602f913960400191505060405180910390fd5b60ff83166003141561159e5761159982828080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612ba292505050565b61100381565b60005460ff161561231d576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b66071afd498d000060019081556000808052600260205260127fac33ff75c19e70fe83507db0d683fd3465c996598dc972688b7ace676c89077b55805460ff19169091179055565b600481565b600581565b61100081565b61271081565b6001600160a01b03811660009081526003602090815260409182902054825182815280840190935260609290918391906020820181803683375050506020810183905290506000805b60208160ff16101561240b57828160ff16815181106123df57fe5b01602001516001600160f81b031916156123fe57600190910190612403565b61240b565b6001016123c4565b5060608160ff166040519080825280601f01601f19166020018201604052801561243c576020820181803683370190505b50905060005b8260ff168160ff16101561249857838160ff168151811061245f57fe5b602001015160f81c60f81b828260ff168151811061247957fe5b60200101906001600160f81b031916908160001a905350600101612442565b5095945050505050565b61100481565b60606124b26144ad565b60006124bd84612ca0565b9150915080612513576040805162461bcd60e51b815260206004820152601f60248201527f756e7265636f676e697a6564207472616e73666572496e207061636b61676500604482015290519081900360640190fd5b600061251e83612ddf565b905063ffffffff8116156125b2576040808401516020808601516001600160a01b031660009081526002909152918220546125599190612a5c565b90506125636144e2565b60405180608001604052808660000151815260200183815260200186608001516001600160a01b031681526020018463ffffffff1681525090506125a68161312c565b95505050505050610efe565b50506040805160008152602081019091529150610efe9050565b6000828201838110156117de576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60006117de83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613208565b600082612677575060006117e1565b8282028284828161268457fe5b04146117de5760405162461bcd60e51b81526004018080602001828103825260218152602001806147c66021913960400191505060405180910390fd5b60006117de83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506132aa565b60408051600680825260e08201909252606091829190816020015b606081526020019060019003908161271e575050835190915061274090613304565b8160008151811061274d57fe5b602002602001018190525061276e83602001516001600160a01b0316613317565b8160018151811061277b57fe5b6020026020010181905250600083604001515190506060816040519080825280602002602001820160405280156127c657816020015b60608152602001906001900390816127b15790505b50905060005b82811015612813576127f4866040015182815181106127e757fe5b6020026020010151613304565b82828151811061280057fe5b60209081029190910101526001016127cc565b5061281d8161333a565b8360028151811061282a57fe5b602002602001018190525060608260405190808252806020026020018201604052801561286b57816020015b60608152602001906001900390816128565790505b50905060005b838110156128c1576128a28760600151828151811061288c57fe5b60200260200101516001600160a01b0316613317565b8282815181106128ae57fe5b6020908102919091010152600101612871565b506128cb8161333a565b846003815181106128d857fe5b602002602001018190525060608360405190808252806020026020018201604052801561291957816020015b60608152602001906001900390816129045790505b50905060005b848110156129595761293a8860800151828151811061288c57fe5b82828151811061294657fe5b602090810291909101015260010161291f565b506129638161333a565b8560048151811061297057fe5b60200260200101819052506129928760a0015167ffffffffffffffff16613304565b8560058151811061299f57fe5b60200260200101819052506129b38561333a565b979650505050505050565b6129c6614509565b60006129d1836133c4565b9150915080612a115760405162461bcd60e51b81526004018080602001828103825260248152602001806148546024913960400191505060405180910390fd5b61160d8261358f565b60006117de83836040518060400160405280601881526020017f536166654d6174683a206d6f64756c6f206279207a65726f0000000000000000815250613a13565b60006008821115612a8557612a7e836007198401600a0a63ffffffff61262616565b90506117e1565b6117de836008849003600a0a63ffffffff61266816565b604080516020808252818301909252600091606091906020820181803683375050506020810184905290506000805b60208160ff161015612b1257828160ff1681518110612ae657fe5b01602001516001600160f81b03191615612b0557600190910190612b0a565b612b12565b600101612acb565b50600760ff82161015612b2a57600092505050610efe565b816005820360ff1681518110612b3c57fe5b6020910101516001600160f81b031916602d60f81b14612b6157600092505050610efe565b816001820360ff1681518110612b7357fe5b6020910101516001600160f81b031916604d60f81b14612b9857600092505050610efe565b5060019392505050565b612baa614461565b6000612bb583613a75565b9150915080612bf55760405162461bcd60e51b81526004018080602001828103825260248152602001806146176024913960400191505060405180910390fd5b612bfd614509565b602080840180516001600160a01b0390811684526040808701518585015291511660009081526002909252812054905b846040015151811015612c7e57612c5b85604001518281518110612c4d57fe5b602002602001015183613cd9565b85604001518281518110612c6b57fe5b6020908102919091010152600101612c2d565b506080840151604083015260056060830152612c998261358f565b5050505050565b612ca86144ad565b6000612cb26144ad565b612cba614540565b612ccb612cc686613d12565b613d37565b90506000805b612cda83613d81565b15612dd25780612cfc57612cf5612cf084613da2565b613df0565b8452612dca565b8060011415612d2957612d16612d1184613da2565b613ea7565b6001600160a01b03166020850152612dca565b8060021415612d4857612d3e612cf084613da2565b6040850152612dca565b8060031415612d7057612d5d612d1184613da2565b6001600160a01b03166060850152612dca565b8060041415612d9857612d85612d1184613da2565b6001600160a01b03166080850152612dca565b8060051415612dc557612dad612cf084613da2565b67ffffffffffffffff1660a085015260019150612dca565b612dd2565b600101612cd1565b5091935090915050915091565b60208101516000906001600160a01b0316612f16578160a0015167ffffffffffffffff16421115612e1257506001610efe565b8160400151471015612e2657506003610efe565b606082015160408084015190516000926001600160a01b0316916127109184818181858888f193505050503d8060008114612e7d576040519150601f19603f3d011682016040523d82523d6000602084013e612e82565b606091505b5050905080612e95575060049050610efe565b7f471eb9cc1ffe55ffadf15b32595415eb9d80f22e761d24bd6dffc607e1284d5983602001518460600151856040015160405180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b03168152602001828152602001935050505060405180910390a15060009050610efe565b8160a0015167ffffffffffffffff16421115612f3457506001610efe565b81516020808401516001600160a01b031660009081526003909152604090205414612f6157506002610efe565b602080830151604080516370a0823160e01b815230600482015290516000936001600160a01b03909316926370a082319261c3509260248083019392829003018187803b158015612fb157600080fd5b5086fa158015612fc5573d6000803e3d6000fd5b50505050506040513d6020811015612fdc57600080fd5b50516040840151909150811015612ff7575060039050610efe565b600083602001516001600160a01b031663a9059cbb61c350866060015187604001516040518463ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600088803b15801561306857600080fd5b5087f115801561307c573d6000803e3d6000fd5b50505050506040513d602081101561309357600080fd5b505190508015613120577f471eb9cc1ffe55ffadf15b32595415eb9d80f22e761d24bd6dffc607e1284d5984602001518560600151866040015160405180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b03168152602001828152602001935050505060405180910390a15060009150610efe9050565b5060059150610efe9050565b60408051600480825260a08201909252606091829190816020015b6060815260200190600190039081613147575050835190915061316990613304565b8160008151811061317657fe5b602002602001018190525061318e8360200151613304565b8160018151811061319b57fe5b60200260200101819052506131bc83604001516001600160a01b0316613317565b816002815181106131c957fe5b60200260200101819052506131e7836060015163ffffffff16613304565b816003815181106131f457fe5b6020026020010181905250610ed28161333a565b600081836132945760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613259578181015183820152602001613241565b50505050905090810190601f1680156132865780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816132a057fe5b0495945050505050565b600081848411156132fc5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315613259578181015183820152602001613241565b505050900390565b60606117e161331283613ec1565b613fa7565b60408051600560a21b8318601482015260348101909152606090610ed281613fa7565b606081516000141561335b5750604080516000815260208101909152610efe565b60608260008151811061336a57fe5b602002602001015190506000600190505b83518110156133ab576133a18285838151811061339457fe5b6020026020010151613ff9565b915060010161337b565b50610ed26133be825160c060ff16614076565b82613ff9565b6133cc614509565b60006133d6614509565b6133de614540565b6133ea612cc686613d12565b90506000805b6133f983613d81565b15612dd2578061341f5761340f612d1184613da2565b6001600160a01b03168452613587565b80600114156134c057606061343b61343685613da2565b61416e565b90508051604051908082528060200260200182016040528015613468578160200160208202803683370190505b50602086015260005b81518110156134b95761349682828151811061348957fe5b6020026020010151613df0565b866020015182815181106134a657fe5b6020908102919091010152600101613471565b5050613587565b80600214156135625760606134d761343685613da2565b90508051604051908082528060200260200182016040528015613504578160200160208202803683370190505b50604086015260005b81518110156134b95761353282828151811061352557fe5b6020026020010151613ea7565b8660400151828151811061354257fe5b6001600160a01b039092166020928302919091019091015260010161350d565b8060031415612dc557613577612cf084613da2565b63ffffffff166060850152600191505b6001016133f0565b80516001600160a01b03166137b95760005b8160200151518110156137b3576000826040015182815181106135c057fe5b60200260200101516001600160a01b0316612710846020015184815181106135e457fe5b60209081029190910101516040516000818181858888f193505050503d806000811461362c576040519150601f19603f3d011682016040523d82523d6000602084013e613631565b606091505b50509050806136f4577f203f9f67a785f4f81be4d48b109aa0c498d1bc8097ecc2627063f480cc5fe73e83600001518460400151848151811061367057fe5b60200260200101518560200151858151811061368857fe5b6020026020010151866060015160405180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b031681526020018381526020018263ffffffff1663ffffffff16815260200194505050505060405180910390a16137aa565b7fd468d4fa5e8fb4adc119b29a983fd0785e04af5cb8b7a3a69a47270c54b6901a83600001518460400151848151811061372a57fe5b60200260200101518560200151858151811061374257fe5b6020026020010151866060015160405180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b031681526020018381526020018263ffffffff1663ffffffff16815260200194505050505060405180910390a15b506001016135a1565b50613a10565b60005b816020015151811015613a0e57600082600001516001600160a01b031663a9059cbb61c350856040015185815181106137f157fe5b60200260200101518660200151868151811061380957fe5b60200260200101516040518463ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600088803b15801561386057600080fd5b5087f1158015613874573d6000803e3d6000fd5b50505050506040513d602081101561388b57600080fd5b50519050801561394f577fd468d4fa5e8fb4adc119b29a983fd0785e04af5cb8b7a3a69a47270c54b6901a8360000151846040015184815181106138cb57fe5b6020026020010151856020015185815181106138e357fe5b6020026020010151866060015160405180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b031681526020018381526020018263ffffffff1663ffffffff16815260200194505050505060405180910390a1613a05565b7f203f9f67a785f4f81be4d48b109aa0c498d1bc8097ecc2627063f480cc5fe73e83600001518460400151848151811061398557fe5b60200260200101518560200151858151811061399d57fe5b6020026020010151866060015160405180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b031681526020018381526020018263ffffffff1663ffffffff16815260200194505050505060405180910390a15b506001016137bc565b505b50565b60008183613a625760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315613259578181015183820152602001613241565b50828481613a6c57fe5b06949350505050565b613a7d614461565b6000613a87614461565b613a8f614540565b613a9b612cc686613d12565b90506000805b613aaa83613d81565b15612dd25780613ac757613ac0612cf084613da2565b8452613cd1565b8060011415613aef57613adc612d1184613da2565b6001600160a01b03166020850152613cd1565b8060021415613b7e576060613b0661343685613da2565b90508051604051908082528060200260200182016040528015613b33578160200160208202803683370190505b50604086015260005b8151811015613b7757613b5482828151811061348957fe5b86604001518281518110613b6457fe5b6020908102919091010152600101613b3c565b5050613cd1565b8060031415613c13576060613b9561343685613da2565b90508051604051908082528060200260200182016040528015613bc2578160200160208202803683370190505b50606086015260005b8151811015613b7757613be382828151811061352557fe5b86606001518281518110613bf357fe5b6001600160a01b0390921660209283029190910190910152600101613bcb565b8060041415613ca8576060613c2a61343685613da2565b90508051604051908082528060200260200182016040528015613c57578160200160208202803683370190505b50608086015260005b8151811015613b7757613c7882828151811061352557fe5b86608001518281518110613c8857fe5b6001600160a01b0390921660209283029190910190910152600101613c60565b8060051415612dc557613cbd612cf084613da2565b67ffffffffffffffff1660a0850152600191505b600101613aa1565b60006008821115613cfb57612a7e836007198401600a0a63ffffffff61266816565b6117de836008849003600a0a63ffffffff61262616565b613d1a614560565b506040805180820190915281518152602082810190820152919050565b613d3f614540565b613d488261423f565b613d5157600080fd5b6000613d60836020015161426f565b60208085015160408051808201909152868152920190820152915050919050565b6000613d8b614560565b505080518051602091820151919092015191011190565b613daa614560565b613db382613d81565b613dbc57600080fd5b60208201516000613dcc826142d2565b80830160209586015260408051808201909152908152938401919091525090919050565b805160009015801590613e0557508151602110155b613e0e57600080fd5b6000613e1d836020015161426f565b90508083600001511015613e78576040805162461bcd60e51b815260206004820152601a60248201527f6c656e677468206973206c657373207468616e206f6666736574000000000000604482015290519081900360640190fd5b825160208085015183018051928490039291831015613e9e57826020036101000a820491505b50949350505050565b8051600090601514613eb857600080fd5b6117e182613df0565b604080516020808252818301909252606091829190602082018180368337505050602081018490529050600067ffffffffffffffff198416613f0557506018613f29565b6fffffffffffffffffffffffffffffffff198416613f2557506010613f29565b5060005b6020811015613f5f57818181518110613f3e57fe5b01602001516001600160f81b03191615613f5757613f5f565b600101613f29565b60008160200390506060816040519080825280601f01601f191660200182016040528015613f94576020820181803683370190505b5080830196909652508452509192915050565b606081516001148015613fd95750607f60f81b82600081518110613fc757fe5b01602001516001600160f81b03191611155b15613fe5575080610efe565b6117e1613ff78351608060ff16614076565b835b6060806040519050835180825260208201818101602087015b8183101561402a578051835260209283019201614012565b50855184518101855292509050808201602086015b8183101561405757805183526020928301920161403f565b508651929092011591909101601f01601f191660405250905092915050565b60606801000000000000000083106140c6576040805162461bcd60e51b815260206004820152600e60248201526d696e70757420746f6f206c6f6e6760901b604482015290519081900360640190fd5b604080516001808252818301909252606091602082018180368337019050509050603784116141205782840160f81b8160008151811061410257fe5b60200101906001600160f81b031916908160001a90535090506117e1565b606061412b85613ec1565b90508381510160370160f81b8260008151811061414457fe5b60200101906001600160f81b031916908160001a9053506141658282613ff9565b95945050505050565b60606141798261423f565b61418257600080fd5b600061418d83614405565b90506060816040519080825280602002602001820160405280156141cb57816020015b6141b8614560565b8152602001906001900390816141b05790505b50905060006141dd856020015161426f565b60208601510190506000805b84811015614234576141fa836142d2565b915060405180604001604052808381526020018481525084828151811061421d57fe5b6020908102919091010152918101916001016141e9565b509195945050505050565b805160009061425057506000610efe565b6020820151805160001a9060c0821015612b9857600092505050610efe565b8051600090811a6080811015614289576000915050610efe565b60b88110806142a4575060c081108015906142a4575060f881105b156142b3576001915050610efe565b60c08110156142c75760b519019050610efe565b60f519019050610efe565b80516000908190811a60808110156142ed57600191506143fe565b60b881101561430257607e19810191506143fe565b60c081101561437c57600060b78203600186019550806020036101000a865104915060018101820193505080831015614376576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b506143fe565b60f88110156143915760be19810191506143fe565b600060f78203600186019550806020036101000a8651049150600181018201935050808310156143fc576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b505b5092915050565b805160009061441657506000610efe565b6000809050600061442a846020015161426f565b602085015185519181019250015b8082101561445857614449826142d2565b60019093019290910190614438565b50909392505050565b6040518060c001604052806000801916815260200160006001600160a01b03168152602001606081526020016060815260200160608152602001600067ffffffffffffffff1681525090565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915290565b60408051608081018252600080825260208201819052918101829052606081019190915290565b604051806080016040528060006001600160a01b031681526020016060815260200160608152602001600063ffffffff1681525090565b6040518060400160405280614553614560565b8152602001600081525090565b60405180604001604052806000815260200160008152509056fe6f6e6c79207374616b696e672073797374656d20636f6e74726163742063616e2063616c6c20746869732066756e6374696f6e746865206d6573736167652073656e646572206d75737420626520696e63656e746976697a6520636f6e7472616374466f72206d696e69546f6b656e2c20746865207472616e7366657220616d6f756e74206d757374206e6f74206265206c657373207468616e2031756e7265636f676e697a6564207472616e736665724f75742073796e207061636b61676565787069726554696d65206d7573742062652074776f206d696e75746573206c61746572616d6f756e7420697320746f6f206c617267652c20657863656564206d6178696d756d206265703220746f6b656e20616d6f756e7474686520636f6e747261637420686173206e6f74206265656e20626f756e6420746f20616e79206265703220746f6b656e726563656976656420424e4220616d6f756e742073686f756c64206265206e6f206c657373207468616e207468652073756d206f66207472616e736665724f757420424e4220616d6f756e7420616e64206d696e696d756d2072656c6179466565616d6f756e7420697320746f6f206c617267652c2075696e74323536206f766572666c6f774c656e677468206f6620726563697069656e74416464727320646f65736e277420657175616c20746f206c656e677468206f6620726566756e644164647273696e76616c6964207472616e7366657220616d6f756e743a20707265636973696f6e206c6f737320696e20616d6f756e7420636f6e76657273696f6e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77726563656976656420424e4220616d6f756e742073686f756c64206265206e6f206c657373207468616e20746865206d696e696d756d2072656c6179466565746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e7472616374756e7265636f676e697a6564207472616e736665724f75742061636b207061636b6167654c656e677468206f6620726563697069656e74416464727320646f65736e277420657175616c20746f206c656e677468206f6620616d6f756e7473746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e7472616374746865206d73672073656e646572206d75737420626520746f6b656e4d616e6167657274686520636f6e7472616374206e6f7420696e69742079657400000000000000726563656976656420424e4220616d6f756e742073686f756c64206265206e6f206c657373207468616e207468652073756d206f66207472616e7366657220424e4220616d6f756e7420616e642072656c6179466565696e76616c696420726563656976656420424e4220616d6f756e743a20707265636973696f6e206c6f737320696e20616d6f756e7420636f6e76657273696f6ea2646970667358221220caf56ff249aa6ca806ce69d2892ae51c7530b6d135624d7e27646a2095f0b01964736f6c63430006040033", + }, + UpgradeConfig { + contract_addr: "0x0000000000000000000000000000000000002001", + code: "60806040526004361061036f5760003560e01c806370fd5bad116101c6578063b88a802f116100f7578063d7ecfcb611610095578063f45fd80b1161006f578063f45fd80b14610bd0578063f9a2bbc714610c15578063fc3e590814610646578063fd6a687914610c2a57610376565b8063d7ecfcb6146107ee578063dc927faf14610ba6578063edc1a5b014610bbb57610376565b8063c2117d82116100d1578063c2117d8214610abc578063c81b166214610ad1578063c8509d8114610ae6578063d61b9b9314610b6b57610376565b8063b88a802f14610a57578063baaafd3b14610a6c578063bf8546ca14610a8157610376565b806396713da911610164578063a78abc161161013e578063a78abc1614610939578063ab51bb9614610962578063ac43175114610977578063b14315df14610a4257610376565b806396713da9146108fa5780639dc092621461090f578063a1a11bf51461092457610376565b806375d47a0a116101a057806375d47a0a1461084b5780637942fd0514610860578063831d65d11461087557806392b888a4146105f257610376565b806370fd5bad146107ee578063718a8aa81461080357806375aca5931461081857610376565b8063413d9c3a116102a05780635d17c8bd1161023e57806369b635b61161021857806369b635b61461075b5780636bd8f804146107705780636e47b482146107a65780636fb7f7eb146107bb57610376565b80635d17c8bd1461071c5780635d499b1b1461073157806362b171d21461074657610376565b80634bf6c8821161027a5780634bf6c882146106b15780634d99dd16146106c657806351e80672146106f2578063552aaf931461070757610376565b8063413d9c3a1461065b57806343756e5c14610670578063493279b11461068557610376565b8063151817e31161030d578063333ad3e7116102e7578063333ad3e71461061c57806334c43354146106315780633dffc387146105f25780633fdfa7e41461064657610376565b8063151817e3146105c757806317c9efb0146105f25780632fdeb1111461060757610376565b80630bee7a67116103495780630bee7a671461043b5780630e2374a5146104695780631182b8751461049a57806311fe9ec61461059457610376565b8063026e402b1461037b57806302985992146103a9578063047636d1146103d057610376565b3661037657005b600080fd5b6103a76004803603604081101561039157600080fd5b506001600160a01b038135169060200135610c3f565b005b3480156103b557600080fd5b506103be611141565b60408051918252519081900360200190f35b3480156103dc57600080fd5b50610403600480360360208110156103f357600080fd5b50356001600160a01b0316611147565b6040518082606080838360005b83811015610428578181015183820152602001610410565b5050505090500191505060405180910390f35b34801561044757600080fd5b5061045061119b565b6040805163ffffffff9092168252519081900360200190f35b34801561047557600080fd5b5061047e6111a0565b604080516001600160a01b039092168252519081900360200190f35b3480156104a657600080fd5b5061051f600480360360408110156104bd57600080fd5b60ff8235169190810190604081016020820135600160201b8111156104e157600080fd5b8201836020820111156104f357600080fd5b803590602001918460018302840111600160201b8311171561051457600080fd5b5090925090506111a6565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610559578181015183820152602001610541565b50505050905090810190601f1680156105865780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156105a057600080fd5b506103be600480360360208110156105b757600080fd5b50356001600160a01b031661135c565b3480156105d357600080fd5b506105dc611377565b6040805160ff9092168252519081900360200190f35b3480156105fe57600080fd5b506105dc61137c565b34801561061357600080fd5b506103be611381565b34801561062857600080fd5b50610450611387565b34801561063d57600080fd5b506103be61138c565b34801561065257600080fd5b506105dc611397565b34801561066757600080fd5b506103be61139c565b34801561067c57600080fd5b5061047e6113a3565b34801561069157600080fd5b5061069a6113a9565b6040805161ffff9092168252519081900360200190f35b3480156106bd57600080fd5b506105dc6113ae565b6103a7600480360360408110156106dc57600080fd5b506001600160a01b0381351690602001356113b3565b3480156106fe57600080fd5b5061047e61199a565b34801561071357600080fd5b506105dc6119a0565b34801561072857600080fd5b506103be6119a5565b34801561073d57600080fd5b506103be6119ab565b34801561075257600080fd5b506103be6119b4565b34801561076757600080fd5b506103be611aec565b6103a76004803603606081101561078657600080fd5b506001600160a01b03813581169160208101359091169060400135611af2565b3480156107b257600080fd5b5061047e612160565b3480156107c757600080fd5b506103be600480360360208110156107de57600080fd5b50356001600160a01b0316612166565b3480156107fa57600080fd5b506105dc612181565b34801561080f57600080fd5b506105dc612186565b34801561082457600080fd5b506103be6004803603602081101561083b57600080fd5b50356001600160a01b031661218b565b34801561085757600080fd5b5061047e6121a6565b34801561086c57600080fd5b506105dc6121ac565b34801561088157600080fd5b506103a76004803603604081101561089857600080fd5b60ff8235169190810190604081016020820135600160201b8111156108bc57600080fd5b8201836020820111156108ce57600080fd5b803590602001918460018302840111600160201b831117156108ef57600080fd5b5090925090506121b1565b34801561090657600080fd5b506105dc612473565b34801561091b57600080fd5b5061047e612478565b34801561093057600080fd5b5061047e61247e565b34801561094557600080fd5b5061094e612484565b604080519115158252519081900360200190f35b34801561096e57600080fd5b506104506119a0565b34801561098357600080fd5b506103a76004803603604081101561099a57600080fd5b810190602081018135600160201b8111156109b457600080fd5b8201836020820111156109c657600080fd5b803590602001918460018302840111600160201b831117156109e757600080fd5b919390929091602081019035600160201b811115610a0457600080fd5b820183602082011115610a1657600080fd5b803590602001918460018302840111600160201b83111715610a3757600080fd5b50909250905061248d565b348015610a4e57600080fd5b506105dc612a8a565b348015610a6357600080fd5b506103be612a8f565b348015610a7857600080fd5b506103be612bc4565b348015610a8d57600080fd5b506103be60048036036040811015610aa457600080fd5b506001600160a01b0381358116916020013516612bcf565b348015610ac857600080fd5b506103be612bfc565b348015610add57600080fd5b5061047e612c02565b348015610af257600080fd5b506103a760048036036040811015610b0957600080fd5b60ff8235169190810190604081016020820135600160201b811115610b2d57600080fd5b820183602082011115610b3f57600080fd5b803590602001918460018302840111600160201b83111715610b6057600080fd5b509092509050612c08565b348015610b7757600080fd5b506103be60048036036040811015610b8e57600080fd5b506001600160a01b0381358116916020013516612e25565b348015610bb257600080fd5b5061047e612e50565b348015610bc757600080fd5b506103be612e56565b348015610bdc57600080fd5b506103be60048036036060811015610bf357600080fd5b506001600160a01b038135811691602081013582169160409091013516612e63565b348015610c2157600080fd5b5061047e612e98565b348015610c3657600080fd5b5061047e612e9e565b60105460ff1660021415610c8b576040805162461bcd60e51b815260206004820152600e60248201526d4e6f2072652d656e7472616e637960901b604482015290519081900360640190fd5b6010805460ff19166002179055806402540be4003406158015610cb357506402540be4008106155b610d04576040805162461bcd60e51b815260206004820152601c60248201527f707265636973696f6e206c6f737320696e20636f6e76657273696f6e00000000604482015290519081900360640190fd5b60005460ff16610d41576638d7ea4c6800006001908155662386f26fc1000060025568056bc75e2d631000006003556000805460ff191690911790555b600354821015610d98576040805162461bcd60e51b815260206004820152601760248201527f696e76616c69642064656c656761746520616d6f756e74000000000000000000604482015290519081900360640190fd5b600154610dac90839063ffffffff612ea416565b341015610df7576040805162461bcd60e51b81526020600482015260146024820152736e6f7420656e6f756768206d73672076616c756560601b604482015290519081900360640190fd5b60405133906108fc9060009081818181818888f19350505050610e55576040805162461bcd60e51b815260206004820152601160248201527034b73b30b634b2103232b632b3b0ba37b960791b604482015290519081900360640190fd5b6000610e6c836402540be40063ffffffff612f0516565b90506000610e80348563ffffffff612f4716565b90506000610e9960025483612f4790919063ffffffff16565b6040805160038082526080820190925291925060609190816020015b6060815260200190600190039081610eb5579050509050610ed533612f89565b81600081518110610ee257fe5b6020026020010181905250610eff876001600160a01b0316612f89565b81600181518110610f0c57fe5b6020026020010181905250610f2084612fac565b81600281518110610f2d57fe5b60200260200101819052506060610f4d6001610f4884612fbf565b613049565b8051602080830191909120600f80546000908152600a845260408082209390935581546001908101909255338152600b909352912080549091019055905061200063f7a251d7601083610fab876402540be40063ffffffff612f0516565b6040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b83811015611009578181015183820152602001610ff1565b50505050905090810190601f1680156110365780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b15801561105757600080fd5b505af115801561106b573d6000803e3d6000fd5b5061100492506108fc91506110889050898663ffffffff612ea416565b6040518115909202916000818181858888f193505050501580156110b0573d6000803e3d6000fd5b506002546040516110029180156108fc02916000818181858888f193505050501580156110e1573d6000803e3d6000fd5b50604080518881526020810185905281516001600160a01b038b169233927f5f32ed2794e2e72d19e3cb2320e8820a499c4204887372beba51f5e61c040867929081900390910190a350506010805460ff19166001179055505050505050565b60035481565b61114f614dd9565b611157614dd9565b6001600160a01b0383166000818152600b60209081526040808320548552838352600c82528083205485830152928252600d9052819020549082015290505b919050565b606481565b61200181565b606033612000146111e85760405162461bcd60e51b815260040180806020018281038252602f815260200180614f97602f913960400191505060405180910390fd5b60005460ff16611225576638d7ea4c6800006001908155662386f26fc1000060025568056bc75e2d631000006003556000805460ff191690911790555b61122d614df7565b61127461126f85858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506130cf92505050565b6130f4565b905060006112896112848361313e565b61318c565b90506000606060ff8316600414156112ae576112a484613243565b9092509050611305565b60ff8316600514156112c3576112a484613423565b6040805162461bcd60e51b8152602060048201526012602482015271756e6b6e6f776e206576656e74207479706560701b604482015290519081900360640190fd5b63ffffffff821615611351576040805163ffffffff84168152905160ff8516917f391d6e5ea6ab6c49b9a0abb1782cae5def8d711f973b00c729658c0b2a80b31b919081900360200190a25b979650505050505050565b6001600160a01b031660009081526006602052604090205490565b600581565b600181565b60015481565b606581565b662386f26fc1000081565b600381565b620a8c0081565b61100181565b606181565b600881565b60105460ff16600214156113ff576040805162461bcd60e51b815260206004820152600e60248201526d4e6f2072652d656e7472616e637960901b604482015290519081900360640190fd5b6010805460ff19166002179055806402540be400340615801561142757506402540be4008106155b611478576040805162461bcd60e51b815260206004820152601c60248201527f707265636973696f6e206c6f737320696e20636f6e76657273696f6e00000000604482015290519081900360640190fd5b60005460ff166114b5576638d7ea4c6800006001908155662386f26fc1000060025568056bc75e2d631000006003556000805460ff191690911790555b600154341015611503576040805162461bcd60e51b81526020600482015260146024820152736e6f7420656e6f7567682072656c61792066656560601b604482015290519081900360640190fd5b6003548210156115be576002548211611556576040805162461bcd60e51b815260206004820152601060248201526f6e6f7420656e6f7567682066756e647360801b604482015290519081900360640190fd5b3360009081526005602090815260408083206001600160a01b038716845290915290205482146115be576040805162461bcd60e51b815260206004820152600e60248201526d1a5b9d985b1a5908185b5bdd5b9d60921b604482015290519081900360640190fd5b3360009081526005602090815260408083206001600160a01b0387168452909152902054821115611627576040805162461bcd60e51b815260206004820152600e60248201526d1a5b9d985b1a5908185b5bdd5b9d60921b604482015290519081900360640190fd5b3360009081526007602090815260408083206001600160a01b038716845290915290205442101561169f576040805162461bcd60e51b815260206004820152601a60248201527f70656e64696e6720756e64656c65676174696f6e206578697374000000000000604482015290519081900360640190fd5b60006116b6836402540be40063ffffffff612f0516565b60025490915034906000906116d290839063ffffffff612f4716565b6040805160038082526080820190925291925060609190816020015b60608152602001906001900390816116ee57905050905061170e33612f89565b8160008151811061171b57fe5b6020026020010181905250611738876001600160a01b0316612f89565b8160018151811061174557fe5b602002602001018190525061175984612fac565b8160028151811061176657fe5b602002602001018190525060606117816002610f4884612fbf565b8051602080830191909120600f80546000908152600a845260408082209390935581546001908101909255338152600c90935291208054909101905590506117d242620a8c0063ffffffff612ea416565b3360009081526007602090815260408083206001600160a01b038d16845290915290205561200063f7a251d7601083611816876402540be40063ffffffff612f0516565b6040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b8381101561187457818101518382015260200161185c565b50505050905090810190601f1680156118a15780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b1580156118c257600080fd5b505af11580156118d6573d6000803e3d6000fd5b5050604051611004925085156108fc02915085906000818181858888f19350505050158015611909573d6000803e3d6000fd5b506002546040516110029180156108fc02916000818181858888f1935050505015801561193a573d6000803e3d6000fd5b50604080518881526020810185905281516001600160a01b038b169233927fdf0b6ac27f3f3bb31cee3dab0f4fe40cc19c6a3f8daaec52e06b261e58a12519929081900390910190a350506010805460ff19166001179055505050505050565b61200081565b600081565b60025481565b6402540be40081565b60105460009060ff1660021415611a03576040805162461bcd60e51b815260206004820152600e60248201526d4e6f2072652d656e7472616e637960901b604482015290519081900360640190fd5b506010805460ff191660021790553360009081526008602052604090205480611a6a576040805162461bcd60e51b81526020600482015260146024820152736e6f20756e64656c6567617465642066756e647360601b604482015290519081900360640190fd5b336000818152600860205260408082208290555183156108fc0291849190818181858888f19350505050158015611aa5573d6000803e3d6000fd5b5060408051828152905133917fc712d133b8d448221aaed2198ed1f0db6dfc860fb01bc3a630916fe6cbef946f919081900360200190a26010805460ff1916600117905590565b60035490565b60105460ff1660021415611b3e576040805162461bcd60e51b815260206004820152600e60248201526d4e6f2072652d656e7472616e637960901b604482015290519081900360640190fd5b6010805460ff19166002179055806402540be4003406158015611b6657506402540be4008106155b611bb7576040805162461bcd60e51b815260206004820152601c60248201527f707265636973696f6e206c6f737320696e20636f6e76657273696f6e00000000604482015290519081900360640190fd5b60005460ff16611bf4576638d7ea4c6800006001908155662386f26fc1000060025568056bc75e2d631000006003556000805460ff191690911790555b826001600160a01b0316846001600160a01b03161415611c52576040805162461bcd60e51b815260206004820152601460248201527334b73b30b634b2103932b232b632b3b0ba34b7b760611b604482015290519081900360640190fd5b600154341015611ca0576040805162461bcd60e51b81526020600482015260146024820152736e6f7420656e6f7567682072656c61792066656560601b604482015290519081900360640190fd5b6003548210158015611cd557503360009081526005602090815260408083206001600160a01b03881684529091529020548211155b611d17576040805162461bcd60e51b815260206004820152600e60248201526d1a5b9d985b1a5908185b5bdd5b9d60921b604482015290519081900360640190fd5b3360009081526009602090815260408083206001600160a01b03888116855290835281842090871684529091529020544210801590611d8557503360009081526009602090815260408083206001600160a01b03878116855290835281842090881684529091529020544210155b611dd6576040805162461bcd60e51b815260206004820152601a60248201527f70656e64696e6720726564656c65676174696f6e206578697374000000000000604482015290519081900360640190fd5b6000611ded836402540be40063ffffffff612f0516565b6002549091503490600090611e0990839063ffffffff612f4716565b60408051600480825260a0820190925291925060609190816020015b6060815260200190600190039081611e25579050509050611e4533612f89565b81600081518110611e5257fe5b6020026020010181905250611e6f886001600160a01b0316612f89565b81600181518110611e7c57fe5b6020026020010181905250611e99876001600160a01b0316612f89565b81600281518110611ea657fe5b6020026020010181905250611eba84612fac565b81600381518110611ec757fe5b60200260200101819052506060611ee26003610f4884612fbf565b8051602080830191909120600f80546000908152600a845260408082209390935581546001908101909255338152600d9093529120805490910190559050611f3342620a8c0063ffffffff612ea416565b3360009081526009602090815260408083206001600160a01b038d81168552908352818420908e168452909152902055611f7642620a8c0063ffffffff612ea416565b3360009081526009602090815260408083206001600160a01b038e81168552908352818420908d16845290915290205561200063f7a251d7601083611fc6876402540be40063ffffffff612f0516565b6040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b8381101561202457818101518382015260200161200c565b50505050905090810190601f1680156120515780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b15801561207257600080fd5b505af1158015612086573d6000803e3d6000fd5b5050604051611004925085156108fc02915085906000818181858888f193505050501580156120b9573d6000803e3d6000fd5b506002546040516110029180156108fc02916000818181858888f193505050501580156120ea573d6000803e3d6000fd5b50876001600160a01b0316896001600160a01b0316336001600160a01b03167fdb0d03fdfcb145c486c442659e6a341a8828985505097cb5190afcf541e840158a87604051808381526020018281526020019250505060405180910390a450506010805460ff1916600117905550505050505050565b61100581565b6001600160a01b031660009081526004602052604090205490565b600281565b601081565b6001600160a01b031660009081526008602052604090205490565b61100881565b600b81565b33612000146121f15760405162461bcd60e51b815260040180806020018281038252602f815260200180614f97602f913960400191505060405180910390fd5b60005460ff1661222e576638d7ea4c6800006001908155662386f26fc1000060025568056bc75e2d631000006003556000805460ff191690911790555b612236614df7565b61227861126f84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506130cf92505050565b905060008060606000805b61228c8661363f565b156122f757806122a9576122a26112848761313e565b94506122ef565b80600114156122c5576122be6112848761313e565b93506122ef565b80600214156122ea576122df6122da8761313e565b613660565b9250600191506122ef565b6122f7565b600101612283565b8161233d576040805162461bcd60e51b81526020600482015260116024820152701c9b1c08191958dbd9194819985a5b1959607a1b604482015290519081900360640190fd5b612346836136d0565b612389576040805162461bcd60e51b815260206004820152600f60248201526e0eee4dedcce40e0c2c6d640d0c2e6d608b1b604482015290519081900360640190fd5b61239561126f846130cf565b955060006123a56112848861313e565b90506123af614df7565b6123b88861363f565b156123db576123d461126f6123cf6122da8b61313e565b6130cf565b905061241c565b6040805162461bcd60e51b8152602060048201526011602482015270656d7074792061636b207061636b61676560781b604482015290519081900360640190fd5b60ff82166001141561243857612433818888613724565b612466565b60ff82166002141561244f57612433818888613adb565b60ff8216600314156112c357612433818888613da8565b5050505050505050505050565b600981565b61100781565b61100681565b60005460ff1681565b60005460ff166124e4576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e7472616374206e6f7420696e69742079657400000000000000604482015290519081900360640190fd5b33611007146125245760405162461bcd60e51b815260040180806020018281038252602e815260200180614f0d602e913960400191505060405180910390fd5b61258584848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600a81526972656c6179657246656560b01b6020820152915061410d9050565b156126eb57602081146125df576040805162461bcd60e51b815260206004820152601d60248201527f6c656e677468206f662072656c61796572466565206d69736d61746368000000604482015290519081900360640190fd5b604080516020601f840181900481028201810190925282815260009161261d918585808385018382808284376000920191909152506141f492505050565b9050600354811061265f5760405162461bcd60e51b815260040180806020018281038252602e815260200180614f3b602e913960400191505060405180910390fd5b600254811161269f5760405162461bcd60e51b815260040180806020018281038252602e815260200180614f69602e913960400191505060405180910390fd5b6402540be4008106156126e35760405162461bcd60e51b815260040180806020018281038252602c815260200180614ee1602c913960400191505060405180910390fd5b6001556129f8565b61274f84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600d81526c62534352656c6179657246656560981b6020820152915061410d9050565b1561287557602081146127a9576040805162461bcd60e51b815260206004820181905260248201527f6c656e677468206f662062534352656c61796572466565206d69736d61746368604482015290519081900360640190fd5b604080516020601f84018190048102820181019092528281526000916127e7918585808385018382808284376000920191909152506141f492505050565b905060015481106128295760405162461bcd60e51b815260040180806020018281038252602e815260200180614e61602e913960400191505060405180910390fd5b6402540be40081061561286d5760405162461bcd60e51b815260040180806020018281038252602f815260200180614e32602f913960400191505060405180910390fd5b6002556129f8565b6128d984848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600d81526c36b4b72232b632b3b0ba34b7b760991b6020820152915061410d9050565b156129bb5760208114612933576040805162461bcd60e51b815260206004820181905260248201527f6c656e677468206f66206d696e44656c65676174696f6e206d69736d61746368604482015290519081900360640190fd5b604080516020601f8401819004810282018101909252828152600091612971918585808385018382808284376000920191909152506141f492505050565b905060015481116129b35760405162461bcd60e51b8152600401808060200182810382526031815260200180614e8f6031913960400191505060405180910390fd5b6003556129f8565b6040805162461bcd60e51b815260206004820152600d60248201526c756e6b6e6f776e20706172616d60981b604482015290519081900360640190fd5b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a848484846040518080602001806020018381038352878782818152602001925080828437600083820152601f01601f191690910184810383528581526020019050858580828437600083820152604051601f909101601f19169092018290039850909650505050505050a150505050565b600481565b60105460009060ff1660021415612ade576040805162461bcd60e51b815260206004820152600e60248201526d4e6f2072652d656e7472616e637960901b604482015290519081900360640190fd5b506010805460ff191660021790553360009081526006602052604090205480612b42576040805162461bcd60e51b81526020600482015260116024820152701b9bc81c195b991a5b99c81c995dd85c99607a1b604482015290519081900360640190fd5b336000818152600660205260408082208290555183156108fc0291849190818181858888f19350505050158015612b7d573d6000803e3d6000fd5b5060408051828152905133917f83b78188b13346b2ffb484da70d42ee27de7fbf9f2bd8045269e10ed643ccd76919081900360200190a26010805460ff1916600117905590565b6638d7ea4c68000081565b6001600160a01b038083166000908152600760209081526040808320938516835292905220545b92915050565b60015490565b61100281565b3361200014612c485760405162461bcd60e51b815260040180806020018281038252602f815260200180614f97602f913960400191505060405180910390fd5b60005460ff16612c85576638d7ea4c6800006001908155662386f26fc1000060025568056bc75e2d631000006003556000805460ff191690911790555b612cc482828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506136d092505050565b612d07576040805162461bcd60e51b815260206004820152600f60248201526e0eee4dedcce40e0c2c6d640d0c2e6d608b1b604482015290519081900360640190fd5b612d0f614df7565b612d5161126f84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506130cf92505050565b90506000612d616112848361313e565b9050612d6b614df7565b612d748361363f565b15612d9257612d8b61126f6123cf6122da8661313e565b9050612dd8565b6040805162461bcd60e51b8152602060048201526016602482015275656d707479206661696c2061636b207061636b61676560501b604482015290519081900360640190fd5b60ff821660011415612df257612ded816141f9565b612e1c565b60ff821660021415612e0757612ded81614413565b60ff8216600314156112c357612ded8161453d565b5050505b505050565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205490565b61100381565b68056bc75e2d6310000081565b6001600160a01b0392831660009081526009602090815260408083209486168352938152838220929094168152925290205490565b61100081565b61100481565b600082820183811015612efe576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b6000612efe83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506146a2565b6000612efe83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250614744565b60408051600560a21b8318601482015260348101909152606090612efe8161479e565b6060612bf6612fba836147f4565b61479e565b6060815160001415612fe05750604080516000815260208101909152611196565b606082600081518110612fef57fe5b602002602001015190506000600190505b8351811015613030576130268285838151811061301957fe5b60200260200101516148da565b9150600101613000565b50612efe613043825160c060ff16614957565b826148da565b6040805160028082526060828101909352829190816020015b60608152602001906001900390816130625790505090506130858460ff16612fac565b8160008151811061309257fe5b60200260200101819052506130a68361479e565b816001815181106130b357fe5b60200260200101819052506130c781612fbf565b949350505050565b6130d7614e17565b506040805180820190915281518152602082810190820152919050565b6130fc614df7565b61310582614a4f565b61310e57600080fd5b600061311d8360200151614a89565b60208085015160408051808201909152868152920190820152915050919050565b613146614e17565b61314f8261363f565b61315857600080fd5b6020820151600061316882614aec565b80830160209586015260408051808201909152908152938401919091525090919050565b8051600090158015906131a157508151602110155b6131aa57600080fd5b60006131b98360200151614a89565b90508083600001511015613214576040805162461bcd60e51b815260206004820152601a60248201527f6c656e677468206973206c657373207468616e206f6666736574000000000000604482015290519081900360640190fd5b82516020808501518301805192849003929183101561323a57826020036101000a820491505b50949350505050565b600060606000806000805b6132578761363f565b156132a957826132795761327261326d8861313e565b614c1f565b915061329e565b82600114156132995761328e6112848861313e565b90506001935061329e565b6132a9565b82600101925061324e565b836132ef576040805162461bcd60e51b81526020600482015260116024820152701c9b1c08191958dbd9194819985a5b1959607a1b604482015290519081900360640190fd5b60006110046001600160a01b031663727be1f8836040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b15801561333957600080fd5b505af115801561334d573d6000803e3d6000fd5b505050506040513d602081101561336357600080fd5b50519050806133885761337a600484846065614c39565b96509650505050505061341e565b6001600160a01b0383166000908152600660205260409020546133b1908363ffffffff612ea416565b6001600160a01b038416600081815260066020908152604091829020939093558051858152905191927f7cc266c7b444f808013fa187f7b904d470a051a6564e78f482aa496581ba4bf892918290030190a260408051600080825260208201909252909750955050505050505b915091565b6000606060008060008060005b6134398861363f565b156134a257836134565761344f61326d8961313e565b9250613497565b83600114156134725761346b61326d8961313e565b9150613497565b8360021415613492576134876112848961313e565b905060019450613497565b6134a2565b836001019350613430565b846134e8576040805162461bcd60e51b81526020600482015260116024820152701c9b1c08191958dbd9194819985a5b1959607a1b604482015290519081900360640190fd5b60006110046001600160a01b031663727be1f8836040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b15801561353257600080fd5b505af1158015613546573d6000803e3d6000fd5b505050506040513d602081101561355c57600080fd5b505190508061358257613573600585846065614c39565b9750975050505050505061341e565b6001600160a01b0380851660008181526007602090815260408083209488168352938152838220829055918152600890915220546135c6908363ffffffff612ea416565b6001600160a01b0380861660008181526008602090815260409182902094909455805186815290519287169391927f35a799836f74fac7eccf5c73902823b970543d2274d3b93d8da3d37a255772a2929181900390910190a3604080516000808252602082019092529098509650505050505050915091565b6000613649614e17565b505080518051602091820151919092015191011190565b805160609061366e57600080fd5b600061367d8360200151614a89565b83516040805191839003808352601f19601f82011683016020019091529192506060908280156136b4576020820181803683370190505b509050600081602001905061323a848760200151018285614d35565b8051602080830191909120600e546000908152600a90925260408220548082146136ff57600092505050611196565b5050600e80546000908152600a60205260408120558054600190810190915592915050565b60008060008060005b6137368861363f565b1561379f57836137535761374c61326d8961313e565b9250613794565b836001141561376f5761376861326d8961313e565b9150613794565b836002141561378f576137846112848961313e565b905060019450613794565b61379f565b83600101935061372d565b846137e5576040805162461bcd60e51b81526020600482015260116024820152701c9b1c08191958dbd9194819985a5b1959607a1b604482015290519081900360640190fd5b60006137fc826402540be40063ffffffff614d8016565b6001600160a01b0385166000908152600b602052604090208054600019019055905060ff8816600114156139425760ff87161561386f576040805162461bcd60e51b815260206004820152600c60248201526b77726f6e672073746174757360a01b604482015290519081900360640190fd5b6001600160a01b038416600090815260046020526040902054613898908263ffffffff612ea416565b6001600160a01b038086166000908152600460209081526040808320949094556005815283822092871682529190915220546138da908263ffffffff612ea416565b6001600160a01b038086166000818152600560209081526040808320948916808452948252918290209490945580518581529051929391927f9a57c81564ab02642f34fd87e41baa9b074c18342cec3b7268b62bf752018fd1929181900390910190a3613ad0565b60ff8816613a94576001600160a01b038416600090815260086020526040902054613973908263ffffffff612ea416565b6001600160a01b0385166000908152600860209081526040808320939093558251630e4f7c3f60e31b81526004810185905292516110049363727be1f89360248083019493928390030190829087803b1580156139cf57600080fd5b505af11580156139e3573d6000803e3d6000fd5b505050506040513d60208110156139f957600080fd5b5051613a42576040805162461bcd60e51b81526020600482015260136024820152721dda5d1a191c985dc8189b988819985a5b1959606a1b604482015290519081900360640190fd5b6040805182815260ff8916602082015281516001600160a01b0380871693908816927fcbd481ae600289fad8c0484d07ce0ffe4f010d7c844ecfdeaf2a13fead52886e929081900390910190a3613ad0565b6040805162461bcd60e51b815260206004820152600c60248201526b77726f6e672073746174757360a01b604482015290519081900360640190fd5b505050505050505050565b60008060008060005b613aed8861363f565b15613b565783613b0a57613b0361326d8961313e565b9250613b4b565b8360011415613b2657613b1f61326d8961313e565b9150613b4b565b8360021415613b4657613b3b6112848961313e565b905060019450613b4b565b613b56565b836001019350613ae4565b84613b9c576040805162461bcd60e51b81526020600482015260116024820152701c9b1c08191958dbd9194819985a5b1959607a1b604482015290519081900360640190fd5b6000613bb3826402540be40063ffffffff614d8016565b6001600160a01b0385166000908152600c602052604090208054600019019055905060ff881660011415613d325760ff871615613c26576040805162461bcd60e51b815260206004820152600c60248201526b77726f6e672073746174757360a01b604482015290519081900360640190fd5b6001600160a01b038416600090815260046020526040902054613c4f908263ffffffff612f4716565b6001600160a01b03808616600090815260046020908152604080832094909455600581528382209287168252919091522054613c91908263ffffffff612f4716565b6001600160a01b03808616600090815260056020908152604080832093881683529290522055613cca42620a8c0063ffffffff612ea416565b6001600160a01b038086166000818152600760209081526040808320948916808452948252918290209490945580518581529051929391927fd6f878a5bcbbe79a64e6418bb0d56aaa20b9a60587d45749819df88dfc7c3c44929181900390910190a3613ad0565b60ff8816613a94576001600160a01b03808516600081815260076020908152604080832094881680845294825280832092909255815185815260ff8c169181019190915281517f4417d10c1e33efa83a770b8d4f47176e78c08c1298d534901ad3b16bb585fa2e929181900390910190a3613ad0565b6000806000806000805b613dbb8961363f565b15613e405784613dd857613dd161326d8a61313e565b9350613e35565b8460011415613df457613ded61326d8a61313e565b9250613e35565b8460021415613e1057613e0961326d8a61313e565b9150613e35565b8460031415613e3057613e256112848a61313e565b905060019550613e35565b613e40565b846001019450613db2565b85613e86576040805162461bcd60e51b81526020600482015260116024820152701c9b1c08191958dbd9194819985a5b1959607a1b604482015290519081900360640190fd5b6000613e9d826402540be40063ffffffff614d8016565b6001600160a01b0386166000908152600d602052604090208054600019019055905060ff8916600114156140705760ff881615613f10576040805162461bcd60e51b815260206004820152600c60248201526b77726f6e672073746174757360a01b604482015290519081900360640190fd5b6001600160a01b03808616600090815260056020908152604080832093881683529290522054613f46908263ffffffff612f4716565b6001600160a01b03868116600090815260056020908152604080832089851684529091528082209390935590851681522054613f829082612ea4565b6001600160a01b03808716600090815260056020908152604080832093881683529290522055613fbb42620a8c0063ffffffff612ea416565b6001600160a01b0380871660009081526009602090815260408083208985168452825280832093881683529290522055613ffe42620a8c0063ffffffff612ea416565b6001600160a01b038087166000818152600960209081526040808320898616808552908352818420958b1680855295835292819020959095558451868152945191947f78bffae3f8c6691ac7fc1a3bff800cb2d612f5ad9ae5b0444cfe2eb15c189e18929081900390910190a4614101565b60ff8916613a94576001600160a01b038581166000818152600960209081526040808320898616808552818452828520968a16808652968452828520859055908352818420818552835281842093909355805186815260ff8e169281019290925280519293927fb93bee5c59f85ede6b074a99f4ffcd3e3fc0d5c3d8156de331de89a49e0ce77c9281900390910190a45b50505050505050505050565b6000816040516020018082805190602001908083835b602083106141425780518252601f199092019160209182019101614123565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120836040516020018082805190602001908083835b602083106141b05780518252601f199092019160209182019101614191565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040528051906020012014905092915050565b015190565b60008060008060005b61420b8661363f565b1561427457836142285761422161326d8761313e565b9250614269565b83600114156142445761423d61326d8761313e565b9150614269565b8360021415614264576142596112848761313e565b905060019450614269565b614274565b836001019350614202565b846142ba576040805162461bcd60e51b81526020600482015260116024820152701c9b1c08191958dbd9194819985a5b1959607a1b604482015290519081900360640190fd5b60006142d1826402540be40063ffffffff614d8016565b6001600160a01b0385166000908152600b602090815260408083208054600019019055600890915290205490915061430f908263ffffffff612ea416565b6001600160a01b0385166000908152600860209081526040808320939093558251630e4f7c3f60e31b81526004810185905292516110049363727be1f89360248083019493928390030190829087803b15801561436b57600080fd5b505af115801561437f573d6000803e3d6000fd5b505050506040513d602081101561439557600080fd5b50516143de576040805162461bcd60e51b81526020600482015260136024820152721dda5d1a191c985dc8189b988819985a5b1959606a1b604482015290519081900360640190fd5b6040516001907ff83de021914a4585482db5ca47d520a5657165b443fa2c7ef8ed4635f054da9b90600090a250505050505050565b60008060008060005b6144258661363f565b1561448e57836144425761443b61326d8761313e565b9250614483565b836001141561445e5761445761326d8761313e565b9150614483565b836002141561447e576144736112848761313e565b905060019450614483565b61448e565b83600101935061441c565b846144d4576040805162461bcd60e51b81526020600482015260116024820152701c9b1c08191958dbd9194819985a5b1959607a1b604482015290519081900360640190fd5b6001600160a01b038084166000908152600c60209081526040808320805460001901905560078252808320938616835292905281812081905590516002917ff83de021914a4585482db5ca47d520a5657165b443fa2c7ef8ed4635f054da9b91a2505050505050565b6000806000806000805b6145508761363f565b156145d5578461456d5761456661326d8861313e565b93506145ca565b84600114156145895761458261326d8861313e565b92506145ca565b84600214156145a55761459e61326d8861313e565b91506145ca565b84600314156145c5576145ba6112848861313e565b9050600195506145ca565b6145d5565b846001019450614547565b8561461b576040805162461bcd60e51b81526020600482015260116024820152701c9b1c08191958dbd9194819985a5b1959607a1b604482015290519081900360640190fd5b6001600160a01b038481166000908152600d602090815260408083208054600019019055600982528083208785168085528184528285209588168552948352818420849055825280832093835292905281812081905590516003917ff83de021914a4585482db5ca47d520a5657165b443fa2c7ef8ed4635f054da9b91a250505050505050565b6000818361472e5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156146f35781810151838201526020016146db565b50505050905090810190601f1680156147205780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858161473a57fe5b0495945050505050565b600081848411156147965760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156146f35781810151838201526020016146db565b505050900390565b6060815160011480156147d05750607f60f81b826000815181106147be57fe5b01602001516001600160f81b03191611155b156147dc575080611196565b612bf66147ee8351608060ff16614957565b836148da565b604080516020808252818301909252606091829190602082018180368337505050602081018490529050600067ffffffffffffffff1984166148385750601861485c565b6fffffffffffffffffffffffffffffffff1984166148585750601061485c565b5060005b60208110156148925781818151811061487157fe5b01602001516001600160f81b0319161561488a57614892565b60010161485c565b60008160200390506060816040519080825280601f01601f1916602001820160405280156148c7576020820181803683370190505b5080830196909652508452509192915050565b6060806040519050835180825260208201818101602087015b8183101561490b5780518352602092830192016148f3565b50855184518101855292509050808201602086015b81831015614938578051835260209283019201614920565b508651929092011591909101601f01601f191660405250905092915050565b60606801000000000000000083106149a7576040805162461bcd60e51b815260206004820152600e60248201526d696e70757420746f6f206c6f6e6760901b604482015290519081900360640190fd5b60408051600180825281830190925260609160208201818036833701905050905060378411614a015782840160f81b816000815181106149e357fe5b60200101906001600160f81b031916908160001a9053509050612bf6565b6060614a0c856147f4565b90508381510160370160f81b82600081518110614a2557fe5b60200101906001600160f81b031916908160001a905350614a4682826148da565b95945050505050565b8051600090614a6057506000611196565b6020820151805160001a9060c0821015614a7f57600092505050611196565b5060019392505050565b8051600090811a6080811015614aa3576000915050611196565b60b8811080614abe575060c08110801590614abe575060f881105b15614acd576001915050611196565b60c0811015614ae15760b519019050611196565b60f519019050611196565b80516000908190811a6080811015614b075760019150614c18565b60b8811015614b1c57607e1981019150614c18565b60c0811015614b9657600060b78203600186019550806020036101000a865104915060018101820193505080831015614b90576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b50614c18565b60f8811015614bab5760be1981019150614c18565b600060f78203600186019550806020036101000a865104915060018101820193505080831015614c16576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b505b5092915050565b8051600090601514614c3057600080fd5b612bf68261318c565b60006060614c52846402540be40063ffffffff612f0516565b60408051600480825260a0820190925291955060609190816020015b6060815260200190600190039081614c6e579050509050614c918760ff16612fac565b81600081518110614c9e57fe5b6020026020010181905250614cbb866001600160a01b0316612f89565b81600181518110614cc857fe5b6020026020010181905250614cdc85612fac565b81600281518110614ce957fe5b6020026020010181905250614d038463ffffffff16612fac565b81600381518110614d1057fe5b60200260200101819052506060614d2682612fbf565b94989497509395505050505050565b80614d3f57612e20565b5b60208110614d5f578251825260209283019290910190601f1901614d40565b915181516020939093036101000a6000190180199091169216919091179052565b600082614d8f57506000612bf6565b82820282848281614d9c57fe5b0414612efe5760405162461bcd60e51b8152600401808060200182810382526021815260200180614ec06021913960400191505060405180910390fd5b60405180606001604052806003906020820280368337509192915050565b6040518060400160405280614e0a614e17565b8152602001600081525090565b60405180604001604052806000815260200160008152509056fe7468652042534352656c61796572466565206d6f642074656e20646563696d616c73206d757374206265207a65726f7468652042534352656c61796572466565206d757374206265206c657373207468616e2072656c61796572466565746865206d696e44656c65676174696f6e206d7573742062652067726561746572207468616e2072656c61796572466565536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f777468652072656c61796572466565206d6f642074656e20646563696d616c73206d757374206265207a65726f746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e74726163747468652072656c61796572466565206d757374206265206c657373207468616e206d696e44656c65676174696f6e7468652072656c61796572466565206d757374206265206d6f7265207468616e2042534352656c61796572466565746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e7472616374a2646970667358221220066cc7c05d87e3cd20ecf3649deba7ac4ce8b389992969b6006793cbf330c73564736f6c63430006040033", + }, + ], + )] + .iter() + .cloned() + .collect(); + + pub static ref BONEH_UPGRADE_CONFIG: HashMap> = [ + ( + 56, + vec![ + UpgradeConfig { + contract_addr: "0x0000000000000000000000000000000000001000", + code: "6080604052600436106104405760003560e01c80638624988211610234578063c81b16621161012e578063e40716a1116100b6578063f9a2bbc71161007a578063f9a2bbc714610aeb578063fc3e590814610b00578063fccc281314610b15578063fd4ad81f14610b2a578063fd6a687914610b5957610447565b8063e40716a114610a79578063eb57e20214610a8e578063eda5868c14610aae578063f340fa0114610ac3578063f92eb86b14610ad657610447565b8063d86222d5116100fd578063d86222d514610a10578063daacdb6614610a25578063dc927faf14610a3a578063e086c7b114610a4f578063e1c7392a14610a6457610447565b8063c81b1662146109d1578063c8509d8114610809578063d04aa996146109e6578063d68fb56a146109fb57610447565b8063a5422d5c116101bc578063ad3c9da611610180578063ad3c9da614610965578063b7ab4db514610985578063b8cf4ef1146109a7578063bf9f4995146105e1578063c6d33945146109bc57610447565b8063a5422d5c146108f1578063a78abc1614610906578063aaf5eb681461091b578063ab51bb9614610930578063ac4317511461094557610447565b806396713da91161020357806396713da9146108885780639dc092621461089d5780639fe0f816146108b2578063a0dc2758146108c7578063a1a11bf5146108dc57610447565b806386249882146108295780638b5ad0c91461083e5780638d19a410146108535780639369d7de1461087357610447565b80634df6e0c3116103455780636969a25c116102cd5780637942fd05116102915780637942fd05146107ca5780637a84ca2a146107df57806381650b62146107f4578063831d65d114610809578063853230aa146107b557610447565b80636969a25c146107445780636e47b4821461077657806370fd5bad1461078b57806375d47a0a146107a057806378dfed4a146107b557610447565b806355614fcc1161031457806355614fcc146106c5578063565c56b3146106e55780635667515a146107055780635d77156c1461071a57806362b72cf51461072f57610447565b80634df6e0c3146106715780635192c82c1461068657806351e806721461069b578063549b03f2146106b057610447565b80633365af3a116103c85780633dffc387116103975780633dffc387146105e157806343756e5c1461060357806345cf9daf14610625578063493279b11461063a5780634bf6c8821461065c57610447565b80633365af3a1461056957806335409f7f146105895780633b071dcc146105a95780633de0f0d8146105cc57610447565b8063152ad3b81161040f578063152ad3b8146104dd5780631ff18069146104ff578063219f22d514610514578063300c356714610529578063321d398a1461054957610447565b806304c4fec61461044c57806307a56847146104635780630bee7a671461048e5780631182b875146104b057610447565b3661044757005b600080fd5b34801561045857600080fd5b50610461610b6e565b005b34801561046f57600080fd5b50610478610be0565b6040516104859190616a8b565b60405180910390f35b34801561049a57600080fd5b506104a3610be6565b6040516104859190616ab5565b3480156104bc57600080fd5b506104d06104cb366004615d88565b610beb565b6040516104859190616019565b3480156104e957600080fd5b506104f2610e23565b604051610485919061600e565b34801561050b57600080fd5b50610478610e2c565b34801561052057600080fd5b506104a3610e32565b34801561053557600080fd5b50610461610544366004615c51565b610e37565b34801561055557600080fd5b506104f2610564366004615d35565b611139565b34801561057557600080fd5b506104f2610584366004615d35565b611208565b34801561059557600080fd5b506104616105a4366004615c2a565b6112b9565b3480156105b557600080fd5b506105be611412565b604051610485929190615f24565b3480156105d857600080fd5b506104786116ee565b3480156105ed57600080fd5b506105f66116f4565b6040516104859190616ac6565b34801561060f57600080fd5b506106186116f9565b6040516104859190615ea2565b34801561063157600080fd5b506104786116ff565b34801561064657600080fd5b5061064f611705565b6040516104859190616a7c565b34801561066857600080fd5b506105f661170a565b34801561067d57600080fd5b506105be61170f565b34801561069257600080fd5b5061047861188d565b3480156106a757600080fd5b50610618611893565b3480156106bc57600080fd5b50610478611899565b3480156106d157600080fd5b506104f26106e0366004615c2a565b61189f565b3480156106f157600080fd5b50610478610700366004615c2a565b6118d4565b34801561071157600080fd5b506105f6611925565b34801561072657600080fd5b506104a361192a565b34801561073b57600080fd5b5061047861192f565b34801561075057600080fd5b5061076461075f366004615d35565b611935565b60405161048596959493929190615ecf565b34801561078257600080fd5b50610618611999565b34801561079757600080fd5b506105f661199f565b3480156107ac57600080fd5b506106186119a4565b3480156107c157600080fd5b506104786119aa565b3480156107d657600080fd5b506105f66119b0565b3480156107eb57600080fd5b506104786119b5565b34801561080057600080fd5b506104a36119bb565b34801561081557600080fd5b50610461610824366004615d88565b6119c0565b34801561083557600080fd5b50610478611a21565b34801561084a57600080fd5b50610478611a27565b34801561085f57600080fd5b5061047861086e366004615c2a565b611a2d565b34801561087f57600080fd5b50610461611a6d565b34801561089457600080fd5b506105f6611b81565b3480156108a957600080fd5b50610618611b86565b3480156108be57600080fd5b50610478611b8c565b3480156108d357600080fd5b50610478611b91565b3480156108e857600080fd5b50610618611b96565b3480156108fd57600080fd5b506104d0611b9c565b34801561091257600080fd5b506104f2611bbb565b34801561092757600080fd5b50610478611bc4565b34801561093c57600080fd5b506104a3611925565b34801561095157600080fd5b50610461610960366004615cd9565b611bcd565b34801561097157600080fd5b50610478610980366004615c2a565b61246c565b34801561099157600080fd5b5061099a61247e565b6040516104859190615f11565b3480156109b357600080fd5b50610478612562565b3480156109c857600080fd5b5061047861199f565b3480156109dd57600080fd5b50610618612567565b3480156109f257600080fd5b5061047861256d565b348015610a0757600080fd5b50610478612572565b348015610a1c57600080fd5b506104786125b1565b348015610a3157600080fd5b506104786125bd565b348015610a4657600080fd5b506106186125c3565b348015610a5b57600080fd5b506104786125c9565b348015610a7057600080fd5b506104616125ce565b348015610a8557600080fd5b5061047861277d565b348015610a9a57600080fd5b50610461610aa9366004615c2a565b612783565b348015610aba57600080fd5b506104a361288b565b610461610ad1366004615c2a565b612890565b348015610ae257600080fd5b50610478612b24565b348015610af757600080fd5b50610618612b2a565b348015610b0c57600080fd5b506105f6611b8c565b348015610b2157600080fd5b50610618612b30565b348015610b3657600080fd5b50610b4a610b45366004615d35565b612b36565b60405161048593929190616a94565b348015610b6557600080fd5b50610618612bf8565b6000610b7933611a2d565b9050600b8181548110610b8857fe5b600091825260209091206001601690920201015460ff16610bc45760405162461bcd60e51b8152600401610bbb90616744565b60405180910390fd5b6000610bce612572565b9050610bdb338383612bfe565b505050565b60095481565b606481565b60005460609060ff16610c105760405162461bcd60e51b8152600401610bbb906161d8565b3361200014610c315760405162461bcd60e51b8152600401610bbb90616923565b600b54610cef57610c40615916565b60015460005b81811015610ceb57600b80546001810182556000919091528351600080516020616b3e833981519152601690920291820190815560208086015160008051602061716d8339815191528401805460ff1916911515919091179055604086015180518794610cc793600080516020616b5e833981519152909101920190615945565b506060820151610cdd90600383019060136159bf565b505050806001019050610c46565b5050505b610cf76159ec565b6000610d3885858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612dec92505050565b9150915080610d5457610d4b6064612fa8565b92505050610e1c565b815160009060ff16610d7957610d7283602001518460400151613009565b9050610de8565b825160ff1660011415610de457826020015151600114610dbe57600080516020616b1e833981519152604051610dae9061662b565b60405180910390a1506067610ddf565b610d728360200151600081518110610dd257fe5b6020026020010151613c5d565b610de8565b5060655b63ffffffff8116610e0d5750506040805160008152602081019091529150610e1c9050565b610e1681612fa8565b93505050505b9392505050565b60075460ff1681565b60035481565b606881565b334114610e565760405162461bcd60e51b8152600401610bbb90616972565b6010544311610e775760405162461bcd60e51b8152600401610bbb90616334565b60005460ff16610e995760405162461bcd60e51b8152600401610bbb906161d8565b600f54610ea657600a600f555b600f546040516309a99b4f60e41b815260646110028031909302049190639a99b4f090610ed99030908590600401615eb6565b602060405180830381600087803b158015610ef357600080fd5b505af1158015610f07573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f2b9190615d4d565b905080610f38575061112f565b6000805b83811015610f6657848482818110610f5057fe5b6020029190910135929092019150600101610f3c565b5080610f7357505061112f565b60008080805b888110156111285784888883818110610f8e57fe5b90506020020135870281610f9e57fe5b049350898982818110610fad57fe5b9050602002016020810190610fc29190615c2a565b6001600160a01b038116600090815260046020526040902054909350915081156110de576000600180840381548110610ff757fe5b9060005260206000209060040201905080600201601c9054906101000a900460ff161561106457836001600160a01b03167fb9c75cbbfde137c4281689580799ef5f52144e78858f776a5979b2b212137d85866040516110579190616a8b565b60405180910390a26110d8565b600354611077908663ffffffff613dd416565b600390815581015461108f908663ffffffff613dd416565b60038201556040516001600160a01b038516907fcb0aad6cf9cd03bdf6137e359f541c42f38b39f007cae8e89e88aa7d8c6617b2906110cf908890616a8b565b60405180910390a25b50611120565b826001600160a01b03167fb9c75cbbfde137c4281689580799ef5f52144e78858f776a5979b2b212137d85856040516111179190616a8b565b60405180910390a25b600101610f79565b5050505050505b5050436010555050565b600154600090821061114d57506000611203565b60006001600160a01b03166001838154811061116557fe5b60009182526020909120600490910201546001600160a01b03161480611195575060085415806111955750600a54155b806111a4575060085460095410155b806111b557506111b382611208565b155b806111de57506000600b83815481106111ca57fe5b906000526020600020906016020160000154115b806111f2575060016111ee61247e565b5111155b156111ff57506000611203565b5060015b919050565b600154600090821061121c57506000611203565b600b548210611259576001828154811061123257fe5b9060005260206000209060040201600201601c9054906101000a900460ff16159050611203565b6001828154811061126657fe5b9060005260206000209060040201600201601c9054906101000a900460ff161580156112b35750600b828154811061129a57fe5b600091825260209091206001601690920201015460ff16155b92915050565b33611001146112da5760405162461bcd60e51b8152600401610bbb90616a33565b600b54611398576112e9615916565b60015460005b8181101561139457600b80546001810182556000919091528351600080516020616b3e833981519152601690920291820190815560208086015160008051602061716d8339815191528401805460ff191691151591909117905560408601518051879461137093600080516020616b5e833981519152909101920190615945565b50606082015161138690600383019060136159bf565b5050508060010190506112ef565b5050505b6001600160a01b038116600090815260046020526040902054806113bc575061140f565b6001810390506000600b82815481106113d157fe5b600091825260209091206001601690920201015460ff1690506113f48383613df9565b80156113fd5750805b15610bdb576009805460001901905550505b50565b60015460609081906000805b82811015611465576001818154811061143357fe5b9060005260206000209060040201600201601c9054906101000a900460ff1661145d576001909101905b60010161141e565b50606081604051908082528060200260200182016040528015611492578160200160208202803683370190505b5090506060826040519080825280602002602001820160405280156114cb57816020015b60608152602001906001900390816114b65790505b50600b54600094509091508414156116465760005b8481101561164057600181815481106114f557fe5b9060005260206000209060040201600201601c9054906101000a900460ff16611638576001818154811061152557fe5b600091825260209091206004909102015483516001600160a01b039091169084908690811061155057fe5b60200260200101906001600160a01b031690816001600160a01b031681525050600b818154811061157d57fe5b600091825260209182902060026016909202018101805460408051601f6000196101006001861615020190931694909404918201859004850284018501905280835291929091908301828280156116155780601f106115ea57610100808354040283529160200191611615565b820191906000526020600020905b8154815290600101906020018083116115f857829003601f168201915b505050505082858151811061162657fe5b60209081029190910101526001909301925b6001016114e0565b506116e2565b60005b848110156116e0576001818154811061165e57fe5b9060005260206000209060040201600201601c9054906101000a900460ff166116d8576001818154811061168e57fe5b600091825260209091206004909102015483516001600160a01b03909116908490869081106116b957fe5b6001600160a01b03909216602092830291909101909101526001909301925b600101611649565b505b909450925050505b9091565b61271081565b600181565b61100181565b60085481565b603881565b600881565b600e54600c54606091829180611723575060155b606061172d61247e565b9050606061173a826141ac565b9050828251116117515790945092506116ea915050565b83838351031015611763578282510393505b83156117995760c8430461177f83838388880360008a8a614317565b6117978383838888038989038a8b8b8b510301614317565b505b6060836040519080825280602002602001820160405280156117c5578160200160208202803683370190505b5090506060846040519080825280602002602001820160405280156117fe57816020015b60608152602001906001900390816117e95790505b50905060005b8581101561187f5784818151811061181857fe5b602002602001015183828151811061182c57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505083818151811061185857fe5b602002602001015182828151811061186c57fe5b6020908102919091010152600101611804565b509096509450505050509091565b60065481565b61200081565b600f5481565b6001600160a01b038116600090815260046020526040812054806118c7576000915050611203565b60001901610e1c81611208565b6001600160a01b038116600090815260046020526040812054806118fc576000915050611203565b60018082038154811061190b57fe5b906000526020600020906004020160030154915050919050565b600081565b606781565b60105481565b6001818154811061194257fe5b600091825260209091206004909102018054600182015460028301546003909301546001600160a01b0392831694509082169291821691600160a01b81046001600160401b031691600160e01b90910460ff169086565b61100581565b600281565b61100881565b6103e881565b600b81565b600c5481565b606681565b33612000146119e15760405162461bcd60e51b8152600401610bbb90616923565b7f41ce201247b6ceb957dcdb217d0b8acb50b9ea0e12af9af4f5e7f38902101605838383604051611a1493929190616ad4565b60405180910390a1505050565b60025481565b600a5481565b6001600160a01b03811660009081526004602052604081205480611a635760405162461bcd60e51b8152600401610bbb906168ab565b6000190192915050565b600b54611b2b57611a7c615916565b60015460005b81811015611b2757600b80546001810182556000919091528351600080516020616b3e833981519152601690920291820190815560208086015160008051602061716d8339815191528401805460ff1916911515919091179055604086015180518794611b0393600080516020616b5e833981519152909101920190615945565b506060820151611b1990600383019060136159bf565b505050806001019050611a82565b5050505b600854611b385760036008555b600a54611b45576002600a555b6000611b5033611a2d565b9050611b5b81611139565b611b775760405162461bcd60e51b8152600401610bbb906165e8565b61140f338261446e565b600981565b61100781565b600381565b60c881565b61100681565b6040518061062001604052806105ef8152602001616b7e6105ef913981565b60005460ff1681565b6402540be40081565b60005460ff16611bef5760405162461bcd60e51b8152600401610bbb906161d8565b3361100714611c105760405162461bcd60e51b8152600401610bbb906166b1565b611c7a84848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080518082019091526013815272065787069726554696d655365636f6e6447617606c1b602082015291506145069050565b15611d175760208114611c9f5760405162461bcd60e51b8152600401610bbb90616865565b604080516020601f8401819004810282018101909252828152600091611cdd9185858083850183828082843760009201919091525061455f92505050565b905060648110158015611cf35750620186a08111155b611d0f5760405162461bcd60e51b8152600401610bbb90616491565b600255612429565b611d7784848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260098152686275726e526174696f60b81b602082015291506145069050565b15611e135760208114611d9c5760405162461bcd60e51b8152600401610bbb9061605e565b604080516020601f8401819004810282018101909252828152600091611dda9185858083850183828082843760009201919091525061455f92505050565b9050612710811115611dfe5760405162461bcd60e51b8152600401610bbb90616376565b6006556007805460ff19166001179055612429565b611e7d84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260138152726d61784e756d4f664d61696e7461696e696e6760681b602082015291506145069050565b15611f175760208114611ea25760405162461bcd60e51b8152600401610bbb90616095565b604080516020601f8401819004810282018101909252828152600091611ee09185858083850183828082843760009201919091525061455f92505050565b600c5490915080611eef575060155b808210611f0e5760405162461bcd60e51b8152600401610bbb906163e9565b50600855612429565b611f8084848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260128152716d61696e7461696e536c6173685363616c6560701b602082015291506145069050565b1561200d5760208114611fa55760405162461bcd60e51b8152600401610bbb9061615e565b604080516020601f8401819004810282018101909252828152600091611fe39185858083850183828082843760009201919091525061455f92505050565b9050600081116120055760405162461bcd60e51b8152600401610bbb906169bf565b600a55612429565b61208184848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601981527f6d61784e756d4f66576f726b696e6743616e6469646174657300000000000000602082015291506145069050565b1561211057602081146120a65760405162461bcd60e51b8152600401610bbb90616112565b604080516020601f84018190048102820181019092528281526000916120e49185858083850183828082843760009201919091525061455f92505050565b9050600d548111156121085760405162461bcd60e51b8152600401610bbb90616507565b600e55612429565b61217984848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260128152716d61784e756d4f6643616e6469646174657360701b602082015291506145069050565b156121fb576020811461219e5760405162461bcd60e51b8152600401610bbb906166ff565b604080516020601f84018190048102820181019092528281526000916121dc9185858083850183828082843760009201919091525061455f92505050565b600d819055600e549091508110156121f557600d54600e555b50612429565b61225f84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600d81526c6e756d4f66436162696e65747360981b602082015291506145069050565b1561230d57602081146122845760405162461bcd60e51b8152600401610bbb906161a3565b604080516020601f84018190048102820181019092528281526000916122c29185858083850183828082843760009201919091525061455f92505050565b9050600081116122e45760405162461bcd60e51b8152600401610bbb90616246565b60298111156123055760405162461bcd60e51b8152600401610bbb9061628e565b600c55612429565b61237784848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601381527266696e616c697479526577617264526174696f60681b602082015291506145069050565b15612411576020811461239c5760405162461bcd60e51b8152600401610bbb906167e8565b604080516020601f84018190048102820181019092528281526000916123da9185858083850183828082843760009201919091525061455f92505050565b9050600181101580156123ed5750606481105b6124095760405162461bcd60e51b8152600401610bbb90616576565b600f55612429565b60405162461bcd60e51b8152600401610bbb90616a0c565b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a8484848460405161245e949392919061602c565b60405180910390a150505050565b60046020526000908152604090205481565b6001546060906000805b828110156124ad5761249981611208565b156124a5576001909101905b600101612488565b506060816040519080825280602002602001820160405280156124da578160200160208202803683370190505b5090506000915060005b83811015612559576124f581611208565b15612551576001818154811061250757fe5b600091825260209091206004909102015482516001600160a01b039091169083908590811061253257fe5b6001600160a01b03909216602092830291909101909101526001909201915b6001016124e4565b50925050505b90565b601581565b61100281565b600a81565b600061257c61247e565b519050600080600c5411612591576015612595565b600c545b9050808211156125a3578091505b816125ad57600191505b5090565b67016345785d8a000081565b60055481565b61100381565b602981565b60005460ff16156125f15760405162461bcd60e51b8152600401610bbb906167b1565b6125f96159ec565b600061261f6040518061062001604052806105ef8152602001616b7e6105ef9139612dec565b91509150806126405760405162461bcd60e51b8152600401610bbb906168e2565b60005b8260200151518110156127655760018360200151828151811061266257fe5b60209081029190910181015182546001818101855560009485528385208351600493840290910180546001600160a01b039283166001600160a01b03199182161782558587015182850180549185169183169190911790556040860151600283018054606089015160808a01511515600160e01b0260ff60e01b196001600160401b03909216600160a01b0267ffffffffffffffff60a01b199590981692909516919091179290921694909417161790915560a09093015160039093019290925591860151805191850193918590811061273857fe5b602090810291909101810151516001600160a01b0316825281019190915260400160002055600101612643565b50506103e8600255506000805460ff19166001179055565b600d5481565b33611001146127a45760405162461bcd60e51b8152600401610bbb90616a33565b600b54612862576127b3615916565b60015460005b8181101561285e57600b80546001810182556000919091528351600080516020616b3e833981519152601690920291820190815560208086015160008051602061716d8339815191528401805460ff191691151591909117905560408601518051879461283a93600080516020616b5e833981519152909101920190615945565b50606082015161285090600383019060136159bf565b5050508060010190506127b9565b5050505b600061286d82614564565b905061287881611139565b1561288757612887828261446e565b5050565b606581565b3341146128af5760405162461bcd60e51b8152600401610bbb90616972565b60005460ff166128d15760405162461bcd60e51b8152600401610bbb906161d8565b600034116128f15760405162461bcd60e51b8152600401610bbb906164d8565b6001600160a01b0381166000908152600460205260409020546007543491906103e89060ff161561292157506006545b6000831180156129315750600081115b156129de57600061295a61271061294e868563ffffffff61470716565b9063ffffffff61474116565b905080156129dc5760405161dead9082156108fc029083906000818181858888f19350505050158015612991573d6000803e3d6000fd5b507f627059660ea01c4733a328effb2294d2f86905bf806da763a89cee254de8bee5816040516129c19190616a8b565b60405180910390a16129d9848263ffffffff61478316565b93505b505b8115612adc5760006001808403815481106129f557fe5b9060005260206000209060040201905080600201601c9054906101000a900460ff1615612a6257846001600160a01b03167ff177e5d6c5764d79c32883ed824111d9b13f5668cf6ab1cc12dd36791dd955b485604051612a559190616a8b565b60405180910390a2612ad6565b600354612a75908563ffffffff613dd416565b6003908155810154612a8d908563ffffffff613dd416565b60038201556040516001600160a01b038616907f93a090ecc682c002995fad3c85b30c5651d7fd29b0be5da9d784a3302aedc05590612acd908790616a8b565b60405180910390a25b50612b1e565b836001600160a01b03167ff177e5d6c5764d79c32883ed824111d9b13f5668cf6ab1cc12dd36791dd955b484604051612b159190616a8b565b60405180910390a25b50505050565b600e5481565b61100081565b61dead81565b600b8181548110612b4357fe5b6000918252602091829020601691909102018054600180830154600280850180546040805161010096831615969096026000190190911692909204601f810188900488028501880190925281845293965060ff90911694919291830182828015612bee5780601f10612bc357610100808354040283529160200191612bee565b820191906000526020600020905b815481529060010190602001808311612bd157829003601f168201915b5050505050905083565b61100481565b6000600a5460001480612c0f575081155b80612c1a5750600954155b15612c2757506000610e1c565b600960008154809291906001900391905055506000612c74600a5461294e8561294e600b8981548110612c5657fe5b6000918252602090912060169091020154439063ffffffff61478316565b90506000600b8581548110612c8557fe5b906000526020600020906016020160010160006101000a81548160ff0219169083151502179055506000806110016001600160a01b0316638256ace66040518163ffffffff1660e01b8152600401604080518083038186803b158015612cea57600080fd5b505afa158015612cfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d229190615d65565b9150915060009350808310612d9c57612d3b8787613df9565b506040516305bfb49960e41b815261100190635bfb499090612d61908a90600401615ea2565b600060405180830381600087803b158015612d7b57600080fd5b505af1158015612d8f573d6000803e3d6000fd5b5050505060019350612dae565b818310612dae57612dac87614564565b505b6040516001600160a01b038816907fb9d38178dc641ff1817967a63c9078cbcd955a9f1fcd75e0e3636de615d44d3b90600090a25050509392505050565b612df46159ec565b6000612dfe6159ec565b612e06615a10565b612e17612e12866147c5565b6147ea565b90506000805b612e2683614834565b15612f9a5780612e4b57612e41612e3c84614855565b6148a3565b60ff168452612f92565b8060011415612f8d576060612e67612e6285614855565b614923565b90508051604051908082528060200260200182016040528015612ea457816020015b612e91615a30565b815260200190600190039081612e895790505b5085602001819052508051604051908082528060200260200182016040528015612ee257816020015b6060815260200190600190039081612ecd5790505b50604086015260005b8151811015612f8257612efc615a30565b60606000612f1c858581518110612f0f57fe5b60200260200101516149f4565b92509250925080612f3c578860009a509a50505050505050505050612fa3565b8289602001518581518110612f4d57fe5b60200260200101819052508189604001518581518110612f6957fe5b6020026020010181905250505050806001019050612eeb565b506001925050612f92565b612f9a565b600101612e1d565b50919350909150505b915091565b604080516001808252818301909252606091829190816020015b6060815260200190600190039081612fc2579050509050612fe88363ffffffff16614b12565b81600081518110612ff557fe5b6020026020010181905250610e1c81614b25565b600060298351111561304057600080516020616b1e833981519152604051613030906162eb565b60405180910390a15060666112b3565b60005b83518110156130de5760005b818110156130d55784818151811061306357fe5b6020026020010151600001516001600160a01b031685838151811061308457fe5b6020026020010151600001516001600160a01b031614156130cd57600080516020616b1e8339815191526040516130ba90616446565b60405180910390a16066925050506112b3565b60010161304f565b50600101613043565b506060806130ec8585614baf565b60015491935091506000908190815b818110156131715767016345785d8a00006001828154811061311957fe5b9060005260206000209060040201600301541061313b57600190930192613169565b60006001828154811061314a57fe5b9060005260206000209060040201600301541115613169576001909201915b6001016130fb565b5060608360405190808252806020026020018201604052801561319e578160200160208202803683370190505b5090506060846040519080825280602002602001820160405280156131cd578160200160208202803683370190505b5090506060856040519080825280602002602001820160405280156131fc578160200160208202803683370190505b50905060608660405190808252806020026020018201604052801561322b578160200160208202803683370190505b509050600060608760405190808252806020026020018201604052801561325c578160200160208202803683370190505b50905060608860405190808252806020026020018201604052801561328b578160200160208202803683370190505b509050600099506000985060006110046001600160a01b031663149d14d96040518163ffffffff1660e01b815260040160206040518083038186803b1580156132d357600080fd5b505afa1580156132e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061330b9190615d4d565b905067016345785d8a000081111561335657600080516020616b1e83398151915260405161333890616770565b60405180910390a160689d50505050505050505050505050506112b3565b60005b898110156135c75767016345785d8a00006001828154811061337757fe5b906000526020600020906004020160030154106134fd576001818154811061339b57fe5b906000526020600020906004020160020160009054906101000a90046001600160a01b0316898d815181106133cc57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060006402540be4006001838154811061340157fe5b9060005260206000209060040201600301548161341a57fe5b066001838154811061342857fe5b906000526020600020906004020160030154039050613450838261478390919063ffffffff16565b898e8151811061345c57fe5b6020026020010181815250506001828154811061347557fe5b906000526020600020906004020160020160009054906101000a90046001600160a01b0316878e815181106134a657fe5b60200260200101906001600160a01b031690816001600160a01b03168152505081888e815181106134d357fe5b60209081029190910101526134ee868263ffffffff613dd416565b6001909d019c95506135bf9050565b60006001828154811061350c57fe5b90600052602060002090600402016003015411156135bf576001818154811061353157fe5b906000526020600020906004020160010160009054906101000a90046001600160a01b0316848c8151811061356257fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506001818154811061358f57fe5b906000526020600020906004020160030154838c815181106135ad57fe5b60209081029190910101526001909a01995b600101613359565b506000841561383d576002546040516303702b2960e51b815261100491636e056520918891613601918e918e918d91420190600401615f94565b6020604051808303818588803b15801561361a57600080fd5b505af19350505050801561364b575060408051601f3d908101601f1916820190925261364891810190615cb9565b60015b6137c2576040516000815260443d101561366757506000613702565b60046000803e60005160e01c6308c379a08114613688576000915050613702565b60043d036004833e81513d60248201116001600160401b03821117156136b357600092505050613702565b80830180516001600160401b038111156136d4576000945050505050613702565b8060208301013d86018111156136f257600095505050505050613702565b601f01601f191660405250925050505b8061370d575061374f565b60019150857fa7cdeed7d0db45e3219a6e5d60838824c16f1d39991fcfe3f963029c844bf280826040516137419190616019565b60405180910390a2506137bd565b3d808015613779576040519150601f19603f3d011682016040523d82523d6000602084013e61377e565b606091505b5060019150857fbfa884552dd8921b6ce90bfe906952ae5b3b29be0cc1a951d4f62697635a3a45826040516137b39190616019565b60405180910390a2505b61383d565b8015613804577fa217d08e65f80c73121cd9db834d81652d544bfbf452f6d04922b16c90a37b70866040516137f79190616a8b565b60405180910390a161383b565b857fa7cdeed7d0db45e3219a6e5d60838824c16f1d39991fcfe3f963029c844bf280604051613832906160db565b60405180910390a25b505b80156139f35760005b87518110156139f157600088828151811061385d57fe5b6020026020010151905060006001828154811061387657fe5b60009182526020909120600160049092020181015481546001600160a01b03909116916108fc91859081106138a757fe5b9060005260206000209060040201600301549081150290604051600060405180830381858888f193505050509050801561396357600182815481106138e857fe5b60009182526020909120600160049092020181015481546001600160a01b03909116917f6c61d60f69a7beb3e1c80db7f39f37b208537cbb19da3174511b477812b2fc7d918590811061393757fe5b9060005260206000209060040201600301546040516139569190616a8b565b60405180910390a26139e7565b6001828154811061397057fe5b60009182526020909120600160049092020181015481546001600160a01b03909116917f25d0ce7d2f0cec669a8c17efe49d195c13455bb8872b65fa610ac7f53fe4ca7d91859081106139bf57fe5b9060005260206000209060040201600301546040516139de9190616a8b565b60405180910390a25b5050600101613846565b505b835115613b3d5760005b8451811015613b3b576000858281518110613a1457fe5b60200260200101516001600160a01b03166108fc868481518110613a3457fe5b60200260200101519081150290604051600060405180830381858888f1935050505090508015613aca57858281518110613a6a57fe5b60200260200101516001600160a01b03167f6c61d60f69a7beb3e1c80db7f39f37b208537cbb19da3174511b477812b2fc7d868481518110613aa857fe5b6020026020010151604051613abd9190616a8b565b60405180910390a2613b32565b858281518110613ad657fe5b60200260200101516001600160a01b03167f25d0ce7d2f0cec669a8c17efe49d195c13455bb8872b65fa610ac7f53fe4ca7d868481518110613b1457fe5b6020026020010151604051613b299190616a8b565b60405180910390a25b506001016139fd565b505b5050505050505050505050506000471115613bb9577f6ecc855f9440a9282c90913bbc91619fd44f5ec0b462af28d127b116f130aa4d47604051613b819190616a8b565b60405180910390a1604051611002904780156108fc02916000818181858888f19350505050158015613bb7573d6000803e3d6000fd5b505b60006003819055600555815115613bd457613bd48282614de8565b6110016001600160a01b031663fc4333cd6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015613c1157600080fd5b505af1158015613c25573d6000803e3d6000fd5b50506040517fedd8d7296956dd970ab4de3f2fc03be2b0ffc615d20cd4c72c6e44f928630ebf925060009150a1506000949350505050565b80516001600160a01b0316600090815260046020526040812054801580613cae5750600180820381548110613c8e57fe5b9060005260206000209060040201600201601c9054906101000a900460ff165b15613cf45782516040516001600160a01b03909116907fe209c46bebf57cf265d5d9009a00870e256d9150f3ed5281ab9d9eb3cec6e4be90600090a26000915050611203565b600154600554600019820111801590613d4a5784516040516001600160a01b03909116907fe209c46bebf57cf265d5d9009a00870e256d9150f3ed5281ab9d9eb3cec6e4be90600090a260009350505050611203565b600580546001908101909155805481906000198601908110613d6857fe5b6000918252602082206002600490920201018054921515600160e01b0260ff60e01b199093169290921790915585516040516001600160a01b03909116917ff226e7d8f547ff903d9d419cf5f54e0d7d07efa9584135a53a057c5f1f27f49a91a2506000949350505050565b600082820183811015610e1c5760405162461bcd60e51b8152600401610bbb9061620f565b60008060018381548110613e0957fe5b90600052602060002090600402016003015490506000600180805490500390506001613e3361247e565b5111613e6857600060018581548110613e4857fe5b9060005260206000209060040201600301819055506000925050506112b3565b846001600160a01b03167f3b6f9ef90462b512a1293ecec018670bf7b7f1876fb727590a8a6d7643130a7083604051613ea19190616a8b565b60405180910390a26001600160a01b038516600090815260046020526040812055835b6001546000190181101561408e5760018160010181548110613ee257fe5b906000526020600020906004020160018281548110613efd57fe5b60009182526020909120825460049092020180546001600160a01b03199081166001600160a01b0393841617825560018085015481840180548416918616919091179055600280860180549185018054909416919095161780835584546001600160401b03600160a01b91829004160267ffffffffffffffff60a01b1990911617808355935460ff600160e01b918290041615150260ff60e01b19909416939093179055600392830154920191909155600b805490918301908110613fbe57fe5b9060005260206000209060160201600b8281548110613fd957fe5b600091825260209091208254601690920201908155600180830154818301805460ff909216151560ff1990921691909117905560028084018054614030938386019390821615610100026000190190911604615a65565b5061404360038281019084016013615ada565b5090505080600101600460006001848154811061405c57fe5b600091825260208083206004909202909101546001600160a01b03168352820192909252604001902055600101613ec4565b50600180548061409a57fe5b60008281526020812060046000199093019283020180546001600160a01b0319908116825560018201805490911690556002810180546001600160e81b0319169055600301559055600b8054806140ed57fe5b60008281526020812060166000199093019283020181815560018101805460ff191690559061411f6002830182615b04565b61412d600383016000615b48565b50509055600081838161413c57fe5b04905080156141a05760015460005b8181101561419d57826001828154811061416157fe5b906000526020600020906004020160030154016001828154811061418157fe5b600091825260209091206003600490920201015560010161414b565b50505b50600195945050505050565b6001548151604080518281526020808402820101909152606092919083908280156141eb57816020015b60608152602001906001900390816141d65790505b50600b549091508314614202579250611203915050565b60005b8281101561430e57600b6004600088848151811061421f57fe5b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020548154811061425257fe5b600091825260209182902060026016909202018101805460408051601f6000196101006001861615020190931694909404918201859004850284018501905280835291929091908301828280156142ea5780601f106142bf576101008083540402835291602001916142ea565b820191906000526020600020905b8154815290600101906020018083116142cd57829003601f168201915b50505050508282815181106142fb57fe5b6020908102919091010152600101614205565b50949350505050565b60005b82811015614464576000828783880160405160200161433a929190615e94565b6040516020818303038152906040528051906020012060001c8161435a57fe5b0690508085018287011461445b576000898388018151811061437857fe5b602002602001015190506060898489018151811061439257fe5b602002602001015190508a838801815181106143aa57fe5b60200260200101518b858a01815181106143c057fe5b60200260200101906001600160a01b031690816001600160a01b031681525050818b848901815181106143ef57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050898388018151811061441d57fe5b60200260200101518a858a018151811061443357fe5b6020026020010181905250808a8489018151811061444d57fe5b602002602001018190525050505b5060010161431a565b5050505050505050565b600980546001908101909155600b80548390811061448857fe5b906000526020600020906016020160010160006101000a81548160ff02191690831515021790555043600b82815481106144be57fe5b600091825260208220601690910201919091556040516001600160a01b038416917ff62981a567ec3cec866c6fa93c55bcdf841d6292d18b8d522ececa769375d82d91a25050565b6000816040516020016145199190615e78565b60405160208183030381529060405280519060200120836040516020016145409190615e78565b6040516020818303038152906040528051906020012014905092915050565b015190565b6001600160a01b0381166000908152600460205260408120548061458d57506000199050611203565b6001810390506000600182815481106145a257fe5b90600052602060002090600402016003015490506000600183815481106145c557fe5b6000918252602090912060036004909202010155600154604051600019909101906001600160a01b038616907f8cd4e147d8af98a9e3b6724021b8bf6aed2e5dac71c38f2dce8161b82585b25d9061461e908590616a8b565b60405180910390a28061463657829350505050611203565b600081838161464157fe5b04905080156146fd5760005b8481101561469f57816001828154811061466357fe5b906000526020600020906004020160030154016001828154811061468357fe5b600091825260209091206003600490920201015560010161464d565b50600180549085015b818110156146fa5782600182815481106146be57fe5b90600052602060002090600402016003015401600182815481106146de57fe5b60009182526020909120600360049092020101556001016146a8565b50505b5091949350505050565b600082614716575060006112b3565b8282028284828161472357fe5b0414610e1c5760405162461bcd60e51b8152600401610bbb90616670565b6000610e1c83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061537d565b6000610e1c83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506153b4565b6147cd615b57565b506040805180820190915281518152602082810190820152919050565b6147f2615a10565b6147fb826153e0565b61480457600080fd5b6000614813836020015161541a565b60208085015160408051808201909152868152920190820152915050919050565b600061483e615b57565b505080518051602091820151919092015191011190565b61485d615b57565b61486682614834565b61486f57600080fd5b6020820151600061487f8261547d565b80830160209586015260408051808201909152908152938401919091525090919050565b8051600090158015906148b857508151602110155b6148c157600080fd5b60006148d0836020015161541a565b905080836000015110156148f65760405162461bcd60e51b8152600401610bbb9061682e565b82516020808501518301805192849003929183101561430e57506020919091036101000a90049392505050565b606061492e826153e0565b61493757600080fd5b60006149428361555e565b905060608160405190808252806020026020018201604052801561498057816020015b61496d615b57565b8152602001906001900390816149655790505b5090506000614992856020015161541a565b60208601510190506000805b848110156149e9576149af8361547d565b91506040518060400160405280838152602001848152508482815181106149d257fe5b60209081029190910101529181019160010161499e565b509195945050505050565b6149fc615a30565b60606000614a08615a30565b6060614a12615a10565b614a1b876147ea565b90506000805b614a2a83614834565b15614b035780614a5557614a45614a4084614855565b6155ba565b6001600160a01b03168552614afb565b8060011415614a7d57614a6a614a4084614855565b6001600160a01b03166020860152614afb565b8060021415614aa557614a92614a4084614855565b6001600160a01b03166040860152614afb565b8060031415614ad157614aba612e3c84614855565b6001600160401b0316606086015260019150614afb565b8060041415614af657614aeb614ae684614855565b6155d4565b935060019150614afb565b614b03565b600101614a21565b50929791965091945092505050565b60606112b3614b2083615644565b61572a565b6060815160001415614b465750604080516000815260208101909152611203565b606082600081518110614b5557fe5b602002602001015190506000600190505b8351811015614b9657614b8c82858381518110614b7f57fe5b602002602001015161577c565b9150600101614b66565b50610e1c614ba9825160c060ff166157f9565b8261577c565b606080600080808080614bc0612572565b6001549091505b8015614cce57600181039250600b8381548110614be057fe5b600091825260209091206001601690920201015460ff16614c0057614cc5565b60018381548110614c0d57fe5b60009182526020909120600490910201546001600160a01b03169450614c34858484612bfe565b9350831580614c47575060018a51038610155b15614c5157614cc5565b60005b8a51811015614cc357856001600160a01b03168b8281518110614c7357fe5b6020026020010151600001516001600160a01b03161415614cbb5760018b8281518110614c9c57fe5b6020908102919091010151901515608090910152600190960195614cc3565b600101614c54565b505b60001901614bc7565b5084895103604051908082528060200260200182016040528015614d0c57816020015b614cf9615a30565b815260200190600190039081614cf15790505b50965084895103604051908082528060200260200182016040528015614d4657816020015b6060815260200190600190039081614d315790505b5095506000915060005b8951811015614dda57898181518110614d6557fe5b602002602001015160800151614dd257898181518110614d8157fe5b6020026020010151888481518110614d9557fe5b6020026020010181905250888181518110614dac57fe5b6020026020010151878481518110614dc057fe5b60209081029190910101526001909201915b600101614d50565b5050505050505b9250929050565b600154825160005b82811015614e9f57614e00615a30565b60018281548110614e0d57fe5b600091825260208083206040805160c081018252600494850290920180546001600160a01b03908116808552600180840154831686880152600284015492831686860152600160a01b83046001600160401b03166060870152600160e01b90920460ff161515608086015260039092015460a09094019390935285529290915290822091909155919091019050614df0565b5080821115614f5e57805b82811015614f5c576001805480614ebd57fe5b60008281526020812060046000199093019283020180546001600160a01b0319908116825560018201805490911690556002810180546001600160e81b0319169055600301559055600b805480614f1057fe5b60008281526020812060166000199093019283020181815560018101805460ff1916905590614f426002830182615b04565b614f50600383016000615b48565b50509055600101614eaa565b505b6000818310614f6d5781614f6f565b825b905060005b8181101561512f578060010160046000888481518110614f9057fe5b6020026020010151600001516001600160a01b03166001600160a01b0316815260200190815260200160002081905550858181518110614fcc57fe5b602002602001015160018281548110614fe157fe5b6000918252602091829020835160049092020180546001600160a01b039283166001600160a01b0319918216178255928401516001820180549184169185169190911790556040840151600282018054606087015160808801511515600160e01b0260ff60e01b196001600160401b03909216600160a01b0267ffffffffffffffff60a01b1995909716929097169190911792909216939093171692909217905560a090910151600390910155845185908290811061509c57fe5b6020026020010151600b82815481106150b157fe5b906000526020600020906016020160020190805190602001906150d5929190615945565b506000600b82815481106150e557fe5b60009182526020822060169190910201600101805460ff191692151592909217909155600b80548390811061511657fe5b6000918252602090912060169091020155600101614f74565b508282111561530757615140615916565b835b838110156153045785818151811061515657fe5b60200260200101518260400181905250600187828151811061517457fe5b6020908102919091018101518254600181810185556000948552838520835160049093020180546001600160a01b039384166001600160a01b0319918216178255848601518284018054918616918316919091179055604080860151600284018054606089015160808a01511515600160e01b0260ff60e01b196001600160401b03909216600160a01b0267ffffffffffffffff60a01b1995909a1692909616919091179290921696909617169190911790935560a090930151600390930192909255600b8054928301815590935284516016909102600080516020616b3e83398151915281019182558583015160008051602061716d8339815191528201805491151560ff19909216919091179055928501518051869492936152aa93600080516020616b5e83398151915201920190615945565b5060608201516152c090600383019060136159bf565b50505080600101600460008984815181106152d757fe5b602090810291909101810151516001600160a01b0316825281019190915260400160002055600101615142565b50505b6000600981905560015493505b83811015615375576000600b828154811061532b57fe5b60009182526020822060169190910201600101805460ff191692151592909217909155600b80548390811061535c57fe5b6000918252602090912060169091020155600101615314565b505050505050565b6000818361539e5760405162461bcd60e51b8152600401610bbb9190616019565b5060008385816153aa57fe5b0495945050505050565b600081848411156153d85760405162461bcd60e51b8152600401610bbb9190616019565b505050900390565b80516000906153f157506000611203565b6020820151805160001a9060c082101561541057600092505050611203565b5060019392505050565b8051600090811a6080811015615434576000915050611203565b60b881108061544f575060c0811080159061544f575060f881105b1561545e576001915050611203565b60c08110156154725760b519019050611203565b60f519019050611203565b80516000908190811a60808110156154985760019150615557565b60b88110156154ad57607e1981019150615557565b60c08110156154fe57600060b78203600186019550806020036101000a8651049150600181018201935050808310156154f85760405162461bcd60e51b8152600401610bbb906165bd565b50615557565b60f88110156155135760be1981019150615557565b600060f78203600186019550806020036101000a8651049150600181018201935050808310156155555760405162461bcd60e51b8152600401610bbb906165bd565b505b5092915050565b805160009061556f57506000611203565b60008090506000615583846020015161541a565b602085015185519181019250015b808210156155b1576155a28261547d565b60019093019290910190615591565b50909392505050565b80516000906015146155cb57600080fd5b6112b3826148a3565b80516060906155e257600080fd5b60006155f1836020015161541a565b83516040805191839003808352601f19601f8201168301602001909152919250606090828015615628576020820181803683370190505b509050600081602001905061430e8487602001510182856158cb565b604080516020808252818301909252606091829190602082018180368337505050602081018490529050600067ffffffffffffffff198416615688575060186156ac565b6fffffffffffffffffffffffffffffffff1984166156a8575060106156ac565b5060005b60208110156156e2578181815181106156c157fe5b01602001516001600160f81b031916156156da576156e2565b6001016156ac565b60008160200390506060816040519080825280601f01601f191660200182016040528015615717576020820181803683370190505b5080830196909652508452509192915050565b60608151600114801561575c5750607f60f81b8260008151811061574a57fe5b01602001516001600160f81b03191611155b15615768575080611203565b6112b361577a8351608060ff166157f9565b835b6060806040519050835180825260208201818101602087015b818310156157ad578051835260209283019201615795565b50855184518101855292509050808201602086015b818310156157da5780518352602092830192016157c2565b508651929092011591909101601f01601f191660405250905092915050565b60606801000000000000000083106158235760405162461bcd60e51b8152600401610bbb906163c1565b6040805160018082528183019092526060916020820181803683370190505090506037841161587d5782840160f81b8160008151811061585f57fe5b60200101906001600160f81b031916908160001a90535090506112b3565b606061588885615644565b90508381510160370160f81b826000815181106158a157fe5b60200101906001600160f81b031916908160001a9053506158c2828261577c565b95945050505050565b806158d557610bdb565b5b602081106158f5578251825260209283019290910190601f19016158d6565b915181516020939093036101000a6000190180199091169216919091179052565b60405180608001604052806000815260200160001515815260200160608152602001615940615b71565b905290565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061598657805160ff19168380011785556159b3565b828001600101855582156159b3579182015b828111156159b3578251825591602001919060010190615998565b506125ad929150615b90565b82601381019282156159b357916020028201828111156159b3578251825591602001919060010190615998565b6040518060600160405280600060ff16815260200160608152602001606081525090565b6040518060400160405280615a23615b57565b8152602001600081525090565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915290565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10615a9e57805485556159b3565b828001600101855582156159b357600052602060002091601f016020900482015b828111156159b3578254825591600101919060010190615abf565b82601381019282156159b357918201828111156159b3578254825591600101919060010190615abf565b50805460018160011615610100020316600290046000825580601f10615b2a575061140f565b601f01602090049060005260206000209081019061140f9190615b90565b5061140f906013810190615b90565b604051806040016040528060008152602001600081525090565b6040518061026001604052806013906020820280368337509192915050565b61255f91905b808211156125ad5760008155600101615b96565b60008083601f840112615bbb578182fd5b5081356001600160401b03811115615bd1578182fd5b6020830191508360208083028501011115614de157600080fd5b60008083601f840112615bfc578182fd5b5081356001600160401b03811115615c12578182fd5b602083019150836020828501011115614de157600080fd5b600060208284031215615c3b578081fd5b81356001600160a01b0381168114610e1c578182fd5b60008060008060408587031215615c66578283fd5b84356001600160401b0380821115615c7c578485fd5b615c8888838901615baa565b90965094506020870135915080821115615ca0578384fd5b50615cad87828801615baa565b95989497509550505050565b600060208284031215615cca578081fd5b81518015158114610e1c578182fd5b60008060008060408587031215615cee578384fd5b84356001600160401b0380821115615d04578586fd5b615d1088838901615beb565b90965094506020870135915080821115615d28578384fd5b50615cad87828801615beb565b600060208284031215615d46578081fd5b5035919050565b600060208284031215615d5e578081fd5b5051919050565b60008060408385031215615d77578182fd5b505080516020909101519092909150565b600080600060408486031215615d9c578283fd5b833560ff81168114615dac578384fd5b925060208401356001600160401b03811115615dc6578283fd5b615dd286828701615beb565b9497909650939450505050565b6000815180845260208085019450808401835b83811015615e175781516001600160a01b031687529582019590820190600101615df2565b509495945050505050565b60008284528282602086013780602084860101526020601f19601f85011685010190509392505050565b60008151808452615e64816020860160208601616af1565b601f01601f19169290920160200192915050565b60008251615e8a818460208701616af1565b9190910192915050565b918252602082015260400190565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b03968716815294861660208601529290941660408401526001600160401b03166060830152911515608082015260a081019190915260c00190565b600060208252610e1c6020830184615ddf565b600060408252615f376040830185615ddf565b602083820381850152818551808452828401915082838202850101838801865b83811015615f8557601f19878403018552615f73838351615e4c565b94860194925090850190600101615f57565b50909998505050505050505050565b600060808252615fa76080830187615ddf565b828103602084810191909152865180835287820192820190845b81811015615fdd57845183529383019391830191600101615fc1565b50508481036040860152615ff18188615ddf565b93505050506001600160401b038316606083015295945050505050565b901515815260200190565b600060208252610e1c6020830184615e4c565b600060408252616040604083018688615e22565b8281036020840152616053818587615e22565b979650505050505050565b6020808252601c908201527f6c656e677468206f66206275726e526174696f206d69736d6174636800000000604082015260600190565b60208082526026908201527f6c656e677468206f66206d61784e756d4f664d61696e7461696e696e67206d696040820152650e6dac2e8c6d60d31b606082015260800190565b6020808252601b908201527f6261746368207472616e736665722072657475726e2066616c73650000000000604082015260600190565b6020808252602c908201527f6c656e677468206f66206d61784e756d4f66576f726b696e6743616e6469646160408201526b0e8cae640dad2e6dac2e8c6d60a31b606082015260800190565b60208082526025908201527f6c656e677468206f66206d61696e7461696e536c6173685363616c65206d69736040820152640dac2e8c6d60db1b606082015260800190565b6020808252818101527f6c656e677468206f66206e756d4f66436162696e657473206d69736d61746368604082015260600190565b60208082526019908201527f74686520636f6e7472616374206e6f7420696e69742079657400000000000000604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526028908201527f746865206e756d4f66436162696e657473206d75737420626520677265617465604082015267072207468616e20360c41b606082015260800190565b60208082526039908201527f746865206e756d4f66436162696e657473206d757374206265206c657373207460408201527f68616e204d41585f4e554d5f4f465f56414c494441544f525300000000000000606082015260800190565b60208082526029908201527f746865206e756d626572206f662076616c696461746f727320657863656564206040820152681d1a19481b1a5b5a5d60ba1b606082015260800190565b60208082526022908201527f63616e206e6f7420646f207468697320747769636520696e206f6e6520626c6f604082015261636b60f01b606082015260800190565b6020808252602b908201527f746865206275726e526174696f206d757374206265206e6f206772656174657260408201526a0207468616e2031303030360ac1b606082015260800190565b6020808252600e908201526d696e70757420746f6f206c6f6e6760901b604082015260600190565b60208082526037908201527f746865206d61784e756d4f664d61696e7461696e696e67206d7573742062652060408201527f6c657373207468616e206e756d4f66436162696e657473000000000000000000606082015260800190565b6020808252602b908201527f6475706c696361746520636f6e73656e7375732061646472657373206f66207660408201526a185b1a59185d1bdc94d95d60aa1b606082015260800190565b60208082526027908201527f7468652065787069726554696d655365636f6e64476170206973206f7574206f604082015266662072616e676560c81b606082015260800190565b6020808252601590820152746465706f7369742076616c7565206973207a65726f60581b604082015260600190565b60208082526049908201527f746865206d61784e756d4f66576f726b696e6743616e64696461746573206d7560408201527f7374206265206e6f742067726561746572207468616e206d61784e756d4f6643606082015268616e6469646174657360b81b608082015260a00190565b60208082526027908201527f7468652066696e616c697479526577617264526174696f206973206f7574206f604082015266662072616e676560c81b606082015260800190565b6020808252601190820152706164646974696f6e206f766572666c6f7760781b604082015260600190565b60208082526023908201527f63616e206e6f7420656e7465722054656d706f72617279204d61696e74656e616040820152626e636560e81b606082015260800190565b60208082526025908201527f6c656e677468206f66206a61696c2076616c696461746f7273206d757374206260408201526465206f6e6560d81b606082015260800190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252602e908201527f746865206d6573736167652073656e646572206d75737420626520676f76657260408201526d1b985b98d94818dbdb9d1c9858dd60921b606082015260800190565b60208082526025908201527f6c656e677468206f66206d61784e756d4f6643616e64696461746573206d69736040820152640dac2e8c6d60db1b606082015260800190565b6020808252601290820152716e6f7420696e206d61696e74656e616e636560701b604082015260600190565b60208082526021908201527f666565206973206c6172676572207468616e2044555354595f494e434f4d494e6040820152604760f81b606082015260800190565b60208082526019908201527f74686520636f6e747261637420616c726561647920696e697400000000000000604082015260600190565b60208082526026908201527f6c656e677468206f662066696e616c697479526577617264526174696f206d696040820152650e6dac2e8c6d60d31b606082015260800190565b6020808252601a908201527f6c656e677468206973206c657373207468616e206f6666736574000000000000604082015260600190565b60208082526026908201527f6c656e677468206f662065787069726554696d655365636f6e64476170206d696040820152650e6dac2e8c6d60d31b606082015260800190565b60208082526017908201527f6f6e6c792063757272656e742076616c696461746f7273000000000000000000604082015260600190565b60208082526021908201527f6661696c656420746f20706172736520696e69742076616c696461746f7253656040820152601d60fa1b606082015260800190565b6020808252602f908201527f746865206d6573736167652073656e646572206d7573742062652063726f737360408201526e0818da185a5b8818dbdb9d1c9858dd608a1b606082015260800190565b6020808252602d908201527f746865206d6573736167652073656e646572206d75737420626520746865206260408201526c3637b1b590383937b23ab1b2b960991b606082015260800190565b6020808252602d908201527f746865206d61696e7461696e536c6173685363616c65206d757374206265206760408201526c0726561746572207468616e203609c1b606082015260800190565b6020808252600d908201526c756e6b6e6f776e20706172616d60981b604082015260600190565b60208082526029908201527f746865206d6573736167652073656e646572206d75737420626520736c6173686040820152680818dbdb9d1c9858dd60ba1b606082015260800190565b61ffff91909116815260200190565b90815260200190565b60008482528315156020830152606060408301526158c26060830184615e4c565b63ffffffff91909116815260200190565b60ff91909116815260200190565b600060ff85168252604060208301526158c2604083018486615e22565b60005b83811015616b0c578181015183820152602001616af4565b83811115612b1e575050600091015256fe70e72399380dcfb0338abc03dc8d47f9f470ada8e769c9a78d644ea97385ecb20175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dbbf905ec80f905e8f846942a7cdd959bfe8d9487b2a43b33565295a698f7e294b6a7edd747c0554875d3fc531d19ba1497992c5e941ff80f3f7f110ffd8920a3ac38fdef318fe94a3f86048c27395000f846946488aa4d1955ee33403f8ccb1d4de5fb97c7ade294220f003d8bdfaadf52aa1e55ae4cc485e6794875941a87e90e440a39c99aa9cb5cea0ad6a3f0b2407b86048c27395000f846949ef9f4360c606c7ab4db26b016007d3ad0ab86a0946103af86a874b705854033438383c82575f25bc29418e2db06cbff3e3c5f856410a1838649e760175786048c27395000f84694ee01c3b1283aa067c58eab4709f85e99d46de5fe94ee4b9bfb1871c64e2bcabb1dc382dc8b7c4218a29415904ab26ab0e99d70b51c220ccdcccabee6e29786048c27395000f84694685b1ded8013785d6623cc18d214320b6bb6475994a20ef4e5e4e7e36258dbf51f4d905114cb1b34bc9413e39085dc88704f4394d35209a02b1a9520320c86048c27395000f8469478f3adfc719c99674c072166708589033e2d9afe9448a30d5eaa7b64492a160f139e2da2800ec3834e94055838358c29edf4dcc1ba1985ad58aedbb6be2b86048c27395000f84694c2be4ec20253b8642161bc3f444f53679c1f3d479466f50c616d737e60d7ca6311ff0d9c434197898a94d1d678a2506eeaa365056fe565df8bc8659f28b086048c27395000f846942f7be8361c80a4c1e7e9aaf001d0877f1cfde218945f93992ac37f3e61db2ef8a587a436a161fd210b94ecbc4fb1a97861344dad0867ca3cba2b860411f086048c27395000f84694ce2fd7544e0b2cc94692d4a704debef7bcb613289444abc67b4b2fba283c582387f54c9cba7c34bafa948acc2ab395ded08bb75ce85bf0f95ad2abc51ad586048c27395000f84694b8f7166496996a7da21cf1f1b04d9b3e26a3d077946770572763289aac606e4f327c2f6cc1aa3b3e3b94882d745ed97d4422ca8da1c22ec49d880c4c097286048c27395000f846942d4c407bbe49438ed859fe965b140dcf1aab71a9943ad0939e120f33518fbba04631afe7a3ed6327b194b2bbb170ca4e499a2b0f3cc85ebfa6e8c4dfcbea86048c27395000f846946bbad7cf34b5fa511d8e963dbba288b1960e75d694853b0f6c324d1f4e76c8266942337ac1b0af1a229442498946a51ca5924552ead6fc2af08b94fcba648601d1a94a2000f846944430b3230294d12c6ab2aac5c2cd68e80b16b581947b107f4976a252a6939b771202c28e64e03f52d694795811a7f214084116949fc4f53cedbf189eeab28601d1a94a2000f84694ea0a6e3c511bbd10f4519ece37dc24887e11b55d946811ca77acfb221a49393c193f3a22db829fcc8e9464feb7c04830dd9ace164fc5c52b3f5a29e5018a8601d1a94a2000f846947ae2f5b9e386cd1b50a4550696d957cb4900f03a94e83bcc5077e6b873995c24bac871b5ad856047e19464e48d4057a90b233e026c1041e6012ada897fe88601d1a94a2000f8469482012708dafc9e1b880fd083b32182b869be8e09948e5adc73a2d233a1b496ed3115464dd6c7b887509428b383d324bc9a37f4e276190796ba5a8947f5ed8601d1a94a2000f8469422b81f8e175ffde54d797fe11eb03f9e3bf75f1d94a1c3ef7ca38d8ba80cce3bfc53ebd2903ed21658942767f7447f7b9b70313d4147b795414aecea54718601d1a94a2000f8469468bf0b8b6fb4e317a0f9d6f03eaf8ce6675bc60d94675cfe570b7902623f47e7f59c9664b5f5065dcf94d84f0d2e50bcf00f2fc476e1c57f5ca2d57f625b8601d1a94a2000f846948c4d90829ce8f72d0163c1d5cf348a862d5506309485c42a7b34309bee2ed6a235f86d16f059deec5894cc2cedc53f0fa6d376336efb67e43d167169f3b78601d1a94a2000f8469435e7a025f4da968de7e4d7e4004197917f4070f194b1182abaeeb3b4d8eba7e6a4162eac7ace23d57394c4fd0d870da52e73de2dd8ded19fe3d26f43a1138601d1a94a2000f84694d6caa02bbebaebb5d7e581e4b66559e635f805ff94c07335cf083c1c46a487f0325769d88e163b653694efaff03b42e41f953a925fc43720e45fb61a19938601d1a94a20000175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dbaa264697066735822122015cd59f0391501fec72b3b76fb6b8a5fc1c08139d61323140cb645103379101864736f6c63430006040033", + }, + UpgradeConfig { + contract_addr: "0x0000000000000000000000000000000000001001", + code: "608060405234801561001057600080fd5b506004361061025e5760003560e01c8063831d65d111610146578063c81b1662116100c3578063dc927faf11610087578063dc927faf14610474578063e1c7392a1461047c578063f9a2bbc714610484578063fc3e59081461048c578063fc4333cd14610494578063fd6a68791461049c5761025e565b8063c81b16621461042b578063c8509d8114610433578063c96be4cb14610446578063cc844b7314610459578063d2a42e4b1461046c5761025e565b8063a78abc161161010a578063a78abc16146103eb578063ab51bb9614610400578063ac0af62914610408578063ac43175114610410578063c80d4b8f146104235761025e565b8063831d65d1146103b857806396713da9146103cb5780639bc8e4f2146103d35780639dc09262146103db578063a1a11bf5146103e35761025e565b80634bf6c882116101df5780636e47b482116101a35780636e47b4821461038857806370fd5bad1461039057806375d47a0a146103985780637912a65d146103a05780637942fd05146103a85780638256ace6146103b05761025e565b80634bf6c8821461035357806351e806721461035b578063567a372d146103635780635bfb49901461036b57806362b72cf5146103805761025e565b8063389f4f7111610226578063389f4f71146103045780633a63f4b1146103195780633dffc3871461032157806343756e5c14610336578063493279b11461033e5761025e565b80630bee7a67146102635780631182b8751461028157806323bac5a2146102a157806335aa2e44146102c357806337c8dab9146102e3575b600080fd5b61026b6104a4565b6040516102789190612f07565b60405180910390f35b61029461028f36600461278f565b6104a9565b6040516102789190612891565b6102b46102af36600461253d565b61050f565b60405161027893929190612eef565b6102d66102d136600461275f565b610532565b6040516102789190612859565b6102f66102f136600461253d565b610559565b604051610278929190612ee1565b61030c6105b0565b6040516102789190612ed8565b61030c6105b6565b6103296105bc565b6040516102789190612f18565b6102d66105c1565b6103466105c7565b6040516102789190612ec9565b6103296105cc565b6102d66105d1565b61030c6105d7565b61037e61037936600461253d565b6105dd565b005b61030c610688565b6102d661068e565b610329610694565b6102d6610699565b61030c61069f565b6103296106a4565b6102f66106a9565b61037e6103c636600461278f565b6106b3565b6103296107c5565b61030c6107ca565b6102d66107d5565b6102d66107db565b6103f36107e1565b6040516102789190612886565b61026b6107ea565b61030c6107ef565b61037e61041e366004612643565b6107f4565b61030c610ba8565b6102d6610bad565b61037e61044136600461278f565b610bb3565b61037e61045436600461253d565b610c24565b61037e6104673660046126ac565b610f9f565b61030c611475565b6102d661147a565b61037e611480565b6102d66114bc565b6103296114c2565b61037e6114c7565b6102d6611910565b606481565b606033612000146104d55760405162461bcd60e51b81526004016104cc90612d4f565b60405180910390fd5b60005460ff166104f75760405162461bcd60e51b81526004016104cc9061293d565b60405162461bcd60e51b81526004016104cc90612e12565b600260208190526000918252604090912080546001820154919092015460ff1683565b6001818154811061053f57fe5b6000918252602090912001546001600160a01b0316905081565b600080610564612324565b5050506001600160a01b0316600090815260026020818152604092839020835160608101855281548082526001830154938201849052919093015460ff16151592909301919091529091565b60055481565b60065481565b600181565b61100181565b603881565b600881565b61200081565b60045481565b33611000146105fe5760405162461bcd60e51b81526004016104cc90612b63565b60005460ff166106205760405162461bcd60e51b81526004016104cc9061293d565b61200063f7a251d7600b61063384611916565b60006040518463ffffffff1660e01b815260040161065393929190612f26565b600060405180830381600087803b15801561066d57600080fd5b505af1158015610681573d6000803e3d6000fd5b5050505050565b60035481565b61100581565b600281565b61100881565b603281565b600b81565b6004546005549091565b33612000146106d45760405162461bcd60e51b81526004016104cc90612d4f565b60005460ff166106f65760405162461bcd60e51b81526004016104cc9061293d565b6106fe612347565b600061073f84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506119e892505050565b9150915080156107865781516040517f7f0956d47419b9525356e7111652b653b530ec6f5096dccc04589bc38e6299679161077991612f07565b60405180910390a1610681565b81516040517f7d45f62d17443dd4547bca8a8112c60e2385669318dc300ec61a5d2492f262e7916107b691612f07565b60405180910390a15050505050565b600981565b662386f26fc1000081565b61100781565b61100681565b60005460ff1681565b600081565b600481565b60005460ff166108165760405162461bcd60e51b81526004016104cc9061293d565b33611007146108375760405162461bcd60e51b81526004016104cc90612c0c565b6108a284848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260148152731b5a5cd9195b59585b9bdc951a1c995cda1bdb1960621b60208201529150611a689050565b1561093d57602081146108c75760405162461bcd60e51b81526004016104cc90612aef565b604080516020601f840181900481028201810190925282815260009161090591858580838501838280828437600092019190915250611ac292505050565b905060018110158015610919575060055481105b6109355760405162461bcd60e51b81526004016104cc90612d0a565b600455610b65565b6109a384848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600f81526e19995b1bdb9e551a1c995cda1bdb19608a1b60208201529150611a689050565b15610a3f57602081146109c85760405162461bcd60e51b81526004016104cc90612c5a565b604080516020601f8401819004810282018101909252828152600091610a0691858580838501838280828437600092019190915250611ac292505050565b90506103e88111158015610a1b575060045481115b610a375760405162461bcd60e51b81526004016104cc906129ab565b600555610b65565b610ab384848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601881527f66696e616c697479536c617368526577617264526174696f000000000000000060208201529150611a689050565b15610b4d5760208114610ad85760405162461bcd60e51b81526004016104cc90612e49565b604080516020601f8401819004810282018101909252828152600091610b1691858580838501838280828437600092019190915250611ac292505050565b9050600a8110158015610b295750606481105b610b455760405162461bcd60e51b81526004016104cc90612aa3565b600655610b65565b60405162461bcd60e51b81526004016104cc90612deb565b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a84848484604051610b9a94939291906128a4565b60405180910390a150505050565b609681565b61100281565b3361200014610bd45760405162461bcd60e51b81526004016104cc90612d4f565b60005460ff16610bf65760405162461bcd60e51b81526004016104cc9061293d565b6040517f07db600eebe2ac176be8dcebad61858c245a4961bb32ca2aa3d159b09aa0810e90600090a1505050565b334114610c435760405162461bcd60e51b81526004016104cc90612d9e565b60005460ff16610c655760405162461bcd60e51b81526004016104cc9061293d565b6003544311610c865760405162461bcd60e51b81526004016104cc90612e94565b3a15610ca45760405162461bcd60e51b81526004016104cc90612bde565b60405163155853f360e21b8152611000906355614fcc90610cc9908490600401612859565b60206040518083038186803b158015610ce157600080fd5b505afa158015610cf5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d199190612623565b610d2257610f98565b610d2a612324565b506001600160a01b0381166000908152600260208181526040928390208351606081018552815481526001820154928101929092529091015460ff161580159282019290925290610d85576020810180516001019052610dde565b60016040820181905260208201819052805480820182556000919091527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf60180546001600160a01b0319166001600160a01b0384161790555b438152600554602082015181610df057fe5b06610ec657600060208201526040516335409f7f60e01b8152611000906335409f7f90610e21908590600401612859565b600060405180830381600087803b158015610e3b57600080fd5b505af1158015610e4f573d6000803e3d6000fd5b505050506120006001600160a01b031663f7a251d7600b610e6f85611916565b60006040518463ffffffff1660e01b8152600401610e8f93929190612f26565b600060405180830381600087803b158015610ea957600080fd5b505af1158015610ebd573d6000803e3d6000fd5b50505050610f32565b600454816020015181610ed557fe5b06610f32576040516375abf10160e11b81526110009063eb57e20290610eff908590600401612859565b600060405180830381600087803b158015610f1957600080fd5b505af1158015610f2d573d6000803e3d6000fd5b505050505b6001600160a01b0382166000818152600260208181526040808420865181559186015160018301558581015191909201805460ff1916911515919091179055517fddb6012116e51abf5436d956a4f0ebd927e92c576ff96d7918290c8782291e3e9190a2505b5043600355565b60005460ff16610fc15760405162461bcd60e51b81526004016104cc9061293d565b604051630a83aaa960e31b81526110069063541d554890610fe6903390600401612859565b60206040518083038186803b158015610ffe57600080fd5b505afa158015611012573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110369190612623565b6110525760405162461bcd60e51b81526004016104cc906128d6565b60065461105f5760146006555b8051514361010090910111801561108157504381602001516000015161010001115b61109d5760405162461bcd60e51b81526004016104cc9061290d565b8060200151602001518160000151602001511480156110cb5750806020015160600151816000015160600151145b156110e85760405162461bcd60e51b81526004016104cc90612b36565b8051604081015190511080156111075750602081015160408101519051105b6111235760405162461bcd60e51b81526004016104cc90612a3f565b6020810151518151511080156111485750806000015160400151816020015160400151105b8061117357508051516020820151511080156111735750806020015160400151816000015160400151105b8061118d5750806020015160400151816000015160400151145b6111a95760405162461bcd60e51b81526004016104cc90612974565b6060806110006001600160a01b0316633b071dcc6040518163ffffffff1660e01b815260040160006040518083038186803b1580156111e757600080fd5b505afa1580156111fb573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526112239190810190612560565b60408501519193509150600090815b83518110156112805761125884828151811061124a57fe5b602002602001015183611ac7565b156112785784818151811061126957fe5b60200260200101519250611280565b600101611232565b506001600160a01b0382166112a75760405162461bcd60e51b81526004016104cc90612a76565b6112b985600001518660400151611b2b565b80156112d257506112d285602001518660400151611b2b565b6112ee5760405162461bcd60e51b81526004016104cc906129e0565b6006546040516309a99b4f60e41b815260646110028031909302049190639a99b4f090611321903390859060040161286d565b602060405180830381600087803b15801561133b57600080fd5b505af115801561134f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113739190612777565b506040516335409f7f60e01b8152611000906335409f7f90611399908690600401612859565b600060405180830381600087803b1580156113b357600080fd5b505af11580156113c7573d6000803e3d6000fd5b505050506120006001600160a01b031663f7a251d7600b6113e786611916565b60006040518463ffffffff1660e01b815260040161140793929190612f26565b600060405180830381600087803b15801561142157600080fd5b505af1158015611435573d6000803e3d6000fd5b50506040516001600160a01b03861692507fddb6012116e51abf5436d956a4f0ebd927e92c576ff96d7918290c8782291e3e9150600090a2505050505050565b601481565b61100381565b60005460ff16156114a35760405162461bcd60e51b81526004016104cc90612c9c565b603260045560966005556000805460ff19166001179055565b61100081565b600381565b33611000146114e85760405162461bcd60e51b81526004016104cc90612b63565b60005460ff1661150a5760405162461bcd60e51b81526004016104cc9061293d565b6001546115165761190e565b600154600090600019015b8082116118e2576000805b828410156116455761153c612324565b600260006001878154811061154d57fe5b60009182526020808320909101546001600160a01b0316835282810193909352604091820190208151606081018352815481526001820154938101939093526002015460ff16151590820152600554909150600490048160200151111561162f576004600554816115ba57fe5b048160200151038160200181815250508060026000600188815481106115dc57fe5b6000918252602080832091909101546001600160a01b0316835282810193909352604091820190208351815591830151600183015591909101516002909101805460ff1916911515919091179055611639565b6001925050611645565b5060019093019261152c565b8284116117dc57611654612324565b600260006001868154811061166557fe5b60009182526020808320909101546001600160a01b0316835282810193909352604091820190208151606081018352815481526001820154938101939093526002015460ff16151590820152600554909150600490048160200151111561174d576004600554816116d257fe5b048160200151038160200181815250508060026000600187815481106116f457fe5b6000918252602080832091909101546001600160a01b03168352828101939093526040918201902083518155918301516001808401919091559201516002909101805460ff191691151591909117905591506117dc9050565b600260006001868154811061175e57fe5b60009182526020808320909101546001600160a01b031683528201929092526040018120818155600181810192909255600201805460ff191690558054806117a257fe5b600082815260209020810160001990810180546001600160a01b0319169055019055836117cf57506117dc565b5060001990920191611645565b8180156117e65750805b156118c55760026000600186815481106117fc57fe5b60009182526020808320909101546001600160a01b031683528201929092526040018120818155600181810192909255600201805460ff1916905580548490811061184357fe5b600091825260209091200154600180546001600160a01b03909216918690811061186957fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060018054806118a257fe5b600082815260209020810160001990810180546001600160a01b03191690550190555b826118d15750506118e2565b505060019091019060001901611521565b6040517fcfdb3b6ccaeccbdc68be3c59c840e3b3c90f0a7c491f5fff1cf56cfda200dd9c90600090a150505b565b61100481565b60408051600480825260a08201909252606091829190816020015b606081526020019060019003908161193157905050905061195a836001600160a01b0316611c76565b8160008151811061196757fe5b602002602001018190525061197b43611c99565b8160018151811061198857fe5b602090810291909101015261199d6038611c99565b816002815181106119aa57fe5b60200260200101819052506119be42611c99565b816003815181106119cb57fe5b60200260200101819052506119df81611cac565b9150505b919050565b6119f0612347565b60006119fa612347565b611a02612359565b611a13611a0e86611d36565b611d5b565b90506000805b611a2283611da5565b15611a5b5780611a4e57611a3d611a3884611dc6565b611e14565b63ffffffff16845260019150611a53565b611a5b565b600101611a19565b5091935090915050915091565b600081604051602001611a7b919061283d565b6040516020818303038152906040528051906020012083604051602001611aa2919061283d565b604051602081830303815290604052805190602001201490505b92915050565b015190565b815181516000916001918114808314611ae35760009250611b21565b600160208701838101602088015b600284838510011415611b1c578051835114611b105760009650600093505b60209283019201611af1565b505050505b5090949350505050565b60408051610110808252610140820190925260009160609190602082018180368337505060408051602080825281830190925292935060609291508082018180368337019050509050611b846020866000015183611e96565b611b92828260006020611e9c565b611ba26020866040015183611e96565b611baf8282602080611e9c565b611bbf6020866020015183611eef565b611bcd828260406020611e9c565b611bdd6020866060015183611eef565b611beb828260606020611e9c565b611bfd82866080015160806060611e9c565b611c0b828560e06030611e9c565b604080516001808252818301909252606091602082018180368337019050509050825160016020830182602087016064600019fa611c4857600080fd5b506001611c56826000611eff565b60ff1614611c6a5760009350505050611abc565b50600195945050505050565b60408051600560a21b83186014820152603481019091526060906119df81611f1b565b6060611abc611ca783611f71565b611f1b565b6060815160001415611ccd57506040805160008152602081019091526119e3565b606082600081518110611cdc57fe5b602002602001015190506000600190505b8351811015611d1d57611d1382858381518110611d0657fe5b6020026020010151612057565b9150600101611ced565b506119df611d30825160c060ff166120d4565b82612057565b611d3e612379565b506040805180820190915281518152602082810190820152919050565b611d63612359565b611d6c826121a6565b611d7557600080fd5b6000611d8483602001516121e0565b60208085015160408051808201909152868152920190820152915050919050565b6000611daf612379565b505080518051602091820151919092015191011190565b611dce612379565b611dd782611da5565b611de057600080fd5b60208201516000611df082612243565b80830160209586015260408051808201909152908152938401919091525090919050565b805160009015801590611e2957508151602110155b611e3257600080fd5b6000611e4183602001516121e0565b90508083600001511015611e675760405162461bcd60e51b81526004016104cc90612cd3565b825160208085015183018051928490039291831015611e8d57826020036101000a820491505b50949350505050565b90910152565b60005b8181101561068157838181518110611eb357fe5b602001015160f81c60f81b858480600101955081518110611ed057fe5b60200101906001600160f81b031916908160001a905350600101611e9f565b9091018181526020918201910152565b60008160010183511015611f1257600080fd5b50016001015190565b606081516001148015611f4d5750607f60f81b82600081518110611f3b57fe5b01602001516001600160f81b03191611155b15611f595750806119e3565b611abc611f6b8351608060ff166120d4565b83612057565b604080516020808252818301909252606091829190602082018180368337505050602081018490529050600067ffffffffffffffff198416611fb557506018611fd9565b6fffffffffffffffffffffffffffffffff198416611fd557506010611fd9565b5060005b602081101561200f57818181518110611fee57fe5b01602001516001600160f81b031916156120075761200f565b600101611fd9565b60008160200390506060816040519080825280601f01601f191660200182016040528015612044576020820181803683370190505b5080830196909652508452509192915050565b6060806040519050835180825260208201818101602087015b81831015612088578051835260209283019201612070565b50855184518101855292509050808201602086015b818310156120b557805183526020928301920161209d565b508651929092011591909101601f01601f191660405250905092915050565b60606801000000000000000083106120fe5760405162461bcd60e51b81526004016104cc90612a17565b604080516001808252818301909252606091602082018180368337019050509050603784116121585782840160f81b8160008151811061213a57fe5b60200101906001600160f81b031916908160001a9053509050611abc565b606061216385611f71565b90508381510160370160f81b8260008151811061217c57fe5b60200101906001600160f81b031916908160001a90535061219d8282612057565b95945050505050565b80516000906121b7575060006119e3565b6020820151805160001a9060c08210156121d6576000925050506119e3565b5060019392505050565b8051600090811a60808110156121fa5760009150506119e3565b60b8811080612215575060c08110801590612215575060f881105b156122245760019150506119e3565b60c08110156122385760b5190190506119e3565b60f5190190506119e3565b80516000908190811a608081101561225e576001915061231d565b60b881101561227357607e198101915061231d565b60c08110156122c457600060b78203600186019550806020036101000a8651049150600181018201935050808310156122be5760405162461bcd60e51b81526004016104cc90612bb3565b5061231d565b60f88110156122d95760be198101915061231d565b600060f78203600186019550806020036101000a86510491506001810182019350508083101561231b5760405162461bcd60e51b81526004016104cc90612bb3565b505b5092915050565b604051806060016040528060008152602001600081526020016000151581525090565b60408051602081019091526000815290565b604051806040016040528061236c612379565b8152602001600081525090565b604051806040016040528060008152602001600081525090565b600082601f8301126123a3578081fd5b81516123b66123b182612f79565b612f52565b818152915060208083019084810160005b8481101561242c578151870188603f8201126123e257600080fd5b838101516123f26123b182612f99565b81815260408b8184860101111561240857600080fd5b61241783888401838701612fbd565b508652505092820192908201906001016123c7565b505050505092915050565b60008083601f840112612448578182fd5b50813567ffffffffffffffff81111561245f578182fd5b60208301915083602082850101111561247757600080fd5b9250929050565b600082601f83011261248e578081fd5b813561249c6123b182612f99565b91508082528360208285010111156124b357600080fd5b8060208401602084013760009082016020015292915050565b600060a082840312156124dd578081fd5b6124e760a0612f52565b905081358152602082013560208201526040820135604082015260608201356060820152608082013567ffffffffffffffff81111561252557600080fd5b6125318482850161247e565b60808301525092915050565b60006020828403121561254e578081fd5b813561255981612fed565b9392505050565b60008060408385031215612572578081fd5b825167ffffffffffffffff80821115612589578283fd5b81850186601f82011261259a578384fd5b805192506125aa6123b184612f79565b80848252602080830192508084018a8283890287010111156125ca578788fd5b8794505b868510156125f55780516125e181612fed565b8452600194909401939281019281016125ce565b50880151909650935050508082111561260c578283fd5b5061261985828601612393565b9150509250929050565b600060208284031215612634578081fd5b81518015158114612559578182fd5b60008060008060408587031215612658578182fd5b843567ffffffffffffffff8082111561266f578384fd5b61267b88838901612437565b90965094506020870135915080821115612693578384fd5b506126a087828801612437565b95989497509550505050565b6000602082840312156126bd578081fd5b813567ffffffffffffffff808211156126d4578283fd5b818401606081870312156126e6578384fd5b6126f06060612f52565b9250803582811115612700578485fd5b61270c878284016124cc565b845250602081013582811115612720578485fd5b61272c878284016124cc565b602085015250604081013582811115612743578485fd5b61274f8782840161247e565b6040850152509195945050505050565b600060208284031215612770578081fd5b5035919050565b600060208284031215612788578081fd5b5051919050565b6000806000604084860312156127a3578283fd5b833560ff811681146127b3578384fd5b9250602084013567ffffffffffffffff8111156127ce578283fd5b6127da86828701612437565b9497909650939450505050565b60008284528282602086013780602084860101526020601f19601f85011685010190509392505050565b60008151808452612829816020860160208601612fbd565b601f01601f19169290920160200192915050565b6000825161284f818460208701612fbd565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b6000602082526125596020830184612811565b6000604082526128b86040830186886127e7565b82810360208401526128cb8185876127e7565b979650505050505050565b6020808252601f908201527f746865206d73672073656e646572206973206e6f7420612072656c6179657200604082015260600190565b6020808252601690820152751d1bdbc81bdb1908189b1bd8dac81a5b9d9bdb1d995960521b604082015260600190565b60208082526019908201527f74686520636f6e7472616374206e6f7420696e69742079657400000000000000604082015260600190565b6020808252601a908201527f6e6f2076696f6c6174696f6e206f6620766f74652072756c6573000000000000604082015260600190565b6020808252818101527f7468652066656c6f6e795468726573686f6c64206f7574206f662072616e6765604082015260600190565b60208082526017908201527f766572696679207369676e6174757265206661696c6564000000000000000000604082015260600190565b6020808252600e908201526d696e70757420746f6f206c6f6e6760901b604082015260600190565b60208082526019908201527f7372634e756d20626967676572207468616e207461724e756d00000000000000604082015260600190565b6020808252601390820152721d985b1a59185d1bdc881b9bdd08195e1a5cdd606a1b604082015260600190565b6020808252602c908201527f7468652066696e616c69747920736c6173682072657761726420726174696f2060408201526b6f7574206f662072616e676560a01b606082015260800190565b60208082526027908201527f6c656e677468206f66206d697364656d65616e6f725468726573686f6c64206d6040820152660d2e6dac2e8c6d60cb1b606082015260800190565b60208082526013908201527274776f206964656e746963616c20766f74657360681b604082015260600190565b60208082526030908201527f746865206d6573736167652073656e646572206d7573742062652076616c696460408201526f185d1bdc94d95d0818dbdb9d1c9858dd60821b606082015260800190565b6020808252601190820152706164646974696f6e206f766572666c6f7760781b604082015260600190565b6020808252601490820152736761737072696365206973206e6f74207a65726f60601b604082015260600190565b6020808252602e908201527f746865206d6573736167652073656e646572206d75737420626520676f76657260408201526d1b985b98d94818dbdb9d1c9858dd60921b606082015260800190565b60208082526022908201527f6c656e677468206f662066656c6f6e795468726573686f6c64206d69736d61746040820152610c6d60f31b606082015260800190565b60208082526019908201527f74686520636f6e747261637420616c726561647920696e697400000000000000604082015260600190565b6020808252601a908201527f6c656e677468206973206c657373207468616e206f6666736574000000000000604082015260600190565b60208082526025908201527f746865206d697364656d65616e6f725468726573686f6c64206f7574206f662060408201526472616e676560d81b606082015260800190565b6020808252602f908201527f746865206d6573736167652073656e646572206d7573742062652063726f737360408201526e0818da185a5b8818dbdb9d1c9858dd608a1b606082015260800190565b6020808252602d908201527f746865206d6573736167652073656e646572206d75737420626520746865206260408201526c3637b1b590383937b23ab1b2b960991b606082015260800190565b6020808252600d908201526c756e6b6e6f776e20706172616d60981b604082015260600190565b6020808252601e908201527f7265636569766520756e65787065637465642073796e207061636b6167650000604082015260600190565b6020808252602b908201527f6c656e677468206f662066696e616c697479536c61736852657761726452617460408201526a0d2de40dad2e6dac2e8c6d60ab1b606082015260800190565b6020808252818101527f63616e206e6f7420736c61736820747769636520696e206f6e6520626c6f636b604082015260600190565b61ffff91909116815260200190565b90815260200190565b918252602082015260400190565b92835260208301919091521515604082015260600190565b63ffffffff91909116815260200190565b60ff91909116815260200190565b600060ff8516825260606020830152612f426060830185612811565b9050826040830152949350505050565b60405181810167ffffffffffffffff81118282101715612f7157600080fd5b604052919050565b600067ffffffffffffffff821115612f8f578081fd5b5060209081020190565b600067ffffffffffffffff821115612faf578081fd5b50601f01601f191660200190565b60005b83811015612fd8578181015183820152602001612fc0565b83811115612fe7576000848401525b50505050565b6001600160a01b038116811461300257600080fd5b5056fea26469706673582212202300191f8f2ff186bb9d9864de2cefb4ad745ccdbca99ff7fd01ba99aa234be164736f6c63430006040033", + }, + UpgradeConfig { + contract_addr: "0x0000000000000000000000000000000000001002", + code: "60806040526004361061016a5760003560e01c806396713da9116100d1578063ac4317511161008a578063f9a2bbc711610064578063f9a2bbc7146104f0578063fb5478b314610505578063fc3e59081461051a578063fd6a68791461052f576101ae565b8063ac431751146103f7578063c81b1662146104c6578063dc927faf146104db576101ae565b806396713da9146103555780639a99b4f01461036a5780639dc09262146103a3578063a1a11bf5146103b8578063a78abc16146103cd578063ab51bb96146103e2576101ae565b806351e806721161012357806351e80672146102a55780636d70f7ae146102ba5780636e47b4821461030157806370fd5bad1461031657806375d47a0a1461032b5780637942fd0514610340576101ae565b80630bee7a67146101b35780633a0b0eff146101e15780633dffc3871461020857806343756e5c14610233578063493279b1146102645780634bf6c88214610290576101ae565b366101ae5734156101ac5760408051348152905133917f6c98249d85d88c3753a04a22230f595e4dc8d3dc86c34af35deeeedc861b89db919081900360200190a25b005b600080fd5b3480156101bf57600080fd5b506101c8610544565b6040805163ffffffff9092168252519081900360200190f35b3480156101ed57600080fd5b506101f6610549565b60408051918252519081900360200190f35b34801561021457600080fd5b5061021d61054f565b6040805160ff9092168252519081900360200190f35b34801561023f57600080fd5b50610248610554565b604080516001600160a01b039092168252519081900360200190f35b34801561027057600080fd5b5061027961055a565b6040805161ffff9092168252519081900360200190f35b34801561029c57600080fd5b5061021d61055f565b3480156102b157600080fd5b50610248610564565b3480156102c657600080fd5b506102ed600480360360208110156102dd57600080fd5b50356001600160a01b031661056a565b604080519115158252519081900360200190f35b34801561030d57600080fd5b50610248610588565b34801561032257600080fd5b5061021d61058e565b34801561033757600080fd5b50610248610593565b34801561034c57600080fd5b5061021d610599565b34801561036157600080fd5b5061021d61059e565b34801561037657600080fd5b506101f66004803603604081101561038d57600080fd5b506001600160a01b0381351690602001356105a3565b3480156103af57600080fd5b50610248610721565b3480156103c457600080fd5b50610248610727565b3480156103d957600080fd5b506102ed61072d565b3480156103ee57600080fd5b506101c8610736565b34801561040357600080fd5b506101ac6004803603604081101561041a57600080fd5b81019060208101813564010000000081111561043557600080fd5b82018360208201111561044757600080fd5b8035906020019184600183028401116401000000008311171561046957600080fd5b91939092909160208101903564010000000081111561048757600080fd5b82018360208201111561049957600080fd5b803590602001918460018302840111640100000000831117156104bb57600080fd5b50909250905061073b565b3480156104d257600080fd5b50610248610987565b3480156104e757600080fd5b5061024861098d565b3480156104fc57600080fd5b50610248610993565b34801561051157600080fd5b506101f6610999565b34801561052657600080fd5b5061021d6109a5565b34801561053b57600080fd5b506102486109aa565b606481565b60015481565b600181565b61100181565b603881565b600881565b61200081565b6001600160a01b031660009081526002602052604090205460ff1690565b61100581565b600281565b61100881565b600b81565b600981565b6000805460ff1661062057600260208190527fe57bda0a954a7c7381b17b2c763e646ba2c60f67292d287ba583603e2c1c41668054600160ff19918216811790925561100560009081527fe25235fc0de9d7165652bef0846fefda506174abb9a190f03d0f7bcc6146dbce80548316841790559282558254161790555b3360009081526002602052604090205460ff1661063f5750600061071b565b600047831061064e5747610650565b825b9050670de0b6b3a764000081111561066d5750670de0b6b3a76400005b80156106ee576040516001600160a01b0385169082156108fc029083906000818181858888f193505050501580156106a9573d6000803e3d6000fd5b506040805182815290516001600160a01b038616917ff8b71c64315fc33b2ead2adfa487955065152a8ac33d9d5193aafd7f45dc15a0919081900360200190a2610718565b6040517fe589651933c2457488cc0d8e0941518abf748e799435e4e396d9c4d0b2db2d4d90600090a15b90505b92915050565b61100781565b61100681565b60005460ff1681565b600081565b336110071461077b5760405162461bcd60e51b815260040180806020018281038252602e815260200180610a98602e913960400191505060405180910390fd5b6107e084848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600e81526d3ab83230ba32a7b832b930ba37b960911b602082015291506109b09050565b156108b857606082828080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050825192935050601490911490506108635760405162461bcd60e51b815260040180806020018281038252602f815260200180610ac6602f913960400191505060405180910390fd5b60148101516001600160a01b038116600081815260026020526040808220805460ff19166001179055517fac7475ed884e49421eb8233dba94b23e64245a7584b98b4b15745ca139014bc69190a250506108f5565b6040805162461bcd60e51b815260206004820152600d60248201526c756e6b6e6f776e20706172616d60981b604482015290519081900360640190fd5b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a848484846040518080602001806020018381038352878782818152602001925080828437600083820152601f01601f191690910184810383528581526020019050858580828437600083820152604051601f909101601f19169092018290039850909650505050505050a150505050565b61100281565b61100381565b61100081565b670de0b6b3a764000081565b600381565b61100481565b6000816040516020018082805190602001908083835b602083106109e55780518252601f1990920191602091820191016109c6565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120836040516020018082805190602001908083835b60208310610a535780518252601f199092019160209182019101610a34565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051602081830303815290604052805190602001201490509291505056fe746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e74726163746c656e677468206f662076616c756520666f72207570646174654f70657261746f722073686f756c64206265203230a264697066735822122092419cbd62645f3337b10ab0ec277c95bb1b6f88b85d7df5314db3b09e3958e064736f6c63430006040033", + }, + ], + ), + ( + 97, + vec![ + UpgradeConfig { + contract_addr: "0x0000000000000000000000000000000000001000", + code: "6080604052600436106104405760003560e01c80638624988211610234578063c81b16621161012e578063e40716a1116100b6578063f9a2bbc71161007a578063f9a2bbc714610aeb578063fc3e590814610b00578063fccc281314610b15578063fd4ad81f14610b2a578063fd6a687914610b5957610447565b8063e40716a114610a79578063eb57e20214610a8e578063eda5868c14610aae578063f340fa0114610ac3578063f92eb86b14610ad657610447565b8063d86222d5116100fd578063d86222d514610a10578063daacdb6614610a25578063dc927faf14610a3a578063e086c7b114610a4f578063e1c7392a14610a6457610447565b8063c81b1662146109d1578063c8509d8114610809578063d04aa996146109e6578063d68fb56a146109fb57610447565b8063a5422d5c116101bc578063ad3c9da611610180578063ad3c9da614610965578063b7ab4db514610985578063b8cf4ef1146109a7578063bf9f4995146105e1578063c6d33945146109bc57610447565b8063a5422d5c146108f1578063a78abc1614610906578063aaf5eb681461091b578063ab51bb9614610930578063ac4317511461094557610447565b806396713da91161020357806396713da9146108885780639dc092621461089d5780639fe0f816146108b2578063a0dc2758146108c7578063a1a11bf5146108dc57610447565b806386249882146108295780638b5ad0c91461083e5780638d19a410146108535780639369d7de1461087357610447565b80634df6e0c3116103455780636969a25c116102cd5780637942fd05116102915780637942fd05146107ca5780637a84ca2a146107df57806381650b62146107f4578063831d65d114610809578063853230aa146107b557610447565b80636969a25c146107445780636e47b4821461077657806370fd5bad1461078b57806375d47a0a146107a057806378dfed4a146107b557610447565b806355614fcc1161031457806355614fcc146106c5578063565c56b3146106e55780635667515a146107055780635d77156c1461071a57806362b72cf51461072f57610447565b80634df6e0c3146106715780635192c82c1461068657806351e806721461069b578063549b03f2146106b057610447565b80633365af3a116103c85780633dffc387116103975780633dffc387146105e157806343756e5c1461060357806345cf9daf14610625578063493279b11461063a5780634bf6c8821461065c57610447565b80633365af3a1461056957806335409f7f146105895780633b071dcc146105a95780633de0f0d8146105cc57610447565b8063152ad3b81161040f578063152ad3b8146104dd5780631ff18069146104ff578063219f22d514610514578063300c356714610529578063321d398a1461054957610447565b806304c4fec61461044c57806307a56847146104635780630bee7a671461048e5780631182b875146104b057610447565b3661044757005b600080fd5b34801561045857600080fd5b50610461610b6e565b005b34801561046f57600080fd5b50610478610be0565b6040516104859190616a8b565b60405180910390f35b34801561049a57600080fd5b506104a3610be6565b6040516104859190616ab5565b3480156104bc57600080fd5b506104d06104cb366004615d88565b610beb565b6040516104859190616019565b3480156104e957600080fd5b506104f2610e23565b604051610485919061600e565b34801561050b57600080fd5b50610478610e2c565b34801561052057600080fd5b506104a3610e32565b34801561053557600080fd5b50610461610544366004615c51565b610e37565b34801561055557600080fd5b506104f2610564366004615d35565b611139565b34801561057557600080fd5b506104f2610584366004615d35565b611208565b34801561059557600080fd5b506104616105a4366004615c2a565b6112b9565b3480156105b557600080fd5b506105be611412565b604051610485929190615f24565b3480156105d857600080fd5b506104786116ee565b3480156105ed57600080fd5b506105f66116f4565b6040516104859190616ac6565b34801561060f57600080fd5b506106186116f9565b6040516104859190615ea2565b34801561063157600080fd5b506104786116ff565b34801561064657600080fd5b5061064f611705565b6040516104859190616a7c565b34801561066857600080fd5b506105f661170a565b34801561067d57600080fd5b506105be61170f565b34801561069257600080fd5b5061047861188d565b3480156106a757600080fd5b50610618611893565b3480156106bc57600080fd5b50610478611899565b3480156106d157600080fd5b506104f26106e0366004615c2a565b61189f565b3480156106f157600080fd5b50610478610700366004615c2a565b6118d4565b34801561071157600080fd5b506105f6611925565b34801561072657600080fd5b506104a361192a565b34801561073b57600080fd5b5061047861192f565b34801561075057600080fd5b5061076461075f366004615d35565b611935565b60405161048596959493929190615ecf565b34801561078257600080fd5b50610618611999565b34801561079757600080fd5b506105f661199f565b3480156107ac57600080fd5b506106186119a4565b3480156107c157600080fd5b506104786119aa565b3480156107d657600080fd5b506105f66119b0565b3480156107eb57600080fd5b506104786119b5565b34801561080057600080fd5b506104a36119bb565b34801561081557600080fd5b50610461610824366004615d88565b6119c0565b34801561083557600080fd5b50610478611a21565b34801561084a57600080fd5b50610478611a27565b34801561085f57600080fd5b5061047861086e366004615c2a565b611a2d565b34801561087f57600080fd5b50610461611a6d565b34801561089457600080fd5b506105f6611b81565b3480156108a957600080fd5b50610618611b86565b3480156108be57600080fd5b50610478611b8c565b3480156108d357600080fd5b50610478611b91565b3480156108e857600080fd5b50610618611b96565b3480156108fd57600080fd5b506104d0611b9c565b34801561091257600080fd5b506104f2611bbb565b34801561092757600080fd5b50610478611bc4565b34801561093c57600080fd5b506104a3611925565b34801561095157600080fd5b50610461610960366004615cd9565b611bcd565b34801561097157600080fd5b50610478610980366004615c2a565b61246c565b34801561099157600080fd5b5061099a61247e565b6040516104859190615f11565b3480156109b357600080fd5b50610478612562565b3480156109c857600080fd5b5061047861199f565b3480156109dd57600080fd5b50610618612567565b3480156109f257600080fd5b5061047861256d565b348015610a0757600080fd5b50610478612572565b348015610a1c57600080fd5b506104786125b1565b348015610a3157600080fd5b506104786125bd565b348015610a4657600080fd5b506106186125c3565b348015610a5b57600080fd5b506104786125c9565b348015610a7057600080fd5b506104616125ce565b348015610a8557600080fd5b5061047861277d565b348015610a9a57600080fd5b50610461610aa9366004615c2a565b612783565b348015610aba57600080fd5b506104a361288b565b610461610ad1366004615c2a565b612890565b348015610ae257600080fd5b50610478612b24565b348015610af757600080fd5b50610618612b2a565b348015610b0c57600080fd5b506105f6611b8c565b348015610b2157600080fd5b50610618612b30565b348015610b3657600080fd5b50610b4a610b45366004615d35565b612b36565b60405161048593929190616a94565b348015610b6557600080fd5b50610618612bf8565b6000610b7933611a2d565b9050600b8181548110610b8857fe5b600091825260209091206001601690920201015460ff16610bc45760405162461bcd60e51b8152600401610bbb90616744565b60405180910390fd5b6000610bce612572565b9050610bdb338383612bfe565b505050565b60095481565b606481565b60005460609060ff16610c105760405162461bcd60e51b8152600401610bbb906161d8565b3361200014610c315760405162461bcd60e51b8152600401610bbb90616923565b600b54610cef57610c40615916565b60015460005b81811015610ceb57600b80546001810182556000919091528351600080516020616ce98339815191526016909202918201908155602080860151600080516020616d298339815191528401805460ff1916911515919091179055604086015180518794610cc793600080516020616d09833981519152909101920190615945565b506060820151610cdd90600383019060136159bf565b505050806001019050610c46565b5050505b610cf76159ec565b6000610d3885858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612dec92505050565b9150915080610d5457610d4b6064612fa8565b92505050610e1c565b815160009060ff16610d7957610d7283602001518460400151613009565b9050610de8565b825160ff1660011415610de457826020015151600114610dbe57600080516020616cc9833981519152604051610dae9061662b565b60405180910390a1506067610ddf565b610d728360200151600081518110610dd257fe5b6020026020010151613c5d565b610de8565b5060655b63ffffffff8116610e0d5750506040805160008152602081019091529150610e1c9050565b610e1681612fa8565b93505050505b9392505050565b60075460ff1681565b60035481565b606881565b334114610e565760405162461bcd60e51b8152600401610bbb90616972565b6010544311610e775760405162461bcd60e51b8152600401610bbb90616334565b60005460ff16610e995760405162461bcd60e51b8152600401610bbb906161d8565b600f54610ea657600a600f555b600f546040516309a99b4f60e41b815260646110028031909302049190639a99b4f090610ed99030908590600401615eb6565b602060405180830381600087803b158015610ef357600080fd5b505af1158015610f07573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f2b9190615d4d565b905080610f38575061112f565b6000805b83811015610f6657848482818110610f5057fe5b6020029190910135929092019150600101610f3c565b5080610f7357505061112f565b60008080805b888110156111285784888883818110610f8e57fe5b90506020020135870281610f9e57fe5b049350898982818110610fad57fe5b9050602002016020810190610fc29190615c2a565b6001600160a01b038116600090815260046020526040902054909350915081156110de576000600180840381548110610ff757fe5b9060005260206000209060040201905080600201601c9054906101000a900460ff161561106457836001600160a01b03167fb9c75cbbfde137c4281689580799ef5f52144e78858f776a5979b2b212137d85866040516110579190616a8b565b60405180910390a26110d8565b600354611077908663ffffffff613dd416565b600390815581015461108f908663ffffffff613dd416565b60038201556040516001600160a01b038516907fcb0aad6cf9cd03bdf6137e359f541c42f38b39f007cae8e89e88aa7d8c6617b2906110cf908890616a8b565b60405180910390a25b50611120565b826001600160a01b03167fb9c75cbbfde137c4281689580799ef5f52144e78858f776a5979b2b212137d85856040516111179190616a8b565b60405180910390a25b600101610f79565b5050505050505b5050436010555050565b600154600090821061114d57506000611203565b60006001600160a01b03166001838154811061116557fe5b60009182526020909120600490910201546001600160a01b03161480611195575060085415806111955750600a54155b806111a4575060085460095410155b806111b557506111b382611208565b155b806111de57506000600b83815481106111ca57fe5b906000526020600020906016020160000154115b806111f2575060016111ee61247e565b5111155b156111ff57506000611203565b5060015b919050565b600154600090821061121c57506000611203565b600b548210611259576001828154811061123257fe5b9060005260206000209060040201600201601c9054906101000a900460ff16159050611203565b6001828154811061126657fe5b9060005260206000209060040201600201601c9054906101000a900460ff161580156112b35750600b828154811061129a57fe5b600091825260209091206001601690920201015460ff16155b92915050565b33611001146112da5760405162461bcd60e51b8152600401610bbb90616a33565b600b54611398576112e9615916565b60015460005b8181101561139457600b80546001810182556000919091528351600080516020616ce98339815191526016909202918201908155602080860151600080516020616d298339815191528401805460ff191691151591909117905560408601518051879461137093600080516020616d09833981519152909101920190615945565b50606082015161138690600383019060136159bf565b5050508060010190506112ef565b5050505b6001600160a01b038116600090815260046020526040902054806113bc575061140f565b6001810390506000600b82815481106113d157fe5b600091825260209091206001601690920201015460ff1690506113f48383613df9565b80156113fd5750805b15610bdb576009805460001901905550505b50565b60015460609081906000805b82811015611465576001818154811061143357fe5b9060005260206000209060040201600201601c9054906101000a900460ff1661145d576001909101905b60010161141e565b50606081604051908082528060200260200182016040528015611492578160200160208202803683370190505b5090506060826040519080825280602002602001820160405280156114cb57816020015b60608152602001906001900390816114b65790505b50600b54600094509091508414156116465760005b8481101561164057600181815481106114f557fe5b9060005260206000209060040201600201601c9054906101000a900460ff16611638576001818154811061152557fe5b600091825260209091206004909102015483516001600160a01b039091169084908690811061155057fe5b60200260200101906001600160a01b031690816001600160a01b031681525050600b818154811061157d57fe5b600091825260209182902060026016909202018101805460408051601f6000196101006001861615020190931694909404918201859004850284018501905280835291929091908301828280156116155780601f106115ea57610100808354040283529160200191611615565b820191906000526020600020905b8154815290600101906020018083116115f857829003601f168201915b505050505082858151811061162657fe5b60209081029190910101526001909301925b6001016114e0565b506116e2565b60005b848110156116e0576001818154811061165e57fe5b9060005260206000209060040201600201601c9054906101000a900460ff166116d8576001818154811061168e57fe5b600091825260209091206004909102015483516001600160a01b03909116908490869081106116b957fe5b6001600160a01b03909216602092830291909101909101526001909301925b600101611649565b505b909450925050505b9091565b61271081565b600181565b61100181565b60085481565b606181565b600881565b600e54600c54606091829180611723575060155b606061172d61247e565b9050606061173a826141ac565b9050828251116117515790945092506116ea915050565b83838351031015611763578282510393505b83156117995760c8430461177f83838388880360008a8a614317565b6117978383838888038989038a8b8b8b510301614317565b505b6060836040519080825280602002602001820160405280156117c5578160200160208202803683370190505b5090506060846040519080825280602002602001820160405280156117fe57816020015b60608152602001906001900390816117e95790505b50905060005b8581101561187f5784818151811061181857fe5b602002602001015183828151811061182c57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505083818151811061185857fe5b602002602001015182828151811061186c57fe5b6020908102919091010152600101611804565b509096509450505050509091565b60065481565b61200081565b600f5481565b6001600160a01b038116600090815260046020526040812054806118c7576000915050611203565b60001901610e1c81611208565b6001600160a01b038116600090815260046020526040812054806118fc576000915050611203565b60018082038154811061190b57fe5b906000526020600020906004020160030154915050919050565b600081565b606781565b60105481565b6001818154811061194257fe5b600091825260209091206004909102018054600182015460028301546003909301546001600160a01b0392831694509082169291821691600160a01b81046001600160401b031691600160e01b90910460ff169086565b61100581565b600281565b61100881565b6103e881565b600b81565b600c5481565b606681565b33612000146119e15760405162461bcd60e51b8152600401610bbb90616923565b7f41ce201247b6ceb957dcdb217d0b8acb50b9ea0e12af9af4f5e7f38902101605838383604051611a1493929190616ad4565b60405180910390a1505050565b60025481565b600a5481565b6001600160a01b03811660009081526004602052604081205480611a635760405162461bcd60e51b8152600401610bbb906168ab565b6000190192915050565b600b54611b2b57611a7c615916565b60015460005b81811015611b2757600b80546001810182556000919091528351600080516020616ce98339815191526016909202918201908155602080860151600080516020616d298339815191528401805460ff1916911515919091179055604086015180518794611b0393600080516020616d09833981519152909101920190615945565b506060820151611b1990600383019060136159bf565b505050806001019050611a82565b5050505b600854611b385760036008555b600a54611b45576002600a555b6000611b5033611a2d565b9050611b5b81611139565b611b775760405162461bcd60e51b8152600401610bbb906165e8565b61140f338261446e565b600981565b61100781565b600381565b60c881565b61100681565b604051806101e001604052806101ab8152602001616b1e6101ab913981565b60005460ff1681565b6402540be40081565b60005460ff16611bef5760405162461bcd60e51b8152600401610bbb906161d8565b3361100714611c105760405162461bcd60e51b8152600401610bbb906166b1565b611c7a84848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080518082019091526013815272065787069726554696d655365636f6e6447617606c1b602082015291506145069050565b15611d175760208114611c9f5760405162461bcd60e51b8152600401610bbb90616865565b604080516020601f8401819004810282018101909252828152600091611cdd9185858083850183828082843760009201919091525061455f92505050565b905060648110158015611cf35750620186a08111155b611d0f5760405162461bcd60e51b8152600401610bbb90616491565b600255612429565b611d7784848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260098152686275726e526174696f60b81b602082015291506145069050565b15611e135760208114611d9c5760405162461bcd60e51b8152600401610bbb9061605e565b604080516020601f8401819004810282018101909252828152600091611dda9185858083850183828082843760009201919091525061455f92505050565b9050612710811115611dfe5760405162461bcd60e51b8152600401610bbb90616376565b6006556007805460ff19166001179055612429565b611e7d84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260138152726d61784e756d4f664d61696e7461696e696e6760681b602082015291506145069050565b15611f175760208114611ea25760405162461bcd60e51b8152600401610bbb90616095565b604080516020601f8401819004810282018101909252828152600091611ee09185858083850183828082843760009201919091525061455f92505050565b600c5490915080611eef575060155b808210611f0e5760405162461bcd60e51b8152600401610bbb906163e9565b50600855612429565b611f8084848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260128152716d61696e7461696e536c6173685363616c6560701b602082015291506145069050565b1561200d5760208114611fa55760405162461bcd60e51b8152600401610bbb9061615e565b604080516020601f8401819004810282018101909252828152600091611fe39185858083850183828082843760009201919091525061455f92505050565b9050600081116120055760405162461bcd60e51b8152600401610bbb906169bf565b600a55612429565b61208184848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601981527f6d61784e756d4f66576f726b696e6743616e6469646174657300000000000000602082015291506145069050565b1561211057602081146120a65760405162461bcd60e51b8152600401610bbb90616112565b604080516020601f84018190048102820181019092528281526000916120e49185858083850183828082843760009201919091525061455f92505050565b9050600d548111156121085760405162461bcd60e51b8152600401610bbb90616507565b600e55612429565b61217984848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260128152716d61784e756d4f6643616e6469646174657360701b602082015291506145069050565b156121fb576020811461219e5760405162461bcd60e51b8152600401610bbb906166ff565b604080516020601f84018190048102820181019092528281526000916121dc9185858083850183828082843760009201919091525061455f92505050565b600d819055600e549091508110156121f557600d54600e555b50612429565b61225f84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600d81526c6e756d4f66436162696e65747360981b602082015291506145069050565b1561230d57602081146122845760405162461bcd60e51b8152600401610bbb906161a3565b604080516020601f84018190048102820181019092528281526000916122c29185858083850183828082843760009201919091525061455f92505050565b9050600081116122e45760405162461bcd60e51b8152600401610bbb90616246565b60298111156123055760405162461bcd60e51b8152600401610bbb9061628e565b600c55612429565b61237784848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601381527266696e616c697479526577617264526174696f60681b602082015291506145069050565b15612411576020811461239c5760405162461bcd60e51b8152600401610bbb906167e8565b604080516020601f84018190048102820181019092528281526000916123da9185858083850183828082843760009201919091525061455f92505050565b9050600181101580156123ed5750606481105b6124095760405162461bcd60e51b8152600401610bbb90616576565b600f55612429565b60405162461bcd60e51b8152600401610bbb90616a0c565b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a8484848460405161245e949392919061602c565b60405180910390a150505050565b60046020526000908152604090205481565b6001546060906000805b828110156124ad5761249981611208565b156124a5576001909101905b600101612488565b506060816040519080825280602002602001820160405280156124da578160200160208202803683370190505b5090506000915060005b83811015612559576124f581611208565b15612551576001818154811061250757fe5b600091825260209091206004909102015482516001600160a01b039091169083908590811061253257fe5b6001600160a01b03909216602092830291909101909101526001909201915b6001016124e4565b50925050505b90565b601581565b61100281565b600a81565b600061257c61247e565b519050600080600c5411612591576015612595565b600c545b9050808211156125a3578091505b816125ad57600191505b5090565b67016345785d8a000081565b60055481565b61100381565b602981565b60005460ff16156125f15760405162461bcd60e51b8152600401610bbb906167b1565b6125f96159ec565b600061261f604051806101e001604052806101ab8152602001616b1e6101ab9139612dec565b91509150806126405760405162461bcd60e51b8152600401610bbb906168e2565b60005b8260200151518110156127655760018360200151828151811061266257fe5b60209081029190910181015182546001818101855560009485528385208351600493840290910180546001600160a01b039283166001600160a01b03199182161782558587015182850180549185169183169190911790556040860151600283018054606089015160808a01511515600160e01b0260ff60e01b196001600160401b03909216600160a01b0267ffffffffffffffff60a01b199590981692909516919091179290921694909417161790915560a09093015160039093019290925591860151805191850193918590811061273857fe5b602090810291909101810151516001600160a01b0316825281019190915260400160002055600101612643565b50506103e8600255506000805460ff19166001179055565b600d5481565b33611001146127a45760405162461bcd60e51b8152600401610bbb90616a33565b600b54612862576127b3615916565b60015460005b8181101561285e57600b80546001810182556000919091528351600080516020616ce98339815191526016909202918201908155602080860151600080516020616d298339815191528401805460ff191691151591909117905560408601518051879461283a93600080516020616d09833981519152909101920190615945565b50606082015161285090600383019060136159bf565b5050508060010190506127b9565b5050505b600061286d82614564565b905061287881611139565b1561288757612887828261446e565b5050565b606581565b3341146128af5760405162461bcd60e51b8152600401610bbb90616972565b60005460ff166128d15760405162461bcd60e51b8152600401610bbb906161d8565b600034116128f15760405162461bcd60e51b8152600401610bbb906164d8565b6001600160a01b0381166000908152600460205260409020546007543491906103e89060ff161561292157506006545b6000831180156129315750600081115b156129de57600061295a61271061294e868563ffffffff61470716565b9063ffffffff61474116565b905080156129dc5760405161dead9082156108fc029083906000818181858888f19350505050158015612991573d6000803e3d6000fd5b507f627059660ea01c4733a328effb2294d2f86905bf806da763a89cee254de8bee5816040516129c19190616a8b565b60405180910390a16129d9848263ffffffff61478316565b93505b505b8115612adc5760006001808403815481106129f557fe5b9060005260206000209060040201905080600201601c9054906101000a900460ff1615612a6257846001600160a01b03167ff177e5d6c5764d79c32883ed824111d9b13f5668cf6ab1cc12dd36791dd955b485604051612a559190616a8b565b60405180910390a2612ad6565b600354612a75908563ffffffff613dd416565b6003908155810154612a8d908563ffffffff613dd416565b60038201556040516001600160a01b038616907f93a090ecc682c002995fad3c85b30c5651d7fd29b0be5da9d784a3302aedc05590612acd908790616a8b565b60405180910390a25b50612b1e565b836001600160a01b03167ff177e5d6c5764d79c32883ed824111d9b13f5668cf6ab1cc12dd36791dd955b484604051612b159190616a8b565b60405180910390a25b50505050565b600e5481565b61100081565b61dead81565b600b8181548110612b4357fe5b6000918252602091829020601691909102018054600180830154600280850180546040805161010096831615969096026000190190911692909204601f810188900488028501880190925281845293965060ff90911694919291830182828015612bee5780601f10612bc357610100808354040283529160200191612bee565b820191906000526020600020905b815481529060010190602001808311612bd157829003601f168201915b5050505050905083565b61100481565b6000600a5460001480612c0f575081155b80612c1a5750600954155b15612c2757506000610e1c565b600960008154809291906001900391905055506000612c74600a5461294e8561294e600b8981548110612c5657fe5b6000918252602090912060169091020154439063ffffffff61478316565b90506000600b8581548110612c8557fe5b906000526020600020906016020160010160006101000a81548160ff0219169083151502179055506000806110016001600160a01b0316638256ace66040518163ffffffff1660e01b8152600401604080518083038186803b158015612cea57600080fd5b505afa158015612cfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d229190615d65565b9150915060009350808310612d9c57612d3b8787613df9565b506040516305bfb49960e41b815261100190635bfb499090612d61908a90600401615ea2565b600060405180830381600087803b158015612d7b57600080fd5b505af1158015612d8f573d6000803e3d6000fd5b5050505060019350612dae565b818310612dae57612dac87614564565b505b6040516001600160a01b038816907fb9d38178dc641ff1817967a63c9078cbcd955a9f1fcd75e0e3636de615d44d3b90600090a25050509392505050565b612df46159ec565b6000612dfe6159ec565b612e06615a10565b612e17612e12866147c5565b6147ea565b90506000805b612e2683614834565b15612f9a5780612e4b57612e41612e3c84614855565b6148a3565b60ff168452612f92565b8060011415612f8d576060612e67612e6285614855565b614923565b90508051604051908082528060200260200182016040528015612ea457816020015b612e91615a30565b815260200190600190039081612e895790505b5085602001819052508051604051908082528060200260200182016040528015612ee257816020015b6060815260200190600190039081612ecd5790505b50604086015260005b8151811015612f8257612efc615a30565b60606000612f1c858581518110612f0f57fe5b60200260200101516149f4565b92509250925080612f3c578860009a509a50505050505050505050612fa3565b8289602001518581518110612f4d57fe5b60200260200101819052508189604001518581518110612f6957fe5b6020026020010181905250505050806001019050612eeb565b506001925050612f92565b612f9a565b600101612e1d565b50919350909150505b915091565b604080516001808252818301909252606091829190816020015b6060815260200190600190039081612fc2579050509050612fe88363ffffffff16614b12565b81600081518110612ff557fe5b6020026020010181905250610e1c81614b25565b600060298351111561304057600080516020616cc9833981519152604051613030906162eb565b60405180910390a15060666112b3565b60005b83518110156130de5760005b818110156130d55784818151811061306357fe5b6020026020010151600001516001600160a01b031685838151811061308457fe5b6020026020010151600001516001600160a01b031614156130cd57600080516020616cc98339815191526040516130ba90616446565b60405180910390a16066925050506112b3565b60010161304f565b50600101613043565b506060806130ec8585614baf565b60015491935091506000908190815b818110156131715767016345785d8a00006001828154811061311957fe5b9060005260206000209060040201600301541061313b57600190930192613169565b60006001828154811061314a57fe5b9060005260206000209060040201600301541115613169576001909201915b6001016130fb565b5060608360405190808252806020026020018201604052801561319e578160200160208202803683370190505b5090506060846040519080825280602002602001820160405280156131cd578160200160208202803683370190505b5090506060856040519080825280602002602001820160405280156131fc578160200160208202803683370190505b50905060608660405190808252806020026020018201604052801561322b578160200160208202803683370190505b509050600060608760405190808252806020026020018201604052801561325c578160200160208202803683370190505b50905060608860405190808252806020026020018201604052801561328b578160200160208202803683370190505b509050600099506000985060006110046001600160a01b031663149d14d96040518163ffffffff1660e01b815260040160206040518083038186803b1580156132d357600080fd5b505afa1580156132e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061330b9190615d4d565b905067016345785d8a000081111561335657600080516020616cc983398151915260405161333890616770565b60405180910390a160689d50505050505050505050505050506112b3565b60005b898110156135c75767016345785d8a00006001828154811061337757fe5b906000526020600020906004020160030154106134fd576001818154811061339b57fe5b906000526020600020906004020160020160009054906101000a90046001600160a01b0316898d815181106133cc57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060006402540be4006001838154811061340157fe5b9060005260206000209060040201600301548161341a57fe5b066001838154811061342857fe5b906000526020600020906004020160030154039050613450838261478390919063ffffffff16565b898e8151811061345c57fe5b6020026020010181815250506001828154811061347557fe5b906000526020600020906004020160020160009054906101000a90046001600160a01b0316878e815181106134a657fe5b60200260200101906001600160a01b031690816001600160a01b03168152505081888e815181106134d357fe5b60209081029190910101526134ee868263ffffffff613dd416565b6001909d019c95506135bf9050565b60006001828154811061350c57fe5b90600052602060002090600402016003015411156135bf576001818154811061353157fe5b906000526020600020906004020160010160009054906101000a90046001600160a01b0316848c8151811061356257fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506001818154811061358f57fe5b906000526020600020906004020160030154838c815181106135ad57fe5b60209081029190910101526001909a01995b600101613359565b506000841561383d576002546040516303702b2960e51b815261100491636e056520918891613601918e918e918d91420190600401615f94565b6020604051808303818588803b15801561361a57600080fd5b505af19350505050801561364b575060408051601f3d908101601f1916820190925261364891810190615cb9565b60015b6137c2576040516000815260443d101561366757506000613702565b60046000803e60005160e01c6308c379a08114613688576000915050613702565b60043d036004833e81513d60248201116001600160401b03821117156136b357600092505050613702565b80830180516001600160401b038111156136d4576000945050505050613702565b8060208301013d86018111156136f257600095505050505050613702565b601f01601f191660405250925050505b8061370d575061374f565b60019150857fa7cdeed7d0db45e3219a6e5d60838824c16f1d39991fcfe3f963029c844bf280826040516137419190616019565b60405180910390a2506137bd565b3d808015613779576040519150601f19603f3d011682016040523d82523d6000602084013e61377e565b606091505b5060019150857fbfa884552dd8921b6ce90bfe906952ae5b3b29be0cc1a951d4f62697635a3a45826040516137b39190616019565b60405180910390a2505b61383d565b8015613804577fa217d08e65f80c73121cd9db834d81652d544bfbf452f6d04922b16c90a37b70866040516137f79190616a8b565b60405180910390a161383b565b857fa7cdeed7d0db45e3219a6e5d60838824c16f1d39991fcfe3f963029c844bf280604051613832906160db565b60405180910390a25b505b80156139f35760005b87518110156139f157600088828151811061385d57fe5b6020026020010151905060006001828154811061387657fe5b60009182526020909120600160049092020181015481546001600160a01b03909116916108fc91859081106138a757fe5b9060005260206000209060040201600301549081150290604051600060405180830381858888f193505050509050801561396357600182815481106138e857fe5b60009182526020909120600160049092020181015481546001600160a01b03909116917f6c61d60f69a7beb3e1c80db7f39f37b208537cbb19da3174511b477812b2fc7d918590811061393757fe5b9060005260206000209060040201600301546040516139569190616a8b565b60405180910390a26139e7565b6001828154811061397057fe5b60009182526020909120600160049092020181015481546001600160a01b03909116917f25d0ce7d2f0cec669a8c17efe49d195c13455bb8872b65fa610ac7f53fe4ca7d91859081106139bf57fe5b9060005260206000209060040201600301546040516139de9190616a8b565b60405180910390a25b5050600101613846565b505b835115613b3d5760005b8451811015613b3b576000858281518110613a1457fe5b60200260200101516001600160a01b03166108fc868481518110613a3457fe5b60200260200101519081150290604051600060405180830381858888f1935050505090508015613aca57858281518110613a6a57fe5b60200260200101516001600160a01b03167f6c61d60f69a7beb3e1c80db7f39f37b208537cbb19da3174511b477812b2fc7d868481518110613aa857fe5b6020026020010151604051613abd9190616a8b565b60405180910390a2613b32565b858281518110613ad657fe5b60200260200101516001600160a01b03167f25d0ce7d2f0cec669a8c17efe49d195c13455bb8872b65fa610ac7f53fe4ca7d868481518110613b1457fe5b6020026020010151604051613b299190616a8b565b60405180910390a25b506001016139fd565b505b5050505050505050505050506000471115613bb9577f6ecc855f9440a9282c90913bbc91619fd44f5ec0b462af28d127b116f130aa4d47604051613b819190616a8b565b60405180910390a1604051611002904780156108fc02916000818181858888f19350505050158015613bb7573d6000803e3d6000fd5b505b60006003819055600555815115613bd457613bd48282614de8565b6110016001600160a01b031663fc4333cd6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015613c1157600080fd5b505af1158015613c25573d6000803e3d6000fd5b50506040517fedd8d7296956dd970ab4de3f2fc03be2b0ffc615d20cd4c72c6e44f928630ebf925060009150a1506000949350505050565b80516001600160a01b0316600090815260046020526040812054801580613cae5750600180820381548110613c8e57fe5b9060005260206000209060040201600201601c9054906101000a900460ff165b15613cf45782516040516001600160a01b03909116907fe209c46bebf57cf265d5d9009a00870e256d9150f3ed5281ab9d9eb3cec6e4be90600090a26000915050611203565b600154600554600019820111801590613d4a5784516040516001600160a01b03909116907fe209c46bebf57cf265d5d9009a00870e256d9150f3ed5281ab9d9eb3cec6e4be90600090a260009350505050611203565b600580546001908101909155805481906000198601908110613d6857fe5b6000918252602082206002600490920201018054921515600160e01b0260ff60e01b199093169290921790915585516040516001600160a01b03909116917ff226e7d8f547ff903d9d419cf5f54e0d7d07efa9584135a53a057c5f1f27f49a91a2506000949350505050565b600082820183811015610e1c5760405162461bcd60e51b8152600401610bbb9061620f565b60008060018381548110613e0957fe5b90600052602060002090600402016003015490506000600180805490500390506001613e3361247e565b5111613e6857600060018581548110613e4857fe5b9060005260206000209060040201600301819055506000925050506112b3565b846001600160a01b03167f3b6f9ef90462b512a1293ecec018670bf7b7f1876fb727590a8a6d7643130a7083604051613ea19190616a8b565b60405180910390a26001600160a01b038516600090815260046020526040812055835b6001546000190181101561408e5760018160010181548110613ee257fe5b906000526020600020906004020160018281548110613efd57fe5b60009182526020909120825460049092020180546001600160a01b03199081166001600160a01b0393841617825560018085015481840180548416918616919091179055600280860180549185018054909416919095161780835584546001600160401b03600160a01b91829004160267ffffffffffffffff60a01b1990911617808355935460ff600160e01b918290041615150260ff60e01b19909416939093179055600392830154920191909155600b805490918301908110613fbe57fe5b9060005260206000209060160201600b8281548110613fd957fe5b600091825260209091208254601690920201908155600180830154818301805460ff909216151560ff1990921691909117905560028084018054614030938386019390821615610100026000190190911604615a65565b5061404360038281019084016013615ada565b5090505080600101600460006001848154811061405c57fe5b600091825260208083206004909202909101546001600160a01b03168352820192909252604001902055600101613ec4565b50600180548061409a57fe5b60008281526020812060046000199093019283020180546001600160a01b0319908116825560018201805490911690556002810180546001600160e81b0319169055600301559055600b8054806140ed57fe5b60008281526020812060166000199093019283020181815560018101805460ff191690559061411f6002830182615b04565b61412d600383016000615b48565b50509055600081838161413c57fe5b04905080156141a05760015460005b8181101561419d57826001828154811061416157fe5b906000526020600020906004020160030154016001828154811061418157fe5b600091825260209091206003600490920201015560010161414b565b50505b50600195945050505050565b6001548151604080518281526020808402820101909152606092919083908280156141eb57816020015b60608152602001906001900390816141d65790505b50600b549091508314614202579250611203915050565b60005b8281101561430e57600b6004600088848151811061421f57fe5b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020548154811061425257fe5b600091825260209182902060026016909202018101805460408051601f6000196101006001861615020190931694909404918201859004850284018501905280835291929091908301828280156142ea5780601f106142bf576101008083540402835291602001916142ea565b820191906000526020600020905b8154815290600101906020018083116142cd57829003601f168201915b50505050508282815181106142fb57fe5b6020908102919091010152600101614205565b50949350505050565b60005b82811015614464576000828783880160405160200161433a929190615e94565b6040516020818303038152906040528051906020012060001c8161435a57fe5b0690508085018287011461445b576000898388018151811061437857fe5b602002602001015190506060898489018151811061439257fe5b602002602001015190508a838801815181106143aa57fe5b60200260200101518b858a01815181106143c057fe5b60200260200101906001600160a01b031690816001600160a01b031681525050818b848901815181106143ef57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050898388018151811061441d57fe5b60200260200101518a858a018151811061443357fe5b6020026020010181905250808a8489018151811061444d57fe5b602002602001018190525050505b5060010161431a565b5050505050505050565b600980546001908101909155600b80548390811061448857fe5b906000526020600020906016020160010160006101000a81548160ff02191690831515021790555043600b82815481106144be57fe5b600091825260208220601690910201919091556040516001600160a01b038416917ff62981a567ec3cec866c6fa93c55bcdf841d6292d18b8d522ececa769375d82d91a25050565b6000816040516020016145199190615e78565b60405160208183030381529060405280519060200120836040516020016145409190615e78565b6040516020818303038152906040528051906020012014905092915050565b015190565b6001600160a01b0381166000908152600460205260408120548061458d57506000199050611203565b6001810390506000600182815481106145a257fe5b90600052602060002090600402016003015490506000600183815481106145c557fe5b6000918252602090912060036004909202010155600154604051600019909101906001600160a01b038616907f8cd4e147d8af98a9e3b6724021b8bf6aed2e5dac71c38f2dce8161b82585b25d9061461e908590616a8b565b60405180910390a28061463657829350505050611203565b600081838161464157fe5b04905080156146fd5760005b8481101561469f57816001828154811061466357fe5b906000526020600020906004020160030154016001828154811061468357fe5b600091825260209091206003600490920201015560010161464d565b50600180549085015b818110156146fa5782600182815481106146be57fe5b90600052602060002090600402016003015401600182815481106146de57fe5b60009182526020909120600360049092020101556001016146a8565b50505b5091949350505050565b600082614716575060006112b3565b8282028284828161472357fe5b0414610e1c5760405162461bcd60e51b8152600401610bbb90616670565b6000610e1c83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061537d565b6000610e1c83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506153b4565b6147cd615b57565b506040805180820190915281518152602082810190820152919050565b6147f2615a10565b6147fb826153e0565b61480457600080fd5b6000614813836020015161541a565b60208085015160408051808201909152868152920190820152915050919050565b600061483e615b57565b505080518051602091820151919092015191011190565b61485d615b57565b61486682614834565b61486f57600080fd5b6020820151600061487f8261547d565b80830160209586015260408051808201909152908152938401919091525090919050565b8051600090158015906148b857508151602110155b6148c157600080fd5b60006148d0836020015161541a565b905080836000015110156148f65760405162461bcd60e51b8152600401610bbb9061682e565b82516020808501518301805192849003929183101561430e57506020919091036101000a90049392505050565b606061492e826153e0565b61493757600080fd5b60006149428361555e565b905060608160405190808252806020026020018201604052801561498057816020015b61496d615b57565b8152602001906001900390816149655790505b5090506000614992856020015161541a565b60208601510190506000805b848110156149e9576149af8361547d565b91506040518060400160405280838152602001848152508482815181106149d257fe5b60209081029190910101529181019160010161499e565b509195945050505050565b6149fc615a30565b60606000614a08615a30565b6060614a12615a10565b614a1b876147ea565b90506000805b614a2a83614834565b15614b035780614a5557614a45614a4084614855565b6155ba565b6001600160a01b03168552614afb565b8060011415614a7d57614a6a614a4084614855565b6001600160a01b03166020860152614afb565b8060021415614aa557614a92614a4084614855565b6001600160a01b03166040860152614afb565b8060031415614ad157614aba612e3c84614855565b6001600160401b0316606086015260019150614afb565b8060041415614af657614aeb614ae684614855565b6155d4565b935060019150614afb565b614b03565b600101614a21565b50929791965091945092505050565b60606112b3614b2083615644565b61572a565b6060815160001415614b465750604080516000815260208101909152611203565b606082600081518110614b5557fe5b602002602001015190506000600190505b8351811015614b9657614b8c82858381518110614b7f57fe5b602002602001015161577c565b9150600101614b66565b50610e1c614ba9825160c060ff166157f9565b8261577c565b606080600080808080614bc0612572565b6001549091505b8015614cce57600181039250600b8381548110614be057fe5b600091825260209091206001601690920201015460ff16614c0057614cc5565b60018381548110614c0d57fe5b60009182526020909120600490910201546001600160a01b03169450614c34858484612bfe565b9350831580614c47575060018a51038610155b15614c5157614cc5565b60005b8a51811015614cc357856001600160a01b03168b8281518110614c7357fe5b6020026020010151600001516001600160a01b03161415614cbb5760018b8281518110614c9c57fe5b6020908102919091010151901515608090910152600190960195614cc3565b600101614c54565b505b60001901614bc7565b5084895103604051908082528060200260200182016040528015614d0c57816020015b614cf9615a30565b815260200190600190039081614cf15790505b50965084895103604051908082528060200260200182016040528015614d4657816020015b6060815260200190600190039081614d315790505b5095506000915060005b8951811015614dda57898181518110614d6557fe5b602002602001015160800151614dd257898181518110614d8157fe5b6020026020010151888481518110614d9557fe5b6020026020010181905250888181518110614dac57fe5b6020026020010151878481518110614dc057fe5b60209081029190910101526001909201915b600101614d50565b5050505050505b9250929050565b600154825160005b82811015614e9f57614e00615a30565b60018281548110614e0d57fe5b600091825260208083206040805160c081018252600494850290920180546001600160a01b03908116808552600180840154831686880152600284015492831686860152600160a01b83046001600160401b03166060870152600160e01b90920460ff161515608086015260039092015460a09094019390935285529290915290822091909155919091019050614df0565b5080821115614f5e57805b82811015614f5c576001805480614ebd57fe5b60008281526020812060046000199093019283020180546001600160a01b0319908116825560018201805490911690556002810180546001600160e81b0319169055600301559055600b805480614f1057fe5b60008281526020812060166000199093019283020181815560018101805460ff1916905590614f426002830182615b04565b614f50600383016000615b48565b50509055600101614eaa565b505b6000818310614f6d5781614f6f565b825b905060005b8181101561512f578060010160046000888481518110614f9057fe5b6020026020010151600001516001600160a01b03166001600160a01b0316815260200190815260200160002081905550858181518110614fcc57fe5b602002602001015160018281548110614fe157fe5b6000918252602091829020835160049092020180546001600160a01b039283166001600160a01b0319918216178255928401516001820180549184169185169190911790556040840151600282018054606087015160808801511515600160e01b0260ff60e01b196001600160401b03909216600160a01b0267ffffffffffffffff60a01b1995909716929097169190911792909216939093171692909217905560a090910151600390910155845185908290811061509c57fe5b6020026020010151600b82815481106150b157fe5b906000526020600020906016020160020190805190602001906150d5929190615945565b506000600b82815481106150e557fe5b60009182526020822060169190910201600101805460ff191692151592909217909155600b80548390811061511657fe5b6000918252602090912060169091020155600101614f74565b508282111561530757615140615916565b835b838110156153045785818151811061515657fe5b60200260200101518260400181905250600187828151811061517457fe5b6020908102919091018101518254600181810185556000948552838520835160049093020180546001600160a01b039384166001600160a01b0319918216178255848601518284018054918616918316919091179055604080860151600284018054606089015160808a01511515600160e01b0260ff60e01b196001600160401b03909216600160a01b0267ffffffffffffffff60a01b1995909a1692909616919091179290921696909617169190911790935560a090930151600390930192909255600b8054928301815590935284516016909102600080516020616ce9833981519152810191825585830151600080516020616d298339815191528201805491151560ff19909216919091179055928501518051869492936152aa93600080516020616d0983398151915201920190615945565b5060608201516152c090600383019060136159bf565b50505080600101600460008984815181106152d757fe5b602090810291909101810151516001600160a01b0316825281019190915260400160002055600101615142565b50505b6000600981905560015493505b83811015615375576000600b828154811061532b57fe5b60009182526020822060169190910201600101805460ff191692151592909217909155600b80548390811061535c57fe5b6000918252602090912060169091020155600101615314565b505050505050565b6000818361539e5760405162461bcd60e51b8152600401610bbb9190616019565b5060008385816153aa57fe5b0495945050505050565b600081848411156153d85760405162461bcd60e51b8152600401610bbb9190616019565b505050900390565b80516000906153f157506000611203565b6020820151805160001a9060c082101561541057600092505050611203565b5060019392505050565b8051600090811a6080811015615434576000915050611203565b60b881108061544f575060c0811080159061544f575060f881105b1561545e576001915050611203565b60c08110156154725760b519019050611203565b60f519019050611203565b80516000908190811a60808110156154985760019150615557565b60b88110156154ad57607e1981019150615557565b60c08110156154fe57600060b78203600186019550806020036101000a8651049150600181018201935050808310156154f85760405162461bcd60e51b8152600401610bbb906165bd565b50615557565b60f88110156155135760be1981019150615557565b600060f78203600186019550806020036101000a8651049150600181018201935050808310156155555760405162461bcd60e51b8152600401610bbb906165bd565b505b5092915050565b805160009061556f57506000611203565b60008090506000615583846020015161541a565b602085015185519181019250015b808210156155b1576155a28261547d565b60019093019290910190615591565b50909392505050565b80516000906015146155cb57600080fd5b6112b3826148a3565b80516060906155e257600080fd5b60006155f1836020015161541a565b83516040805191839003808352601f19601f8201168301602001909152919250606090828015615628576020820181803683370190505b509050600081602001905061430e8487602001510182856158cb565b604080516020808252818301909252606091829190602082018180368337505050602081018490529050600067ffffffffffffffff198416615688575060186156ac565b6fffffffffffffffffffffffffffffffff1984166156a8575060106156ac565b5060005b60208110156156e2578181815181106156c157fe5b01602001516001600160f81b031916156156da576156e2565b6001016156ac565b60008160200390506060816040519080825280601f01601f191660200182016040528015615717576020820181803683370190505b5080830196909652508452509192915050565b60608151600114801561575c5750607f60f81b8260008151811061574a57fe5b01602001516001600160f81b03191611155b15615768575080611203565b6112b361577a8351608060ff166157f9565b835b6060806040519050835180825260208201818101602087015b818310156157ad578051835260209283019201615795565b50855184518101855292509050808201602086015b818310156157da5780518352602092830192016157c2565b508651929092011591909101601f01601f191660405250905092915050565b60606801000000000000000083106158235760405162461bcd60e51b8152600401610bbb906163c1565b6040805160018082528183019092526060916020820181803683370190505090506037841161587d5782840160f81b8160008151811061585f57fe5b60200101906001600160f81b031916908160001a90535090506112b3565b606061588885615644565b90508381510160370160f81b826000815181106158a157fe5b60200101906001600160f81b031916908160001a9053506158c2828261577c565b95945050505050565b806158d557610bdb565b5b602081106158f5578251825260209283019290910190601f19016158d6565b915181516020939093036101000a6000190180199091169216919091179052565b60405180608001604052806000815260200160001515815260200160608152602001615940615b71565b905290565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061598657805160ff19168380011785556159b3565b828001600101855582156159b3579182015b828111156159b3578251825591602001919060010190615998565b506125ad929150615b90565b82601381019282156159b357916020028201828111156159b3578251825591602001919060010190615998565b6040518060600160405280600060ff16815260200160608152602001606081525090565b6040518060400160405280615a23615b57565b8152602001600081525090565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915290565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10615a9e57805485556159b3565b828001600101855582156159b357600052602060002091601f016020900482015b828111156159b3578254825591600101919060010190615abf565b82601381019282156159b357918201828111156159b3578254825591600101919060010190615abf565b50805460018160011615610100020316600290046000825580601f10615b2a575061140f565b601f01602090049060005260206000209081019061140f9190615b90565b5061140f906013810190615b90565b604051806040016040528060008152602001600081525090565b6040518061026001604052806013906020820280368337509192915050565b61255f91905b808211156125ad5760008155600101615b96565b60008083601f840112615bbb578182fd5b5081356001600160401b03811115615bd1578182fd5b6020830191508360208083028501011115614de157600080fd5b60008083601f840112615bfc578182fd5b5081356001600160401b03811115615c12578182fd5b602083019150836020828501011115614de157600080fd5b600060208284031215615c3b578081fd5b81356001600160a01b0381168114610e1c578182fd5b60008060008060408587031215615c66578283fd5b84356001600160401b0380821115615c7c578485fd5b615c8888838901615baa565b90965094506020870135915080821115615ca0578384fd5b50615cad87828801615baa565b95989497509550505050565b600060208284031215615cca578081fd5b81518015158114610e1c578182fd5b60008060008060408587031215615cee578384fd5b84356001600160401b0380821115615d04578586fd5b615d1088838901615beb565b90965094506020870135915080821115615d28578384fd5b50615cad87828801615beb565b600060208284031215615d46578081fd5b5035919050565b600060208284031215615d5e578081fd5b5051919050565b60008060408385031215615d77578182fd5b505080516020909101519092909150565b600080600060408486031215615d9c578283fd5b833560ff81168114615dac578384fd5b925060208401356001600160401b03811115615dc6578283fd5b615dd286828701615beb565b9497909650939450505050565b6000815180845260208085019450808401835b83811015615e175781516001600160a01b031687529582019590820190600101615df2565b509495945050505050565b60008284528282602086013780602084860101526020601f19601f85011685010190509392505050565b60008151808452615e64816020860160208601616af1565b601f01601f19169290920160200192915050565b60008251615e8a818460208701616af1565b9190910192915050565b918252602082015260400190565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b03968716815294861660208601529290941660408401526001600160401b03166060830152911515608082015260a081019190915260c00190565b600060208252610e1c6020830184615ddf565b600060408252615f376040830185615ddf565b602083820381850152818551808452828401915082838202850101838801865b83811015615f8557601f19878403018552615f73838351615e4c565b94860194925090850190600101615f57565b50909998505050505050505050565b600060808252615fa76080830187615ddf565b828103602084810191909152865180835287820192820190845b81811015615fdd57845183529383019391830191600101615fc1565b50508481036040860152615ff18188615ddf565b93505050506001600160401b038316606083015295945050505050565b901515815260200190565b600060208252610e1c6020830184615e4c565b600060408252616040604083018688615e22565b8281036020840152616053818587615e22565b979650505050505050565b6020808252601c908201527f6c656e677468206f66206275726e526174696f206d69736d6174636800000000604082015260600190565b60208082526026908201527f6c656e677468206f66206d61784e756d4f664d61696e7461696e696e67206d696040820152650e6dac2e8c6d60d31b606082015260800190565b6020808252601b908201527f6261746368207472616e736665722072657475726e2066616c73650000000000604082015260600190565b6020808252602c908201527f6c656e677468206f66206d61784e756d4f66576f726b696e6743616e6469646160408201526b0e8cae640dad2e6dac2e8c6d60a31b606082015260800190565b60208082526025908201527f6c656e677468206f66206d61696e7461696e536c6173685363616c65206d69736040820152640dac2e8c6d60db1b606082015260800190565b6020808252818101527f6c656e677468206f66206e756d4f66436162696e657473206d69736d61746368604082015260600190565b60208082526019908201527f74686520636f6e7472616374206e6f7420696e69742079657400000000000000604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526028908201527f746865206e756d4f66436162696e657473206d75737420626520677265617465604082015267072207468616e20360c41b606082015260800190565b60208082526039908201527f746865206e756d4f66436162696e657473206d757374206265206c657373207460408201527f68616e204d41585f4e554d5f4f465f56414c494441544f525300000000000000606082015260800190565b60208082526029908201527f746865206e756d626572206f662076616c696461746f727320657863656564206040820152681d1a19481b1a5b5a5d60ba1b606082015260800190565b60208082526022908201527f63616e206e6f7420646f207468697320747769636520696e206f6e6520626c6f604082015261636b60f01b606082015260800190565b6020808252602b908201527f746865206275726e526174696f206d757374206265206e6f206772656174657260408201526a0207468616e2031303030360ac1b606082015260800190565b6020808252600e908201526d696e70757420746f6f206c6f6e6760901b604082015260600190565b60208082526037908201527f746865206d61784e756d4f664d61696e7461696e696e67206d7573742062652060408201527f6c657373207468616e206e756d4f66436162696e657473000000000000000000606082015260800190565b6020808252602b908201527f6475706c696361746520636f6e73656e7375732061646472657373206f66207660408201526a185b1a59185d1bdc94d95d60aa1b606082015260800190565b60208082526027908201527f7468652065787069726554696d655365636f6e64476170206973206f7574206f604082015266662072616e676560c81b606082015260800190565b6020808252601590820152746465706f7369742076616c7565206973207a65726f60581b604082015260600190565b60208082526049908201527f746865206d61784e756d4f66576f726b696e6743616e64696461746573206d7560408201527f7374206265206e6f742067726561746572207468616e206d61784e756d4f6643606082015268616e6469646174657360b81b608082015260a00190565b60208082526027908201527f7468652066696e616c697479526577617264526174696f206973206f7574206f604082015266662072616e676560c81b606082015260800190565b6020808252601190820152706164646974696f6e206f766572666c6f7760781b604082015260600190565b60208082526023908201527f63616e206e6f7420656e7465722054656d706f72617279204d61696e74656e616040820152626e636560e81b606082015260800190565b60208082526025908201527f6c656e677468206f66206a61696c2076616c696461746f7273206d757374206260408201526465206f6e6560d81b606082015260800190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252602e908201527f746865206d6573736167652073656e646572206d75737420626520676f76657260408201526d1b985b98d94818dbdb9d1c9858dd60921b606082015260800190565b60208082526025908201527f6c656e677468206f66206d61784e756d4f6643616e64696461746573206d69736040820152640dac2e8c6d60db1b606082015260800190565b6020808252601290820152716e6f7420696e206d61696e74656e616e636560701b604082015260600190565b60208082526021908201527f666565206973206c6172676572207468616e2044555354595f494e434f4d494e6040820152604760f81b606082015260800190565b60208082526019908201527f74686520636f6e747261637420616c726561647920696e697400000000000000604082015260600190565b60208082526026908201527f6c656e677468206f662066696e616c697479526577617264526174696f206d696040820152650e6dac2e8c6d60d31b606082015260800190565b6020808252601a908201527f6c656e677468206973206c657373207468616e206f6666736574000000000000604082015260600190565b60208082526026908201527f6c656e677468206f662065787069726554696d655365636f6e64476170206d696040820152650e6dac2e8c6d60d31b606082015260800190565b60208082526017908201527f6f6e6c792063757272656e742076616c696461746f7273000000000000000000604082015260600190565b60208082526021908201527f6661696c656420746f20706172736520696e69742076616c696461746f7253656040820152601d60fa1b606082015260800190565b6020808252602f908201527f746865206d6573736167652073656e646572206d7573742062652063726f737360408201526e0818da185a5b8818dbdb9d1c9858dd608a1b606082015260800190565b6020808252602d908201527f746865206d6573736167652073656e646572206d75737420626520746865206260408201526c3637b1b590383937b23ab1b2b960991b606082015260800190565b6020808252602d908201527f746865206d61696e7461696e536c6173685363616c65206d757374206265206760408201526c0726561746572207468616e203609c1b606082015260800190565b6020808252600d908201526c756e6b6e6f776e20706172616d60981b604082015260600190565b60208082526029908201527f746865206d6573736167652073656e646572206d75737420626520736c6173686040820152680818dbdb9d1c9858dd60ba1b606082015260800190565b61ffff91909116815260200190565b90815260200190565b60008482528315156020830152606060408301526158c26060830184615e4c565b63ffffffff91909116815260200190565b60ff91909116815260200190565b600060ff85168252604060208301526158c2604083018486615e22565b60005b83811015616b0c578181015183820152602001616af4565b83811115612b1e575050600091015256fef901a880f901a4f844941284214b9b9c85549ab3d2b972df0deef66ac2c9946ddf42a51534fc98d0c0a3b42c963cace8441ddf946ddf42a51534fc98d0c0a3b42c963cace8441ddf8410000000f84494a2959d3f95eae5dc7d70144ce1b73b403b7eb6e0948081ef03f1d9e0bb4a5bf38f16285c879299f07f948081ef03f1d9e0bb4a5bf38f16285c879299f07f8410000000f8449435552c16704d214347f29fa77f77da6d75d7c75294dc4973e838e3949c77aced16ac2315dc2d7ab11194dc4973e838e3949c77aced16ac2315dc2d7ab1118410000000f84494980a75ecd1309ea12fa2ed87a8744fbfc9b863d594cc6ac05c95a99c1f7b5f88de0e3486c82293b27094cc6ac05c95a99c1f7b5f88de0e3486c82293b2708410000000f84494f474cf03cceff28abc65c9cbae594f725c80e12d94e61a183325a18a173319dd8e19c8d069459e217594e61a183325a18a173319dd8e19c8d069459e21758410000000f84494b71b214cb885500844365e95cd9942c7276e7fd894d22ca3ba2141d23adab65ce4940eb7665ea2b6a794d22ca3ba2141d23adab65ce4940eb7665ea2b6a7841000000070e72399380dcfb0338abc03dc8d47f9f470ada8e769c9a78d644ea97385ecb20175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dbb0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dbaa2646970667358221220e90bdc6c308abf4dc87bb603ebdb3e216dfe03c59cdfa311cddf066d91bb9c1964736f6c63430006040033", + }, + UpgradeConfig { + contract_addr: "0x0000000000000000000000000000000000001001", + code: "608060405234801561001057600080fd5b506004361061025e5760003560e01c8063831d65d111610146578063c81b1662116100c3578063dc927faf11610087578063dc927faf14610474578063e1c7392a1461047c578063f9a2bbc714610484578063fc3e59081461048c578063fc4333cd14610494578063fd6a68791461049c5761025e565b8063c81b16621461042b578063c8509d8114610433578063c96be4cb14610446578063cc844b7314610459578063d2a42e4b1461046c5761025e565b8063a78abc161161010a578063a78abc16146103eb578063ab51bb9614610400578063ac0af62914610408578063ac43175114610410578063c80d4b8f146104235761025e565b8063831d65d1146103b857806396713da9146103cb5780639bc8e4f2146103d35780639dc09262146103db578063a1a11bf5146103e35761025e565b80634bf6c882116101df5780636e47b482116101a35780636e47b4821461038857806370fd5bad1461039057806375d47a0a146103985780637912a65d146103a05780637942fd05146103a85780638256ace6146103b05761025e565b80634bf6c8821461035357806351e806721461035b578063567a372d146103635780635bfb49901461036b57806362b72cf5146103805761025e565b8063389f4f7111610226578063389f4f71146103045780633a63f4b1146103195780633dffc3871461032157806343756e5c14610336578063493279b11461033e5761025e565b80630bee7a67146102635780631182b8751461028157806323bac5a2146102a157806335aa2e44146102c357806337c8dab9146102e3575b600080fd5b61026b6104a4565b6040516102789190612f07565b60405180910390f35b61029461028f36600461278f565b6104a9565b6040516102789190612891565b6102b46102af36600461253d565b61050f565b60405161027893929190612eef565b6102d66102d136600461275f565b610532565b6040516102789190612859565b6102f66102f136600461253d565b610559565b604051610278929190612ee1565b61030c6105b0565b6040516102789190612ed8565b61030c6105b6565b6103296105bc565b6040516102789190612f18565b6102d66105c1565b6103466105c7565b6040516102789190612ec9565b6103296105cc565b6102d66105d1565b61030c6105d7565b61037e61037936600461253d565b6105dd565b005b61030c610688565b6102d661068e565b610329610694565b6102d6610699565b61030c61069f565b6103296106a4565b6102f66106a9565b61037e6103c636600461278f565b6106b3565b6103296107c5565b61030c6107ca565b6102d66107d5565b6102d66107db565b6103f36107e1565b6040516102789190612886565b61026b6107ea565b61030c6107ef565b61037e61041e366004612643565b6107f4565b61030c610ba8565b6102d6610bad565b61037e61044136600461278f565b610bb3565b61037e61045436600461253d565b610c24565b61037e6104673660046126ac565b610f9f565b61030c611475565b6102d661147a565b61037e611480565b6102d66114bc565b6103296114c2565b61037e6114c7565b6102d6611910565b606481565b606033612000146104d55760405162461bcd60e51b81526004016104cc90612d4f565b60405180910390fd5b60005460ff166104f75760405162461bcd60e51b81526004016104cc9061293d565b60405162461bcd60e51b81526004016104cc90612e12565b600260208190526000918252604090912080546001820154919092015460ff1683565b6001818154811061053f57fe5b6000918252602090912001546001600160a01b0316905081565b600080610564612324565b5050506001600160a01b0316600090815260026020818152604092839020835160608101855281548082526001830154938201849052919093015460ff16151592909301919091529091565b60055481565b60065481565b600181565b61100181565b606181565b600881565b61200081565b60045481565b33611000146105fe5760405162461bcd60e51b81526004016104cc90612b63565b60005460ff166106205760405162461bcd60e51b81526004016104cc9061293d565b61200063f7a251d7600b61063384611916565b60006040518463ffffffff1660e01b815260040161065393929190612f26565b600060405180830381600087803b15801561066d57600080fd5b505af1158015610681573d6000803e3d6000fd5b5050505050565b60035481565b61100581565b600281565b61100881565b603281565b600b81565b6004546005549091565b33612000146106d45760405162461bcd60e51b81526004016104cc90612d4f565b60005460ff166106f65760405162461bcd60e51b81526004016104cc9061293d565b6106fe612347565b600061073f84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506119e892505050565b9150915080156107865781516040517f7f0956d47419b9525356e7111652b653b530ec6f5096dccc04589bc38e6299679161077991612f07565b60405180910390a1610681565b81516040517f7d45f62d17443dd4547bca8a8112c60e2385669318dc300ec61a5d2492f262e7916107b691612f07565b60405180910390a15050505050565b600981565b662386f26fc1000081565b61100781565b61100681565b60005460ff1681565b600081565b600481565b60005460ff166108165760405162461bcd60e51b81526004016104cc9061293d565b33611007146108375760405162461bcd60e51b81526004016104cc90612c0c565b6108a284848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260148152731b5a5cd9195b59585b9bdc951a1c995cda1bdb1960621b60208201529150611a689050565b1561093d57602081146108c75760405162461bcd60e51b81526004016104cc90612aef565b604080516020601f840181900481028201810190925282815260009161090591858580838501838280828437600092019190915250611ac292505050565b905060018110158015610919575060055481105b6109355760405162461bcd60e51b81526004016104cc90612d0a565b600455610b65565b6109a384848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600f81526e19995b1bdb9e551a1c995cda1bdb19608a1b60208201529150611a689050565b15610a3f57602081146109c85760405162461bcd60e51b81526004016104cc90612c5a565b604080516020601f8401819004810282018101909252828152600091610a0691858580838501838280828437600092019190915250611ac292505050565b90506103e88111158015610a1b575060045481115b610a375760405162461bcd60e51b81526004016104cc906129ab565b600555610b65565b610ab384848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601881527f66696e616c697479536c617368526577617264526174696f000000000000000060208201529150611a689050565b15610b4d5760208114610ad85760405162461bcd60e51b81526004016104cc90612e49565b604080516020601f8401819004810282018101909252828152600091610b1691858580838501838280828437600092019190915250611ac292505050565b9050600a8110158015610b295750606481105b610b455760405162461bcd60e51b81526004016104cc90612aa3565b600655610b65565b60405162461bcd60e51b81526004016104cc90612deb565b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a84848484604051610b9a94939291906128a4565b60405180910390a150505050565b609681565b61100281565b3361200014610bd45760405162461bcd60e51b81526004016104cc90612d4f565b60005460ff16610bf65760405162461bcd60e51b81526004016104cc9061293d565b6040517f07db600eebe2ac176be8dcebad61858c245a4961bb32ca2aa3d159b09aa0810e90600090a1505050565b334114610c435760405162461bcd60e51b81526004016104cc90612d9e565b60005460ff16610c655760405162461bcd60e51b81526004016104cc9061293d565b6003544311610c865760405162461bcd60e51b81526004016104cc90612e94565b3a15610ca45760405162461bcd60e51b81526004016104cc90612bde565b60405163155853f360e21b8152611000906355614fcc90610cc9908490600401612859565b60206040518083038186803b158015610ce157600080fd5b505afa158015610cf5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d199190612623565b610d2257610f98565b610d2a612324565b506001600160a01b0381166000908152600260208181526040928390208351606081018552815481526001820154928101929092529091015460ff161580159282019290925290610d85576020810180516001019052610dde565b60016040820181905260208201819052805480820182556000919091527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf60180546001600160a01b0319166001600160a01b0384161790555b438152600554602082015181610df057fe5b06610ec657600060208201526040516335409f7f60e01b8152611000906335409f7f90610e21908590600401612859565b600060405180830381600087803b158015610e3b57600080fd5b505af1158015610e4f573d6000803e3d6000fd5b505050506120006001600160a01b031663f7a251d7600b610e6f85611916565b60006040518463ffffffff1660e01b8152600401610e8f93929190612f26565b600060405180830381600087803b158015610ea957600080fd5b505af1158015610ebd573d6000803e3d6000fd5b50505050610f32565b600454816020015181610ed557fe5b06610f32576040516375abf10160e11b81526110009063eb57e20290610eff908590600401612859565b600060405180830381600087803b158015610f1957600080fd5b505af1158015610f2d573d6000803e3d6000fd5b505050505b6001600160a01b0382166000818152600260208181526040808420865181559186015160018301558581015191909201805460ff1916911515919091179055517fddb6012116e51abf5436d956a4f0ebd927e92c576ff96d7918290c8782291e3e9190a2505b5043600355565b60005460ff16610fc15760405162461bcd60e51b81526004016104cc9061293d565b604051630a83aaa960e31b81526110069063541d554890610fe6903390600401612859565b60206040518083038186803b158015610ffe57600080fd5b505afa158015611012573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110369190612623565b6110525760405162461bcd60e51b81526004016104cc906128d6565b60065461105f5760146006555b8051514361010090910111801561108157504381602001516000015161010001115b61109d5760405162461bcd60e51b81526004016104cc9061290d565b8060200151602001518160000151602001511480156110cb5750806020015160600151816000015160600151145b156110e85760405162461bcd60e51b81526004016104cc90612b36565b8051604081015190511080156111075750602081015160408101519051105b6111235760405162461bcd60e51b81526004016104cc90612a3f565b6020810151518151511080156111485750806000015160400151816020015160400151105b8061117357508051516020820151511080156111735750806020015160400151816000015160400151105b8061118d5750806020015160400151816000015160400151145b6111a95760405162461bcd60e51b81526004016104cc90612974565b6060806110006001600160a01b0316633b071dcc6040518163ffffffff1660e01b815260040160006040518083038186803b1580156111e757600080fd5b505afa1580156111fb573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526112239190810190612560565b60408501519193509150600090815b83518110156112805761125884828151811061124a57fe5b602002602001015183611ac7565b156112785784818151811061126957fe5b60200260200101519250611280565b600101611232565b506001600160a01b0382166112a75760405162461bcd60e51b81526004016104cc90612a76565b6112b985600001518660400151611b2b565b80156112d257506112d285602001518660400151611b2b565b6112ee5760405162461bcd60e51b81526004016104cc906129e0565b6006546040516309a99b4f60e41b815260646110028031909302049190639a99b4f090611321903390859060040161286d565b602060405180830381600087803b15801561133b57600080fd5b505af115801561134f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113739190612777565b506040516335409f7f60e01b8152611000906335409f7f90611399908690600401612859565b600060405180830381600087803b1580156113b357600080fd5b505af11580156113c7573d6000803e3d6000fd5b505050506120006001600160a01b031663f7a251d7600b6113e786611916565b60006040518463ffffffff1660e01b815260040161140793929190612f26565b600060405180830381600087803b15801561142157600080fd5b505af1158015611435573d6000803e3d6000fd5b50506040516001600160a01b03861692507fddb6012116e51abf5436d956a4f0ebd927e92c576ff96d7918290c8782291e3e9150600090a2505050505050565b601481565b61100381565b60005460ff16156114a35760405162461bcd60e51b81526004016104cc90612c9c565b603260045560966005556000805460ff19166001179055565b61100081565b600381565b33611000146114e85760405162461bcd60e51b81526004016104cc90612b63565b60005460ff1661150a5760405162461bcd60e51b81526004016104cc9061293d565b6001546115165761190e565b600154600090600019015b8082116118e2576000805b828410156116455761153c612324565b600260006001878154811061154d57fe5b60009182526020808320909101546001600160a01b0316835282810193909352604091820190208151606081018352815481526001820154938101939093526002015460ff16151590820152600554909150600490048160200151111561162f576004600554816115ba57fe5b048160200151038160200181815250508060026000600188815481106115dc57fe5b6000918252602080832091909101546001600160a01b0316835282810193909352604091820190208351815591830151600183015591909101516002909101805460ff1916911515919091179055611639565b6001925050611645565b5060019093019261152c565b8284116117dc57611654612324565b600260006001868154811061166557fe5b60009182526020808320909101546001600160a01b0316835282810193909352604091820190208151606081018352815481526001820154938101939093526002015460ff16151590820152600554909150600490048160200151111561174d576004600554816116d257fe5b048160200151038160200181815250508060026000600187815481106116f457fe5b6000918252602080832091909101546001600160a01b03168352828101939093526040918201902083518155918301516001808401919091559201516002909101805460ff191691151591909117905591506117dc9050565b600260006001868154811061175e57fe5b60009182526020808320909101546001600160a01b031683528201929092526040018120818155600181810192909255600201805460ff191690558054806117a257fe5b600082815260209020810160001990810180546001600160a01b0319169055019055836117cf57506117dc565b5060001990920191611645565b8180156117e65750805b156118c55760026000600186815481106117fc57fe5b60009182526020808320909101546001600160a01b031683528201929092526040018120818155600181810192909255600201805460ff1916905580548490811061184357fe5b600091825260209091200154600180546001600160a01b03909216918690811061186957fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060018054806118a257fe5b600082815260209020810160001990810180546001600160a01b03191690550190555b826118d15750506118e2565b505060019091019060001901611521565b6040517fcfdb3b6ccaeccbdc68be3c59c840e3b3c90f0a7c491f5fff1cf56cfda200dd9c90600090a150505b565b61100481565b60408051600480825260a08201909252606091829190816020015b606081526020019060019003908161193157905050905061195a836001600160a01b0316611c76565b8160008151811061196757fe5b602002602001018190525061197b43611c99565b8160018151811061198857fe5b602090810291909101015261199d6061611c99565b816002815181106119aa57fe5b60200260200101819052506119be42611c99565b816003815181106119cb57fe5b60200260200101819052506119df81611cac565b9150505b919050565b6119f0612347565b60006119fa612347565b611a02612359565b611a13611a0e86611d36565b611d5b565b90506000805b611a2283611da5565b15611a5b5780611a4e57611a3d611a3884611dc6565b611e14565b63ffffffff16845260019150611a53565b611a5b565b600101611a19565b5091935090915050915091565b600081604051602001611a7b919061283d565b6040516020818303038152906040528051906020012083604051602001611aa2919061283d565b604051602081830303815290604052805190602001201490505b92915050565b015190565b815181516000916001918114808314611ae35760009250611b21565b600160208701838101602088015b600284838510011415611b1c578051835114611b105760009650600093505b60209283019201611af1565b505050505b5090949350505050565b60408051610110808252610140820190925260009160609190602082018180368337505060408051602080825281830190925292935060609291508082018180368337019050509050611b846020866000015183611e96565b611b92828260006020611e9c565b611ba26020866040015183611e96565b611baf8282602080611e9c565b611bbf6020866020015183611eef565b611bcd828260406020611e9c565b611bdd6020866060015183611eef565b611beb828260606020611e9c565b611bfd82866080015160806060611e9c565b611c0b828560e06030611e9c565b604080516001808252818301909252606091602082018180368337019050509050825160016020830182602087016064600019fa611c4857600080fd5b506001611c56826000611eff565b60ff1614611c6a5760009350505050611abc565b50600195945050505050565b60408051600560a21b83186014820152603481019091526060906119df81611f1b565b6060611abc611ca783611f71565b611f1b565b6060815160001415611ccd57506040805160008152602081019091526119e3565b606082600081518110611cdc57fe5b602002602001015190506000600190505b8351811015611d1d57611d1382858381518110611d0657fe5b6020026020010151612057565b9150600101611ced565b506119df611d30825160c060ff166120d4565b82612057565b611d3e612379565b506040805180820190915281518152602082810190820152919050565b611d63612359565b611d6c826121a6565b611d7557600080fd5b6000611d8483602001516121e0565b60208085015160408051808201909152868152920190820152915050919050565b6000611daf612379565b505080518051602091820151919092015191011190565b611dce612379565b611dd782611da5565b611de057600080fd5b60208201516000611df082612243565b80830160209586015260408051808201909152908152938401919091525090919050565b805160009015801590611e2957508151602110155b611e3257600080fd5b6000611e4183602001516121e0565b90508083600001511015611e675760405162461bcd60e51b81526004016104cc90612cd3565b825160208085015183018051928490039291831015611e8d57826020036101000a820491505b50949350505050565b90910152565b60005b8181101561068157838181518110611eb357fe5b602001015160f81c60f81b858480600101955081518110611ed057fe5b60200101906001600160f81b031916908160001a905350600101611e9f565b9091018181526020918201910152565b60008160010183511015611f1257600080fd5b50016001015190565b606081516001148015611f4d5750607f60f81b82600081518110611f3b57fe5b01602001516001600160f81b03191611155b15611f595750806119e3565b611abc611f6b8351608060ff166120d4565b83612057565b604080516020808252818301909252606091829190602082018180368337505050602081018490529050600067ffffffffffffffff198416611fb557506018611fd9565b6fffffffffffffffffffffffffffffffff198416611fd557506010611fd9565b5060005b602081101561200f57818181518110611fee57fe5b01602001516001600160f81b031916156120075761200f565b600101611fd9565b60008160200390506060816040519080825280601f01601f191660200182016040528015612044576020820181803683370190505b5080830196909652508452509192915050565b6060806040519050835180825260208201818101602087015b81831015612088578051835260209283019201612070565b50855184518101855292509050808201602086015b818310156120b557805183526020928301920161209d565b508651929092011591909101601f01601f191660405250905092915050565b60606801000000000000000083106120fe5760405162461bcd60e51b81526004016104cc90612a17565b604080516001808252818301909252606091602082018180368337019050509050603784116121585782840160f81b8160008151811061213a57fe5b60200101906001600160f81b031916908160001a9053509050611abc565b606061216385611f71565b90508381510160370160f81b8260008151811061217c57fe5b60200101906001600160f81b031916908160001a90535061219d8282612057565b95945050505050565b80516000906121b7575060006119e3565b6020820151805160001a9060c08210156121d6576000925050506119e3565b5060019392505050565b8051600090811a60808110156121fa5760009150506119e3565b60b8811080612215575060c08110801590612215575060f881105b156122245760019150506119e3565b60c08110156122385760b5190190506119e3565b60f5190190506119e3565b80516000908190811a608081101561225e576001915061231d565b60b881101561227357607e198101915061231d565b60c08110156122c457600060b78203600186019550806020036101000a8651049150600181018201935050808310156122be5760405162461bcd60e51b81526004016104cc90612bb3565b5061231d565b60f88110156122d95760be198101915061231d565b600060f78203600186019550806020036101000a86510491506001810182019350508083101561231b5760405162461bcd60e51b81526004016104cc90612bb3565b505b5092915050565b604051806060016040528060008152602001600081526020016000151581525090565b60408051602081019091526000815290565b604051806040016040528061236c612379565b8152602001600081525090565b604051806040016040528060008152602001600081525090565b600082601f8301126123a3578081fd5b81516123b66123b182612f79565b612f52565b818152915060208083019084810160005b8481101561242c578151870188603f8201126123e257600080fd5b838101516123f26123b182612f99565b81815260408b8184860101111561240857600080fd5b61241783888401838701612fbd565b508652505092820192908201906001016123c7565b505050505092915050565b60008083601f840112612448578182fd5b50813567ffffffffffffffff81111561245f578182fd5b60208301915083602082850101111561247757600080fd5b9250929050565b600082601f83011261248e578081fd5b813561249c6123b182612f99565b91508082528360208285010111156124b357600080fd5b8060208401602084013760009082016020015292915050565b600060a082840312156124dd578081fd5b6124e760a0612f52565b905081358152602082013560208201526040820135604082015260608201356060820152608082013567ffffffffffffffff81111561252557600080fd5b6125318482850161247e565b60808301525092915050565b60006020828403121561254e578081fd5b813561255981612fed565b9392505050565b60008060408385031215612572578081fd5b825167ffffffffffffffff80821115612589578283fd5b81850186601f82011261259a578384fd5b805192506125aa6123b184612f79565b80848252602080830192508084018a8283890287010111156125ca578788fd5b8794505b868510156125f55780516125e181612fed565b8452600194909401939281019281016125ce565b50880151909650935050508082111561260c578283fd5b5061261985828601612393565b9150509250929050565b600060208284031215612634578081fd5b81518015158114612559578182fd5b60008060008060408587031215612658578182fd5b843567ffffffffffffffff8082111561266f578384fd5b61267b88838901612437565b90965094506020870135915080821115612693578384fd5b506126a087828801612437565b95989497509550505050565b6000602082840312156126bd578081fd5b813567ffffffffffffffff808211156126d4578283fd5b818401606081870312156126e6578384fd5b6126f06060612f52565b9250803582811115612700578485fd5b61270c878284016124cc565b845250602081013582811115612720578485fd5b61272c878284016124cc565b602085015250604081013582811115612743578485fd5b61274f8782840161247e565b6040850152509195945050505050565b600060208284031215612770578081fd5b5035919050565b600060208284031215612788578081fd5b5051919050565b6000806000604084860312156127a3578283fd5b833560ff811681146127b3578384fd5b9250602084013567ffffffffffffffff8111156127ce578283fd5b6127da86828701612437565b9497909650939450505050565b60008284528282602086013780602084860101526020601f19601f85011685010190509392505050565b60008151808452612829816020860160208601612fbd565b601f01601f19169290920160200192915050565b6000825161284f818460208701612fbd565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b6000602082526125596020830184612811565b6000604082526128b86040830186886127e7565b82810360208401526128cb8185876127e7565b979650505050505050565b6020808252601f908201527f746865206d73672073656e646572206973206e6f7420612072656c6179657200604082015260600190565b6020808252601690820152751d1bdbc81bdb1908189b1bd8dac81a5b9d9bdb1d995960521b604082015260600190565b60208082526019908201527f74686520636f6e7472616374206e6f7420696e69742079657400000000000000604082015260600190565b6020808252601a908201527f6e6f2076696f6c6174696f6e206f6620766f74652072756c6573000000000000604082015260600190565b6020808252818101527f7468652066656c6f6e795468726573686f6c64206f7574206f662072616e6765604082015260600190565b60208082526017908201527f766572696679207369676e6174757265206661696c6564000000000000000000604082015260600190565b6020808252600e908201526d696e70757420746f6f206c6f6e6760901b604082015260600190565b60208082526019908201527f7372634e756d20626967676572207468616e207461724e756d00000000000000604082015260600190565b6020808252601390820152721d985b1a59185d1bdc881b9bdd08195e1a5cdd606a1b604082015260600190565b6020808252602c908201527f7468652066696e616c69747920736c6173682072657761726420726174696f2060408201526b6f7574206f662072616e676560a01b606082015260800190565b60208082526027908201527f6c656e677468206f66206d697364656d65616e6f725468726573686f6c64206d6040820152660d2e6dac2e8c6d60cb1b606082015260800190565b60208082526013908201527274776f206964656e746963616c20766f74657360681b604082015260600190565b60208082526030908201527f746865206d6573736167652073656e646572206d7573742062652076616c696460408201526f185d1bdc94d95d0818dbdb9d1c9858dd60821b606082015260800190565b6020808252601190820152706164646974696f6e206f766572666c6f7760781b604082015260600190565b6020808252601490820152736761737072696365206973206e6f74207a65726f60601b604082015260600190565b6020808252602e908201527f746865206d6573736167652073656e646572206d75737420626520676f76657260408201526d1b985b98d94818dbdb9d1c9858dd60921b606082015260800190565b60208082526022908201527f6c656e677468206f662066656c6f6e795468726573686f6c64206d69736d61746040820152610c6d60f31b606082015260800190565b60208082526019908201527f74686520636f6e747261637420616c726561647920696e697400000000000000604082015260600190565b6020808252601a908201527f6c656e677468206973206c657373207468616e206f6666736574000000000000604082015260600190565b60208082526025908201527f746865206d697364656d65616e6f725468726573686f6c64206f7574206f662060408201526472616e676560d81b606082015260800190565b6020808252602f908201527f746865206d6573736167652073656e646572206d7573742062652063726f737360408201526e0818da185a5b8818dbdb9d1c9858dd608a1b606082015260800190565b6020808252602d908201527f746865206d6573736167652073656e646572206d75737420626520746865206260408201526c3637b1b590383937b23ab1b2b960991b606082015260800190565b6020808252600d908201526c756e6b6e6f776e20706172616d60981b604082015260600190565b6020808252601e908201527f7265636569766520756e65787065637465642073796e207061636b6167650000604082015260600190565b6020808252602b908201527f6c656e677468206f662066696e616c697479536c61736852657761726452617460408201526a0d2de40dad2e6dac2e8c6d60ab1b606082015260800190565b6020808252818101527f63616e206e6f7420736c61736820747769636520696e206f6e6520626c6f636b604082015260600190565b61ffff91909116815260200190565b90815260200190565b918252602082015260400190565b92835260208301919091521515604082015260600190565b63ffffffff91909116815260200190565b60ff91909116815260200190565b600060ff8516825260606020830152612f426060830185612811565b9050826040830152949350505050565b60405181810167ffffffffffffffff81118282101715612f7157600080fd5b604052919050565b600067ffffffffffffffff821115612f8f578081fd5b5060209081020190565b600067ffffffffffffffff821115612faf578081fd5b50601f01601f191660200190565b60005b83811015612fd8578181015183820152602001612fc0565b83811115612fe7576000848401525b50505050565b6001600160a01b038116811461300257600080fd5b5056fea26469706673582212203f1ba3aa2cb8081bd01eafa998c802486928737d77a28fa3a6226f643d7670c764736f6c63430006040033", + }, + UpgradeConfig { + contract_addr: "0x0000000000000000000000000000000000001002", + code: "60806040526004361061016a5760003560e01c806396713da9116100d1578063ac4317511161008a578063f9a2bbc711610064578063f9a2bbc7146104f0578063fb5478b314610505578063fc3e59081461051a578063fd6a68791461052f576101ae565b8063ac431751146103f7578063c81b1662146104c6578063dc927faf146104db576101ae565b806396713da9146103555780639a99b4f01461036a5780639dc09262146103a3578063a1a11bf5146103b8578063a78abc16146103cd578063ab51bb96146103e2576101ae565b806351e806721161012357806351e80672146102a55780636d70f7ae146102ba5780636e47b4821461030157806370fd5bad1461031657806375d47a0a1461032b5780637942fd0514610340576101ae565b80630bee7a67146101b35780633a0b0eff146101e15780633dffc3871461020857806343756e5c14610233578063493279b1146102645780634bf6c88214610290576101ae565b366101ae5734156101ac5760408051348152905133917f6c98249d85d88c3753a04a22230f595e4dc8d3dc86c34af35deeeedc861b89db919081900360200190a25b005b600080fd5b3480156101bf57600080fd5b506101c8610544565b6040805163ffffffff9092168252519081900360200190f35b3480156101ed57600080fd5b506101f6610549565b60408051918252519081900360200190f35b34801561021457600080fd5b5061021d61054f565b6040805160ff9092168252519081900360200190f35b34801561023f57600080fd5b50610248610554565b604080516001600160a01b039092168252519081900360200190f35b34801561027057600080fd5b5061027961055a565b6040805161ffff9092168252519081900360200190f35b34801561029c57600080fd5b5061021d61055f565b3480156102b157600080fd5b50610248610564565b3480156102c657600080fd5b506102ed600480360360208110156102dd57600080fd5b50356001600160a01b031661056a565b604080519115158252519081900360200190f35b34801561030d57600080fd5b50610248610588565b34801561032257600080fd5b5061021d61058e565b34801561033757600080fd5b50610248610593565b34801561034c57600080fd5b5061021d610599565b34801561036157600080fd5b5061021d61059e565b34801561037657600080fd5b506101f66004803603604081101561038d57600080fd5b506001600160a01b0381351690602001356105a3565b3480156103af57600080fd5b50610248610721565b3480156103c457600080fd5b50610248610727565b3480156103d957600080fd5b506102ed61072d565b3480156103ee57600080fd5b506101c8610736565b34801561040357600080fd5b506101ac6004803603604081101561041a57600080fd5b81019060208101813564010000000081111561043557600080fd5b82018360208201111561044757600080fd5b8035906020019184600183028401116401000000008311171561046957600080fd5b91939092909160208101903564010000000081111561048757600080fd5b82018360208201111561049957600080fd5b803590602001918460018302840111640100000000831117156104bb57600080fd5b50909250905061073b565b3480156104d257600080fd5b50610248610987565b3480156104e757600080fd5b5061024861098d565b3480156104fc57600080fd5b50610248610993565b34801561051157600080fd5b506101f6610999565b34801561052657600080fd5b5061021d6109a5565b34801561053b57600080fd5b506102486109aa565b606481565b60015481565b600181565b61100181565b606181565b600881565b61200081565b6001600160a01b031660009081526002602052604090205460ff1690565b61100581565b600281565b61100881565b600b81565b600981565b6000805460ff1661062057600260208190527fe57bda0a954a7c7381b17b2c763e646ba2c60f67292d287ba583603e2c1c41668054600160ff19918216811790925561100560009081527fe25235fc0de9d7165652bef0846fefda506174abb9a190f03d0f7bcc6146dbce80548316841790559282558254161790555b3360009081526002602052604090205460ff1661063f5750600061071b565b600047831061064e5747610650565b825b9050670de0b6b3a764000081111561066d5750670de0b6b3a76400005b80156106ee576040516001600160a01b0385169082156108fc029083906000818181858888f193505050501580156106a9573d6000803e3d6000fd5b506040805182815290516001600160a01b038616917ff8b71c64315fc33b2ead2adfa487955065152a8ac33d9d5193aafd7f45dc15a0919081900360200190a2610718565b6040517fe589651933c2457488cc0d8e0941518abf748e799435e4e396d9c4d0b2db2d4d90600090a15b90505b92915050565b61100781565b61100681565b60005460ff1681565b600081565b336110071461077b5760405162461bcd60e51b815260040180806020018281038252602e815260200180610a98602e913960400191505060405180910390fd5b6107e084848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600e81526d3ab83230ba32a7b832b930ba37b960911b602082015291506109b09050565b156108b857606082828080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050825192935050601490911490506108635760405162461bcd60e51b815260040180806020018281038252602f815260200180610ac6602f913960400191505060405180910390fd5b60148101516001600160a01b038116600081815260026020526040808220805460ff19166001179055517fac7475ed884e49421eb8233dba94b23e64245a7584b98b4b15745ca139014bc69190a250506108f5565b6040805162461bcd60e51b815260206004820152600d60248201526c756e6b6e6f776e20706172616d60981b604482015290519081900360640190fd5b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a848484846040518080602001806020018381038352878782818152602001925080828437600083820152601f01601f191690910184810383528581526020019050858580828437600083820152604051601f909101601f19169092018290039850909650505050505050a150505050565b61100281565b61100381565b61100081565b670de0b6b3a764000081565b600381565b61100481565b6000816040516020018082805190602001908083835b602083106109e55780518252601f1990920191602091820191016109c6565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120836040516020018082805190602001908083835b60208310610a535780518252601f199092019160209182019101610a34565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051602081830303815290604052805190602001201490509291505056fe746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e74726163746c656e677468206f662076616c756520666f72207570646174654f70657261746f722073686f756c64206265203230a26469706673582212208e4c7c7583829546df971b988e1a1680d5711dc8760df607c59cb162f541cc9664736f6c63430006040033", + }, + ], + )] + .iter() + .cloned() + .collect(); +} diff --git a/crates/bsc/consensus/src/error.rs b/crates/bsc/consensus/src/error.rs new file mode 100644 index 000000000..0c4764817 --- /dev/null +++ b/crates/bsc/consensus/src/error.rs @@ -0,0 +1,51 @@ +use reth_consensus::ConsensusError; +use reth_primitives::{BlockNumber, U256}; + +/// Parlia consensus error. +#[derive(thiserror::Error, Debug, PartialEq, Eq, Clone)] +pub enum ParliaConsensusError { + /// Error when header extra vanity is missing + #[error("missing header extra vanity")] + ExtraVanityMissing, + + /// Error when header extra signature is missing + #[error("missing header extra signature")] + ExtraSignatureMissing, + + /// Error when header extra length is invalid + #[error("header extra length {header_extra_len} is invalid")] + InvalidHeaderExtraLen { + /// The validator bytes length + header_extra_len: u64, + }, + + /// Error when header extra validator bytes length is invalid + #[error("header extra validator bytes length {validator_bytes_len} is invalid")] + InvalidHeaderExtraValidatorBytesLen { + /// Is epoch + is_epoch: bool, + /// The validator bytes length + validator_bytes_len: usize, + }, + + /// Error when the header is not in epoch + #[error("{block_number} is not in epoch")] + NotInEpoch { + /// The block number + block_number: BlockNumber, + }, + + /// Error when encountering a abi decode inner error + #[error("abi decode inner error")] + ABIDecodeInnerError, + + /// Error when encountering a recover ecdsa inner error + #[error("recover ecdsa inner error")] + RecoverECDSAInnerError, +} + +impl From for ConsensusError { + fn from(err: ParliaConsensusError) -> Self { + ConsensusError::other(err) + } +} diff --git a/crates/bsc/consensus/src/feynman_fork.rs b/crates/bsc/consensus/src/feynman_fork.rs new file mode 100644 index 000000000..8c3f4ea88 --- /dev/null +++ b/crates/bsc/consensus/src/feynman_fork.rs @@ -0,0 +1,67 @@ +use reth_primitives::{Address, U256}; +use std::{cmp::Ordering, collections::BinaryHeap}; + +#[derive(Debug, Eq, PartialEq)] +pub struct ValidatorItem { + pub address: Address, + pub voting_power: U256, + pub vote_address: Vec, +} + +impl Ord for ValidatorItem { + fn cmp(&self, other: &Self) -> Ordering { + match self.voting_power.cmp(&other.voting_power) { + Ordering::Equal => self.address.cmp(&other.address), + other => other, + } + } +} + +impl PartialOrd for ValidatorItem { + fn partial_cmp(&self, other: &Self) -> Option { + Some(self.cmp(other)) + } +} + +pub fn get_top_validators_by_voting_power( + consensus_addrs: Vec
, + voting_powers: Vec, + vote_addresses: Vec>, + total_length: U256, + max_elected_validators: U256, +) -> Option<(Vec
, Vec, Vec>)> { + if consensus_addrs.len() != total_length.to::() || + voting_powers.len() != total_length.to::() || + vote_addresses.len() != total_length.to::() + { + return None; + } + + let mut validator_heap: BinaryHeap = BinaryHeap::new(); + for i in 0..consensus_addrs.len() { + let item = ValidatorItem { + address: consensus_addrs[i], + voting_power: voting_powers[i], + vote_address: vote_addresses[i].clone(), + }; + if item.voting_power > U256::ZERO { + validator_heap.push(item); + } + } + + let top_n = max_elected_validators.to::() as usize; + let top_n = if top_n > validator_heap.len() { validator_heap.len() } else { top_n }; + let mut e_validators = Vec::with_capacity(top_n); + let mut e_voting_powers = Vec::with_capacity(top_n); + let mut e_vote_addrs = Vec::with_capacity(top_n); + for _ in 0..top_n { + let item = validator_heap.pop().unwrap(); + e_validators.push(item.address); + // as the decimal in BNB Beacon Chain is 1e8 and in BNB Smart Chain is 1e18, we need to + // divide it by 1e10 + e_voting_powers.push(item.voting_power / U256::from(10u64.pow(10))); + e_vote_addrs.push(item.vote_address); + } + + Some((e_validators, e_voting_powers, e_vote_addrs)) +} diff --git a/crates/bsc/consensus/src/go_rng.rs b/crates/bsc/consensus/src/go_rng.rs new file mode 100644 index 000000000..a2c37accd --- /dev/null +++ b/crates/bsc/consensus/src/go_rng.rs @@ -0,0 +1,858 @@ +/// Uniform distribution +/// algorithm by +/// DP Mitchell and JA Reeds + +const RNG_LEN: usize = 607; +const RNG_TAP: usize = 273; +const RNG_MAX: u64 = 1 << 63; +const RNG_MASK: u64 = RNG_MAX - 1; +const INT32_MAX: i64 = (1 << 31) - 1; + +// rngCooked used for seeding. +const RNG_COOKED: [i64; RNG_LEN] = [ + -4181792142133755926, + -4576982950128230565, + 1395769623340756751, + 5333664234075297259, + -6347679516498800754, + 9033628115061424579, + 7143218595135194537, + 4812947590706362721, + 7937252194349799378, + 5307299880338848416, + 8209348851763925077, + -7107630437535961764, + 4593015457530856296, + 8140875735541888011, + -5903942795589686782, + -603556388664454774, + -7496297993371156308, + 113108499721038619, + 4569519971459345583, + -4160538177779461077, + -6835753265595711384, + -6507240692498089696, + 6559392774825876886, + 7650093201692370310, + 7684323884043752161, + -8965504200858744418, + -2629915517445760644, + 271327514973697897, + -6433985589514657524, + 1065192797246149621, + 3344507881999356393, + -4763574095074709175, + 7465081662728599889, + 1014950805555097187, + -4773931307508785033, + -5742262670416273165, + 2418672789110888383, + 5796562887576294778, + 4484266064449540171, + 3738982361971787048, + -4699774852342421385, + 10530508058128498, + -589538253572429690, + -6598062107225984180, + 8660405965245884302, + 10162832508971942, + -2682657355892958417, + 7031802312784620857, + 6240911277345944669, + 831864355460801054, + -1218937899312622917, + 2116287251661052151, + 2202309800992166967, + 9161020366945053561, + 4069299552407763864, + 4936383537992622449, + 457351505131524928, + -8881176990926596454, + -6375600354038175299, + -7155351920868399290, + 4368649989588021065, + 887231587095185257, + -3659780529968199312, + -2407146836602825512, + 5616972787034086048, + -751562733459939242, + 1686575021641186857, + -5177887698780513806, + -4979215821652996885, + -1375154703071198421, + 5632136521049761902, + -8390088894796940536, + -193645528485698615, + -5979788902190688516, + -4907000935050298721, + -285522056888777828, + -2776431630044341707, + 1679342092332374735, + 6050638460742422078, + -2229851317345194226, + -1582494184340482199, + 5881353426285907985, + 812786550756860885, + 4541845584483343330, + -6497901820577766722, + 4980675660146853729, + -4012602956251539747, + -329088717864244987, + -2896929232104691526, + 1495812843684243920, + -2153620458055647789, + 7370257291860230865, + -2466442761497833547, + 4706794511633873654, + -1398851569026877145, + 8549875090542453214, + -9189721207376179652, + -7894453601103453165, + 7297902601803624459, + 1011190183918857495, + -6985347000036920864, + 5147159997473910359, + -8326859945294252826, + 2659470849286379941, + 6097729358393448602, + -7491646050550022124, + -5117116194870963097, + -896216826133240300, + -745860416168701406, + 5803876044675762232, + -787954255994554146, + -3234519180203704564, + -4507534739750823898, + -1657200065590290694, + 505808562678895611, + -4153273856159712438, + -8381261370078904295, + 572156825025677802, + 1791881013492340891, + 3393267094866038768, + -5444650186382539299, + 2352769483186201278, + -7930912453007408350, + -325464993179687389, + -3441562999710612272, + -6489413242825283295, + 5092019688680754699, + -227247482082248967, + 4234737173186232084, + 5027558287275472836, + 4635198586344772304, + -536033143587636457, + 5907508150730407386, + -8438615781380831356, + 972392927514829904, + -3801314342046600696, + -4064951393885491917, + -174840358296132583, + 2407211146698877100, + -1640089820333676239, + 3940796514530962282, + -5882197405809569433, + 3095313889586102949, + -1818050141166537098, + 5832080132947175283, + 7890064875145919662, + 8184139210799583195, + -8073512175445549678, + -7758774793014564506, + -4581724029666783935, + 3516491885471466898, + -8267083515063118116, + 6657089965014657519, + 5220884358887979358, + 1796677326474620641, + 5340761970648932916, + 1147977171614181568, + 5066037465548252321, + 2574765911837859848, + 1085848279845204775, + -5873264506986385449, + 6116438694366558490, + 2107701075971293812, + -7420077970933506541, + 2469478054175558874, + -1855128755834809824, + -5431463669011098282, + -9038325065738319171, + -6966276280341336160, + 7217693971077460129, + -8314322083775271549, + 7196649268545224266, + -3585711691453906209, + -5267827091426810625, + 8057528650917418961, + -5084103596553648165, + -2601445448341207749, + -7850010900052094367, + 6527366231383600011, + 3507654575162700890, + 9202058512774729859, + 1954818376891585542, + -2582991129724600103, + 8299563319178235687, + -5321504681635821435, + 7046310742295574065, + -2376176645520785576, + -7650733936335907755, + 8850422670118399721, + 3631909142291992901, + 5158881091950831288, + -6340413719511654215, + 4763258931815816403, + 6280052734341785344, + -4979582628649810958, + 2043464728020827976, + -2678071570832690343, + 4562580375758598164, + 5495451168795427352, + -7485059175264624713, + 553004618757816492, + 6895160632757959823, + -989748114590090637, + 7139506338801360852, + -672480814466784139, + 5535668688139305547, + 2430933853350256242, + -3821430778991574732, + -1063731997747047009, + -3065878205254005442, + 7632066283658143750, + 6308328381617103346, + 3681878764086140361, + 3289686137190109749, + 6587997200611086848, + 244714774258135476, + -5143583659437639708, + 8090302575944624335, + 2945117363431356361, + -8359047641006034763, + 3009039260312620700, + -793344576772241777, + 401084700045993341, + -1968749590416080887, + 4707864159563588614, + -3583123505891281857, + -3240864324164777915, + -5908273794572565703, + -3719524458082857382, + -5281400669679581926, + 8118566580304798074, + 3839261274019871296, + 7062410411742090847, + -8481991033874568140, + 6027994129690250817, + -6725542042704711878, + -2971981702428546974, + -7854441788951256975, + 8809096399316380241, + 6492004350391900708, + 2462145737463489636, + -8818543617934476634, + -5070345602623085213, + -8961586321599299868, + -3758656652254704451, + -8630661632476012791, + 6764129236657751224, + -709716318315418359, + -3403028373052861600, + -8838073512170985897, + -3999237033416576341, + -2920240395515973663, + -2073249475545404416, + 368107899140673753, + -6108185202296464250, + -6307735683270494757, + 4782583894627718279, + 6718292300699989587, + 8387085186914375220, + 3387513132024756289, + 4654329375432538231, + -292704475491394206, + -3848998599978456535, + 7623042350483453954, + 7725442901813263321, + 9186225467561587250, + -5132344747257272453, + -6865740430362196008, + 2530936820058611833, + 1636551876240043639, + -3658707362519810009, + 1452244145334316253, + -7161729655835084979, + -7943791770359481772, + 9108481583171221009, + -3200093350120725999, + 5007630032676973346, + 2153168792952589781, + 6720334534964750538, + -3181825545719981703, + 3433922409283786309, + 2285479922797300912, + 3110614940896576130, + -2856812446131932915, + -3804580617188639299, + 7163298419643543757, + 4891138053923696990, + 580618510277907015, + 1684034065251686769, + 4429514767357295841, + -8893025458299325803, + -8103734041042601133, + 7177515271653460134, + 4589042248470800257, + -1530083407795771245, + 143607045258444228, + 246994305896273627, + -8356954712051676521, + 6473547110565816071, + 3092379936208876896, + 2058427839513754051, + -4089587328327907870, + 8785882556301281247, + -3074039370013608197, + -637529855400303673, + 6137678347805511274, + -7152924852417805802, + 5708223427705576541, + -3223714144396531304, + 4358391411789012426, + 325123008708389849, + 6837621693887290924, + 4843721905315627004, + -3212720814705499393, + -3825019837890901156, + 4602025990114250980, + 1044646352569048800, + 9106614159853161675, + -8394115921626182539, + -4304087667751778808, + 2681532557646850893, + 3681559472488511871, + -3915372517896561773, + -2889241648411946534, + -6564663803938238204, + -8060058171802589521, + 581945337509520675, + 3648778920718647903, + -4799698790548231394, + -7602572252857820065, + 220828013409515943, + -1072987336855386047, + 4287360518296753003, + -4633371852008891965, + 5513660857261085186, + -2258542936462001533, + -8744380348503999773, + 8746140185685648781, + 228500091334420247, + 1356187007457302238, + 3019253992034194581, + 3152601605678500003, + -8793219284148773595, + 5559581553696971176, + 4916432985369275664, + -8559797105120221417, + -5802598197927043732, + 2868348622579915573, + -7224052902810357288, + -5894682518218493085, + 2587672709781371173, + -7706116723325376475, + 3092343956317362483, + -5561119517847711700, + 972445599196498113, + -1558506600978816441, + 1708913533482282562, + -2305554874185907314, + -6005743014309462908, + -6653329009633068701, + -483583197311151195, + 2488075924621352812, + -4529369641467339140, + -4663743555056261452, + 2997203966153298104, + 1282559373026354493, + 240113143146674385, + 8665713329246516443, + 628141331766346752, + -4651421219668005332, + -7750560848702540400, + 7596648026010355826, + -3132152619100351065, + 7834161864828164065, + 7103445518877254909, + 4390861237357459201, + -4780718172614204074, + -319889632007444440, + 622261699494173647, + -3186110786557562560, + -8718967088789066690, + -1948156510637662747, + -8212195255998774408, + -7028621931231314745, + 2623071828615234808, + -4066058308780939700, + -5484966924888173764, + -6683604512778046238, + -6756087640505506466, + 5256026990536851868, + 7841086888628396109, + 6640857538655893162, + -8021284697816458310, + -7109857044414059830, + -1689021141511844405, + -4298087301956291063, + -4077748265377282003, + -998231156719803476, + 2719520354384050532, + 9132346697815513771, + 4332154495710163773, + -2085582442760428892, + 6994721091344268833, + -2556143461985726874, + -8567931991128098309, + 59934747298466858, + -3098398008776739403, + -265597256199410390, + 2332206071942466437, + -7522315324568406181, + 3154897383618636503, + -7585605855467168281, + -6762850759087199275, + 197309393502684135, + -8579694182469508493, + 2543179307861934850, + 4350769010207485119, + -4468719947444108136, + -7207776534213261296, + -1224312577878317200, + 4287946071480840813, + 8362686366770308971, + 6486469209321732151, + -5605644191012979782, + -1669018511020473564, + 4450022655153542367, + -7618176296641240059, + -3896357471549267421, + -4596796223304447488, + -6531150016257070659, + -8982326463137525940, + -4125325062227681798, + -1306489741394045544, + -8338554946557245229, + 5329160409530630596, + 7790979528857726136, + 4955070238059373407, + -4304834761432101506, + -6215295852904371179, + 3007769226071157901, + -6753025801236972788, + 8928702772696731736, + 7856187920214445904, + -4748497451462800923, + 7900176660600710914, + -7082800908938549136, + -6797926979589575837, + -6737316883512927978, + 4186670094382025798, + 1883939007446035042, + -414705992779907823, + 3734134241178479257, + 4065968871360089196, + 6953124200385847784, + -7917685222115876751, + -7585632937840318161, + -5567246375906782599, + -5256612402221608788, + 3106378204088556331, + -2894472214076325998, + 4565385105440252958, + 1979884289539493806, + -6891578849933910383, + 3783206694208922581, + 8464961209802336085, + 2843963751609577687, + 3030678195484896323, + -4429654462759003204, + 4459239494808162889, + 402587895800087237, + 8057891408711167515, + 4541888170938985079, + 1042662272908816815, + -3666068979732206850, + 2647678726283249984, + 2144477441549833761, + -3417019821499388721, + -2105601033380872185, + 5916597177708541638, + -8760774321402454447, + 8833658097025758785, + 5970273481425315300, + 563813119381731307, + -6455022486202078793, + 1598828206250873866, + -4016978389451217698, + -2988328551145513985, + -6071154634840136312, + 8469693267274066490, + 125672920241807416, + -3912292412830714870, + -2559617104544284221, + -486523741806024092, + -4735332261862713930, + 5923302823487327109, + -9082480245771672572, + -1808429243461201518, + 7990420780896957397, + 4317817392807076702, + 3625184369705367340, + -6482649271566653105, + -3480272027152017464, + -3225473396345736649, + -368878695502291645, + -3981164001421868007, + -8522033136963788610, + 7609280429197514109, + 3020985755112334161, + -2572049329799262942, + 2635195723621160615, + 5144520864246028816, + -8188285521126945980, + 1567242097116389047, + 8172389260191636581, + -2885551685425483535, + -7060359469858316883, + -6480181133964513127, + -7317004403633452381, + 6011544915663598137, + 5932255307352610768, + 2241128460406315459, + -8327867140638080220, + 3094483003111372717, + 4583857460292963101, + 9079887171656594975, + -384082854924064405, + -3460631649611717935, + 4225072055348026230, + -7385151438465742745, + 3801620336801580414, + -399845416774701952, + -7446754431269675473, + 7899055018877642622, + 5421679761463003041, + 5521102963086275121, + -4975092593295409910, + 8735487530905098534, + -7462844945281082830, + -2080886987197029914, + -1000715163927557685, + -4253840471931071485, + -5828896094657903328, + 6424174453260338141, + 359248545074932887, + -5949720754023045210, + -2426265837057637212, + 3030918217665093212, + -9077771202237461772, + -3186796180789149575, + 740416251634527158, + -2142944401404840226, + 6951781370868335478, + 399922722363687927, + -8928469722407522623, + -1378421100515597285, + -8343051178220066766, + -3030716356046100229, + -8811767350470065420, + 9026808440365124461, + 6440783557497587732, + 4615674634722404292, + 539897290441580544, + 2096238225866883852, + 8751955639408182687, + -7316147128802486205, + 7381039757301768559, + 6157238513393239656, + -1473377804940618233, + 8629571604380892756, + 5280433031239081479, + 7101611890139813254, + 2479018537985767835, + 7169176924412769570, + -1281305539061572506, + -7865612307799218120, + 2278447439451174845, + 3625338785743880657, + 6477479539006708521, + 8976185375579272206, + -3712000482142939688, + 1326024180520890843, + 7537449876596048829, + 5464680203499696154, + 3189671183162196045, + 6346751753565857109, + -8982212049534145501, + -6127578587196093755, + -245039190118465649, + -6320577374581628592, + 7208698530190629697, + 7276901792339343736, + -7490986807540332668, + 4133292154170828382, + 2918308698224194548, + -7703910638917631350, + -3929437324238184044, + -4300543082831323144, + -6344160503358350167, + 5896236396443472108, + -758328221503023383, + -1894351639983151068, + -307900319840287220, + -6278469401177312761, + -2171292963361310674, + 8382142935188824023, + 9103922860780351547, + 4152330101494654406, +]; + +/// seed rng x[n+1] = 48271 * x[n] mod (2**31 - 1) +pub fn seed_rand(mut x: i32) -> i32 { + const A: i32 = 48271; + const Q: i32 = 44488; + const R: i32 = 3399; + + let hi = x / Q; + let lo = x % Q; + x = A * lo - R * hi; + if x < 0 { + x += INT32_MAX as i32; + } + x +} + +#[allow(missing_debug_implementations)] +pub struct RngSource { + tap: usize, // index into vec + feed: usize, // index into vec + vec: [i64; RNG_LEN], // current feedback register +} + +impl RngSource { + pub fn new(seed: i64) -> RngSource { + let mut rng = RngSource { tap: 0, feed: 0, vec: [0; RNG_LEN] }; + rng.seed(seed); + rng + } + + /// Seed uses the provided seed value to initialize the generator to a deterministic state. + pub fn seed(&mut self, mut seed: i64) { + self.tap = 0; + self.feed = RNG_LEN - RNG_TAP; + + seed %= INT32_MAX; + if seed < 0 { + seed += INT32_MAX + } + if seed == 0 { + seed = 89482311 + } + + let mut x = seed as i32; + let mut i: i32 = -20; + while i < (RNG_LEN as i32) { + x = seed_rand(x); + if i >= 0 { + let mut u = (x as i64) << 40; + x = seed_rand(x); + u ^= (x as i64) << 20; + x = seed_rand(x); + u ^= x as i64; + u ^= RNG_COOKED[i as usize]; + self.vec[i as usize] = u + } + i += 1; + } + } + + /// Int63 returns a non-negative pseudo-random 63-bit integer as an int64. + pub fn int63(&mut self) -> i64 { + (self.uint64() & RNG_MASK) as i64 + } + + /// Uint64 returns a non-negative pseudo-random 64-bit integer as an uint64. + pub fn uint64(&mut self) -> u64 { + self.tap = (self.tap + RNG_LEN - 1) % RNG_LEN; + self.feed = (self.feed + RNG_LEN - 1) % RNG_LEN; + + let (x, _) = self.vec[self.feed].overflowing_add(self.vec[self.tap]); + self.vec[self.feed] = x; + x as u64 + } + + /// Uint32 returns a pseudo-random 32-bit value as a uint32. + pub fn uint32(&mut self) -> u32 { + (self.int63() >> 31) as u32 + } + + /// Int63n returns, as an int64, a non-negative pseudo-random number in the half-open interval + /// [0,n). It panics if n <= 0. + pub fn int63n(&mut self, n: i64) -> i64 { + if n <= 0 { + panic!("invalid argument to int63n") + } + if n & (n - 1) == 0 { + // n is power of two, can mask + return self.int63() & (n - 1); + } + let (tmp, _) = (1_i64 << 63).overflowing_sub(1); + let (max, _) = tmp.overflowing_sub((1_i64 << 63) % n); + let mut v = self.int63(); + while v > max { + v = self.int63(); + } + v % n + } + + /// int31n returns, as an int32, a non-negative pseudo-random number in the half-open interval + /// [0,n). n must be > 0, but int31n does not check this; the caller must ensure it. + /// + /// For implementation details, see: + /// https://lemire.me/blog/2016/06/27/a-fast-alternative-to-the-modulo-reduction + /// https://lemire.me/blog/2016/06/30/fast-random-shuffling + pub fn int31n(&mut self, n: i32) -> i32 { + let mut v = self.uint32(); + let mut prod = (v as u64) * (n as u64); + let mut low = prod as u32; + if low < (n as u32) { + let thresh = (-n as u32) % (n as u32); + while low < thresh { + v = self.uint32(); + prod = (v as u64) * (n as u64); + low = prod as u32 + } + } + (prod >> 32) as i32 + } +} + +pub trait Shuffle { + fn shuffle(&mut self, rng: &mut RngSource); +} + +/// Shuffle pseudo-randomizes the order of elements. +/// n is the number of elements. Shuffle panics if n < 0. +/// swap swaps the elements with indexes i and j. +impl Shuffle for Vec { + fn shuffle(&mut self, rng: &mut RngSource) { + if self.is_empty() { + return; + } + + // Fisher-Yates shuffle: https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle + // Shuffle really ought not be called with n that doesn't fit in 32 bits. + // Not only will it take a very long time, but with 2³¹! possible permutations, + // there's no way that any PRNG can have a big enough internal state to + // generate even a minuscule percentage of the possible permutations. + // Nevertheless, the right API signature accepts an int n, so handle it as best we can. + let mut i = self.len() - 1; + while i > (1 << 31) - 1 - 1 { + let j = rng.int63n((i + 1) as i64) as usize; + self.swap(i, j); + i -= 1; + } + while i > 0 { + let j = rng.int31n((i + 1) as i32) as usize; + self.swap(i, j); + i -= 1; + } + } +} + +#[cfg(test)] +mod test { + use super::*; + + #[test] + fn test_shuffle_validators() { + assert_eq!(2308, validators_shuffle_idx(51, 3937, 3012)); + assert_eq!(4247, validators_shuffle_idx(9758, 6148, 2872)); + assert_eq!(90, validators_shuffle_idx(9449, 8084, 6675)); + assert_eq!(4591, validators_shuffle_idx(1574, 8836, 2879)); + assert_eq!(25, validators_shuffle_idx(2873, 4968, 1315)); + assert_eq!(3049, validators_shuffle_idx(790, 3331, 1206)); + assert_eq!(3735, validators_shuffle_idx(9956, 4911, 3112)); + assert_eq!(889, validators_shuffle_idx(6378, 1109, 237)); + assert_eq!(644, validators_shuffle_idx(1650, 1588, 1051)); + assert_eq!(2763, validators_shuffle_idx(8344, 4443, 3324)); + assert_eq!(1429, validators_shuffle_idx(8459, 1803, 1099)); + assert_eq!(7452, validators_shuffle_idx(1883, 8907, 4467)); + assert_eq!(1525, validators_shuffle_idx(7780, 3115, 2856)); + assert_eq!(1122, validators_shuffle_idx(20, 3071, 1558)); + assert_eq!(2480, validators_shuffle_idx(1907, 2719, 604)); + assert_eq!(648, validators_shuffle_idx(3110, 1397, 788)); + assert_eq!(2031, validators_shuffle_idx(9721, 5917, 2145)); + assert_eq!(6338, validators_shuffle_idx(4449, 9579, 5144)); + assert_eq!(2703, validators_shuffle_idx(9825, 2746, 1712)); + assert_eq!(3111, validators_shuffle_idx(1718, 7901, 4206)); + } + + #[test] + fn test_seeable_rand() { + assert_eq!(5853, RngSource::new(51).int63() % 10000); + + assert_eq!(7039896061028515893, RngSource::new(4037200794235010051).int63()); + assert_eq!(8675804364753902221, RngSource::new(3916589616287113937).int63()); + assert_eq!(7420226548541032724, RngSource::new(6334824724549167320).int63()); + assert_eq!(6835526398207435727, RngSource::new(605394647632969758).int63()); + assert_eq!(7622528842839255797, RngSource::new(1443635317331776148).int63()); + assert_eq!(4295814465130857885, RngSource::new(894385949183117216).int63()); + assert_eq!(7961788315963576056, RngSource::new(2775422040480279449).int63()); + assert_eq!(771687904863631760, RngSource::new(4751997750760398084).int63()); + assert_eq!(8469182823164019134, RngSource::new(7504504064263669287).int63()); + assert_eq!(1204007307177116518, RngSource::new(1976235410884491574).int63()); + assert_eq!(3458909304935912740, RngSource::new(3510942875414458836).int63()); + assert_eq!(5983978521117946066, RngSource::new(2933568871211445515).int63()); + assert_eq!(3394726189251915803, RngSource::new(4324745483838182873).int63()); + assert_eq!(2410173803800937436, RngSource::new(2610529275472644968).int63()); + assert_eq!(2422504652737723496, RngSource::new(2703387474910584091).int63()); + assert_eq!(8467155815380886789, RngSource::new(6263450610539110790).int63()); + assert_eq!(4460428455915224032, RngSource::new(2015796113853353331).int63()); + assert_eq!(7218399662037550364, RngSource::new(1874068156324778273).int63()); + assert_eq!(2377551076592147989, RngSource::new(3328451335138149956).int63()); + assert_eq!(7001107694597370676, RngSource::new(5263531936693774911).int63()); + assert_eq!(5448903345799732067, RngSource::new(1661493340433556000).int63()); + assert_eq!(1056790531586703720, RngSource::new(1661493340433594000).int63()); + assert_eq!(54553268748962966, RngSource::new(1661493340433608000).int63()); + assert_eq!(645755345946526905, RngSource::new(1661493340433621000).int63()); + assert_eq!(928151370232117485, RngSource::new(1661493340433634000).int63()); + assert_eq!(2419775955065219472, RngSource::new(1661493340433647000).int63()); + assert_eq!(7218475445819489996, RngSource::new(1661493340433662000).int63()); + assert_eq!(1729282990796017667, RngSource::new(1661493340433677000).int63()); + assert_eq!(3218909210588563502, RngSource::new(1661493340433690000).int63()); + assert_eq!(1013938088593965908, RngSource::new(1661493340433704000).int63()); + assert_eq!(5820541465141728400, RngSource::new(1661493340433719000).int63()); + assert_eq!(6156336370809410755, RngSource::new(1661493340433732000).int63()); + assert_eq!(1823224864415984114, RngSource::new(1661493340433747000).int63()); + assert_eq!(3240478448967492262, RngSource::new(1661493340433760000).int63()); + assert_eq!(3858950612230672966, RngSource::new(1661493340433773000).int63()); + assert_eq!(8393291589306033149, RngSource::new(1661493340433788000).int63()); + assert_eq!(2241638736967505451, RngSource::new(1661493340433800000).int63()); + assert_eq!(3732382647103245903, RngSource::new(1661493340433813000).int63()); + assert_eq!(9122912843445273239, RngSource::new(1661493340433831000).int63()); + assert_eq!(6987264066974383553, RngSource::new(1661493340433845000).int63()); + } + + fn validators_shuffle_idx(seed: i64, n: u64, idx: usize) -> u64 { + let mut rng = RngSource::new(seed); + let mut y = Vec::new(); + for i in 0..n { + y.insert(i as usize, i); + } + y.shuffle(&mut rng); + y[idx] + } +} diff --git a/crates/bsc/consensus/src/lib.rs b/crates/bsc/consensus/src/lib.rs new file mode 100644 index 000000000..941e644be --- /dev/null +++ b/crates/bsc/consensus/src/lib.rs @@ -0,0 +1,878 @@ +//! Bsc Consensus implementation. + +// TODO: doc +#![allow(missing_docs)] +#![cfg_attr(docsrs, feature(doc_cfg, doc_auto_cfg))] +// The `bsc` feature must be enabled to use this crate. +#![cfg(feature = "bsc")] + +use alloy_dyn_abi::{DynSolValue, FunctionExt, JsonAbiExt}; +use alloy_json_abi::JsonAbi; +use alloy_rlp::Decodable; +use bitset::BitSet; +use blst::{ + min_pk::{PublicKey, Signature}, + BLST_ERROR, +}; +use lazy_static::lazy_static; +use lru::LruCache; +use parking_lot::RwLock; +use reth_provider::{HeaderProvider, ParliaSnapshotReader, ParliaSnapshotWriter}; +use secp256k1::{ + ecdsa::{RecoverableSignature, RecoveryId}, + Message, SECP256K1, +}; +use sha3::{Digest, Keccak256}; +use std::{ + collections::HashMap, + fmt::{Debug, Formatter}, + num::NonZeroUsize, + sync::Arc, + time::SystemTime, +}; + +use reth_consensus::{Consensus, ConsensusError}; +use reth_consensus_common::validation::validate_4844_header_standalone; +use reth_db::models::parlia::{ + Snapshot, ValidatorInfo, VoteAddress, VoteAttestation, CHECKPOINT_INTERVAL, + MAX_ATTESTATION_EXTRA_LENGTH, +}; +use reth_primitives::{ + constants::EMPTY_MIX_HASH, Address, BlockNumber, Bytes, ChainSpec, GotExpected, Hardfork, + Header, SealedBlock, SealedHeader, Transaction, TxKind, TxLegacy, B256, EMPTY_OMMER_ROOT_HASH, + U256, +}; + +mod util; +pub use util::*; +mod constants; +pub use constants::*; + +pub mod contract_upgrade; +mod feynman_fork; +pub use feynman_fork::*; +mod error; +pub mod go_rng; +pub use error::ParliaConsensusError; + +use go_rng::{RngSource, Shuffle}; + +const RECOVERED_PROPOSER_CACHE_NUM: usize = 4096; + +lazy_static! { + // recovered proposer cache map by block_number: proposer_address + static ref RECOVERED_PROPOSER_CACHE: RwLock> = RwLock::new(LruCache::new(NonZeroUsize::new(RECOVERED_PROPOSER_CACHE_NUM).unwrap())); +} + +#[derive(Clone, Debug)] +pub struct ParliaConfig { + epoch: u64, + period: u64, +} + +impl Default for ParliaConfig { + fn default() -> Self { + Self { epoch: 300, period: 15 } + } +} + +/// BSC parlia consensus implementation +pub struct Parlia { + chain_spec: Arc, + epoch: u64, + period: u64, + validator_abi: JsonAbi, + validator_abi_before_luban: JsonAbi, + slash_abi: JsonAbi, + stake_hub_abi: JsonAbi, +} + +impl Default for Parlia { + fn default() -> Self { + Self::new(Arc::new(ChainSpec::default()), ParliaConfig::default()) + } +} + +impl Parlia { + pub fn new(chain_spec: Arc, cfg: ParliaConfig) -> Self { + let validator_abi = load_abi_from_file("./res/validator_set.json").unwrap(); + let validator_abi_before_luban = + load_abi_from_file("./res/validator_set_before_luban.json").unwrap(); + let slash_abi = load_abi_from_file("./res/slash.json").unwrap(); + let stake_hub_abi = load_abi_from_file("./res/stake_hub.json").unwrap(); + + Self { + chain_spec, + epoch: cfg.epoch, + period: cfg.period, + validator_abi, + validator_abi_before_luban, + slash_abi, + stake_hub_abi, + } + } + + pub const fn epoch(&self) -> u64 { + self.epoch + } + + pub const fn period(&self) -> u64 { + self.period + } + + #[inline] + pub fn chain_spec(&self) -> &ChainSpec { + &self.chain_spec + } + + pub fn is_on_feynman(&self, timestamp: u64, parent_timestamp: u64) -> bool { + self.chain_spec.fork(Hardfork::Feynman).active_at_timestamp(timestamp) && + !self.chain_spec.fork(Hardfork::Feynman).active_at_timestamp(parent_timestamp) + } + + pub fn is_on_luban(&self, block_number: BlockNumber) -> bool { + self.chain_spec.fork(Hardfork::Luban).active_at_block(block_number) && + !self.chain_spec.fork(Hardfork::Luban).active_at_block(block_number - 1) + } + + pub fn recover_proposer(&self, header: &Header) -> Result { + let mut cache = RECOVERED_PROPOSER_CACHE.write(); + + let hash = header.hash_slow(); + if let Some(&proposer) = cache.get(&hash) { + return Ok(proposer); + } + + let extra_data = &header.extra_data; + + if extra_data.len() < EXTRA_VANITY_LEN + EXTRA_SEAL_LEN { + return Err(ParliaConsensusError::ExtraSignatureMissing); + } + let signature_offset = header.extra_data.len() - EXTRA_SEAL_LEN; + + let sig = &header.extra_data[signature_offset..signature_offset + EXTRA_SEAL_LEN - 1]; + let rec = + RecoveryId::from_i32(header.extra_data[signature_offset + EXTRA_SEAL_LEN - 1] as i32) + .map_err(|_| ParliaConsensusError::RecoverECDSAInnerError)?; + let signature = RecoverableSignature::from_compact(sig, rec) + .map_err(|_| ParliaConsensusError::RecoverECDSAInnerError)?; + + let mut sig_hash_header = header.clone(); + sig_hash_header.extra_data = + Bytes::copy_from_slice(&header.extra_data[..header.extra_data.len() - EXTRA_SEAL_LEN]); + let message = Message::from_slice( + hash_with_chain_id(&sig_hash_header, self.chain_spec.chain.id()).as_slice(), + ) + .map_err(|_| ParliaConsensusError::RecoverECDSAInnerError)?; + + let public = &SECP256K1 + .recover_ecdsa(&message, &signature) + .map_err(|_| ParliaConsensusError::RecoverECDSAInnerError)?; + let address_slice = &Keccak256::digest(&public.serialize_uncompressed()[1..])[12..]; + let proposer = Address::from_slice(address_slice); + + cache.put(hash, proposer); + Ok(proposer) + } + + pub fn parse_validators_from_header( + &self, + header: &Header, + ) -> Result<(Vec
, Option>), ParliaConsensusError> { + let val_bytes = self.get_validator_bytes_from_header(header)?; + + if !self.chain_spec.fork(Hardfork::Luban).active_at_block(header.number) { + let count = val_bytes.len() / EXTRA_VALIDATOR_LEN_BEFORE_LUBAN; + let mut vals = Vec::with_capacity(count); + for i in 0..count { + let start = i * EXTRA_VALIDATOR_LEN_BEFORE_LUBAN; + let end = start + EXTRA_VALIDATOR_LEN_BEFORE_LUBAN; + vals.push(Address::from_slice(&val_bytes[start..end])); + } + + return Ok((vals, None)); + } + + let count = val_bytes.len() / EXTRA_VALIDATOR_LEN; + let mut vals = Vec::with_capacity(count); + let mut val_info_map = HashMap::with_capacity(count); + for i in 0..count { + let start = i * EXTRA_VALIDATOR_LEN; + let end = start + ADDRESS_LENGTH; + let addr = Address::from_slice(&val_bytes[start..end]); + vals.push(addr); + + let start = i * EXTRA_VALIDATOR_LEN + ADDRESS_LENGTH; + let end = i * EXTRA_VALIDATOR_LEN + EXTRA_VALIDATOR_LEN; + val_info_map.insert( + addr, + ValidatorInfo { + index: (i + 1) as u64, + vote_addr: VoteAddress::from_slice(&val_bytes[start..end]), + }, + ); + } + + Ok((vals, Some(val_info_map))) + } + + pub fn get_vote_attestation_from_header( + &self, + header: &Header, + ) -> Result, ParliaConsensusError> { + self.check_header_extra_len(header)?; + + let mut raw; + let extra_len = header.extra_data.len(); + if header.number % self.epoch != 0 { + raw = &header.extra_data[EXTRA_VANITY_LEN..extra_len - EXTRA_SEAL_LEN] + } else { + let count = header.extra_data[EXTRA_VANITY_LEN_WITH_VALIDATOR_NUM - 1] as usize; + let start = EXTRA_VANITY_LEN_WITH_VALIDATOR_NUM + count * EXTRA_VALIDATOR_LEN; + let end = extra_len - EXTRA_SEAL_LEN; + raw = &header.extra_data[start..end]; + } + if raw.is_empty() { + return Ok(None); + } + + Ok(Some( + Decodable::decode(&mut raw).map_err(|_| ParliaConsensusError::ABIDecodeInnerError)?, + )) + } + + pub fn get_validator_bytes_from_header( + &self, + header: &Header, + ) -> Result, ParliaConsensusError> { + self.check_header_extra_len(header)?; + + if header.number % self.epoch != 0 { + return Err(ParliaConsensusError::NotInEpoch { block_number: header.number }); + } + + let extra_len = header.extra_data.len(); + + if !self.chain_spec.fork(Hardfork::Luban).active_at_block(header.number) { + return Ok(header.extra_data[EXTRA_VANITY_LEN..extra_len - EXTRA_SEAL_LEN].to_vec()); + } + + let count = header.extra_data[EXTRA_VANITY_LEN_WITH_VALIDATOR_NUM - 1] as usize; + let start = EXTRA_VANITY_LEN_WITH_VALIDATOR_NUM; + let end = start + count * EXTRA_VALIDATOR_LEN; + + Ok(header.extra_data[start..end].to_vec()) + } + + pub fn back_off_time(&self, snap: &Snapshot, header: &Header) -> u64 { + let validator = header.beneficiary; + if snap.is_inturn(validator) { + return 0; + } + let idx = match snap.index_of(validator) { + Some(i) => i, + None => { + // The backOffTime does not matter when a validator is not authorized. + return 0; + } + }; + + let mut rng = RngSource::new(snap.block_number as i64); + let validator_count = snap.validators.len(); + + if !self.chain_spec.fork(Hardfork::Luban).active_at_block(header.number) { + // select a random step for delay, range 0~(proposer_count-1) + let mut backoff_steps = Vec::new(); + for i in 0..validator_count { + backoff_steps.push(i); + } + backoff_steps.shuffle(&mut rng); + return BACKOFF_TIME_OF_INITIAL + (backoff_steps[idx] as u64) * BACKOFF_TIME_OF_WIGGLE; + } + + // Exclude the recently signed validators first + let mut recents = HashMap::new(); + let limit = self.get_recently_proposal_limit(header, validator_count as u64); + let block_number = header.number; + for (seen, proposer) in snap.recent_proposers.iter() { + if block_number < limit || *seen > block_number - limit { + if validator == *proposer { + // The backOffTime does not matter when a validator has signed recently. + return 0; + } + recents.insert(*proposer, true); + } + } + let mut index = idx; + let mut backoff_steps = Vec::new(); + for i in 0..validator_count { + if recents.get(&snap.validators[i]).is_some() { + if i < idx { + index -= 1; + } + continue; + } + backoff_steps.push(backoff_steps.len()) + } + + // select a random step for delay in left validators + backoff_steps.shuffle(&mut rng); + let mut delay = + BACKOFF_TIME_OF_INITIAL + (backoff_steps[index] as u64) * BACKOFF_TIME_OF_WIGGLE; + // If the current validator has recently signed, reduce initial delay. + if recents.get(&snap.inturn_validator()).is_some() { + delay -= BACKOFF_TIME_OF_INITIAL; + } + delay + } + + fn check_header_extra_len(&self, header: &Header) -> Result<(), ParliaConsensusError> { + let extra_len = header.extra_data.len(); + if extra_len < EXTRA_VANITY_LEN { + return Err(ParliaConsensusError::ExtraVanityMissing); + } + if extra_len < EXTRA_VANITY_LEN + EXTRA_SEAL_LEN { + return Err(ParliaConsensusError::ExtraSignatureMissing); + } + + if header.number % self.epoch != 0 { + return Ok(()); + } + + if !self.chain_spec.fork(Hardfork::Luban).active_at_block(header.number) { + if (extra_len - EXTRA_SEAL_LEN - EXTRA_VANITY_LEN) / EXTRA_VALIDATOR_LEN_BEFORE_LUBAN == + 0 + { + return Err(ParliaConsensusError::InvalidHeaderExtraLen { + header_extra_len: extra_len as u64, + }); + } + if (extra_len - EXTRA_SEAL_LEN - EXTRA_VANITY_LEN) % EXTRA_VALIDATOR_LEN_BEFORE_LUBAN != + 0 + { + return Err(ParliaConsensusError::InvalidHeaderExtraLen { + header_extra_len: extra_len as u64, + }); + } + } else { + let count = header.extra_data[EXTRA_VANITY_LEN_WITH_VALIDATOR_NUM - 1] as usize; + let expect = + EXTRA_VANITY_LEN_WITH_VALIDATOR_NUM + EXTRA_SEAL_LEN + count * EXTRA_VALIDATOR_LEN; + if count == 0 || extra_len < expect { + return Err(ParliaConsensusError::InvalidHeaderExtraLen { + header_extra_len: extra_len as u64, + }); + } + } + + Ok(()) + } + + fn check_header_extra(&self, header: &Header) -> Result<(), ParliaConsensusError> { + self.check_header_extra_len(header)?; + + let is_epoch = header.number % self.epoch == 0; + let validator_bytes_len = self.get_validator_len_from_header(header)?; + if !is_epoch && validator_bytes_len != 0 { + return Err(ParliaConsensusError::InvalidHeaderExtraValidatorBytesLen { + is_epoch, + validator_bytes_len, + }); + } + if is_epoch && validator_bytes_len == 0 { + return Err(ParliaConsensusError::InvalidHeaderExtraValidatorBytesLen { + is_epoch, + validator_bytes_len, + }); + } + + Ok(()) + } + + fn get_recently_proposal_limit(&self, header: &Header, validator_count: u64) -> u64 { + if self.chain_spec.fork(Hardfork::Luban).active_at_block(header.number) { + validator_count * 2 / 3 + 1 + } else { + validator_count / 2 + 1 + } + } + + fn get_validator_len_from_header( + &self, + header: &Header, + ) -> Result { + self.check_header_extra_len(header)?; + + if header.number % self.epoch != 0 { + return Ok(0); + } + + let extra_len = header.extra_data.len(); + + if !self.chain_spec.fork(Hardfork::Luban).active_at_block(header.number) { + return Ok(extra_len - EXTRA_VANITY_LEN - EXTRA_SEAL_LEN); + } + + let count = header.extra_data[EXTRA_VANITY_LEN_WITH_VALIDATOR_NUM - 1] as usize; + Ok(count * EXTRA_VALIDATOR_LEN) + } +} + +// Assemble system tx +impl Parlia { + pub fn init_genesis_contracts(&self, nonce: u64) -> Vec { + let function = self.validator_abi.function("init").unwrap().first().unwrap(); + let input = function.abi_encode_input(&[]).unwrap(); + + let contracts = vec![ + *VALIDATOR_CONTRACT, + *SLASH_CONTRACT, + *LIGHT_CLIENT_CONTRACT, + *RELAYER_HUB_CONTRACT, + *TOKEN_HUB_CONTRACT, + *RELAYER_INCENTIVIZE_CONTRACT, + *CROSS_CHAIN_CONTRACT, + ]; + + contracts + .into_iter() + .enumerate() + .map(|(idx, contract)| { + Transaction::Legacy(TxLegacy { + chain_id: Some(self.chain_spec.chain.id()), + nonce: nonce + idx as u64, + gas_limit: u64::MAX / 2, + gas_price: 0, + value: U256::ZERO, + input: Bytes::from(input.clone()), + to: TxKind::Call(contract), + }) + }) + .collect() + } + + pub fn init_feynman_contracts(&self, nonce: u64) -> Vec { + let function = self.stake_hub_abi.function("initialize").unwrap().first().unwrap(); + let input = function.abi_encode_input(&[]).unwrap(); + + let contracts = vec![ + *STAKE_HUB_CONTRACT, + *BSC_GOVERNOR_CONTRACT, + *GOV_TOKEN_CONTRACT, + *BSC_TIMELOCK_CONTRACT, + *TOKEN_RECOVER_PORTAL_CONTRACT, + ]; + + contracts + .into_iter() + .enumerate() + .map(|(idx, contract)| { + Transaction::Legacy(TxLegacy { + chain_id: Some(self.chain_spec.chain.id()), + nonce: nonce + idx as u64, + gas_limit: u64::MAX / 2, + gas_price: 0, + value: U256::ZERO, + input: Bytes::from(input.clone()), + to: TxKind::Call(contract), + }) + }) + .collect() + } + + pub fn slash(&self, nonce: u64, address: Address) -> Transaction { + let function = self.slash_abi.function("slash").unwrap().first().unwrap(); + let input = function.abi_encode_input(&[DynSolValue::from(address)]).unwrap(); + + Transaction::Legacy(TxLegacy { + chain_id: Some(self.chain_spec.chain.id()), + nonce, + gas_limit: u64::MAX / 2, + gas_price: 0, + value: U256::ZERO, + input: Bytes::from(input.clone()), + to: TxKind::Call(*SLASH_CONTRACT), + }) + } + + pub fn distribute_to_system(&self, nonce: u64, system_reward: u128) -> Transaction { + Transaction::Legacy(TxLegacy { + chain_id: Some(self.chain_spec.chain.id()), + nonce, + gas_limit: u64::MAX / 2, + gas_price: 0, + value: U256::from(system_reward), + input: Bytes::default(), + to: TxKind::Call(*SYSTEM_REWARD_CONTRACT), + }) + } + + pub fn distribute_to_validator( + &self, + nonce: u64, + address: Address, + block_reward: u128, + ) -> Transaction { + let function = self.validator_abi.function("deposit").unwrap().first().unwrap(); + let input = function.abi_encode_input(&[DynSolValue::from(address)]).unwrap(); + + Transaction::Legacy(TxLegacy { + chain_id: Some(self.chain_spec.chain.id()), + nonce, + gas_limit: u64::MAX / 2, + gas_price: 0, + value: U256::from(block_reward), + input: Bytes::from(input), + to: TxKind::Call(*VALIDATOR_CONTRACT), + }) + } + + pub fn distribute_finality_reward( + &self, + nonce: u64, + validators: Vec
, + weights: Vec, + ) -> Transaction { + let function = + self.validator_abi.function("distributeFinalityReward").unwrap().first().unwrap(); + + let validators = validators.into_iter().map(|val| DynSolValue::from(val)).collect(); + let weights = weights.into_iter().map(|weight| DynSolValue::from(weight)).collect(); + let input = function + .abi_encode_input(&[DynSolValue::Array(validators), DynSolValue::Array(weights)]) + .unwrap(); + + Transaction::Legacy(TxLegacy { + chain_id: Some(self.chain_spec.chain.id()), + nonce, + gas_limit: u64::MAX / 2, + gas_price: 0, + value: U256::ZERO, + input: Bytes::from(input), + to: TxKind::Call(*VALIDATOR_CONTRACT), + }) + } + + pub fn update_validator_set_v2( + &self, + nonce: u64, + validators: Vec
, + voting_powers: Vec, + vote_addresses: Vec>, + ) -> Transaction { + let function = + self.validator_abi.function("updateValidatorSetV2").unwrap().first().unwrap(); + + let validators = validators.into_iter().map(|val| DynSolValue::from(val)).collect(); + let voting_powers = voting_powers.into_iter().map(|val| DynSolValue::from(val)).collect(); + let vote_addresses = vote_addresses.into_iter().map(|val| DynSolValue::from(val)).collect(); + let input = function + .abi_encode_input(&[ + DynSolValue::Array(validators), + DynSolValue::Array(voting_powers), + DynSolValue::Array(vote_addresses), + ]) + .unwrap(); + + Transaction::Legacy(TxLegacy { + chain_id: Some(self.chain_spec.chain.id()), + nonce, + gas_limit: u64::MAX / 2, + gas_price: 0, + value: U256::ZERO, + input: Bytes::from(input), + to: TxKind::Call(*VALIDATOR_CONTRACT), + }) + } +} + +// ABI encode/decode +impl Parlia { + pub fn get_current_validators_before_luban( + &self, + block_number: BlockNumber, + ) -> (Address, Bytes) { + let function = if self.chain_spec.fork(Hardfork::Euler).active_at_block(block_number) { + self.validator_abi_before_luban + .function("getMiningValidators") + .unwrap() + .first() + .unwrap() + } else { + self.validator_abi_before_luban.function("getValidators").unwrap().first().unwrap() + }; + + (*VALIDATOR_CONTRACT, Bytes::from(function.abi_encode_input(&[]).unwrap())) + } + + pub fn unpack_data_into_validator_set_before_luban(&self, data: &[u8]) -> Vec
{ + let function = + self.validator_abi_before_luban.function("getValidators").unwrap().first().unwrap(); + let output = function.abi_decode_output(data, true).unwrap(); + + output.into_iter().map(|val| val.as_address().unwrap()).collect() + } + + pub fn get_current_validators(&self) -> (Address, Bytes) { + let function = self.validator_abi.function("getMiningValidators").unwrap().first().unwrap(); + + (*VALIDATOR_CONTRACT, Bytes::from(function.abi_encode_input(&[]).unwrap())) + } + + pub fn unpack_data_into_validator_set(&self, data: &[u8]) -> (Vec
, Vec) { + let function = self.validator_abi.function("getMiningValidators").unwrap().first().unwrap(); + let output = function.abi_decode_output(data, true).unwrap(); + + let consensus_addresses = output[0] + .as_array() + .unwrap() + .into_iter() + .map(|val| val.as_address().unwrap()) + .collect(); + let vote_address = output[1] + .as_array() + .unwrap() + .into_iter() + .map(|val| VoteAddress::from_slice(val.as_bytes().unwrap())) + .collect(); + + (consensus_addresses, vote_address) + } + + pub fn get_validator_election_info(&self) -> (Address, Bytes) { + let function = + self.stake_hub_abi.function("getValidatorElectionInfo").unwrap().first().unwrap(); + + ( + *STAKE_HUB_CONTRACT, + Bytes::from( + function + .abi_encode_input(&[ + DynSolValue::from(U256::from(0)), + DynSolValue::from(U256::from(0)), + ]) + .unwrap(), + ), + ) + } + + pub fn unpack_data_into_validator_election_info( + &self, + data: &[u8], + ) -> (Vec
, Vec, Vec>, U256) { + let function = + self.stake_hub_abi.function("getValidatorElectionInfo").unwrap().first().unwrap(); + let output = function.abi_decode_output(data, true).unwrap(); + + let consensus_address = output[0] + .as_array() + .unwrap() + .into_iter() + .map(|val| val.as_address().unwrap()) + .collect(); + let voting_powers = + output[1].as_array().unwrap().into_iter().map(|val| val.as_uint().unwrap().0).collect(); + let vote_addresses = output[2] + .as_array() + .unwrap() + .into_iter() + .map(|val| val.as_bytes().unwrap().to_vec()) + .collect(); + let total_length = output[3].as_uint().unwrap().0; + + (consensus_address, voting_powers, vote_addresses, total_length) + } + + pub fn get_max_elected_validators(&self) -> (Address, Bytes) { + let function = + self.stake_hub_abi.function("maxElectedValidators").unwrap().first().unwrap(); + + (*STAKE_HUB_CONTRACT, Bytes::from(function.abi_encode_input(&[]).unwrap())) + } + + pub fn unpack_data_into_max_elected_validators(&self, data: &[u8]) -> U256 { + let function = + self.stake_hub_abi.function("maxElectedValidators").unwrap().first().unwrap(); + let output = function.abi_decode_output(data, true).unwrap(); + + output[0].as_uint().unwrap().0 + } +} + +impl Debug for Parlia { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + f.debug_struct("Parlia") + .field("chain_spec", &self.chain_spec) + .field("epoch", &self.epoch) + .field("period", &self.period) + .finish() + } +} + +impl Consensus for Parlia { + fn validate_header(&self, header: &SealedHeader) -> Result<(), ConsensusError> { + // Don't waste time checking blocks from the future + let present_timestamp = + SystemTime::now().duration_since(SystemTime::UNIX_EPOCH).unwrap().as_secs(); + if header.timestamp > present_timestamp { + return Err(ConsensusError::TimestampIsInFuture { + timestamp: header.timestamp, + present_timestamp, + }); + } + + // Ensure that the block's difficulty is DIFF_INTURN or DIFF_NOTURN + if header.difficulty != DIFF_INTURN && header.difficulty != DIFF_NOTURN { + return Err(ConsensusError::InvalidDifficulty { difficulty: header.difficulty }); + } + + // Check extra data + self.check_header_extra(header)?; + + // Ensure that the mix digest is zero as we don't have fork protection currently + if header.mix_hash != EMPTY_MIX_HASH { + return Err(ConsensusError::InvalidMixHash); + } + + // Ensure that the block with no uncles + if header.ommers_hash != EMPTY_OMMER_ROOT_HASH { + return Err(ConsensusError::BodyOmmersHashDiff( + GotExpected { got: header.ommers_hash, expected: EMPTY_OMMER_ROOT_HASH }.into(), + )); + } + + // Gas used needs to be less than gas limit. Gas used is going to be checked after + // execution. + if header.gas_used > header.gas_limit { + return Err(ConsensusError::HeaderGasUsedExceedsGasLimit { + gas_used: header.gas_used, + gas_limit: header.gas_limit, + }); + } + + // Check if base fee is set. + if self.chain_spec.fork(Hardfork::London).active_at_block(header.number) && + header.base_fee_per_gas.is_none() + { + return Err(ConsensusError::BaseFeeMissing); + } + + // Ensures that EIP-4844 fields are valid once cancun is active. + if self.chain_spec.is_cancun_active_at_timestamp(header.timestamp) { + validate_4844_header_standalone(header)?; + } else if header.blob_gas_used.is_some() { + return Err(ConsensusError::BlobGasUsedUnexpected); + } else if header.excess_blob_gas.is_some() { + return Err(ConsensusError::ExcessBlobGasUnexpected); + } else if header.parent_beacon_block_root.is_some() { + return Err(ConsensusError::ParentBeaconBlockRootUnexpected); + } + + Ok(()) + } + + fn validate_header_against_parent( + &self, + header: &SealedHeader, + parent: &SealedHeader, + ) -> Result<(), ConsensusError> { + header.validate_against_parent(parent, &self.chain_spec).map_err(ConsensusError::from)?; + Ok(()) + } + + // No total difficulty check for Parlia + fn validate_header_with_total_difficulty( + &self, + _header: &Header, + _total_difficulty: U256, + ) -> Result<(), ConsensusError> { + Ok(()) + } + + fn validate_block(&self, block: &SealedBlock) -> Result<(), ConsensusError> { + // Check transaction root + if let Err(error) = block.ensure_transaction_root_valid() { + return Err(ConsensusError::BodyTransactionRootDiff(error.into())); + } + + // EIP-4844: Shard Blob Transactions + if self.chain_spec.is_cancun_active_at_timestamp(block.timestamp) { + // Check that the blob gas used in the header matches the sum of the blob gas used by + // each blob tx + let header_blob_gas_used = + block.blob_gas_used.ok_or(ConsensusError::BlobGasUsedMissing)?; + let total_blob_gas = block.blob_gas_used(); + if total_blob_gas != header_blob_gas_used { + return Err(ConsensusError::BlobGasUsedDiff(GotExpected { + got: header_blob_gas_used, + expected: total_blob_gas, + }) + .into()); + } + } + + Ok(()) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use reth_primitives::{address, hex}; + + #[test] + fn abi_encode() { + let expected = "63a036b500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + + let stake_hub_abi = load_abi_from_file("./res/stake_hub.json").unwrap(); + let function = stake_hub_abi.function("getValidatorElectionInfo").unwrap().first().unwrap(); + let input = function + .abi_encode_input(&[DynSolValue::from(U256::from(0)), DynSolValue::from(U256::from(0))]) + .unwrap(); + + let input_str = hex::encode(&input); + println!("encoded data: {:?}", &input_str); + assert_eq!(input_str, expected); + } + + #[test] + fn abi_decode() { + let expected_consensus_addr = address!("C08B5542D177ac6686946920409741463a15dDdB"); + let expected_voting_power = U256::from(1); + let expected_vote_addr = hex::decode("3c2438a4113804bf99e3849ef31887c0f880a0feb92f356f58fbd023a82f5311fc87a5883a662e9ebbbefc90bf13aa53").unwrap(); + let expected_total_length = U256::from(1); + + let output_str = "000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000c08b5542d177ac6686946920409741463a15dddb000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000303c2438a4113804bf99e3849ef31887c0f880a0feb92f356f58fbd023a82f5311fc87a5883a662e9ebbbefc90bf13aa5300000000000000000000000000000000"; + let output = hex::decode(output_str).unwrap(); + + let stake_hub_abi = load_abi_from_file("./res/stake_hub.json").unwrap(); + let function = stake_hub_abi.function("getValidatorElectionInfo").unwrap().first().unwrap(); + let output = function.abi_decode_output(&output, true).unwrap(); + + let consensus_address: Vec
= output[0] + .as_array() + .unwrap() + .into_iter() + .map(|val| val.as_address().unwrap()) + .collect(); + let voting_powers: Vec = + output[1].as_array().unwrap().into_iter().map(|val| val.as_uint().unwrap().0).collect(); + let vote_addresses: Vec> = output[2] + .as_array() + .unwrap() + .into_iter() + .map(|val| val.as_bytes().unwrap().to_vec()) + .collect(); + let total_length = output[3].as_uint().unwrap().0; + + println!("consensus address: {:?}", consensus_address[0]); + println!("voting power: {:?}", voting_powers[0]); + println!("vote address: {:?}", hex::encode(&vote_addresses[0])); + println!("total length: {:?}", total_length); + + assert_eq!(consensus_address[0], expected_consensus_addr); + assert_eq!(voting_powers[0], expected_voting_power); + assert_eq!(vote_addresses[0], expected_vote_addr); + assert_eq!(total_length, expected_total_length); + } +} diff --git a/crates/bsc/consensus/src/util.rs b/crates/bsc/consensus/src/util.rs new file mode 100644 index 000000000..15c5f67a5 --- /dev/null +++ b/crates/bsc/consensus/src/util.rs @@ -0,0 +1,181 @@ +use lazy_static::lazy_static; +use reth_primitives::{ + keccak256, Address, BufMut, BytesMut, Header, TransactionSigned, B256, B64, U256, +}; + +use crate::EXTRA_SEAL_LEN; +use alloy_json_abi::JsonAbi; +use alloy_rlp::Encodable; +use serde_json::Error; +use std::str::FromStr; + +lazy_static! { + // preset contracts + pub static ref VALIDATOR_CONTRACT: Address = Address::from_str("0000000000000000000000000000000000001000").unwrap(); + pub static ref SLASH_CONTRACT: Address = Address::from_str("0000000000000000000000000000000000001001").unwrap(); + pub static ref SYSTEM_REWARD_CONTRACT: Address = Address::from_str("0000000000000000000000000000000000001002").unwrap(); + pub static ref LIGHT_CLIENT_CONTRACT: Address = Address::from_str("0000000000000000000000000000000000001003").unwrap(); + pub static ref TOKEN_HUB_CONTRACT: Address = Address::from_str("0000000000000000000000000000000000001004").unwrap(); + pub static ref RELAYER_INCENTIVIZE_CONTRACT: Address = Address::from_str("0000000000000000000000000000000000001005").unwrap(); + pub static ref RELAYER_HUB_CONTRACT: Address = Address::from_str("0000000000000000000000000000000000001006").unwrap(); + pub static ref GOV_HUB_CONTRACT: Address = Address::from_str("0000000000000000000000000000000000001007").unwrap(); + pub static ref CROSS_CHAIN_CONTRACT: Address = Address::from_str("0000000000000000000000000000000000001008").unwrap(); + pub static ref TOKEN_MANAGER_CONTRACT: Address = Address::from_str("0000000000000000000000000000000000002000").unwrap(); + pub static ref STAKING_CONTRACT: Address = Address::from_str("0000000000000000000000000000000000002001").unwrap(); + pub static ref STAKE_HUB_CONTRACT: Address = Address::from_str("0000000000000000000000000000000000002002").unwrap(); + pub static ref STAKE_CREDIT_CONTRACT: Address = Address::from_str("0000000000000000000000000000000000002003").unwrap(); + pub static ref BSC_GOVERNOR_CONTRACT: Address = Address::from_str("0000000000000000000000000000000000002004").unwrap(); + pub static ref GOV_TOKEN_CONTRACT: Address = Address::from_str("0000000000000000000000000000000000002005").unwrap(); + pub static ref BSC_TIMELOCK_CONTRACT: Address = Address::from_str("0000000000000000000000000000000000002006").unwrap(); + pub static ref TOKEN_RECOVER_PORTAL_CONTRACT: Address = Address::from_str("0000000000000000000000000000000000003000").unwrap(); + + pub static ref SYSTEM_CONTRACTS: Vec
= vec![ + *VALIDATOR_CONTRACT, + *SLASH_CONTRACT, + *SYSTEM_REWARD_CONTRACT, + *LIGHT_CLIENT_CONTRACT, + *TOKEN_HUB_CONTRACT, + *RELAYER_INCENTIVIZE_CONTRACT, + *RELAYER_HUB_CONTRACT, + *GOV_HUB_CONTRACT, + *TOKEN_MANAGER_CONTRACT, + *CROSS_CHAIN_CONTRACT, + *STAKING_CONTRACT, + *STAKE_HUB_CONTRACT, + *STAKE_CREDIT_CONTRACT, + *BSC_GOVERNOR_CONTRACT, + *GOV_TOKEN_CONTRACT, + *BSC_TIMELOCK_CONTRACT, + *TOKEN_RECOVER_PORTAL_CONTRACT, + ]; +} + +const SECONDS_PER_DAY: u64 = 86400; // 24 * 60 * 60 + +pub fn is_same_day_in_utc(first: u64, second: u64) -> bool { + first / SECONDS_PER_DAY == second / SECONDS_PER_DAY +} + +pub fn is_breathe_block(last_block_time: u64, block_time: u64) -> bool { + last_block_time != 0 && !is_same_day_in_utc(last_block_time, block_time) +} + +pub fn is_system_transaction(tx: &TransactionSigned, header: &Header) -> bool { + if let Some(to) = tx.to() { + if to == header.beneficiary && is_invoke_system_contract(&to) && tx.max_fee_per_gas() == 0 { + return true; + } + } + + false +} + +/// whether the contract is system or not +pub fn is_invoke_system_contract(addr: &Address) -> bool { + SYSTEM_CONTRACTS.contains(addr) +} + +pub fn load_abi_from_file(path: &str) -> Result { + let json = std::fs::read_to_string(path).unwrap(); + let abi: JsonAbi = serde_json::from_str(&json)?; + Ok(abi) +} + +pub fn hash_with_chain_id(header: &Header, chain_id: u64) -> B256 { + let mut out = BytesMut::new(); + encode_header_with_chain_id(header, &mut out, chain_id); + keccak256(&out[..]) +} + +pub fn encode_header_with_chain_id(header: &Header, out: &mut dyn BufMut, chain_id: u64) { + rlp_header(header, chain_id).encode(out); + Encodable::encode(&U256::from(chain_id), out); + Encodable::encode(&header.parent_hash, out); + Encodable::encode(&header.ommers_hash, out); + Encodable::encode(&header.beneficiary, out); + Encodable::encode(&header.state_root, out); + Encodable::encode(&header.transactions_root, out); + Encodable::encode(&header.receipts_root, out); + Encodable::encode(&header.logs_bloom, out); + Encodable::encode(&header.difficulty, out); + Encodable::encode(&U256::from(header.number), out); + Encodable::encode(&header.gas_limit, out); + Encodable::encode(&header.gas_used, out); + Encodable::encode(&header.timestamp, out); + Encodable::encode(&header.extra_data[..header.extra_data.len() - EXTRA_SEAL_LEN], out); // will panic if extra_data is less than EXTRA_SEAL_LEN + Encodable::encode(&header.mix_hash, out); + Encodable::encode(&B64::new(header.nonce.to_be_bytes()), out); +} + +fn rlp_header(header: &Header, chain_id: u64) -> alloy_rlp::Header { + let mut rlp_head = alloy_rlp::Header { list: true, payload_length: 0 }; + + // add chain_id make more security + rlp_head.payload_length += U256::from(chain_id).length(); // chain_id + rlp_head.payload_length += header.parent_hash.length(); // parent_hash + rlp_head.payload_length += header.ommers_hash.length(); // ommers_hash + rlp_head.payload_length += header.beneficiary.length(); // beneficiary + rlp_head.payload_length += header.state_root.length(); // state_root + rlp_head.payload_length += header.transactions_root.length(); // transactions_root + rlp_head.payload_length += header.receipts_root.length(); // receipts_root + rlp_head.payload_length += header.logs_bloom.length(); // logs_bloom + rlp_head.payload_length += header.difficulty.length(); // difficulty + rlp_head.payload_length += U256::from(header.number).length(); // block height + rlp_head.payload_length += header.gas_limit.length(); // gas_limit + rlp_head.payload_length += header.gas_used.length(); // gas_used + rlp_head.payload_length += header.timestamp.length(); // timestamp + rlp_head.payload_length += + &header.extra_data[..header.extra_data.len() - EXTRA_SEAL_LEN].length(); // extra_data + rlp_head.payload_length += header.mix_hash.length(); // mix_hash + rlp_head.payload_length += &B64::new(header.nonce.to_be_bytes()).length(); // nonce + + rlp_head +} + +#[cfg(test)] +mod tests { + use crate::{encode_header_with_chain_id, hash_with_chain_id}; + use reth_primitives::{address, b256, hex, Bloom, Bytes, Header, U256}; + + #[test] + fn test_encode_header_with_chain_id() { + // test data from bsc testnet + let expected_rlp = "f902d361a0b68487ffcf4a419f8f8b77afb31e47eeb05195b0b77fe7a0bbc50ebe2f365992a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794b71b214cb885500844365e95cd9942c7276e7fd8a08fcdaf2f45f782142206517f6c059888db0da8ad7809f2101c19f68a68984499a06765de680f44a688e9eed23adfe732fee37b3376d2888a9d7a3523e3a01bfb10a0c783cd24949a5ab58293ee8d9bcb8638699308e055747d044e3317fe5e638494b90100000000000000000000000040100000000000000000000000000000000080018000001420000000100000000000000000000000060008000000000000002030000200001000100000000000080008000020100000000080004000100000001c00400880200002000000040000000008000804000000000010000000100000040000000008800000000000200400200000081004200080000000000000081000200600400020000020080000002200000000080080001000000000000000000002000000020800000000000020000200000001008020880000001040120000200000100002000000000100000400000102000080000000000040000800000000000284024b8ca68402faf0808316db1a8465f003e3b8d5d88301030a846765746888676f312e32312e37856c696e757800000096d46a82f8b381fbb8608a1933f7b78c4e5fcc87580635f39d8850ec66ed767bce1fafaf582b1b941fc6ab17c6b951e188e845e87f4b77136dd512dcf971b93472e4eb1f54799e5ff90ebc6e8d43339bb0e3009ff488cb87a03b104a7ce9d1ba6c17c54e34c1069c77a8f84c84024b8ca4a00bb45f286d475ad03dfa64215c3d21f9bccd5d199d6da149c2958923666b96f384024b8ca5a0b68487ffcf4a419f8f8b77afb31e47eeb05195b0b77fe7a0bbc50ebe2f36599280a00000000000000000000000000000000000000000000000000000000000000000880000000000000000"; + let expected_hash = "1cc380de1196b5bb088f6b7a0eac87f9634864ee6c3f4a47396155464f6ef8f2"; + + let bloom = Bloom::from_slice(&hex::decode("000000000000000000000040100000000000000000000000000000000080018000001420000000100000000000000000000000060008000000000000002030000200001000100000000000080008000020100000000080004000100000001c0040088020000200000004000000000800080400000000001000000010000004000000000880000000000020040020000008100420008000000000000008100020060040002000002008000000220000000008008000100000000000000000000200000002080000000000002000020000000100802088000000104012000020000010000200000000010000040000010200008000000000004000080000000000").unwrap()); + let extra = hex::decode("d88301030a846765746888676f312e32312e37856c696e757800000096d46a82f8b381fbb8608a1933f7b78c4e5fcc87580635f39d8850ec66ed767bce1fafaf582b1b941fc6ab17c6b951e188e845e87f4b77136dd512dcf971b93472e4eb1f54799e5ff90ebc6e8d43339bb0e3009ff488cb87a03b104a7ce9d1ba6c17c54e34c1069c77a8f84c84024b8ca4a00bb45f286d475ad03dfa64215c3d21f9bccd5d199d6da149c2958923666b96f384024b8ca5a0b68487ffcf4a419f8f8b77afb31e47eeb05195b0b77fe7a0bbc50ebe2f3659928094a6203400acc84400f2f1aa658e17180490e2f5b758124097751b9cd0a954dc672530d892214bfc77c35201473e34a5ad44100fc0e2235325ba393d5261c26800").unwrap(); + + let header = Header { + parent_hash: b256!("b68487ffcf4a419f8f8b77afb31e47eeb05195b0b77fe7a0bbc50ebe2f365992"), + ommers_hash: b256!("1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347"), + beneficiary: address!("B71b214Cb885500844365E95CD9942C7276E7fD8"), + state_root: b256!("8fcdaf2f45f782142206517f6c059888db0da8ad7809f2101c19f68a68984499"), + transactions_root: b256!( + "6765de680f44a688e9eed23adfe732fee37b3376d2888a9d7a3523e3a01bfb10" + ), + receipts_root: b256!( + "c783cd24949a5ab58293ee8d9bcb8638699308e055747d044e3317fe5e638494" + ), + logs_bloom: bloom, + difficulty: U256::from(2), + number: 38505638, + gas_limit: 50000000, + gas_used: 1497882, + timestamp: 1710228451, + extra_data: Bytes::from(extra), + mix_hash: b256!("0000000000000000000000000000000000000000000000000000000000000000"), + nonce: 0, + ..Default::default() + }; + + let mut data = vec![]; + encode_header_with_chain_id(&header, &mut data, 97); + println!("rlp output: {:?}", hex::encode(&data)); + assert_eq!(hex::encode(&data), expected_rlp); + + let hash = hash_with_chain_id(&header, 97); + println!("encode hash: {:?}", hex::encode(hash.as_slice())); + assert_eq!(hex::encode(hash.as_slice()), expected_hash); + } +} diff --git a/crates/bsc/evm/Cargo.toml b/crates/bsc/evm/Cargo.toml new file mode 100644 index 000000000..ff593c3e9 --- /dev/null +++ b/crates/bsc/evm/Cargo.toml @@ -0,0 +1,46 @@ +[package] +name = "reth-evm-bsc" +version.workspace = true +edition.workspace = true +rust-version.workspace = true +license.workspace = true +homepage.workspace = true +repository.workspace = true + +[lints] +workspace = true + +[dependencies] +# Reth +reth-evm.workspace = true +reth-primitives.workspace = true +reth-revm.workspace = true +reth-interfaces.workspace = true +reth-provider.workspace = true +reth-db.workspace = true +reth-bsc-consensus.workspace = true + +# Optimism +revm.workspace = true +revm-primitives.workspace = true + +# misc +thiserror.workspace = true +tracing.workspace = true +lazy_static = "1.4.0" +parking_lot = "0.12.2" +bitset = "0.1.2" +lru = "0.12.3" +blst = "0.3.11" + +[dev-dependencies] +reth-revm = { workspace = true, features = ["test-utils"] } + +[features] +bsc = [ + "reth-bsc-consensus/bsc", +] +# "reth-primitives/bsc", +# "reth-provider/bsc", +# "reth-interfaces/bsc", +# "revm-primitives/bsc", diff --git a/crates/bsc/evm/src/error.rs b/crates/bsc/evm/src/error.rs new file mode 100644 index 000000000..86b45cbe9 --- /dev/null +++ b/crates/bsc/evm/src/error.rs @@ -0,0 +1,141 @@ +//! Error types for the Bsc EVM module. + +use reth_bsc_consensus::ParliaConsensusError; +use reth_interfaces::executor::BlockExecutionError; +use reth_primitives::{Address, BlockHash, BlockNumber, GotExpected, GotExpectedBoxed, B256, U256}; + +/// Bsc Block Executor Errors +#[derive(thiserror::Error, Debug, Clone, PartialEq, Eq)] +pub enum BscBlockExecutionError { + /// Error when the system txs are more than expected + #[error("unexpected system tx")] + UnexpectedSystemTx, + + /// Error when there are normal tx after system tx + #[error("unexpected normal tx after system tx")] + UnexpectedNormalTx, + + /// Error when there is no snapshot found + #[error("no snapshot found")] + SnapshotNotFound, + + /// Error when eth call failed + #[error("eth call failed")] + EthCallFailed, + + /// Error when the validators in header are invalid + #[error("invalid validators in header")] + InvalidValidators, + + /// Error when get top validators failed + #[error("get top validators failed")] + GetTopValidatorsFailed, + + /// Error when the block proposer is in the backoff period + #[error("block [number={block_number}, hash={hash}] proposer is in the backoff period")] + FutureBlock { + /// The block number + block_number: BlockNumber, + /// The block hash + hash: B256, + }, + + /// Error when encountering a provider inner error + #[error("provider inner error")] + ProviderInnerError, + + /// Error when encountering a blst inner error + #[error("blst inner error")] + BLSTInnerError, + + /// Error when the parent hash of a block is not known. + #[error("block parent [hash={hash}] is not known")] + ParentUnknown { + /// The hash of the unknown parent block. + hash: BlockHash, + }, + + /// Error when apply snapshot failed + #[error("apply snapshot failed")] + ApplySnapshotFailed, + + /// Error when the attestation's extra length is too large + #[error("attestation extra length {extra_len} is too large")] + TooLargeAttestationExtraLen { + /// The extra length + extra_len: usize, + }, + + /// Error when the header is unknown + #[error("unknown header [number={block_number}, hash={hash}]")] + UnknownHeader { + /// The block number + block_number: BlockNumber, + /// The block hash + hash: B256, + }, + + /// Error when the attestation's target is invalid + #[error("invalid attestation target: number {block_number}, hash {block_hash}")] + InvalidAttestationTarget { + /// The expected and got block number + block_number: GotExpected, + /// The expected and got block hash + block_hash: GotExpectedBoxed, + }, + + /// Error when the attestation's source is invalid + #[error("invalid attestation source: number {block_number}, hash {block_hash}")] + InvalidAttestationSource { + /// The expected and got block number + block_number: GotExpected, + /// The expected and got block hash + block_hash: GotExpectedBoxed, + }, + + /// Error when the attestation's vote count is invalid + #[error("invalid attestation vote count: {0}")] + InvalidAttestationVoteCount(GotExpected), + + /// Error when the vote address is not found + #[error("vote address not found: {address}")] + VoteAddrNotFoundInSnap { + /// The vote address + address: Address, + }, + + /// Error when the block's header signer is invalid + #[error("wrong header signer: block number {block_number}, signer {signer}")] + WrongHeaderSigner { + /// The block number + block_number: BlockNumber, + /// The expected and got signer address + signer: GotExpectedBoxed
, + }, + + /// Error when the block signer is not authorized + #[error("proposer {proposer} at height {block_number} is not authorized")] + SignerUnauthorized { + /// The block number + block_number: BlockNumber, + /// The proposer address + proposer: Address, + }, + + /// Error when the block signer is over limit + #[error("proposer {proposer} is over limit")] + SignerOverLimit { + /// The proposer address + proposer: Address, + }, + + /// Error type transparently wrapping ParliaConsensusError. + #[error(transparent)] + ParliaConsensusError(#[from] ParliaConsensusError), +} + +impl From for BlockExecutionError { + fn from(err: BscBlockExecutionError) -> Self { + BlockExecutionError::other(err) + } +} diff --git a/crates/bsc/evm/src/execute.rs b/crates/bsc/evm/src/execute.rs new file mode 100644 index 000000000..8666ecaf7 --- /dev/null +++ b/crates/bsc/evm/src/execute.rs @@ -0,0 +1,1299 @@ +//! Bsc block executor. + +use crate::{verify::verify_receipts, BscBlockExecutionError, BscEvmConfig}; +use bitset::BitSet; +use blst::{ + min_pk::{PublicKey, Signature}, + BLST_ERROR, +}; +use lazy_static::lazy_static; +use lru::LruCache; +use parking_lot::RwLock; +use reth_bsc_consensus::{ + get_top_validators_by_voting_power, hash_with_chain_id, is_breathe_block, + is_system_transaction, Parlia, ParliaConfig, ParliaConsensusError, + COLLECT_ADDITIONAL_VOTES_REWARD_RATIO, DIFF_INTURN, DIFF_NOTURN, EXTRA_SEAL_LEN, + EXTRA_VANITY_LEN, MAX_SYSTEM_REWARD, NATURALLY_JUSTIFIED_DIST, SYSTEM_REWARD_CONTRACT, + SYSTEM_REWARD_PERCENT, SYSTEM_TXS_GAS, +}; +use reth_db::models::parlia::{ + Snapshot, VoteAddress, CHECKPOINT_INTERVAL, MAX_ATTESTATION_EXTRA_LENGTH, +}; +use reth_evm::{ + execute::{ + BatchBlockExecutionOutput, BatchExecutor, BlockExecutionInput, BlockExecutionOutput, + BlockExecutorProvider, Executor, + }, + ConfigureEvm, +}; +use reth_interfaces::{ + executor::{BlockExecutionError, BlockValidationError}, + provider::ProviderError, +}; +use reth_primitives::{ + constants::SYSTEM_ADDRESS, Address, BlockNumber, BlockWithSenders, Bytes, ChainSpec, + GotExpected, Hardfork, Header, PruneModes, Receipt, Receipts, SealedHeader, Transaction, + TransactionSigned, TxType, Withdrawals, B256, U256, +}; +use reth_provider::{HeaderProvider, ParliaSnapshotReader, ParliaSnapshotWriter}; +use reth_revm::{ + batch::{BlockBatchRecord, BlockExecutorStats}, + db::states::bundle_state::BundleRetention, + state_change::{apply_beacon_root_contract_call, post_block_balance_increments}, + Evm, State, +}; +use revm_primitives::{ + db::{Database, DatabaseCommit}, + BlockEnv, CfgEnvWithHandlerCfg, EnvWithHandlerCfg, ResultAndState, TransactTo, +}; +use std::{collections::HashMap, num::NonZeroUsize, sync::Arc}; +use tracing::{debug, trace}; + +const SNAP_CACHE_NUM: usize = 2048; + +lazy_static! { + // snapshot cache map by block_hash: snapshot + static ref RECENT_SNAPS: RwLock> = RwLock::new(LruCache::new(NonZeroUsize::new(SNAP_CACHE_NUM).unwrap())); +} + +/// Provides executors to execute regular bsc blocks +#[derive(Debug, Clone)] +pub struct BscExecutorProvider { + chain_spec: Arc, + evm_config: EvmConfig, + parlia_config: ParliaConfig, +} + +impl BscExecutorProvider { + /// Creates a new default bsc executor provider. + pub fn bsc(chain_spec: Arc) -> Self { + Self::new(chain_spec, Default::default(), ParliaConfig::default()) + } +} + +impl BscExecutorProvider { + /// Creates a new executor provider. + pub fn new( + chain_spec: Arc, + evm_config: EvmConfig, + parlia_config: ParliaConfig, + ) -> Self { + Self { chain_spec, evm_config, parlia_config } + } +} + +impl BscExecutorProvider +where + EvmConfig: ConfigureEvm, +{ + fn bsc_executor(&self, db: DB, provider: P) -> BscBlockExecutor + where + DB: Database, + { + BscBlockExecutor::new( + self.chain_spec.clone(), + self.evm_config.clone(), + self.parlia_config.clone(), + State::builder().with_database(db).with_bundle_update().without_state_clear().build(), + provider, + ) + } +} + +impl BlockExecutorProvider for BscExecutorProvider +where + EvmConfig: ConfigureEvm, +{ + type Executor> = BscBlockExecutor; + + type BatchExecutor> = BscBatchExecutor; + fn executor(&self, _db: DB) -> Self::Executor + where + DB: Database, + { + panic!("Use `executor_with_provider_rw` instead") + } + + fn executor_with_provider_rw(&self, db: DB, provider: P) -> Self::Executor + where + DB: Database, + { + self.bsc_executor(db, provider) + } + + fn batch_executor(&self, _db: DB, _prune_modes: PruneModes) -> Self::BatchExecutor + where + DB: Database, + { + panic!("Use `batch_executor_with_provider_rw` instead") + } + + fn batch_executor_with_provider_rw( + &self, + db: DB, + prune_modes: PruneModes, + provider: P, + ) -> Self::BatchExecutor + where + DB: Database, + { + let executor = self.bsc_executor(db, provider); + BscBatchExecutor { + executor, + batch_record: BlockBatchRecord::new(prune_modes), + stats: BlockExecutorStats::default(), + } + } +} + +/// Helper container type for EVM with chain spec. +#[derive(Debug, Clone)] +struct BscEvmExecutor { + /// The chain spec + chain_spec: Arc, + /// How to create an EVM. + evm_config: EvmConfig, +} + +impl BscEvmExecutor +where + EvmConfig: ConfigureEvm, +{ + /// Executes the transactions in the block and returns the receipts. + /// + /// This applies the pre-execution changes, and executes the transactions. + /// + /// # Note + /// + /// It does __not__ apply post-execution changes. + fn execute_pre_and_transactions( + &self, + block: &BlockWithSenders, + evm: &mut Evm<'_, Ext, &mut State>, + ) -> Result<(Vec<&TransactionSigned>, Vec, u64), BlockExecutionError> + where + DB: Database, + { + // reserve gas for system transactions + let gas_limit = block.header.gas_limit - SYSTEM_TXS_GAS; + + // execute transactions + let mut cumulative_gas_used = 0; + let mut system_txs = Vec::with_capacity(2); // Normally there are 2 system transactions. + let mut receipts = Vec::with_capacity(block.body.len()); + for (sender, transaction) in block.transactions_with_sender() { + if is_system_transaction(transaction, &block.header) { + system_txs.push(transaction); + continue + } + // systemTxs should be always at the end of block. + if self.chain_spec.is_cancun_active_at_timestamp(block.timestamp) { + if system_txs.len() > 0 { + return Err(BlockExecutionError::Validation( + BscBlockExecutionError::UnexpectedNormalTx.into(), + )) + } + } + + // The sum of the transaction’s gas limit, Tg, and the gas utilized in this block prior, + // must be no greater than the block’s gasLimit. + let block_available_gas = gas_limit - cumulative_gas_used; + if transaction.gas_limit() > block_available_gas { + return Err(BlockValidationError::TransactionGasLimitMoreThanAvailableBlockGas { + transaction_gas_limit: transaction.gas_limit(), + block_available_gas, + } + .into()) + } + + EvmConfig::fill_tx_env(evm.tx_mut(), transaction, *sender); + + // Execute transaction. + let ResultAndState { result, state } = evm.transact().map_err(move |err| { + // Ensure hash is calculated for error log, if not already done + BlockValidationError::EVM { + hash: transaction.recalculate_hash(), + error: err.into(), + } + })?; + + trace!( + target: "evm", + ?transaction, + "Executed transaction" + ); + + evm.db_mut().commit(state); + + // append gas used + cumulative_gas_used += result.gas_used(); + + // Push transaction changeset and calculate header bloom filter for receipt. + receipts.push( + #[allow(clippy::needless_update)] // side-effect of optimism fields + Receipt { + tx_type: transaction.tx_type(), + // Success flag was added in `EIP-658: Embedding transaction status code in + // receipts`. + success: result.is_success(), + cumulative_gas_used, + // convert to reth log + logs: result.into_logs(), + ..Default::default() + }, + ); + } + + Ok((system_txs, receipts, cumulative_gas_used)) + } +} + +/// A basic Ethereum block executor. +/// +/// Expected usage: +/// - Create a new instance of the executor. +/// - Execute the block. +#[derive(Debug)] +pub struct BscBlockExecutor { + /// Chain specific evm config that's used to execute a block. + executor: BscEvmExecutor, + /// The state to use for execution + state: State, + /// Extra provider for bsc + provider: P, + /// Parlia consensus instance + parlia: Arc, +} + +impl BscBlockExecutor { + /// Creates a new Ethereum block executor. + pub fn new( + chain_spec: Arc, + evm_config: EvmConfig, + parlia_config: ParliaConfig, + state: State, + provider: P, + ) -> Self { + let parlia = Arc::new(Parlia::new(Arc::clone(&chain_spec), parlia_config)); + Self { executor: BscEvmExecutor { chain_spec, evm_config }, state, provider, parlia } + } + + #[inline] + fn chain_spec(&self) -> &ChainSpec { + &self.executor.chain_spec + } + + #[inline] + fn parlia(&self) -> &Parlia { + &self.parlia + } + + /// Returns mutable reference to the state that wraps the underlying database. + #[allow(unused)] + fn state_mut(&mut self) -> &mut State { + &mut self.state + } +} + +impl BscBlockExecutor +where + EvmConfig: ConfigureEvm, + DB: Database, + P: HeaderProvider + ParliaSnapshotReader + ParliaSnapshotWriter, +{ + /// Configures a new evm configuration and block environment for the given block. + /// + /// Caution: this does not initialize the tx environment. + fn evm_env_for_block(&self, header: &Header, total_difficulty: U256) -> EnvWithHandlerCfg { + let mut cfg = CfgEnvWithHandlerCfg::new(Default::default(), Default::default()); + let mut block_env = BlockEnv::default(); + EvmConfig::fill_cfg_and_block_env( + &mut cfg, + &mut block_env, + self.chain_spec(), + header, + total_difficulty, + ); + + EnvWithHandlerCfg::new_with_cfg_env(cfg, block_env, Default::default()) + } + + /// Execute a single block and apply the state changes to the internal state. + /// + /// Returns the receipts of the transactions in the block and the total gas used. + /// + /// Returns an error if execution fails or receipt verification fails. + fn execute_and_verify( + &mut self, + block: &BlockWithSenders, + total_difficulty: U256, + ) -> Result<(Vec, u64), BlockExecutionError> { + // 1. prepare state on new block + self.on_new_block(&block.header)?; + + // 2. configure the evm and execute normal transactions + let env = self.evm_env_for_block(&block.header, total_difficulty); + + if !self.parlia.chain_spec().fork(Hardfork::Feynman).active_at_timestamp(block.timestamp) { + let _parent = self.get_header_by_hash(block.number - 1, block.parent_hash)?; + // apply system contract upgrade + todo!() + } + + let mut evm = self.executor.evm_config.evm_with_env(&mut self.state, env); + let (mut system_txs, mut receipts, mut gas_used) = + self.executor.execute_pre_and_transactions(block, &mut evm)?; + + // 3. apply post execution changes + self.post_execution(block, &mut system_txs, &mut receipts, &mut gas_used, &mut evm)?; + + // Check if gas used matches the value set in header. + if block.gas_used != gas_used { + let receipts = Receipts::from_block_receipt(receipts); + return Err(BlockValidationError::BlockGasUsed { + gas: GotExpected { got: gas_used, expected: block.gas_used }, + gas_spent_by_tx: receipts.gas_spent_by_tx()?, + } + .into()); + } + + // Before Byzantium, receipts contained state root that would mean that expensive + // operation as hashing that is required for state root got calculated in every + // transaction This was replaced with is_success flag. + // See more about EIP here: https://eips.ethereum.org/EIPS/eip-658 + if self.chain_spec().is_byzantium_active_at_block(block.header.number) { + if let Err(error) = verify_receipts( + block.header.receipts_root, + block.header.logs_bloom, + receipts.iter(), + ) { + debug!(target: "evm", %error, ?receipts, "receipts verification failed"); + return Err(error); + }; + } + + Ok((receipts, gas_used)) + } + + /// Apply settings and verify headers before a new block is executed. + pub(crate) fn on_new_block(&mut self, header: &Header) -> Result<(), BlockExecutionError> { + // Set state clear flag if the block is after the Spurious Dragon hardfork. + let state_clear_flag = self.chain_spec().is_spurious_dragon_active_at_block(header.number); + self.state.set_state_clear_flag(state_clear_flag); + + self.verify_cascading_fields(header) + } + + /// Apply post execution state changes, including system txs and other state change. + pub fn post_execution( + &mut self, + block: &BlockWithSenders, + system_txs: &mut Vec<&TransactionSigned>, + receipts: &mut Vec, + cumulative_gas_used: &mut u64, + evm: &mut Evm<'_, Ext, &mut State>, + ) -> Result<(), BlockExecutionError> + where + DB: Database, + { + let number = block.number; + let validator = block.beneficiary; + let header = &block.header; + + let ref parent = self.get_header_by_hash(block.number - 1, block.parent_hash)?; + let ref snap = self.snapshot(header, Some(parent))?; + + //TODO: isMajorityFork ? + + self.verify_validators(header, evm)?; + + if number == 1 { + self.init_genesis_contracts(validator, system_txs, receipts, cumulative_gas_used, evm)?; + } + + if self.parlia.chain_spec().fork(Hardfork::Feynman).active_at_timestamp(block.timestamp) { + // apply system contract upgrade + todo!() + } + + if self.parlia.is_on_feynman(block.timestamp, parent.timestamp) { + self.init_feynman_contracts(validator, system_txs, receipts, cumulative_gas_used, evm)?; + } + + // slash validator if it's not inturn + if block.difficulty != DIFF_INTURN { + let spoiled_val = snap.inturn_validator(); + let signed_recently: bool; + if self.parlia.chain_spec().fork(Hardfork::Plato).active_at_block(number) { + signed_recently = snap.sign_recently(spoiled_val); + } else { + signed_recently = snap + .recent_proposers + .iter() + .find(|(_, v)| **v == spoiled_val) + .map(|_| true) + .unwrap_or(false); + } + + if !signed_recently { + self.slash_spoiled_validator( + validator, + spoiled_val, + system_txs, + receipts, + cumulative_gas_used, + evm, + )?; + } + } + + self.distribute_incoming(header, system_txs, receipts, cumulative_gas_used, evm)?; + + if self.parlia.chain_spec().fork(Hardfork::Plato).active_at_block(number) { + self.distribute_finality_reward( + header, + system_txs, + receipts, + cumulative_gas_used, + evm, + )?; + } + + // update validator set after Feynman upgrade + if self.parlia.chain_spec().fork(Hardfork::Feynman).active_at_timestamp(header.timestamp) && + is_breathe_block(parent.timestamp, header.timestamp) + { + if !self.parlia.is_on_feynman(header.timestamp, parent.timestamp) { + self.update_validator_set_v2( + validator, + system_txs, + receipts, + cumulative_gas_used, + evm, + )?; + } + } + + if !system_txs.is_empty() { + return Err(BlockExecutionError::Validation( + BscBlockExecutionError::UnexpectedSystemTx.into(), + )) + } + + Ok(()) + } + + fn verify_cascading_fields(&self, header: &Header) -> Result<(), BlockExecutionError> { + if header.number == 0 { + return Ok(()); + } + + let ref parent = self.get_header_by_hash(header.number - 1, header.parent_hash)?; + let ref snap = self.snapshot(header, Some(parent))?; + + self.verify_block_time_for_ramanujan(snap, header, parent)?; + self.verify_vote_attestation(snap, header, parent)?; + self.verify_seal(snap, header)?; + + Ok(()) + } + + fn verify_block_time_for_ramanujan( + &self, + snapshot: &Snapshot, + header: &Header, + parent: &Header, + ) -> Result<(), BlockExecutionError> { + if self.parlia.chain_spec().fork(Hardfork::Ramanujan).active_at_block(header.number) { + if header.timestamp < + parent.timestamp + + self.parlia.period() + + self.parlia.back_off_time(snapshot, header) + { + return Err(BscBlockExecutionError::FutureBlock { + block_number: header.number, + hash: header.hash_slow(), + } + .into()); + } + } + + Ok(()) + } + + fn verify_vote_attestation( + &self, + snap: &Snapshot, + header: &Header, + parent: &Header, + ) -> Result<(), BlockExecutionError> { + let attestation = self.parlia.get_vote_attestation_from_header(header)?; + if let Some(attestation) = attestation { + if attestation.extra.len() > MAX_ATTESTATION_EXTRA_LENGTH { + return Err(BscBlockExecutionError::TooLargeAttestationExtraLen { + extra_len: MAX_ATTESTATION_EXTRA_LENGTH, + } + .into()); + } + + // the attestation target block should be direct parent. + let target_block = attestation.data.target_number; + let target_hash = attestation.data.target_hash; + if target_block != parent.number || target_hash != header.parent_hash { + return Err(BscBlockExecutionError::InvalidAttestationTarget { + block_number: GotExpected { got: target_block, expected: parent.number }, + block_hash: GotExpected { got: target_hash, expected: parent.hash_slow() } + .into(), + } + .into()); + } + + // the attestation source block should be the highest justified block. + let source_block = attestation.data.source_number; + let source_hash = attestation.data.source_hash; + let ref justified: Header = self.get_justified_header(snap, parent)?; + if source_block != justified.number || source_hash != justified.hash_slow() { + return Err(BscBlockExecutionError::InvalidAttestationSource { + block_number: GotExpected { got: source_block, expected: justified.number }, + block_hash: GotExpected { got: source_hash, expected: justified.hash_slow() } + .into(), + } + .into()); + } + + // query bls keys from snapshot. + let validators_count = snap.validators.len(); + let vote_bit_set = BitSet::from_u64(attestation.vote_address_set); + let bit_set_count = vote_bit_set.count() as usize; + + if bit_set_count > validators_count { + return Err(BscBlockExecutionError::InvalidAttestationVoteCount(GotExpected { + got: bit_set_count as u64, + expected: validators_count as u64, + }) + .into()); + } + let mut vote_addrs: Vec = Vec::with_capacity(bit_set_count); + for (i, val) in snap.validators.iter().enumerate() { + if !vote_bit_set.test(i) { + continue; + } + + let val_info = snap.validators_map.get(val).ok_or_else(|| { + BscBlockExecutionError::VoteAddrNotFoundInSnap { address: *val } + })?; + vote_addrs.push(val_info.vote_addr.clone()); + } + + // check if voted validator count satisfied 2/3+1 + let at_least_votes = validators_count * 2 / 3; + if vote_addrs.len() < at_least_votes { + return Err(BscBlockExecutionError::InvalidAttestationVoteCount(GotExpected { + got: vote_addrs.len() as u64, + expected: at_least_votes as u64, + }) + .into()); + } + + // check bls aggregate sig + let vote_addrs: Vec = vote_addrs + .iter() + .map(|addr| PublicKey::from_bytes(addr.as_slice()).unwrap()) + .collect(); + let vote_addrs: Vec<&PublicKey> = vote_addrs.iter().collect(); + + let sig = Signature::from_bytes(&attestation.agg_signature[..]) + .map_err(|_| BscBlockExecutionError::BLSTInnerError)?; + let err = sig.aggregate_verify( + true, + &[attestation.data.hash().as_slice()], + &[], + &vote_addrs, + true, + ); + + return match err { + BLST_ERROR::BLST_SUCCESS => Ok(()), + _ => Err(BscBlockExecutionError::BLSTInnerError.into()), + } + } + + Ok(()) + } + + fn verify_seal(&self, snap: &Snapshot, header: &Header) -> Result<(), BlockExecutionError> { + let block_number = header.number; + let proposer = self.parlia.recover_proposer(header)?; + + if proposer != header.beneficiary { + return Err(BscBlockExecutionError::WrongHeaderSigner { + block_number, + signer: GotExpected { got: proposer, expected: header.beneficiary }.into(), + } + .into()); + } + + if !snap.validators.contains(&proposer) { + return Err(BscBlockExecutionError::SignerUnauthorized { block_number, proposer }.into()); + } + + for (seen, recent) in snap.recent_proposers.iter() { + if *recent == proposer { + // Signer is among recent_proposers, only fail if the current block doesn't shift it + // out + let limit = self.get_recently_proposal_limit(header, snap.validators.len() as u64); + if *seen > block_number - limit { + return Err(BscBlockExecutionError::SignerOverLimit { proposer }.into()); + } + } + } + + let is_inturn = snap.is_inturn(proposer); + if (is_inturn && header.difficulty != DIFF_INTURN) || + (!is_inturn && header.difficulty != DIFF_NOTURN) + { + return Err(BscBlockExecutionError::ParliaConsensusError( + ParliaConsensusError::InvalidDifficulty { difficulty: header.difficulty }, + ) + .into()); + } + + Ok(()) + } + + fn snapshot( + &self, + header: &Header, + parent: Option<&Header>, + ) -> Result { + let mut cache = RECENT_SNAPS.write(); + + let mut header = header.clone(); + let mut block_number = header.number; + let mut block_hash = header.hash_slow(); + let mut skip_headers = Vec::new(); + + let mut snap: Option = None; + loop { + // Read from cache + if let Some(cached) = cache.get(&block_hash) { + snap = Some(cached.clone()); + break; + } + + // Read from db + if block_number % CHECKPOINT_INTERVAL == 0 { + if let Some(cached) = self + .provider + .get_parlia_snapshot(block_hash) + .map_err(|_| BscBlockExecutionError::ProviderInnerError)? + { + snap = Some(cached); + break; + } + } + + // If we're at the genesis, snapshot the initial state. + if block_number == 0 { + let (next_validators, bls_keys) = + self.parse_validators_from_header(header.header())?; + snap = Some(Snapshot::new( + next_validators, + block_number, + block_hash, + self.parlia.epoch(), + bls_keys, + )); + break; + } + + // No snapshot for this header, gather the header and move backward + skip_headers.push(header.clone()); + if let Some(parent) = parent { + block_number = parent.number; + block_hash = parent.hash_slow(); + header = parent.clone(); + } else if let Some(h) = self + .provider + .header_by_number(block_number - 1) + .map_err(|_| BscBlockExecutionError::ProviderInnerError)? + { + let hash = h.hash_slow(); + if hash != header.parent_hash { + return Err(BscBlockExecutionError::ParentUnknown { hash: block_hash }); + } + block_number = h.number; + block_hash = hash; + header = h; + } + } + + if snap.is_none() { + return Err(BscBlockExecutionError::SnapshotNotFound.into()) + } + let mut snap = snap.unwrap(); + + // apply skip headers + skip_headers.reverse(); + for header in skip_headers.iter() { + let validator = self.recover_proposer(header)?; + let (next_validators, bls_keys) = self.parse_validators_from_header(header)?; + let attestation = self.get_vote_attestation_from_header(header)?; + snap = snap + .apply(validator, header, next_validators, bls_keys, attestation) + .ok_or_else(|| BscBlockExecutionError::ApplySnapshotFailed)?; + } + + cache.put(snap.block_hash, snap.clone()); + if snap.block_number % CHECKPOINT_INTERVAL == 0 { + self.provider + .save_parlia_snapshot(snap.block_hash, snap.clone()) + .map_err(|_| BscBlockExecutionError::ProviderInnerError)?; + } + + Ok(snap) + } + + fn get_justified_header( + &self, + snap: &Snapshot, + header: &Header, + ) -> Result { + // If there has vote justified block, find it or return naturally justified block. + if snap.vote_data.source_hash != B256::ZERO && snap.vote_data.target_hash != B256::ZERO { + if snap.block_number - snap.vote_data.target_number > NATURALLY_JUSTIFIED_DIST { + return self.find_ancient_header(header, NATURALLY_JUSTIFIED_DIST); + } + return self.get_header_by_hash(snap.vote_data.target_number, snap.vote_data.target_hash) + } + + // If there is no vote justified block, then return root block or naturally justified block. + if header.number < NATURALLY_JUSTIFIED_DIST { + return Ok(self + .provider + .header_by_number(0) + .map_err(|_| BscBlockExecutionError::ProviderInnerError)? + .ok_or_else(|| BscBlockExecutionError::UnknownHeader { + block_number: 0, + hash: Default::default(), + })?); + } + + self.find_ancient_header(header, NATURALLY_JUSTIFIED_DIST) + } + + fn find_ancient_header( + &self, + header: &Header, + count: u64, + ) -> Result { + let mut result = header.clone(); + for _ in 0..count { + result = self.get_header_by_hash(result.number - 1, result.parent_hash)?; + } + Ok(result) + } + + fn get_header_by_hash( + &self, + block_number: BlockNumber, + hash: B256, + ) -> Result { + let header = self + .provider + .header_by_number(block_number) + .map_err(|_| BscBlockExecutionError::ProviderInnerError)? + .ok_or_else(|| BscBlockExecutionError::UnknownHeader { block_number, hash })?; + + return if header.hash_slow() == hash { + Ok(header) + } else { + Err(BscBlockExecutionError::UnknownHeader { block_number, hash }.into()) + } + } + + fn verify_validators( + &self, + header: &Header, + evm: &mut Evm<'_, Ext, &mut State>, + ) -> Result<(), BlockExecutionError> { + let number = header.number; + let (mut validators, mut vote_addrs_map) = self.get_current_validators(number, evm); + + validators.sort(); + let validator_num = validators.len(); + let validator_bytes = + if self.parlia.chain_spec().fork(Hardfork::Luban).active_at_block(number) { + let mut validator_bytes = Vec::new(); + for v in validators { + validator_bytes.extend_from_slice(v.as_ref()); + } + + validator_bytes.as_slice() + } else { + if self.parlia.is_on_luban(number) { + vote_addrs_map = Vec::with_capacity(validator_num); + for _ in 0..validator_num { + vote_addrs_map.push(VoteAddress::default()); + } + } + + let mut validator_bytes = Vec::new(); + for i in 0..validator_num { + validator_bytes.extend_from_slice(validators[i].as_ref()); + validator_bytes.extend_from_slice(vote_addrs_map[i].as_ref()); + } + + validator_bytes.as_slice() + }; + + if !validator_bytes.eq(self + .parlia + .get_validator_bytes_from_header(header) + .unwrap() + .as_slice()) + { + return Err(BscBlockExecutionError::InvalidValidators.into()) + } + + Ok(()) + } + + fn get_current_validators( + &self, + number: BlockNumber, + evm: &mut Evm<'_, Ext, &mut State>, + ) -> (Vec
, Vec) { + if self.parlia.chain_spec().fork(Hardfork::Luban).active_at_block(number) { + let (to, data) = self.parlia.get_current_validators_before_luban(number); + let output = self.eth_call(to, data, evm)?; + + (self.parlia.unpack_data_into_validator_set_before_luban(output.as_ref()), Vec::new()) + } else { + let (to, data) = self.parlia.get_current_validators(); + let output = self.eth_call(to, data, evm)?; + + self.parlia.unpack_data_into_validator_set(output.as_ref()) + } + } + + fn init_genesis_contracts( + &self, + validator: Address, + system_txs: &mut Vec<&TransactionSigned>, + receipts: &mut Vec, + cumulative_gas_used: &mut u64, + evm: &mut Evm<'_, Ext, &mut State>, + ) -> Result<(), BlockExecutionError> { + let nonce = evm.db_mut().basic(validator).unwrap().unwrap().nonce; + self.parlia.init_genesis_contracts(nonce).iter().for_each(|tx| { + self.transact_system_tx(tx, validator, system_txs, receipts, cumulative_gas_used, evm)?; + }); + + Ok(()) + } + + fn init_feynman_contracts( + &self, + validator: Address, + system_txs: &mut Vec<&TransactionSigned>, + receipts: &mut Vec, + cumulative_gas_used: &mut u64, + evm: &mut Evm<'_, Ext, &mut State>, + ) -> Result<(), BlockExecutionError> { + let nonce = evm.db_mut().basic(validator).unwrap().unwrap().nonce; + self.parlia.init_feynman_contracts(nonce).iter().for_each(|tx| { + self.transact_system_tx(tx, validator, system_txs, receipts, cumulative_gas_used, evm)?; + }); + + Ok(()) + } + + fn slash_spoiled_validator( + &self, + validator: Address, + spoiled_val: Address, + system_txs: &mut Vec<&TransactionSigned>, + receipts: &mut Vec, + cumulative_gas_used: &mut u64, + evm: &mut Evm<'_, Ext, &mut State>, + ) -> Result<(), BlockExecutionError> { + let nonce = evm.db_mut().basic(validator).unwrap().unwrap().nonce; + self.transact_system_tx( + &self.parlia.slash(nonce, spoiled_val), + validator, + system_txs, + receipts, + cumulative_gas_used, + evm, + )?; + + Ok(()) + } + + fn distribute_incoming( + &self, + header: &Header, + system_txs: &mut Vec<&TransactionSigned>, + receipts: &mut Vec, + cumulative_gas_used: &mut u64, + evm: &mut Evm<'_, Ext, &mut State>, + ) -> Result<(), BlockExecutionError> { + let validator = header.beneficiary; + + let mut block_reward = *evm.db_mut().drain_balances([SYSTEM_ADDRESS])?.first().unwrap(); + let mut balance_increment = HashMap::new(); + balance_increment.insert(validator, block_reward); + evm.db_mut() + .increment_balances(balance_increment) + .map_err(|_| BlockValidationError::IncrementBalanceFailed)?; + + if !self.parlia.chain_spec().fork(Hardfork::Kepler).active_at_timestamp(header.timestamp) { + let system_reward_balance = + evm.db_mut().basic(*SYSTEM_REWARD_CONTRACT).unwrap().unwrap().balance; + if system_reward_balance.try_into().unwrap() < MAX_SYSTEM_REWARD { + let reward_to_system = block_reward >> SYSTEM_REWARD_PERCENT; + if reward_to_system > 0 { + let nonce = evm.db_mut().basic(validator).unwrap().unwrap().nonce; + self.transact_system_tx( + &self.parlia.distribute_to_system(nonce, reward_to_system), + validator, + system_txs, + receipts, + cumulative_gas_used, + evm, + )?; + } + + block_reward -= reward_to_system; + } + } + + let nonce = self.db_mut().basic(validator).unwrap().unwrap().nonce; + self.transact_system_tx( + &self.parlia.distribute_to_validator(nonce, validator, block_reward), + validator, + system_txs, + receipts, + cumulative_gas_used, + evm, + )?; + + Ok(()) + } + + fn distribute_finality_reward( + &self, + header: &Header, + system_txs: &mut Vec<&TransactionSigned>, + receipts: &mut Vec, + cumulative_gas_used: &mut u64, + evm: &mut Evm<'_, Ext, &mut State>, + ) -> Result<(), BlockExecutionError> { + if header.number % self.parlia.epoch() != 0 { + return Ok(()) + } + + let validator = header.beneficiary; + + let mut accumulated_weights: HashMap = HashMap::new(); + let start = (header.number - self.parlia.epoch()).max(1); + for height in (start..header.number).rev() { + let header = self.get_header_by_hash(height, header.parent_hash)?; + if let Some(attestation) = self.get_vote_attestation_from_header(&header)? { + let justified_header = self.get_header_by_hash( + attestation.data.target_number, + attestation.data.target_hash, + )?; + let snap = self.snapshot(&justified_header, None)?; + let validators = &snap.validators; + let validators_bit_set = BitSet::from_u64(attestation.vote_address_set); + if validators_bit_set.count() as usize > validators.len() { + return Err(BscBlockExecutionError::InvalidAttestationVoteCount(GotExpected { + got: validators_bit_set.count(), + expected: validators.len() as u64, + }) + .into()); + } + + let mut valid_vote_count = 0; + for (index, val) in validators.iter().enumerate() { + if validators_bit_set.test(index) { + *accumulated_weights.entry(*val).or_insert(U256::ZERO) += U256::from(1); + valid_vote_count += 1; + } + } + let quorum = (snap.validators.len() * 2 + 2) / 3; // ceil div + if valid_vote_count > quorum { + *accumulated_weights.entry(header.beneficiary).or_insert(U256::ZERO) += + U256::from( + ((valid_vote_count - quorum) * COLLECT_ADDITIONAL_VOTES_REWARD_RATIO) / + 100, + ); + } + } + } + + let mut validators: Vec
= accumulated_weights.keys().cloned().collect(); + validators.sort(); + let weights: Vec = + validators.iter().map(|val| accumulated_weights[val].clone()).collect(); + + let nonce = self.db_mut().basic(validator).unwrap().unwrap().nonce; + self.transact_system_tx( + &self.parlia.distribute_finality_reward(nonce, validators, weights), + validator, + system_txs, + receipts, + cumulative_gas_used, + evm, + )?; + + Ok(()) + } + + fn update_validator_set_v2( + &self, + validator: Address, + system_txs: &mut Vec<&TransactionSigned>, + receipts: &mut Vec, + cumulative_gas_used: &mut u64, + evm: &mut Evm<'_, Ext, &mut State>, + ) -> Result<(), BlockExecutionError> { + let (to, data) = self.parlia.get_max_elected_validators(); + let output = self.eth_call(to, data, evm)?; + let max_elected_validators = + self.parlia.unpack_data_into_max_elected_validators(output.as_ref()); + + let (to, data) = self.parlia.get_validator_election_info(); + let output = self.eth_call(to, data, evm)?; + let (consensus_addrs, voting_powers, vote_addrs, total_length) = + self.parlia.unpack_data_into_validator_election_info(output.as_ref()); + + let (e_validators, e_voting_powers, e_vote_addrs) = get_top_validators_by_voting_power( + consensus_addrs, + voting_powers, + vote_addrs, + total_length, + max_elected_validators, + ) + .ok_or(Err(BscBlockExecutionError::GetTopValidatorsFailed.into()))?; + + let nonce = evm.db_mut().basic(validator).unwrap().unwrap().nonce; + self.transact_system_tx( + &self.parlia.update_validator_set_v2( + nonce, + e_validators, + e_voting_powers, + e_vote_addrs, + ), + validator, + system_txs, + receipts, + cumulative_gas_used, + evm, + )?; + + Ok(()) + } + + fn eth_call( + &self, + to: Address, + data: Bytes, + evm: &mut Evm<'_, Ext, &mut State>, + ) -> Result<&Bytes, BlockExecutionError> { + let tx_env = evm.tx_mut(); + + tx_env.caller = Address::default(); + tx_env.transact_to = TransactTo::Call(to); + tx_env.nonce = None; + tx_env.gas_limit = u64::MAX / 2; + tx_env.value = U256::ZERO; + tx_env.data = data; + tx_env.gas_price = U256::ZERO; + // The chain ID check is not relevant here and is disabled if set to None + tx_env.chain_id = None; + // Setting the gas priority fee to None ensures the effective gas price is derived from + // the `gas_price` field, which we need to be zero + tx_env.gas_priority_fee = None; + tx_env.access_list = Vec::new(); + tx_env.blob_hashes = Vec::new(); + tx_env.max_fee_per_blob_gas = None; + + // disable the base fee check for this call by setting the base fee to zero + let block_env = evm.block_mut(); + block_env.basefee = U256::ZERO; + + // Execute call. + let ResultAndState { result, .. } = evm.transact().map_err(move |e| { + // Ensure hash is calculated for error log, if not already done + BlockValidationError::EVM { hash: B256::default(), error: e.into() }.into() + })?; + + if !result.is_success() { + return Err(BscBlockExecutionError::EthCallFailed.into()) + } + + result.output().ok_or_else(|| BscBlockExecutionError::EthCallFailed.into()) + } + + fn transact_system_tx( + &self, + transaction: &Transaction, + sender: Address, + system_txs: &mut Vec<&TransactionSigned>, + receipts: &mut Vec, + cumulative_gas_used: &mut u64, + evm: &mut Evm<'_, Ext, &mut State>, + ) -> Result { + if transaction.signature_hash() != system_txs[0].signature_hash() { + return Err(BscBlockExecutionError::UnexpectedSystemTx.into()); + } + system_txs.remove(0); + + let tx_env = evm.tx_mut(); + tx_env.caller = sender; + tx_env.transact_to = TransactTo::Call(transaction.to().unwrap()); + tx_env.nonce = Some(transaction.nonce()); + tx_env.gas_limit = u64::MAX / 2; + tx_env.value = transaction.value(); + tx_env.data = transaction.input().clone(); + // System transactions' gas price is always zero + tx_env.gas_price = U256::ZERO; + tx_env.chain_id = transaction.chain_id(); + // Setting the gas priority fee to None ensures the effective gas price is derived from + // the `gas_price` field, which we need to be zero + tx_env.gas_priority_fee = None; + tx_env.access_list = Vec::new(); + tx_env.blob_hashes = Vec::new(); + tx_env.max_fee_per_blob_gas = None; + tx_env.bsc.is_system_transaction = Some(true); + + // disable the base fee check for this call by setting the base fee to zero + let block_env = evm.block_mut(); + block_env.basefee = U256::ZERO; + + // Execute transaction. + let ResultAndState { result, state } = evm.transact().map_err(move |e| { + // Ensure hash is calculated for error log, if not already done + BlockValidationError::EVM { hash: transaction.recalculate_hash(), error: e.into() } + .into() + })?; + + evm.db_mut().commit(state); + + // append gas used + *cumulative_gas_used += result.gas_used(); + + // Push transaction changeset and calculate header bloom filter for receipt. + receipts.push(Receipt { + tx_type: transaction.tx_type(), + // Success flag was added in `EIP-658: Embedding transaction status code in + // receipts`. + success: result.is_success(), + cumulative_gas_used, + // convert to reth log + logs: result.into_logs().into_iter().map(Into::into).collect(), + }); + } +} +impl Executor for BscBlockExecutor +where + EvmConfig: ConfigureEvm, + DB: Database, + P: HeaderProvider + ParliaSnapshotReader + ParliaSnapshotWriter, +{ + type Input<'a> = BlockExecutionInput<'a, BlockWithSenders>; + type Output = BlockExecutionOutput; + type Error = BlockExecutionError; + + /// Executes the block and commits the state changes. + /// + /// Returns the receipts of the transactions in the block. + /// + /// Returns an error if the block could not be executed or failed verification. + /// + /// State changes are committed to the database. + fn execute(mut self, input: Self::Input<'_>) -> Result { + let BlockExecutionInput { block, total_difficulty } = input; + let (receipts, gas_used) = self.execute_and_verify(block, total_difficulty)?; + + // NOTE: we need to merge keep the reverts for the bundle retention + self.state.merge_transitions(BundleRetention::Reverts); + + Ok(BlockExecutionOutput { state: self.state.take_bundle(), receipts, gas_used }) + } +} + +/// An executor for a batch of blocks. +/// +/// State changes are tracked until the executor is finalized. +#[derive(Debug)] +pub struct BscBatchExecutor { + /// The executor used to execute blocks. + executor: BscBlockExecutor, + /// Keeps track of the batch and record receipts based on the configured prune mode + batch_record: BlockBatchRecord, + stats: BlockExecutorStats, +} + +impl BscBatchExecutor { + /// Returns the receipts of the executed blocks. + pub fn receipts(&self) -> &Receipts { + self.batch_record.receipts() + } + + /// Returns mutable reference to the state that wraps the underlying database. + #[allow(unused)] + fn state_mut(&mut self) -> &mut State { + self.executor.state_mut() + } +} + +impl BatchExecutor for BscBatchExecutor +where + EvmConfig: ConfigureEvm, + DB: Database, + P: HeaderProvider + ParliaSnapshotReader + ParliaSnapshotWriter, +{ + type Input<'a> = BlockExecutionInput<'a, BlockWithSenders>; + type Output = BatchBlockExecutionOutput; + type Error = BlockExecutionError; + + fn execute_one(&mut self, input: Self::Input<'_>) -> Result<(), Self::Error> { + let BlockExecutionInput { block, total_difficulty } = input; + let (receipts, _gas_used) = self.executor.execute_and_verify(block, total_difficulty)?; + + // prepare the state according to the prune mode + let retention = self.batch_record.bundle_retention(block.number); + self.executor.state.merge_transitions(retention); + + // store receipts in the set + self.batch_record.save_receipts(receipts)?; + + if self.batch_record.first_block().is_none() { + self.batch_record.set_first_block(block.number); + } + + Ok(()) + } + + fn finalize(mut self) -> Self::Output { + self.stats.log_debug(); + + BatchBlockExecutionOutput::new( + self.executor.state.take_bundle(), + self.batch_record.take_receipts(), + self.batch_record.first_block().unwrap_or_default(), + ) + } + + fn set_tip(&mut self, tip: BlockNumber) { + self.batch_record.set_tip(tip); + } + + fn size_hint(&self) -> Option { + Some(self.executor.state.bundle_state.size_hint()) + } +} diff --git a/crates/bsc/evm/src/lib.rs b/crates/bsc/evm/src/lib.rs new file mode 100644 index 000000000..f4318d62a --- /dev/null +++ b/crates/bsc/evm/src/lib.rs @@ -0,0 +1,105 @@ +//! EVM config for bsc. + +// TODO: doc +#![allow(missing_docs)] +#![cfg_attr(docsrs, feature(doc_cfg, doc_auto_cfg))] +// The `bsc` feature must be enabled to use this crate. +#![cfg(feature = "bsc")] + +use reth_evm::{ConfigureEvm, ConfigureEvmEnv}; +use reth_primitives::{ + revm::{config::revm_spec, env::fill_tx_env}, + revm_primitives::{AnalysisKind, CfgEnvWithHandlerCfg, TxEnv}, + Address, ChainSpec, Head, Header, TransactionSigned, U256, +}; +use reth_revm::{inspector_handle_register, Database, Evm, EvmBuilder, GetInspector}; + +mod execute; +pub use execute::*; + +mod error; +pub use error::BscBlockExecutionError; +pub mod verify; + +/// Bsc-related EVM configuration. +#[derive(Debug, Default, Clone, Copy)] +#[non_exhaustive] +pub struct BscEvmConfig; + +impl ConfigureEvmEnv for BscEvmConfig { + fn fill_tx_env(tx_env: &mut TxEnv, transaction: &TransactionSigned, sender: Address) { + fill_tx_env(tx_env, transaction, sender) + } + + fn fill_cfg_env( + cfg_env: &mut CfgEnvWithHandlerCfg, + chain_spec: &ChainSpec, + header: &Header, + total_difficulty: U256, + ) { + let spec_id = revm_spec( + chain_spec, + Head { + number: header.number, + timestamp: header.timestamp, + difficulty: header.difficulty, + total_difficulty, + hash: Default::default(), + }, + ); + + cfg_env.chain_id = chain_spec.chain().id(); + cfg_env.perf_analyse_created_bytecodes = AnalysisKind::Analyse; + + cfg_env.handler_cfg.spec_id = spec_id; + cfg_env.handler_cfg.is_bsc = chain_spec.is_bsc(); + } +} + +impl ConfigureEvm for BscEvmConfig { + type DefaultExternalContext<'a> = (); + + fn evm<'a, DB: Database + 'a>(&self, db: DB) -> Evm<'a, Self::DefaultExternalContext<'a>, DB> { + EvmBuilder::default().with_db(db).bsc().build() + } + + fn evm_with_inspector<'a, DB, I>(&self, db: DB, inspector: I) -> Evm<'a, I, DB> + where + DB: Database + 'a, + I: GetInspector, + { + EvmBuilder::default() + .with_db(db) + .with_external_context(inspector) + .bsc() + .append_handler_register(inspector_handle_register) + .build() + } +} + +#[cfg(test)] +mod tests { + use super::*; + use reth_primitives::revm_primitives::{BlockEnv, CfgEnv}; + use revm_primitives::SpecId; + + #[test] + #[ignore] + fn test_fill_cfg_and_block_env() { + let mut cfg_env = CfgEnvWithHandlerCfg::new_with_spec_id(CfgEnv::default(), SpecId::LATEST); + let mut block_env = BlockEnv::default(); + let header = Header::default(); + let chain_spec = ChainSpec::default(); + let total_difficulty = U256::ZERO; + + BscEvmConfig::fill_cfg_and_block_env( + &mut cfg_env, + &mut block_env, + &chain_spec, + &header, + total_difficulty, + ); + + assert_eq!(cfg_env.chain_id, chain_spec.chain().id()); + } +} diff --git a/crates/bsc/evm/src/verify.rs b/crates/bsc/evm/src/verify.rs new file mode 100644 index 000000000..6430bc2b9 --- /dev/null +++ b/crates/bsc/evm/src/verify.rs @@ -0,0 +1,53 @@ +//! Helpers for verifying the receipts. + +use reth_interfaces::executor::{BlockExecutionError, BlockValidationError}; +use reth_primitives::{Bloom, GotExpected, Receipt, ReceiptWithBloom, B256}; + +/// Calculate the receipts root, and compare it against the expected receipts root and logs +/// bloom. +pub fn verify_receipts<'a>( + expected_receipts_root: B256, + expected_logs_bloom: Bloom, + receipts: impl Iterator + Clone, +) -> Result<(), BlockExecutionError> { + // Calculate receipts root. + let receipts_with_bloom = receipts.map(|r| r.clone().into()).collect::>(); + let receipts_root = reth_primitives::proofs::calculate_receipt_root(&receipts_with_bloom); + + // Create header log bloom. + let logs_bloom = receipts_with_bloom.iter().fold(Bloom::ZERO, |bloom, r| bloom | r.bloom); + + compare_receipts_root_and_logs_bloom( + receipts_root, + logs_bloom, + expected_receipts_root, + expected_logs_bloom, + )?; + + Ok(()) +} + +/// Compare the calculated receipts root with the expected receipts root, also compare +/// the calculated logs bloom with the expected logs bloom. +pub fn compare_receipts_root_and_logs_bloom( + calculated_receipts_root: B256, + calculated_logs_bloom: Bloom, + expected_receipts_root: B256, + expected_logs_bloom: Bloom, +) -> Result<(), BlockExecutionError> { + if calculated_receipts_root != expected_receipts_root { + return Err(BlockValidationError::ReceiptRootDiff( + GotExpected { got: calculated_receipts_root, expected: expected_receipts_root }.into(), + ) + .into()) + } + + if calculated_logs_bloom != expected_logs_bloom { + return Err(BlockValidationError::BloomLogDiff( + GotExpected { got: calculated_logs_bloom, expected: expected_logs_bloom }.into(), + ) + .into()) + } + + Ok(()) +} diff --git a/crates/bsc/node/Cargo.toml b/crates/bsc/node/Cargo.toml new file mode 100644 index 000000000..10ca4e045 --- /dev/null +++ b/crates/bsc/node/Cargo.toml @@ -0,0 +1,20 @@ +[package] +name = "reth-node-bsc" +version.workspace = true +edition.workspace = true +rust-version.workspace = true +license.workspace = true +homepage.workspace = true +repository.workspace = true + +[lints] +workspace = true + +[dependencies] +# Reth +reth-evm-bsc.workspace = true + +[features] +bsc = [ + "reth-evm-bsc/bsc", +] \ No newline at end of file diff --git a/crates/bsc/node/src/lib.rs b/crates/bsc/node/src/lib.rs new file mode 100644 index 000000000..e69de29bb diff --git a/crates/consensus/consensus/src/lib.rs b/crates/consensus/consensus/src/lib.rs index 2dee6b124..b3938833c 100644 --- a/crates/consensus/consensus/src/lib.rs +++ b/crates/consensus/consensus/src/lib.rs @@ -250,6 +250,17 @@ pub enum ConsensusError { #[error("blob gas used mismatch: {0}")] BlobGasUsedDiff(GotExpected), + /// Error for invalid block difficulty + #[error("invalid block difficulty: {difficulty}")] + InvalidDifficulty { + /// The block difficulty + difficulty: U256, + }, + + /// Error for invalid mix hash + #[error("invalid mix digest")] + InvalidMixHash, + /// Error for a transaction that violates consensus. #[error(transparent)] InvalidTransaction(#[from] InvalidTransactionError), diff --git a/crates/ethereum-forks/src/hardfork.rs b/crates/ethereum-forks/src/hardfork.rs index 41d1f1302..7909b1759 100644 --- a/crates/ethereum-forks/src/hardfork.rs +++ b/crates/ethereum-forks/src/hardfork.rs @@ -76,6 +76,24 @@ pub enum Hardfork { /// Fjord: #[cfg(feature = "optimism")] Fjord, + + // BSC hardfork + Ramanujan, + Niels, + MirrorSync, + Bruno, + Euler, + Gibbs, + Nano, + Moran, + Planck, + Luban, + Plato, + Hertz, + HertzFix, + Kepler, + Feynman, + FeynmanFix, } impl Hardfork { diff --git a/crates/evm/src/execute.rs b/crates/evm/src/execute.rs index e7ce09e79..17f916f90 100644 --- a/crates/evm/src/execute.rs +++ b/crates/evm/src/execute.rs @@ -164,6 +164,14 @@ pub trait BlockExecutorProvider: Send + Sync + Clone + Unpin + 'static { where DB: Database; + /// Creates a new executor for single block execution with provider read-write. + fn executor_with_provider_rw(&self, db: DB, _provider_rw: P) -> Self::Executor + where + DB: Database { + // return normal executor by default + self.executor(db) + } + /// Creates a new batch executor with the given database and pruning modes. /// /// Batch executor is used to execute multiple blocks in sequence and keep track of the state @@ -174,6 +182,14 @@ pub trait BlockExecutorProvider: Send + Sync + Clone + Unpin + 'static { fn batch_executor(&self, db: DB, prune_modes: PruneModes) -> Self::BatchExecutor where DB: Database; + + /// Creates a new batch executor with the given database and pruning modes with provider read-write. + fn batch_executor_with_provider_rw(&self, db: DB, prune_modes: PruneModes, _provider: P) -> Self::BatchExecutor + where + DB: Database { + // return normal batch executor by default + self.batch_executor(db, prune_modes) + } } #[cfg(test)] diff --git a/crates/interfaces/src/executor.rs b/crates/interfaces/src/executor.rs index 04b9832f0..8a2679452 100644 --- a/crates/interfaces/src/executor.rs +++ b/crates/interfaces/src/executor.rs @@ -118,7 +118,8 @@ pub enum BlockExecutionError { /// Error when fetching latest block state. #[error(transparent)] LatestBlock(#[from] ProviderError), - /// Optimism Block Executor Errors + + /// Optimism/Bsc Block Executor Errors #[error(transparent)] Other(Box), } diff --git a/crates/primitives/src/chain/spec.rs b/crates/primitives/src/chain/spec.rs index de56ff1fe..1d1c4ecb7 100644 --- a/crates/primitives/src/chain/spec.rs +++ b/crates/primitives/src/chain/spec.rs @@ -568,6 +568,20 @@ impl ChainSpec { ) } + /// Returns `true` if this chain contains Bsc configuration. + #[inline] + pub fn is_bsc(&self) -> bool { + // TODO: self.chain.is_bsc() + self.chain.is_optimism() + } + + /// Returns `true` if this chain is Bsc mainnet. + #[inline] + pub fn is_bsc_mainnet(&self) -> bool { + // TODO: self.chain == Chain::bsc_mainnet() + self.chain == Chain::optimism_mainnet() + } + /// Returns `true` if this chain contains Optimism configuration. #[inline] pub fn is_optimism(&self) -> bool { diff --git a/crates/primitives/src/constants/mod.rs b/crates/primitives/src/constants/mod.rs index 4fc0aadfe..dddf77f54 100644 --- a/crates/primitives/src/constants/mod.rs +++ b/crates/primitives/src/constants/mod.rs @@ -178,6 +178,10 @@ pub const EMPTY_TRANSACTIONS: B256 = EMPTY_ROOT_HASH; /// Withdrawals root of empty withdrawals set. pub const EMPTY_WITHDRAWALS: B256 = EMPTY_ROOT_HASH; +/// Empty mix hash +pub const EMPTY_MIX_HASH: B256 = + b256!("0000000000000000000000000000000000000000000000000000000000000000"); + /// The number of blocks to unwind during a reorg that already became a part of canonical chain. /// /// In reality, the node can end up in this particular situation very rarely. It would happen only diff --git a/crates/stages/Cargo.toml b/crates/stages/Cargo.toml index ef91b2be2..a8c015a43 100644 --- a/crates/stages/Cargo.toml +++ b/crates/stages/Cargo.toml @@ -38,6 +38,7 @@ tracing.workspace = true thiserror.workspace = true itertools.workspace = true rayon.workspace = true +cfg-if = "1.0.0" num-traits = "0.2.15" tempfile = { workspace = true, optional = true } @@ -45,6 +46,7 @@ tempfile = { workspace = true, optional = true } # reth reth-primitives = { workspace = true, features = ["test-utils", "arbitrary"] } reth-db = { workspace = true, features = ["test-utils", "mdbx"] } +reth-evm-bsc.workspace = true reth-evm-ethereum.workspace = true reth-interfaces = { workspace = true, features = ["test-utils"] } reth-consensus = { workspace = true, features = ["test-utils"] } @@ -77,6 +79,9 @@ pprof = { workspace = true, features = [ ] } [features] +bsc = [ + "reth-evm-bsc/bsc", +] test-utils = [ "reth-interfaces/test-utils", "reth-db/test-utils", diff --git a/crates/stages/src/stages/execution.rs b/crates/stages/src/stages/execution.rs index 9d8cf6ac6..adff4fced 100644 --- a/crates/stages/src/stages/execution.rs +++ b/crates/stages/src/stages/execution.rs @@ -183,7 +183,13 @@ where provider.tx_ref(), provider.static_file_provider().clone(), )); - let mut executor = self.executor_provider.batch_executor(db, prune_modes); + cfg_if::cfg_if! { + if #[cfg(feature = "bsc")] { + let mut executor = self.executor_provider.batch_executor_with_provider_rw(db, prune_modes, provider); + } else { + let mut executor = self.executor_provider.batch_executor(db, prune_modes); + } + } executor.set_tip(max_block); // Progress tracking diff --git a/crates/storage/db/Cargo.toml b/crates/storage/db/Cargo.toml index 97b556346..c1efb7966 100644 --- a/crates/storage/db/Cargo.toml +++ b/crates/storage/db/Cargo.toml @@ -24,6 +24,7 @@ reth-nippy-jar.workspace = true reth-tracing.workspace = true # codecs +alloy-rlp = { workspace = true, features = ["arrayvec"] } serde = { workspace = true, default-features = false } parity-scale-codec = { version = "3.2.1", features = ["bytes"] } modular-bitfield.workspace = true @@ -48,6 +49,7 @@ proptest = { workspace = true, optional = true } proptest-derive = { workspace = true, optional = true } strum = { workspace = true, features = ["derive"] } once_cell.workspace = true +serde_cbor = "0.11.2" [dev-dependencies] # reth libs with arbitrary diff --git a/crates/storage/db/src/tables/mod.rs b/crates/storage/db/src/tables/mod.rs index b10662325..6c9a88cb2 100644 --- a/crates/storage/db/src/tables/mod.rs +++ b/crates/storage/db/src/tables/mod.rs @@ -25,6 +25,7 @@ pub(crate) mod utils; use crate::{ abstraction::table::Table, + models::parlia::Snapshot, table::DupSort, tables::{ codecs::CompactU256, @@ -377,6 +378,9 @@ tables! { /// Stores the history of client versions that have accessed the database with write privileges by unix timestamp in seconds. table VersionHistory; + + /// Stores the parlia snapshot data by block hash. + table ParliaSnapshot; } // Alias types. diff --git a/crates/storage/db/src/tables/models/mod.rs b/crates/storage/db/src/tables/models/mod.rs index f1270cec3..b89974d5c 100644 --- a/crates/storage/db/src/tables/models/mod.rs +++ b/crates/storage/db/src/tables/models/mod.rs @@ -14,6 +14,7 @@ pub mod accounts; pub mod blocks; pub mod client_version; pub mod integer_list; +pub mod parlia; pub mod sharded_key; pub mod storage_sharded_key; diff --git a/crates/storage/db/src/tables/models/parlia/mod.rs b/crates/storage/db/src/tables/models/parlia/mod.rs new file mode 100644 index 000000000..88ab427fc --- /dev/null +++ b/crates/storage/db/src/tables/models/parlia/mod.rs @@ -0,0 +1,7 @@ +//! Parlia related models and types. + +mod snapshot; +pub use snapshot::*; + +mod vote; +pub use vote::*; diff --git a/crates/storage/db/src/tables/models/parlia/snapshot.rs b/crates/storage/db/src/tables/models/parlia/snapshot.rs new file mode 100644 index 000000000..f897d4ece --- /dev/null +++ b/crates/storage/db/src/tables/models/parlia/snapshot.rs @@ -0,0 +1,203 @@ +use crate::{ + models::parlia::{VoteAddress, VoteAttestation, VoteData}, + table::{Compress, Decompress}, + DatabaseError, +}; +use bytes::BufMut; +use reth_codecs::{main_codec, Compact}; +use reth_primitives::{Address, BlockNumber, SealedHeader, B256}; +use serde::{Deserialize, Serialize}; +use std::{ + collections::{BTreeMap, HashMap}, + fmt::Debug, +}; + +/// Number of blocks after which to save the snapshot to the database +pub const CHECKPOINT_INTERVAL: u64 = 1024; + +/// record validators information +#[main_codec] +#[derive(Debug, Default, PartialEq, Eq, Clone)] +pub struct ValidatorInfo { + /// The index of the validator + /// The index should offset by 1 + pub index: u64, + /// The vote address of the validator + pub vote_addr: VoteAddress, +} + +/// Snapshot, record validators and proposal from epoch chg. +#[derive(Debug, Default, PartialEq, Eq, Clone, Serialize, Deserialize)] +pub struct Snapshot { + /// record current epoch number + pub epoch_num: u64, + /// record block number when epoch chg + pub block_number: BlockNumber, + /// record block hash when epoch chg + pub block_hash: B256, + /// record epoch validators when epoch chg, sorted by ascending order. + pub validators: Vec
, + /// record every validator's information + pub validators_map: HashMap, + /// record recent block proposers + pub recent_proposers: BTreeMap, + /// record the block attestation's vote data + pub vote_data: VoteData, +} + +impl Snapshot { + /// Create a new snapshot + pub fn new( + mut validators: Vec
, + block_number: BlockNumber, + block_hash: B256, + epoch_num: u64, + val_info_map: Option>, + ) -> Self { + // notice: the validators should be sorted by ascending order. + validators.sort(); + Self { + block_number, + block_hash, + epoch_num, + validators, + validators_map: val_info_map.unwrap_or_default(), + recent_proposers: Default::default(), + vote_data: Default::default(), + } + } + + /// Apply the next block to the snapshot + pub fn apply( + &mut self, + validator: Address, + next_header: &SealedHeader, + mut next_validators: Vec
, + val_info_map: Option>, + attestation: Option, + ) -> Option { + let block_number = next_header.number; + if self.block_number + 1 != block_number { + return None; + } + + let mut snap = self.clone(); + snap.block_hash = next_header.hash(); + snap.block_number = block_number; + let limit = (snap.validators.len() / 2 + 1) as u64; + if block_number >= limit { + snap.recent_proposers.remove(&(block_number - limit)); + } + + if !snap.validators.contains(&validator) { + return None; + } + if snap.recent_proposers.iter().any(|(_, &addr)| addr == validator) { + return None; + } + snap.recent_proposers.insert(block_number, validator); + + if !next_validators.is_empty() { + next_validators.sort(); + snap.validators = next_validators; + snap.validators_map = val_info_map.unwrap_or_default(); + } + + if let Some(attestation) = attestation { + snap.vote_data = attestation.data; + } + Some(snap) + } + + /// Returns true if the block difficulty should be inturn + pub fn is_inturn(&self, proposer: Address) -> bool { + self.inturn_validator() == proposer + } + + /// Returns the validator who should propose the block + pub fn inturn_validator(&self) -> Address { + self.validators[((self.block_number + 1) as usize) % self.validators.len()] + } + + /// Return index of the validator's index in validators list + pub fn index_of(&self, validator: Address) -> Option { + for (i, &addr) in self.validators.iter().enumerate() { + if validator == addr { + return Some(i); + } + } + None + } + + /// Returns true if the validator has signed a block in the last limit blocks + pub fn sign_recently(&self, validator: Address) -> bool { + for (num, addr) in self.recent_proposers.iter() { + if *addr == validator { + let limit = (self.validators.len() / 2 + 1) as u64; + if self.block_number + 1 < limit || *num > self.block_number + 1 - limit { + return true; + } + } + } + false + } +} + +impl Compress for Snapshot { + type Compressed = Vec; + + fn compress(self) -> Self::Compressed { + serde_cbor::to_vec(&self).expect("Failed to serialize Snapshot") + } + + fn compress_to_buf>(self, buf: &mut B) { + let compressed = self.compress(); + buf.put_slice(&compressed); + } +} + +impl Decompress for Snapshot { + fn decompress>(value: B) -> Result { + serde_cbor::from_slice(value.as_ref()).map_err(|_| DatabaseError::Decode) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use rand::Rng; + + #[test] + fn compress_snapshot() { + let mut rng = rand::thread_rng(); + + let mut snap = Snapshot { + epoch_num: rng.gen::(), + block_number: rng.gen::(), + block_hash: B256::random(), + validators: vec![Address::random()], + validators_map: HashMap::new(), + recent_proposers: BTreeMap::new(), + vote_data: VoteData::default(), + }; + snap.validators_map.insert( + snap.validators[0], + ValidatorInfo { index: 1, vote_addr: VoteAddress::random() }, + ); + snap.recent_proposers.insert(1, snap.validators[0]); + snap.vote_data = VoteData { + source_number: rng.gen::(), + source_hash: B256::random(), + target_number: rng.gen::(), + target_hash: B256::random(), + }; + println!("original snapshot: {:?}", snap); + + let compressed = snap.clone().compress(); + println!("compressed snapshot: {:?}", compressed); + + let decompressed = Snapshot::decompress(&compressed).unwrap(); + println!("decompressed snapshot: {:?}", decompressed); + assert_eq!(snap, decompressed); + } +} diff --git a/crates/storage/db/src/tables/models/parlia/vote.rs b/crates/storage/db/src/tables/models/parlia/vote.rs new file mode 100644 index 000000000..05b10c3ae --- /dev/null +++ b/crates/storage/db/src/tables/models/parlia/vote.rs @@ -0,0 +1,87 @@ +use alloy_rlp::{RlpDecodable, RlpEncodable}; +use bytes::Bytes; +use reth_codecs::{impl_compact_for_bytes, main_codec, Compact}; +use reth_primitives::{alloy_primitives::wrap_fixed_bytes, keccak256, BlockNumber, B256}; + +/// max attestation extra length +pub const MAX_ATTESTATION_EXTRA_LENGTH: usize = 256; +/// validators bit set in vote attestation +pub type ValidatorsBitSet = u64; + +wrap_fixed_bytes!( + /// VoteAddress represents the BLS public key of the validator. + pub struct VoteAddress<48>; +); + +impl_compact_for_bytes!(VoteAddress); + +wrap_fixed_bytes!( + /// VoteSignature represents the BLS signature of the validator. + pub struct VoteSignature<96>; +); + +impl_compact_for_bytes!(VoteSignature); + +/// VoteData represents the vote range that validator voted for fast finality. +#[main_codec] +#[derive(Clone, Copy, Debug, PartialEq, Eq, Default, RlpEncodable, RlpDecodable)] +pub struct VoteData { + /// The source block number should be the latest justified block number. + pub source_number: BlockNumber, + /// The block hash of the source block. + pub source_hash: B256, + /// The target block number which validator wants to vote for. + pub target_number: BlockNumber, + /// The block hash of the target block. + pub target_hash: B256, +} + +impl VoteData { + /// hash, get the hash of the rlp outcome of the VoteData + pub fn hash(&self) -> B256 { + keccak256(alloy_rlp::encode(self)) + } +} + +/// VoteEnvelope a single vote from validator. +#[derive(Clone, Debug, PartialEq, Eq, RlpEncodable, RlpDecodable)] +pub struct VoteEnvelope { + /// The BLS public key of the validator. + pub vote_address: VoteAddress, + /// The BLS signature of the validator. + pub signature: VoteSignature, + /// The vote data for fast finality. + pub data: VoteData, +} + +impl VoteEnvelope { + /// hash, get the hash of the rlp outcome of the VoteEnvelope + pub fn hash(&self) -> B256 { + keccak256(alloy_rlp::encode(self)) + } + + // /// verify, check if VoteEnvelope's signature is valid + // pub fn verify(&self) -> Result<(), > { + // let bls_key = PublicKey::from_bytes(&self.vote_address[..])?; + // let sig = Signature::from_bytes(&self.signature[..])?; + // + // let err = sig.verify(true, self.hash().as_bytes(), &[], &[], &bls_key, true); + // if !err == BLST_ERROR::BLST_SUCCESS { + // return Err(err.into()); + // } + // Ok(()) + // } +} + +/// VoteAttestation represents the votes of super majority validators. +#[derive(Clone, Debug, PartialEq, Eq, RlpEncodable, RlpDecodable)] +pub struct VoteAttestation { + /// The bitset marks the voted validators. + pub vote_address_set: ValidatorsBitSet, + /// The aggregated BLS signature of the voted validators' signatures. + pub agg_signature: VoteSignature, + /// The vote data for fast finality. + pub data: VoteData, + /// Reserved for future usage. + pub extra: Bytes, +} diff --git a/crates/storage/provider/src/providers/database/mod.rs b/crates/storage/provider/src/providers/database/mod.rs index c84e9d8ce..a455c35a9 100644 --- a/crates/storage/provider/src/providers/database/mod.rs +++ b/crates/storage/provider/src/providers/database/mod.rs @@ -4,8 +4,9 @@ use crate::{ traits::{BlockSource, ReceiptProvider}, BlockHashReader, BlockNumReader, BlockReader, ChainSpecProvider, DatabaseProviderFactory, EvmEnvProvider, HeaderProvider, HeaderSyncGap, HeaderSyncGapProvider, HeaderSyncMode, - ProviderError, PruneCheckpointReader, StageCheckpointReader, StateProviderBox, - StaticFileProviderFactory, TransactionVariant, TransactionsProvider, WithdrawalsProvider, + ParliaSnapshotReader, ProviderError, PruneCheckpointReader, StageCheckpointReader, + StateProviderBox, StaticFileProviderFactory, TransactionVariant, TransactionsProvider, + WithdrawalsProvider, }; use reth_db::{database::Database, init_db, models::StoredBlockBodyIndices, DatabaseEnv}; use reth_evm::ConfigureEvmEnv; @@ -29,7 +30,7 @@ mod metrics; mod provider; pub use provider::{DatabaseProvider, DatabaseProviderRO, DatabaseProviderRW}; -use reth_db::mdbx::DatabaseArguments; +use reth_db::{mdbx::DatabaseArguments, models::parlia::Snapshot}; /// A common provider that fetches data from a database or static file. /// @@ -567,6 +568,13 @@ impl Clone for ProviderFactory { } } } + +impl ParliaSnapshotReader for ProviderFactory { + fn get_parlia_snapshot(&self, block_hash: B256) -> ProviderResult> { + self.provider()?.get_parlia_snapshot(block_hash) + } +} + #[cfg(test)] mod tests { use super::ProviderFactory; diff --git a/crates/storage/provider/src/providers/database/provider.rs b/crates/storage/provider/src/providers/database/provider.rs index 6e07b7c46..8e4015d77 100644 --- a/crates/storage/provider/src/providers/database/provider.rs +++ b/crates/storage/provider/src/providers/database/provider.rs @@ -8,9 +8,10 @@ use crate::{ AccountReader, BlockExecutionWriter, BlockHashReader, BlockNumReader, BlockReader, BlockWriter, Chain, EvmEnvProvider, HashingWriter, HeaderProvider, HeaderSyncGap, HeaderSyncGapProvider, HeaderSyncMode, HistoricalStateProvider, HistoryWriter, LatestStateProvider, - OriginalValuesKnown, ProviderError, PruneCheckpointReader, PruneCheckpointWriter, - StageCheckpointReader, StateProviderBox, StateWriter, StatsReader, StorageReader, - TransactionVariant, TransactionsProvider, TransactionsProviderExt, WithdrawalsProvider, + OriginalValuesKnown, ParliaSnapshotReader, ParliaSnapshotWriter, ProviderError, + PruneCheckpointReader, PruneCheckpointWriter, StageCheckpointReader, StateProviderBox, + StateWriter, StatsReader, StorageReader, TransactionVariant, TransactionsProvider, + TransactionsProviderExt, WithdrawalsProvider, }; use itertools::{izip, Itertools}; use reth_db::{ @@ -18,8 +19,9 @@ use reth_db::{ cursor::{DbCursorRO, DbCursorRW, DbDupCursorRO, RangeWalker}, database::Database, models::{ - sharded_key, storage_sharded_key::StorageShardedKey, AccountBeforeTx, BlockNumberAddress, - ShardedKey, StoredBlockBodyIndices, StoredBlockOmmers, StoredBlockWithdrawals, + parlia::Snapshot, sharded_key, storage_sharded_key::StorageShardedKey, AccountBeforeTx, + BlockNumberAddress, ShardedKey, StoredBlockBodyIndices, StoredBlockOmmers, + StoredBlockWithdrawals, }, table::{Table, TableRow}, tables, @@ -2692,6 +2694,18 @@ impl StatsReader for DatabaseProvider { } } +impl ParliaSnapshotReader for DatabaseProvider { + fn get_parlia_snapshot(&self, block_hash: B256) -> ProviderResult> { + Ok(self.tx.get::(block_hash)?) + } +} + +impl ParliaSnapshotWriter for DatabaseProvider { + fn save_parlia_snapshot(&self, block_hash: B256, snapshot: Snapshot) -> ProviderResult<()> { + Ok(self.tx.put::(block_hash, snapshot)?) + } +} + fn range_size_hint(range: &impl RangeBounds) -> Option { let start = match range.start_bound().cloned() { Bound::Included(start) => start, diff --git a/crates/storage/provider/src/providers/mod.rs b/crates/storage/provider/src/providers/mod.rs index bf94e32cf..a98a17625 100644 --- a/crates/storage/provider/src/providers/mod.rs +++ b/crates/storage/provider/src/providers/mod.rs @@ -2,10 +2,10 @@ use crate::{ AccountReader, BlockHashReader, BlockIdReader, BlockNumReader, BlockReader, BlockReaderIdExt, BlockSource, BlockchainTreePendingStateProvider, BundleStateDataProvider, CanonChainTracker, CanonStateNotifications, CanonStateSubscriptions, ChainSpecProvider, ChangeSetReader, - DatabaseProviderFactory, EvmEnvProvider, HeaderProvider, ProviderError, PruneCheckpointReader, - ReceiptProvider, ReceiptProviderIdExt, StageCheckpointReader, StateProviderBox, - StateProviderFactory, StaticFileProviderFactory, TransactionVariant, TransactionsProvider, - TreeViewer, WithdrawalsProvider, + DatabaseProviderFactory, EvmEnvProvider, HeaderProvider, ParliaSnapshotReader, ProviderError, + PruneCheckpointReader, ReceiptProvider, ReceiptProviderIdExt, StageCheckpointReader, + StateProviderBox, StateProviderFactory, StaticFileProviderFactory, TransactionVariant, + TransactionsProvider, TreeViewer, WithdrawalsProvider, }; use reth_db::{ database::Database, @@ -61,6 +61,7 @@ use chain_info::ChainInfoTracker; mod consistent_view; pub use consistent_view::{ConsistentDbView, ConsistentViewError}; +use reth_db::models::parlia::Snapshot; use reth_rpc_types::engine::ForkchoiceState; /// The main type for interacting with the blockchain. @@ -906,3 +907,12 @@ where self.database.provider()?.basic_account(address) } } + +impl ParliaSnapshotReader for BlockchainProvider +where + DB: Database + Sync + Send, +{ + fn get_parlia_snapshot(&self, block_hash: B256) -> ProviderResult> { + self.database.provider()?.get_parlia_snapshot(block_hash) + } +} diff --git a/crates/storage/provider/src/test_utils/noop.rs b/crates/storage/provider/src/test_utils/noop.rs index 626bd5351..e7a8c8c89 100644 --- a/crates/storage/provider/src/test_utils/noop.rs +++ b/crates/storage/provider/src/test_utils/noop.rs @@ -1,12 +1,12 @@ use crate::{ traits::{BlockSource, ReceiptProvider}, AccountReader, BlockHashReader, BlockIdReader, BlockNumReader, BlockReader, BlockReaderIdExt, - ChainSpecProvider, ChangeSetReader, EvmEnvProvider, HeaderProvider, PruneCheckpointReader, - ReceiptProviderIdExt, StageCheckpointReader, StateProvider, StateProviderBox, - StateProviderFactory, StateRootProvider, TransactionVariant, TransactionsProvider, - WithdrawalsProvider, + ChainSpecProvider, ChangeSetReader, EvmEnvProvider, HeaderProvider, ParliaSnapshotReader, + PruneCheckpointReader, ReceiptProviderIdExt, StageCheckpointReader, StateProvider, + StateProviderBox, StateProviderFactory, StateRootProvider, TransactionVariant, + TransactionsProvider, WithdrawalsProvider, }; -use reth_db::models::{AccountBeforeTx, StoredBlockBodyIndices}; +use reth_db::models::{parlia::Snapshot, AccountBeforeTx, StoredBlockBodyIndices}; use reth_evm::ConfigureEvmEnv; use reth_interfaces::provider::ProviderResult; use reth_primitives::{ @@ -456,3 +456,9 @@ impl PruneCheckpointReader for NoopProvider { Ok(None) } } + +impl ParliaSnapshotReader for NoopProvider { + fn get_parlia_snapshot(&self, _block_hash: B256) -> ProviderResult> { + Ok(None) + } +} diff --git a/crates/storage/provider/src/traits/mod.rs b/crates/storage/provider/src/traits/mod.rs index c966cd9ef..f35ff5101 100644 --- a/crates/storage/provider/src/traits/mod.rs +++ b/crates/storage/provider/src/traits/mod.rs @@ -83,3 +83,6 @@ pub use full::FullProvider; mod tree_viewer; pub use tree_viewer::TreeViewer; + +mod parlia_snapshot; +pub use parlia_snapshot::{ParliaSnapshotReader, ParliaSnapshotWriter}; diff --git a/crates/storage/provider/src/traits/parlia_snapshot.rs b/crates/storage/provider/src/traits/parlia_snapshot.rs new file mode 100644 index 000000000..f3d954709 --- /dev/null +++ b/crates/storage/provider/src/traits/parlia_snapshot.rs @@ -0,0 +1,17 @@ +use reth_db::models::parlia::Snapshot; +use reth_interfaces::provider::ProviderResult; +use reth_primitives::B256; + +/// The trait for fetching parlia snapshot related data. +#[auto_impl::auto_impl(&, Arc)] +pub trait ParliaSnapshotReader: Send + Sync { + /// Fetch the snapshot for the given block hash. + fn get_parlia_snapshot(&self, block_hash: B256) -> ProviderResult>; +} + +/// The trait for updating parlia snapshot related data. +#[auto_impl::auto_impl(&, Arc)] +pub trait ParliaSnapshotWriter: Send + Sync { + /// Save snapshot. + fn save_parlia_snapshot(&self, block_hash: B256, snapshot: Snapshot) -> ProviderResult<()>; +}